监控大模型训练

大模型训练时间久,而且过程中容易出现各种各样的问题而中断,中断之后不及时续练的话对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命令运行这两个程序中的一个,以监控大模型的训练是否正常进行。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。