概述
本指南旨在为用户提供一套全面、高效的模型训练最佳实践,涵盖从环境登录到多机分布式训练的全过程。通过系统化的步骤指引,用户可以快速熟悉并掌握在平台上进行模型训练的操作流程,充分利用平台的强大工具,完成大模型的高效训练任务。无论是单机训练还是多机分布式训练,本指南均提供了详细的操作步骤与注意事项,帮助用户快速上手并解决可能遇到的问题。
前置条件
执行本文操作之前, 请完成以下准备工作:
注册天翼云账号,并完成实名认证。
确保天翼云账户余额大于100元。
说明
为了方便演示,本文中涉及资源开通的情形,均默认选择按量付费模式。
平台体验:https://huiju.ctyun.cn/?regionId=200000001852
环境介绍:本次使用昇腾910B环境进行操作
CPU: 鲲鹏920 4*48=192
内存:1536GB
NPU: 昇腾910B * 8
主机(风冷机):Atlas 800A2
训练准备
开发机
在进行大规模模型训练之前,确保所有的开发环境、模型代码、依赖库、权重文件以及数据集都已准备妥当是至关重要的一步。通过平台提供的开发机工具,您可以轻松实现可视化的IDE操作,简化训练环境的搭建与管理。
配置开发机
先创建开发机IDE任务,按照如下步骤展开操作:
打开IDE
提交任务后,点击“启动”按钮,任务状态将依次显示启动中->环境准备中->运行中(如果长时间(>1min)界面状态未更新, 可以使用F5手动刷新界面),当状态显示为运行中后,点击操作栏“打开”按钮。
打开终端
打开后,显示vscode界面如下,按照下图步骤打开terminal运行终端:
左侧文件管理器中显示了当前集群的共享存储空间/work/share,用户可在此创建文件夹,确保所有节点对文件的访问。用户还可以在终端中进入共享存储目录,执行命令行操作。
镜像制作
您可以轻松将开发机中的运行环境保存为镜像,通过保存镜像,您不仅能够在日后快速复用该开发环境,还可以将其应用到多节点训练任务中,确保训练环境的一致性与稳定性。这种方式能够避免因环境差异导致的问题,实现从单机开发到多机分布式训练的无缝衔接。同时,镜像化管理还能在团队协作中发挥重要作用,便于其他成员直接使用统一环境,提升整体研发效率。
填写镜像名称与版本号后,点击“确定”按钮。
在左侧“我的镜像”选项卡中可查看镜像制作进度。
镜像制作完成后,下次创建开发机或训练任务时即可选择该自定义镜像。
模型准备
代码下载
将工程代码、第三方库下载,并切换到对应的版本号。
git clone https://gitee.com/ascend/MindSpeed-LLM.git
git clone https://github.com/NVIDIA/Megatron-LM.git
# 【可替换】国内加速: git clone https://gitdl.cn/https://github.com/NVIDIA/Megatron-LM.git
cd Megatron-LM
git checkout core_r0.6.0
cp -r megatron ../MindSpeed-LLM/
cd../MindSpeed-LLM
git checkout 1.0.RC2
mkdir logs
mkdir model_from_hf
mkdir dataset
mkdir ckpt
环境搭建
安装加速包和其他依赖。
git clone https://gitee.com/ascend/MindSpeed.git
cd MindSpeed
git checkout 2b0edd2
pip install -e .
cd..
pip install -r requirements.txt
权重下载
通过 ModelScope 工具下载模型权重,例如:Llama-2-7b-hf 权重:
cd ./model_from_hf/
pip install modelscope
modelscope download --model shakechen/Llama-2-7b-hf --local_dir ./llama-2-7b-hf
cd..
权重转换
将Huggingface格式的权重转换为可运行的切分后的megatron格式权重。
python tools/checkpoint/convert_ckpt.py \
--model-type GPT \
--loader llama2_hf \
--saver megatron \
--target-tensor-parallel-size 1\
--target-pipeline-parallel-size 2\
--load-dir ./model_from_hf/llama-2-7b-hf/ \
--save-dir ./model_weights/llama-2-7b-hf-v0.1-tp1-pp2/ \
--tokenizer-model ./model_from_hf/llama-2-7b-hf/tokenizer.model
运行成功后,终端显示如下信息:
数据集准备
数据集下载
使用 wget 工具从指定地址下载数据集文件。以下命令行下载 alpaca 数据集为例:
# 下载数据
cd ./dataset
wget https://hf-mirror.com/datasets/tatsu-lab/alpaca/resolve/main/data/train-00000-of-00001-a09b74b3ef9c3b56.parquet
cd..
# 【备选】使用模乐社区下载权重
# apt install git-lfs
# git lfs install
# git clone https://modelers.cn/MindSpore-Lab/llama2-7b-hf.git
此过程会将数据集文件存储到指定目录中,下载完成后请检查文件完整性,为后续的数据预处理环节做好准备。
数据集预处理
下载完成后,需对原始数据集进行预处理,以便适配模型训练的需求。以下是预处理的关键步骤:
# 处理数据
mkdir ./dataset/llama-2-7b-hf/
python ./tools/preprocess_data.py \
--input ./dataset/train-00000-of-00001-a09b74b3ef9c3b56.parquet \
--tokenizer-name-or-path ./model_from_hf/llama-2-7b-hf/ \
--output-prefix ./dataset/llama-2-7b-hf/alpaca \
--workers 4\
--log-interval 1000\
--tokenizer-type PretrainedFromHF
运行完成后,终端显示如下信息:
通过以上步骤,您已成功将原始数据集转换为可直接用于训练的数据格式,此时也可以在文件管理器中看到生成的数据预处理文件。
模型训练
开发机-单机训练
开发机训练是模型开发过程中快速验证代码和训练流程的重要环节。通过开发机训练,可以高效完成模型调试和小规模实验,以下是开发机模型训练的操作指南。
训练脚本准备
在完成环境和权重准备后,可以通过以下步骤启动开发机的模型训练任务:修改examples/llama2/pretrain_llama2_7b_ptd.sh脚本
# 根据实际情况配置权重保存、权重加载、词表、数据集路径
CKPT_SAVE_DIR="./ckpt/llama-2-7b"#新权重保存路径
DATA_PATH="./dataset/llama-2-7b-hf/alpaca_text_document"#数据集路径
TOKENIZER_MODEL="./model_from_hf/llama-2-7b-hf/tokenizer.model"#词表路径
CKPT_LOAD_DIR="./model_weights/llama-2-7b-hf-v0.1-tp1-pp2"#权重加载路径
可直接在VScode中,使用文本编辑其中进行修改,文本编辑器内的内容会自动保存更改,无需每次手动保存。
配置分布式参数
单机 8 卡训练参数示例:
GPUS_PER_NODE=8
MASTER_ADDR=localhost
MASTER_PORT=6000
NNODES=1
NODE_RANK=0
WORLD_SIZE=$(($GPUS_PER_NODE * $NNODES))
启动训练
在终端的MindSpeed-LLM工作目录下直接执行训练脚本。
bash examples/llama2/pretrain_llama2_7b_ptd.sh
说明
由于原框架问题,第一次运行失败的话,可以尝试重复启动一下。
训练任务启动后,终端将实时打印训练日志。
训练任务-多机训练
多节点训练是提升模型训练效率、实现大规模分布式计算的关键方式。借助平台提供的训练任务工具,通过动态分配计算资源、自动化参数配置和高效的资源管理,能够快速完成大规模模型的分布式训练。以下是多节点训练的详细操作指南。
训练脚本准备
多节点训练的脚本与单节点训练脚本基本一致,仅需针对分布式参数部分进行相应调整。
复制单节点训练脚本。
# 参考单机训练脚本拷贝出一份多机训练脚本
cpexamples/llama2/pretrain_llama2_7b_ptd.shexamples/llama2/pretrain_llama2_7b_multinodes.sh
修改分布式参数,在脚本中,调整以下配置:
# examples/llama2/pretrain_llama2_7b_multinodes.sh
GPUS_PER_NODE=8
DISTRIBUTED_ARGS="
--nproc_per_node $GPUS_PER_NODE \
--nnodes $PET_NNODES \
--node_rank $PET_NODE_RANK \
--master_addr $PET_MASTER_ADDR \
--master_port $PET_MASTER_PORT
"
参数说明
$GPUS_PER_NODE:每个节点的 GPU 数量,由用户自行配置。
$NNODES:总节点数,由用户自行配置。
$PET_NNODES、$PET_NODE_RANK、$PET_MASTER_ADDR、$PET_MASTER_PORT:由平台提供的系统变量自动配置。
创建任务
多节点集群训练可使用训练任务工具创建多机多卡训练任务,创建任务可通过以下两种方式创建。
方法一:通过开发机任务创建
在开发机任务页面中创建训练任务,系统会自动选择与开发机一致的镜像版本,保证环境一致性。
方法二:通过训练任务工具创建
打开平台左侧“训练任务”选项卡,点击“新建任务”按钮。
配置任务
两种方法均会进入任务创建页面。
启动命令:
cd /work/share/demo/MindSpeed-LLM;
bash examples/llama2/pretrain_llama2_7b_multinodes.sh;
注意
此模式下,不要打开容错训练开关!
完成所有配置后,点击“提交”按钮,您的训练任务将被创建并开始执行。
监控任务
若训练任务成功拉起,任务状态变为运行中。
点击日志按钮,可实时查看所有节点的训练日志,支持筛选单节点日志或查看全量日志,方便定位问题。
若启动命令存在错误,任务无法正常启动,可以进入“事件”页面查看错误原因是否存在资源不足、网络超时等提示。或者检查日志中,根据具体报错情况,调整模型配置或训练脚本,并重新提交任务。
结语
通过本文档的实践操作,用户可以熟练掌握平台模型训练的关键流程,包括环境搭建、代码管理、镜像管理、数据处理、权重转换以及单机和多机训练等核心任务。在实际操作中,如果遇到任何问题,可以结合日志信息和平台提供的工具进行排查和优化。随着平台功能的持续升级和优化,相信在未来,用户将能够更加高效地完成大模型的训练任务,并不断探索和应用前沿的人工智能技术。