안녕하세요 연구를 하다보니 어느덧 벌써 봄이 왔네요..
"제가 연구실에서 서버를 사용하면서 아쉬웠던점이 쥐피유가 다 사용되면 알고싶다는 점 이였습니다"
tensorboard, visdom, tqdm, wandb 등으로 한 iter를 알고 대략적인 시간을 알 수는 있지만
서버를 같이 사용하다보면 data load나 이러한 여러가지 조건이 때문에 평균 iter 속도가 유지되지않을 수 있으며
논문을 같이쓰다보면 따로알려주지않는이상 그시간을 까먹기 마련입니다..ㅠ
그래서 제가한번 지정한 gpu 메모리를 설정한 메모리 값보다 내려가는 기준으로 사용하는지 여부를
판단해서 메일로 보내주는 코드를 한번 작성해서 배포하려고 이렇게 글을 남깁니다 ㅎㅎ
(허접하지만 필요하시면..ㅎㅎ 언제든지 가져다 쓰세요..)
https://github.com/JongBeomBaek/GPU_ALARM
import os
import time
import argparse
#mail package
import smtplib
from email.mime.text import MIMEText
INIT_INFO = 9
JUMP = 4
NUM_INFO = 1
MEM_INFO = 8
GMAIL_INDEX = 587
parser = argparse.ArgumentParser(description='arguments yaml load')
parser.add_argument("--SLEEP_TIME",
type=int,
help="sleep tiem in loop(sec)",
default=5)
parser.add_argument("--LIMIT_MEM",
type=int,
help="decide about memory useage(MiB)",
default=1000)
parser.add_argument("--file_name",
type=str,
help="save text file",
default="gpu_use.txt")
parser.add_argument("--trcat_gpu_num",
nargs="+",
type=int,
help="tracking gpu number[list]",
default=[0])
parser.add_argument("--alias",
type=str,
help="send email subject",
default='my-local')
parser.add_argument("--email",
type=str,
help="send email subject",
default='my-local')
parser.add_argument("--app_pw",
type=str,
help="send email subject")
args = parser.parse_args()
if __name__ == "__main__":
send_email = False
pre_list = args.trcat_gpu_num
while True:
os.system(f'nvidia-smi > {args.file_name}')
with open(args.file_name, 'r') as f:
ll = f.readlines()
seq_list = []
for i in range(INIT_INFO, len(ll), JUMP):
# print(f'{i}/{len(ll)}')
c = ll[i].split()
if len(c) == 1:
break
gpu_num = ll[i-1].split()[NUM_INFO]
if int(gpu_num) in args.trcat_gpu_num and int(c[MEM_INFO][:-3]) > args.LIMIT_MEM:
seq_list.append(int(gpu_num))
if len(pre_list) > len(seq_list):
pre_set = set(pre_list)
cur_set = set(seq_list)
smtp = smtplib.SMTP('smtp.gmail.com', GMAIL_INDEX)
smtp.starttls() # TLS 사용시 필요
smtp.login(args.email, args.app_pw)
content = pre_set.difference(cur_set)
msg = MIMEText(f'{content} empty')
msg['Subject'] = f'[{args.alias} GPU 사용량]'
msg['To'] = args.email
smtp.sendmail(args.email, args.email, msg.as_string())
smtp.quit()
print(f'{pre_list}/{seq_list}')
pre_list = seq_list
time.sleep(args.SLEEP_TIME)
코드가 매우 짧은 만큼 사용법도 간단한데요
각 argument별로 어떤의미를 하는지 알려드릴게요ㅎㅎ
- sleep time: while문이 계속돌면 thread하나를 잡아먹는게 있다보니 지정시간마다 체크하기위해 설정하는 시간
- limit mem: 타겟 메모리값입니다 1000을 설정하면 1000이상일경우 사용 이하일 경우 미사용으로 판단하기위해 설정하는 값 입니다 (아무래도 로컬 pc는 화면을 송출하다보니 기본적으로 1000MiB는 먹더라구요 ㅎㅎ)
- file name: gpu 정보를 저장하려는 파일명인데 별일없으면 안쓰실거에요 ㅎㅎ
- tract_gpu_num: 리스트 타입으로 멀티쥐피유를 지정하여 설정한 쥐피유만 모니터링 하여 알려줍니다 (trace할라한건데 오타나있네요..)
- alias: 별칭을 설정하는건데요 여러쥐피유를 사용하다면 그쥐피유의 별칭을 통해 구분하기위해 설정하는 값입니다.
- email: 본인 이메일을 사용하시면 되며 지금 설정이 구글을 기본으로 되어있는데 필요에따라 바꿔서사용하시면 됩니다 ㅎㅎ(밑에 문헌 참고)
- app_pw: 앱비밀번호라해서 gmail의 직접적인 이메일 번호가 아닌 따로 설정해서 얻으셔야합니다(밑에 문헌 참고)
중요하게 설정해야할 값들은 제가 볼드체로 해놓았으니 참고하세요 ㅎㅎ
예시 command
python gpu_alarm.py --alias [별칭] --trcat_gpu_num [추적하려는 gpu 번호] --email [이메일] --app_pw [해당 이메일 앱비밀번호]
상황 예시 command
(1번서버 1 2 4 번 쥐피유를 추적해서 내이메일(id:robot / pw:robot_love)로 보내줘
python gpu_alarm.py --alias server1 --trcat_gpu_num 1 2 4 --email robot@email.com --app_pw robot_love
참고 문헌
여기에 app비밀번호 설정등에 대해 사진으로 자세히 설명해주셔서 참고하시면 됩니다 ㅎㅎ
'일상' 카테고리의 다른 글
[VS Code ProxyJump] 우회 ssh 접속 (0) | 2022.04.08 |
---|---|
ssh 연결 문제 [System is booting up. See pam_nologin(8)] (0) | 2021.06.24 |
Docker GPU[0000] ERROR (0) | 2021.05.26 |
tmux 설치 및 간단 사용법 (2) | 2020.06.17 |
termius 어플 소개 (0) | 2020.06.16 |