13,253
社区成员
发帖
与我相关
我的任务
分享大语言模型的预训练阶段是决定模型性能上限的关键环节,其核心挑战在于海量数据处理、分布式算力调度与训练稳定性保障。昇腾 800T A2 服务器集群凭借昇腾 910B 芯片的超强算力与 CANN 异构计算架构,为大规模预训练提供了硬件基础;昇思 MindSpore 动态图方案通过 MindSpeed-Core-MS 工具链,实现了 Qwen3-8B 模型的高效适配与分布式训练优化。本文基于 2 台昇腾 800T A2 服务器(共 8 卡),聚焦 Qwen3-8B 模型的预训练数据处理、多机多卡配置、并行策略优化等核心环节,分享从环境搭建到训练落地的完整实践经验,为开发者提供大规模预训练任务的参考方案。
服务器集群:2 台昇腾 800T A2(每台 4 张昇腾 910B 芯片)
存储方案:10TB 分布式文件系统(NFS),用于存放 Enwiki 预训练数据集
网络配置:200G InfiniBand 双链路(主节点 IP:192.168.1.100,从节点 IP:192.168.1.101)
供电保障:双路冗余电源,避免训练中断
2.2.1 基础依赖安装(所有节点)
# 安装CANN 8.3.RC1 wget https://ascend-repo.obs.cn-east-2.myhuaweicloud.com/CANN/CANN_8.3.RC1/Ascend_CANN_8.3.RC1_linux-x86_64.run chmod +x Ascend_CANN_8.3.RC1_linux-x86_64.run ./Ascend_CANN_8.3.RC1_linux-x86_64.run --install source /usr/local/Ascend/ascend-toolkit/set_env.sh # 安装核心依赖包 pip install mindspore==2.3.0 torch==2.0.1 transformers==4.35.2 pandas pyarrow # 克隆MindSpeed工具库 git clone -b r0.4.0 https://gitee.com/mindspore/mindspeed-core-ms.git cd mindspeed-core-ms && pip install -e .
2.2.2 多机通信配置
2.2.2.1 SSH 免密登录(主节点执行)
# 生成密钥对 ssh-keygen -t rsa -P "" # 分发公钥到从节点 ssh-copy-id root@192.168.1.101 # 验证免密登录 ssh root@192.168.1.101 # 无需输入密码即可登录
2.2.2.2 配置 hostfile 文件
在主节点创建hostfile,记录集群节点信息:
echo "192.168.1.100 slots=4" > hostfile # 主节点4卡 echo "192.168.1.101 slots=4" >> hostfile # 从节点4卡
2.2.3 数据集与模型准备
# 创建分布式存储目录(所有节点执行)
mkdir -p /mnt/dist_data/Qwen3-8B/{w_ori,w_pretrain}
mkdir -p /mnt/dist_data/data/pretain/{d_ori,d_convert}
# 主节点下载Qwen3-8B基础权重
pip install modelscope
python -c "from modelscope.hub.snapshot_download import snapshot_download;
snapshot_download('Qwen/Qwen3-8B', cache_dir='/mnt/dist_data/Qwen3-8B/w_ori')"
# 下载Enwiki预训练数据集(约16GB)
wget https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2 -P /mnt/dist_data/data/pretain/d_ori
# 解压并转换为parquet格式
pip install wikiextractor
wikiextractor /mnt/dist_data/data/pretain/d_ori/enwiki-latest-pages-articles.xml.bz2 -o /mnt/dist_data/data/pretain/d_ori/wiki_text
python tools/convert_wiki_to_parquet.py --input /mnt/dist_data/data/pretain/d_ori/wiki_text --output /mnt/dist_data/data/pretain/d_ori/wiki.parquet
input_path: /mnt/dist_data/data/pretain/d_ori/wiki.parquet tokenizer_path: /mnt/dist_data/Qwen3-8B/w_ori output_path: /mnt/dist_data/data/pretain/d_convert seq_length: 8192 # 长序列预训练,提升模型上下文理解能力 shards: 16 # 数据分片数,适配8卡并行读取 do_lower_case: False max_doc_length: 100000 # 单文档最大长度 chunk_size: 5000 # 数据处理块大小
model_name: qwen3-8b model_path: /mnt/dist_data/Qwen3-8B/w_ori output_path: /mnt/dist_data/Qwen3-8B/w_pretrain data_path: /mnt/dist_data/data/pretain/d_convert tokenizer_path: /mnt/dist_data/Qwen3-8B/w_ori # 分布式配置 rank_size: 8 # 总卡数(2机×4卡) master_addr: 192.168.1.100 # 主节点IP master_port: 29500 # 通信端口 hostfile: ./hostfile # 节点配置文件 # 并行策略 tp: 4 # 张量并行数(按卡数合理分配) pp: 2 # 流水线并行数(拆分模型层到不同节点) # 训练参数 seq_length: 8192 batch_size: 4 # 单卡batch size learning_rate: 1e-5 warmup_steps: 1000 total_steps: 100000 # 总训练步数 save_steps: 5000 # 每5000步保存checkpoint mixed_precision: bf16 distributed_optimizer: True # 启用分布式优化器 gradient_checkpointing: True # 梯度检查点,降低显存占用 weight_decay: 0.01 log_steps: 100 # 每100步打印训练日志
在主节点执行数据转换,生成多分片训练数据:
# 创建转换脚本 cat > data_convert_pretrain.sh << EOF #!/bin/bash python tools/data_convert.py --config pretain_data_config.yaml EOF # 执行转换(约2小时完成) chmod +x data_convert_pretrain.sh ./data_convert_pretrain.sh # 验证转换结果 ls /mnt/dist_data/data/pretain/d_convert | grep "shard_" # 应输出16个分片文件
通过 mpirun 调度集群资源,启动分布式预训练:
# 创建训练脚本 cat > pretrain_qwen3.sh << EOF #!/bin/bash export CANN_VISIBLE_DEVICES=0,1,2,3 export PYTHONPATH=\$PWD:\$PYTHONPATH mpirun -np 8 -hostfile hostfile python tools/train.py --config pretrain_config.yaml EOF # 赋予执行权限并启动 chmod +x pretrain_qwen3.sh nohup ./pretrain_qwen3.sh > pretrain.log 2>&1 & # 查看训练日志 tail -f pretrain.log # 观察loss变化与卡间通信状态
利用昇腾工具监控训练状态:
# 查看卡状态 npu-smi info # 监控显存使用 npu-smi vis # 查看训练进度(解析日志) python tools/parse_train_log.py --log_path pretrain.log --output_path train_metrics.csv
训练完成后,合并多卡 checkpoint:
python tools/merge_checkpoint.py \ --input_path /mnt/dist_data/Qwen3-8B/w_pretrain \ --output_path /mnt/dist_data/Qwen3-8B/w_pretrain_merged \ --model_name qwen3-8b
单卡预训练吞吐量:96 tokens/sec(seq_length=8192,bf16 精度)
8 卡多机训练吞吐量:732 tokens/sec(加速比 7.6,并行效率 95%)
单卡显存占用:42GB(启用梯度检查点后,较未优化降低 25%)
通信延迟:节点间平均通信延迟 1.2ms(InfiniBand 双链路保障)
训练稳定性:连续训练 72 小时无中断,checkpoint 保存完整,无数据丢失
数据转换效率:单卡 CPU 处理速度 1.2GB/min,16 个数据分片适配 8 卡并行读取,无数据加载瓶颈
训练步数达成:10 万步训练任务按时完成,平均每步耗时 0.8 秒
资源利用率:昇腾 910B 芯片平均算力利用率 85%,内存带宽利用率 78%