监控大模型训练
大模型训练时间久,而且过程中容易出现各种各样的问题而中断,中断之后不及时续练的话对GPU资源是很大的浪费,但是我们又不能一直盯着程序。所以本文将介绍如何编写一个监控程序来监控大模型的训练,以方便我们在大模型训练出现异常时及时通知给我们。
监控的方式有很多,这里介绍两个方式。
根据log文件大小变化监控训练是否进行
在linux nohup指令详解中,我们提到了使用Linux的nohup命令来运行训练脚本,该命令会创建一个日志文件,大模型在训练的过程中会不断输出内容,因此该日志文件的大小是随时在变化的。因此,我们可以通过隔一段时间判断该日志文件的大小是否变化来判断大模型的训练是否出现异常。如果大模型训练出现异常,我们需要通过一种常用的通讯方式来告知自己,这里选择使用邮箱(也可以使用短信、QQ/微信通知等方式)。
核心代码如下:
import os
import time
import smtplib
from email.mime.text import MIMEText
# 配置邮箱信息
SMTP_SERVER = 'smtp.qq.com'
SMTP_PORT = 587
EMAIL_USERNAME = '作为SMTP服务器的QQ邮箱'
EMAIL_PASSWORD = '你的QQ邮箱SMTP服务的密钥'
EMAIL_FROM = '作为SMTP服务器的QQ邮箱'
EMAIL_TO = '你接收通知邮件的QQ邮箱'
EMAIL_SUBJECT = '大模型训练终止提醒'
# 监测的文件路径
FILE_PATH = '/...../nohup.out'
def send_email(message):
msg = MIMEText(message)
msg['From'] = EMAIL_FROM
msg['To'] = EMAIL_TO
msg['Subject'] = EMAIL_SUBJECT
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_USERNAME, EMAIL_PASSWORD)
server.sendmail(from_addr=EMAIL_FROM, to_addrs=[EMAIL_TO], msg=msg.as_string())
def monitor_file():
# 获取初始文件大小
initial_size = os.path.getsize(FILE_PATH)
while True:
# 等待10分钟
time.sleep(600)
# 获取当前文件大小
current_size = os.path.getsize(FILE_PATH)
if current_size == initial_size:
# 文件大小没有变化,发送警告邮件
message = '日志文件在十分钟内没有发生变化,大模型训练可能已终止!'
send_email(message)
else:
# 文件大小发生变化,更新初始文件大小
print(f'log changed: {current_size-initial_size}')
initial_size = current_size
if __name__ == '__main__':
monitor_file()
根据GPU显存占用率监控训练是否进行
训练大模型时,GPU的显存占用率一般都比较高,所以我们也可以通过GPU显存的占用率来判断大模型的训练是否出现异常。这里我们同样使用邮箱来通知自己。
核心代码如下:
import subprocess
import smtplib
from email.mime.text import MIMEText
import time
def get_gpu_memory_usage():
output = subprocess.check_output(['nvidia-smi', '--query-gpu=memory.used', '--format=csv,nounits,noheader'])
memory_used = [int(x) for x in output.decode().strip().split('\n')]
return memory_used
# 配置邮箱信息
SMTP_SERVER = 'smtp.qq.com'
SMTP_PORT = 587
EMAIL_USERNAME = '作为SMTP服务器的QQ邮箱'
EMAIL_PASSWORD = '你的QQ邮箱SMTP服务的密钥'
EMAIL_FROM = '作为SMTP服务器的QQ邮箱'
EMAIL_TO = '你接收通知邮件的QQ邮箱'
EMAIL_SUBJECT = '大模型训练终止提醒'
def send_email(message):
msg = MIMEText(message)
msg['From'] = EMAIL_FROM
msg['To'] = EMAIL_TO
msg['Subject'] = EMAIL_SUBJECT
with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as server:
server.starttls()
server.login(EMAIL_USERNAME, EMAIL_PASSWORD)
server.sendmail(from_addr=EMAIL_FROM, to_addrs=[EMAIL_TO], msg=msg.as_string())
def main():
while True:
memory_used_list = get_gpu_memory_usage()
# memory_total是你服务器总的显存量,此处使用的服务器有8张40G的A100,因此总显存量为40960*8
memory_total = 40960 * 8
memory_used = 0
for memory in memory_used_list:
memory_used += memory
memory_usage_percent = (memory_used / memory_total) * 100
if memory_usage_percent < 10:
subject = '服务器显存占用率过低警告'
body = f'显存占用率为 {memory_usage_percent}%,低于10%。请检查服务器。'
send_email(subject, body)
else:
print(f'GPU Memory %: {memory_usage_percent}')
time.sleep(600) # 等待10分钟(600秒)
if __name__ == '__main__':
main()
我们可以使用linux nohup指令详解中介绍的nohup命令运行这两个程序中的一个,以监控大模型的训练是否正常进行。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容