万卡规模国产化集群下,断点续训在5类故障下实现1分钟检测、5分钟内定位、15分钟内恢复训练。
测试数据及代码准备
数据集 | 数据集大小 | 使用模型 |
---|---|---|
Wikipedia-en (1M条) | 9.1GB | Llama2-70B /Llama3.1-405B |
● 使用预处理为MindRecord格式的Wikipedia-en (1M条)数据集,上传到对象存储,并由对象存储下载到慧聚HPFS。
● 测试代码在gitlab仓库下载到本地,并放置于/work/home下。
脚本和任务准备
按照下面修改run.sh脚本
#! /bin/bash
# huijuformers的绝对路径, 需要修改path_to_huijuformers
export BASE_DIR=/work/data/llama2_9216/huijuformers
## 以下为平台自动注入的环境变量
# yaml文件中需要修改的环境变量
export BATCH_SIZE=1
export EPOCHS=350
export LEARNING_RATE=6.e-5
export DATA_PARALLEL=256
export MODEL_PARALLEL=4
export PIPELINE_STAGE=9
# 模型微调相关
export FINETUNE_MODEL_TYPE=llama2_70b_base # 合并为一个参数,与模型存放文件夹名称一致(与后端沟通过)
export FINETUNING_TYPE=ALL
export TIME_TAG=$(date +"%m%d-%H%M")
# # 数据相关
# export DATASET_PATH=${BASE_DIR}/data
# export DATASET_FILE=original_data.json # 需要修改
# ## 以下为平台后端需要自行更改后传入的环境变量
# # 平台数据格式转换,专用数据调试时用不到
# export DATASET_TMP_PATH=${BASE_DIR}/data/processed_data/${FINETUNE_MODEL_TYPE}
# mkdir -p ${DATASET_TMP_PATH}
# # 模型输入
# # 专业模式,平台训练时需要按照平台的挂载路径去修改这一块的变量
# export CHECKPOINT_DIR=''
# # 低代码模式,微调时约定挂载为下面的路径
# # export CHECKPOINT_DIR=/work/mount/publicModel/${FINETUNE_MODEL_TYPE}/${FINETUNE_MODEL_TYPE}
# # 输出文件夹路径,run_mode为训练模式,如train,lora,full
run_mode=train
export OUTPUT_DIR=${BASE_DIR}/output/${FINETUNE_MODEL_TYPE}/${run_mode}/${TIME_TAG}
export OUTPUT_ROOT_DIR=${BASE_DIR}/output/${FINETUNE_MODEL_TYPE}/${run_mode}
rm -rf ${OUTPUT_DIR}/resume_record
# 获取节点IP、名称,记录至文件
echo $(hostname -I | awk '{print $1}'),$NODE_NAME >> ${BASE_DIR}/output/nodes
sed -i '/pam_limits.so/s/^/#/' /etc/pam.d/sshd
# 启动脚本
cd ${BASE_DIR}/bin/scripts
# apt install netcat -y
# 微调
# bash finetune.sh
# 预训练
export MS_TOPO_TIMEOUT=7200
bash train.sh
启动训练任务
点击训练任务页面的新建任务,按照如下的示例配置训练命令和模型挂载等,然后启动任务。
Llama2-70B万卡测试结果
在慧聚平台使用9216卡对Llama2-70B进行预训练,万卡规模国产化集群下,断点续训在5类故障下实现1分钟检测、5分钟内定位、15分钟内恢复训练。
整体结果
训练环境
服务器型号 | Atlas 800T A2 |
---|---|
NPU型号 | 910B2(64GB) |
驱动版本 | 23.0.3 |
CANN | 8.0.RC2 |
Python | 3.10.14 |
MindSpore | 2.3.0 |
Mindformers | 1.2.0 |
训练配置
Epochs | 350 |
---|---|
Learning Rate | 6.e-5 |
Global Batch Size | 32768 |
Batch Size | 1 |
Micro Batch Size | 128 |
Sequence Length | 4096 |
Data Parallel (DP) | 256 |
Model Parallel (MP) | 4 |
Pipeline Parallel (PP) | 9 |
max_device_memory | 54GB |
jit_level | O2 |
训练结果
吞吐量(tokens/s/p) | 366.915 |
---|---|
MFU - 芯片算力(%) | 43.061 |
MFU - CUBE算力(%) | 45.867 |
断点续训
断点CheckPoint总大小:22T,其中0卡断点CheckPoint大小:2.9G。
故障1:业务故障,kill所有python进程
故障检测时间(Min) | 7.2s |
---|---|
故障处理耗时(Min) | 231.7s, 3.86min |
故障恢复耗时(Min) | 458s, 7.63min |
CKPT加载时间(Min) | 0.28min |
0卡CKPT加载速度(GB/s) | 0.99 |
故障2:节点心跳故障,把node上label去掉
故障检测时间(Min) | 18.9s, 0.315min |
---|---|
故障处理耗时(Min) | 279.8s, 4.64min |
故障恢复耗时(Min) | 478s, 7.96min |
0卡CKPT加载时间(Min) | 0.3min |
0卡CKPT加载速度(GB/s) | 1.01 |
故障3:节点down故障,reboot
故障检测时间(Min) | 18.3s, 0.3min |
---|---|
故障处理耗时(Min) | 465s, 7.75min |
故障恢复耗时(Min) | 546s, 9.1min |
0卡CKPT加载时间(Min) | 0.98min |
0卡CKPT加载速度(GB/s) | 0.1 |
故障4:网络故障,网卡link down
故障检测时间(Min) | 895s(600s HCCL), 14.9min |
---|---|
故障处理耗时(Min) | 300s, 5min |
故障恢复耗时(Min) | 472.1s, 7.86min |
0卡CKPT加载时间(Min) | 0.32min |
0卡CKPT加载速度(GB/s) | 0.96 |
故障5:PCIE故障,模拟NPU掉卡
故障检测时间(Min) | 78.7s, 1.3min |
---|---|
故障处理耗时(Min) | 267.1s, 4.4min |
故障恢复耗时(Min) | 516.9s, 8.6min |
0卡CKPT加载时间(Min) | 0.32min |
0卡CKPT加载速度(GB/s) | 0.98 |