集群任务脚本¶
指定 CUDA 版本¶
集群提供多个 CUDA 版本,存放在
/app/cuda
路径下,用户可以查看并选择合适的版本。如果需要指定任务运行的 CUDA 版本,可以在 bash 脚本中添加以下命令:
# 修改环境变量
export CUDA_HOME=/app/cuda/cuda-11.8
export PATH=$CUDA_HOME/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH
# 验证环境变量
echo $CUDA_HOME # 应输出 /app/cuda/cuda-11.8
which nvcc # 应显示 /app/cuda/cuda-11.8/bin/nvcc
nvcc --version # 确认版本是否正确
任务信息邮件通知¶
为了方便监控任务运行状况,可以添加一个自动发送邮件的 python 脚本。一共需要使用两个邮箱,一个作为发送方,一个作为接收方。相关 python 依赖请自行安装。
import smtplib
import argparse
from email.mime.text import MIMEText
def parse_args():
parser = argparse.ArgumentParser(
description="Provide message to send."
)
parser.add_argument(
'-t', '--task',
type=str,
default='train',
help="The name of submitted task",
)
return parser.parse_args()
if __name__ == '__main__':
args = parse_args()
# print(args.task)
msg_from="" #填入发送方邮箱
smtp="" #填入发送方邮箱 smtp 授权码
to="" #填入接收方邮箱
subject="CLUSTER-INFO" #电子邮件的主题
content=f"task {args.task} completed" #电子邮件的内容
#构造邮件(注意大写字母)
msg=MIMEText(content)
msg["Subject"]=subject
msg["From"]=msg_from
msg["To"]=to
#发送邮件
try:
ss=smtplib.SMTP_SSL("smtp.163.com",465) #使用163邮箱时发送方邮箱smtp安全协议
# ss=smtplib.SMTP_SSL("smtp.qq.com",465) #使用qq邮箱时的协议设置
ss.login(msg_from, smtp) #登录
ss.sendmail(msg_from,to,msg.as_string()) #发送
print("email sent successfully")
except Exception as e:
print("sending failed: ",e)
注意有一点是需要用户自行获得邮箱的 smtp 码才能够使用,下面是两种常用的邮箱 smtp 码获取方式:
qq邮箱:进入邮箱网页版界面后,点击“设置”,再点击“账号”,在 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务” 中管理或者生成 smtp 授权码即可。
163邮箱:进入邮箱网页版界面后,点击“设置”,再点击“POP3/SMTP/IMAP”中进行配置即可。
最后在 bash 脚本中添加这样一行代码即可使用。
# your_task_name 替换成你的任务名称
srun python /path/to/your_mail_script.py -t your_task_name-$SLURM_JOB_ID
多卡任务通信端口¶
多卡任务通常需要指定通信端口,为避免端口冲突,建议在任务脚本通过以下代码动态确定端口。
# 生成 50000~60000 的随机端口,直到找到可用端口 MASTER_PORT
while :; do
MASTER_PORT=$(( RANDOM % 10001 + 50000 ))
if ! ss -tuln | grep -q ":${MASTER_PORT} "; then
echo "Selected available port: ${MASTER_PORT}"
break
fi
done