MindSpore InternLM2-20B 32卡 微调最佳实践
框架介绍
MindSpore 是华为推出的一个全场景深度学习框架,旨在实现易开发、高效执行和全场景覆盖。支持动态图和静态图统一的编码方式,用户可以轻松切换模式,无需编写多套代码。MindSpore 的设计使得 AI 编程变得简单,用户可以使用 Python 原生控制逻辑构建复杂的神经网络模型。它还支持自动微分,用户无需手动求导,从而减少错误。此外,MindSpore 统一了单机和分布式训练的编码方式,开发者只需添加少量代码即可实现分布式训练,大大降低了 AI 开发的门槛。MindSpore 提供了不同层次的 API,从低阶的张量定义和基础算子到高阶的训练推理管理,满足不同用户的需求。
官网链接:https://www.mindspore.cn/tutorial/zh-CN/r1.2/introduction.html
模型介绍
第二代浦语模型, InternLM2 包含 7B 和 20B 两个量级的模型。InternLM2 的基础模型具备以下的技术特点:
- 有效支持20万字超长上下文:模型在20万字长输入中几乎完美地实现长文“大海捞针”,而且在 LongBench 和 L-Eval 等长文任务中的表现也达到开源模型中的领先水平;
- 综合性能全面提升:各能力维度相比上一代模型全面进步,在推理、数学、代码等方面的能力提升显著。
使用前提
前置动作1:在弹性计算集群(AEC2)创建工作空间 --> 创建节点 --> 将节点绑定到目标集群。如您已经有可用集群则可以忽视本步骤。前置动作2:在文件存储AFS创建文件系统(若采取随机初始化权重则无需创建AFS文件系统)
MindSpore镜像使用
镜像中包含了MindSpore的基础环境和mindformer的脚本:
激活MindSpore环境:
source activate mindspore_dev
mindformers脚本:
/root/workspace/mindformers
InternLM2-20B模型32卡微调(随机初始化权重)
点击进入ACP高性能算力池;
选定工作空间;
点击左侧栏任务列表;
点击新建任务;
选择MindSpore镜像
在完成基本算力池任务配置后,复制以下训练启动命令,创建任务即可启动20B 32卡随机初始化权重的微调
export HCCL_RDMA_TC=104
export HCCL_BUFFSIZE=300
export HCCL_IF_BASE_PORT=30000
export HCCL_INTRA_ROCE_ENABLE=1
export HCCL_INTRA_PCIE_ENABLE=0
export HCCL_CONNECT_TIMEOUT=1600
source activate mindspore_dev
# the root directory of run package
LOCAL_ASCEND=/usr/local/Ascend
export LD_LIBRARY_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/lib64:${LOCAL_ASCEND}/driver/lib64:${LOCAL_ASCEND}/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe/op_tiling:${LD_LIBRARY_PATH}
export TBE_IMPL_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe
export ASCEND_OPP_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp
export ASCEND_AICPU_PATH=${ASCEND_OPP_PATH}/..
export PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/compiler/ccec_compiler/bin/:${PATH}
export PYTHONPATH=${TBE_IMPL_PATH}:${PYTHONPATH}
#source cann的环境变量,msprof生效;
source /usr/local/Ascend/ascend-toolkit/set_env.sh
master_IP=$(nslookup "$MASTER_ADDR" | awk '/^Address: / {print $2}')
echo "master_IP address of $MASTER_ADDR is: $master_IP"
sed -i '3a bbb' /usr/local/Ascend/ascend-toolkit/latest/opp/built-in/fusion_pass/config/fusion_config.json
sed -i 's/bbb/ "ZZMatMulToMatmulV3FusionPass": "off",/g' /usr/local/Ascend/ascend-toolkit/latest/opp/built-in/fusion_pass/config/fusion_config.json
export GLOG_v=2
export ENABLE_CELL_REUSE=1
export SHARED_PATHS="/root/workspace/mindformers/output_20b,/root/workspace/mindformers/checkpoint_download"
sed -i 's/\r$//' mindformers/scripts/msrun_launcher_20b.sh
sed -i 's/epochs: 2/epochs: 0.1/g' mindformers/research/internlm2/finetune_internlm2_20b_32p_old.yaml
bash mindformers/scripts/msrun_launcher_20b.sh \
"python mindformers/research/internlm2/run_internlm2.py \
--config mindformers/research/internlm2/finetune_internlm2_20b_32p_old.yaml \
--train_dataset mindformers/data/alpaca_zh_51k_4096.mindrecord \
--run_mode finetune \
--use_parallel True" \
32 16 $master_IP $MASTER_PORT $RANK mindformers/output_20b/msrun_log False 1600
tail -f mindformers/output_20b/msrun_log/worker_$RANK.log
参数说明:
启动脚本入口:
mindformers/scripts/msrun_launcher_20b.sh
参数:当前随机初始化权重,不加载预训练权重,采用mindformers/data/内所有数据集进行微调
"python mindformers/research/internlm2/run_internlm2.py #internlm2的入口python脚本
--config mindformers/research/internlm2/finetune_internlm2_20b_32p_old.yaml #intenrlm2的模型配置,并行策略配置等
--train_dataset mindformers/data/ #预处理好的训练数据目录
--run_mode finetune #训练模式
--use_parallel True" #开启并行策略
#可以指定训练数据集,如指定alpaca:
"python mindformers/research/internlm2/run_internlm2.py #internlm2的入口python脚本
--config mindformers/research/internlm2/finetune_internlm2_20b_32p_old.yaml #intenrlm2的模型配置,并行策略配置等
--train_dataset mindformers/data/alpaca_zh_51k_4096.mindrecord
--run_mode finetune #训练模式
--use_parallel True" #开启并行策略
InternLM2-20B模型32卡微调(加载模型权重)
权重配置
使用上述MindSpore镜像创建CCI,并将用于下载模型权重的AFS挂载到/data目录下(或通过算力池创建任务,将AFS挂载到/data目录下,待任务运行后,进入web terminal);
权重下载;
通过下方链接下载模型权重 https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm2-20b.git
# mount AFS to /data
mkdir -p /data/checkpoint_download/ #或替换为其他目录
cd /data/checkpoint_download/
apt update
apt install git #若还未下载git,需先install
git init #若git clone无法clone完整的权重,可能需要先下载lfs(git扩展:Large File Storage)
apt-get install git-lfs
git lfs install
git clone https://www.modelscope.cn/Shanghai_AI_Laboratory/internlm2-20b.git #clone模型
- 权重转换;
下载权重后,需要经过模型权重转换后再加载入mindformers进行训练:
source activate mindspore_dev
cd /root/workspace/mindformers
#若报错,需先下载部分包
python convert_weight.py \
--model internlm2 \
--input_path /data/checkpoint_download/internlm2-20b \ # 可替换为模型下载目录
--output_path /data/checkpoint_download/internlm2-20b_ms_noqkv/internlm2_weight_ms_noqkv.ckpt \ #可替换为自定义输出目录
--qkv_concat False #True 解决动态shape 关闭qkv_concat
算力池模型微调任务配置
进入控制台,点击ACP,并新建任务
选择MindSpore镜像
将AFS挂载到/data目录下
启动命令
export HCCL_RDMA_TC=104
export HCCL_BUFFSIZE=300
export HCCL_IF_BASE_PORT=30000
export HCCL_INTRA_ROCE_ENABLE=1
export HCCL_INTRA_PCIE_ENABLE=0
export HCCL_CONNECT_TIMEOUT=1600
source activate mindspore_dev
# the root directory of run package
LOCAL_ASCEND=/usr/local/Ascend
export LD_LIBRARY_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/lib64:${LOCAL_ASCEND}/driver/lib64:${LOCAL_ASCEND}/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe/op_tiling:${LD_LIBRARY_PATH}
export TBE_IMPL_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe
export ASCEND_OPP_PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/opp
export ASCEND_AICPU_PATH=${ASCEND_OPP_PATH}/..
export PATH=${LOCAL_ASCEND}/ascend-toolkit/latest/compiler/ccec_compiler/bin/:${PATH}
export PYTHONPATH=${TBE_IMPL_PATH}:${PYTHONPATH}
#source cann的环境变量,msprof生效;
source /usr/local/Ascend/ascend-toolkit/set_env.sh
master_IP=$(nslookup "$MASTER_ADDR" | awk '/^Address: / {print $2}')
echo "master_IP address of $MASTER_ADDR is: $master_IP"
sed -i '3a bbb' /usr/local/Ascend/ascend-toolkit/latest/opp/built-in/fusion_pass/config/fusion_config.json
sed -i 's/bbb/ "ZZMatMulToMatmulV3FusionPass": "off",/g' /usr/local/Ascend/ascend-toolkit/latest/opp/built-in/fusion_pass/config/fusion_config.json
export GLOG_v=2
export ENABLE_CELL_REUSE=1
export SHARED_PATHS="/root/workspace/mindformers/output_20b,/root/workspace/mindformers/checkpoint_download"
sed -i 's/\r$//' mindformers/scripts/msrun_launcher_20b.sh
bash mindformers/scripts/msrun_launcher_20b.sh \
"python mindformers/research/internlm2/run_internlm2.py \
--config mindformers/research/internlm2/finetune_internlm2_20b_32p_old.yaml \
--train_dataset mindformers/data/ \
--load_checkpoint /data/checkpoint_download/internlm2-20b_ms_noqkv \
--run_mode finetune \
--use_parallel True"
32 16 $master_IP $MASTER_PORT $RANK mindformers/output_20b/msrun_log False 1600
tail -f mindformers/output_20b/msrun_log/worker_$RANK.log
参数说明
#启动脚本入口
mindformers/scripts/msrun_launcher_20b.sh
#脚本参数
"python mindformers/research/internlm2/run_internlm2.py #internlm2的入口python脚本
--config mindformers/research/internlm2/finetune_internlm2_20b_32p_old.yaml #intenrlm2的模型配置,并行策略配置等
--train_dataset mindformers/data/ #预处理好的训练数据目录
--load_checkpoint output/x_tran_ckpt_copy_chat_20b_32p_48l_242_noqkv/internlm2-20b-ms-noqkv #微调初始权重
--run_mode finetune #训练模式
--use_parallel True" #开启并行策略
Tips:数据预处理
MindSpore使用私有的mindrecrd数据格式,微调前需要预处理数据。 以alpaca作为微调数据集。
wget https://gitee.com/link?target=https%3A%2F%2Fgithub.com%2Ftatsu-lab%2Fstanford_alpaca%2Fblob%2Fmain%2Falpaca_data.json
下载数据集后,使用预处理脚本research/internlm2/alpaca_data_preprocess.py生成mindrecord训练数据:
python alpaca_data_preprocess.py \
--mindrecord_schema internlm2_alpaca \
--input_glob {path}/alpaca_data.json \
--output_file {path}/alpaca_processed/alpaca.mindrecord \
--model_file {path}/tokenizer.model \
--seq_length 2048
对于packed数据: 参考mindformers/scripts/pack下的数据集预处理脚本