MindSpore InternLM2-20B 32卡 微调最佳实践 | 大装置帮助中心
跳到主要内容

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卡微调(随机初始化权重)

  1. 点击进入ACP高性能算力池;

  2. 选定工作空间;

  3. 点击左侧栏任务列表;

  4. 点击新建任务;

  5. 选择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卡微调(加载模型权重)

权重配置

  1. 使用上述MindSpore镜像创建CCI,并将用于下载模型权重的AFS挂载到/data目录下(或通过算力池创建任务,将AFS挂载到/data目录下,待任务运行后,进入web terminal);

  2. 权重下载;

通过下方链接下载模型权重 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模型

  1. 权重转换;

下载权重后,需要经过模型权重转换后再加载入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

算力池模型微调任务配置

  1. 进入控制台,点击ACP,并新建任务

  2. 选择MindSpore镜像

  3. 将AFS挂载到/data目录下

  4. 启动命令

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下的数据集预处理脚本