MindeSpore 已经适配 DeepSeek-V3 的训练推理啦,下面是使用 MindSpore 对DeepSeek-V3做训练的过程。
一、环境确认
这里呢我使用的是 8张 910B2 的显卡:
其中 MindSpore Transformers 的环境依赖如下:
Python | MindSpore | CANN | 固件与驱动 |
---|---|---|---|
3.10 | 2.4.10 | 8.0.RC3.betaq | 24.1.RC3 |
也可以使用为 DeepSeek-V3 预训练专门配置的 Docker 镜像,在容器中已经拉取了 deepseek-V3 仓库的代码
# 下载镜像
docker pull swr.cn-central-221.ovaijisuan.com/mindformers/deepseek_v3_mindspore2.4.10-train:20250209
# 创建环境变量
export image_name=swr.cn-central-221.ovaijisuan.com/mindformers/deepseek_v3_mindspore2.4.10-train:20250209
export docker_name=deepseek_v3
# 创建容器
docker run -itd -u root \
--ipc=host --net=host \
--privileged \
--device=/dev/davinci0 \
--device=/dev/davinci1 \
--device=/dev/davinci2 \
--device=/dev/davinci3 \
--device=/dev/davinci4 \
--device=/dev/davinci5 \
--device=/dev/davinci6 \
--device=/dev/davinci7 \
--device=/dev/davinci_manager \
--device=/dev/devmm_svm \
--device=/dev/hisi_hdc \
-v /etc/localtime:/etc/localtime \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/Ascend/driver/tools/hccn_tool:/usr/local/bin/hccn_tool \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /var/log/npu:/usr/slog \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /etc/hccn.conf:/etc/hccn.conf \
--name "$docker_name" \
"$image_name" \
/bin/bash
# 进入容器
docker exec -ti deepseek_v3 bash
二、数据集准备
预训练需要用到两个数据集,分别是 wikiText2 和 分词模型
# 下载 WikiText2数据集
wget https://ascend-repo-modelzoo.obs.cn-east-2.myhuaweicloud.com/MindFormers/dataset/wikitext-2/wikitext-2-v1.zip
# 解压数据集
unzip ./wikitext-2-v1.zip
# 下载分词模型(需要科学的上网)
wget https://huggingface.co/deepseek-ai/DeepSeek-V3/resolve/main/tokenizer.json
# 上传数据集文件 wiki.train.tokens 和分词模型文件tokenizer.json 到服务器的 /root 目录下
scp -P <端口号> wikitext-2/wiki.train.tokens root@<ip地址>:/root
scp -P <端口号> tokenizer.json root@<ip地址>:/root
# 从宿主机器复制 数据集文件 wiki.train.tokens 和分词模型文件tokenizer.json 到容器的 /home/work/dataset 目录下
# 容器内创建文件夹
mkdir dataset
# 宿主机器上执行 docker cp
docker cp tokenizer.json deepseek_v3:/home/work/dataset
docker cp wiki.train.tokens deepseek_v3:/home/work/dataset
在预训练前,我们首先需要处理一下数据集,转换为 Megatron bin 文件
# 在容器中执行
cd /home/work/mindformers/research/deepseek3
# 执行对应脚本
python wikitext_to_bin.py \
--input /home/work/dataset/wiki.train.tokens \
--output-prefix /home/work/dataset/wiki_4096 \
--vocab-file /home/work/dataset/tokenizer.json \
--seq-length 4096 \
--workers 2
三、配置文件修改
基于预训练配置文件 pretrain_deepseek3_671b.yaml
按照如下步骤操作并保存为 pretrain_deepseek3_1b.yaml
cd /home/work/mindformers/research/deepseek3/deepseek3_671b
cp pretrain_deepseek3_671b.yaml pretrain_deepseek3_1b.yaml
3.1 修改模型配置
# model config
model:
model_config:
type: DeepseekV3Config
auto_register: deepseek3_config.DeepseekV3Config
seq_length: 4096
hidden_size: 2048 # 修改为2048
num_layers: &num_layers 3 # 修改为3
num_heads: 8 # 修改为8
max_position_embeddings: 4096
intermediate_size: 6144 # 修改为6144
offset: 0 # 修改为0
3.2 修改模型配置
#moe
moe_config:
expert_num: &expert_num 16 # 修改为16
first_k_dense_replace: 1 # 修改为1
3.3 修改并行配置
# parallel config for devices num=8
parallel_config:
data_parallel: &dp 2 # 修改为2
model_parallel: 2 # 修改为2
pipeline_stage: 2 # 修改为2
expert_parallel: 2 # 修改为2
micro_batch_num: µ_batch_num 4 # 修改为4
parallel:
parallel_optimizer_config:
optimizer_weight_shard_size: 8 # 修改为8
3.4 修改学习率配置
# lr schedule
lr_schedule:
type: ConstantWarmUpLR
warmup_steps: 20
3.5 修改数据集配置
配置数据集路径
# dataset
train_dataset: &train_dataset
data_loader:
type: BlendedMegatronDatasetDataLoader
config:
data_path:
- 1
- "/home/work/dataset/wiki_4096_text_document" # 修改此项为数据集路径
配置数据集并行通信配置路径
# mindspore context init config
context:
ascend_config:
parallel_speed_up_json_path: "/home/work/mindformers/research/deepseek3/parallel_speed_up.json" # 修改此项为数据集并行通信配置路径
四、启动训练任务
代码根目录并执行以下命令拉起单台Atlas 800T A2(64G)预训练任务
cd /home/work/mindformers
bash scripts/msrun_launcher.sh "run_mindformer.py \
--register_path research/deepseek3 \
--config research/deepseek3/deepseek3_671b/pretrain_deepseek3_1b.yaml"
启动脚本执行完毕会在后台拉起任务,日志保存在 /home/work/mindformers/output/msrun_log
下,使用以下命令查看训练日志(由于开启了流水并行pipeline_stage: 2,loss 只显示在最后一张卡的日志 worker_7.log
中,其他日志显示 loss
为 0):
tail -f /home/work/mindformers/output/msrun_log/worker_7.log
训练过程中的权重 checkpoint 将会保存在 /home/work/mindformers/output/checkpoint
下。
开源链接
昇思MindSpore开源社区训练代码
魔乐社区推理代码
开箱即用教程
注: 不同的终端中 \
符号可能会影响命令的执行,如果相关命令报错可以尝试去掉 \
进行尝试