版本 | 日期 | 更新日志 |
---|---|---|
版本V1 | 2024/4/11 | 产品化版本 |
版本V2 | 2024/4/25 | 更新集合通信性能,支持LLama3,支持Baichuan2 FP8等 |
版本V3 | 2024/5/8 | 更新集群选择建议,更新镜像列表 |
版本V4 | 2024/5/10 | 更新注意事项,关于HCCPNV6对GPU驱动(>= 535.161.07)和CUDA版本(>= cuda12.3)的要求 |
版本V5 | 2024/5/14 | 更新镜像列表 |
版本V6 | 2024/6/12 | 更新容器镜像(基于NGC 24.03)和常见问题(vLLM) |
版本V7 | 2024/7/10 | 更新容器镜像(支持mmdet训练仓库) |
版本V8 | 2024/9/11 | 更新5.3节中NCCL集合通信性能数据 |
在「镜像」、「共享镜像」标签中,按需选择合适镜像。如果找不到对应的OS镜像,需要提供账号信息并通知售后团队发起镜像共享。
标准场景(推荐使用TencentOS Server 3.1)
| 地域 | 镜像id | 镜像信息 |
|:----|:----|:----|:----|
| 上海 | img-lddg0nfz | TencentOS Server 3.1 |
| 上海 | img-hixleoxx | Ubuntu20.04 |
| 南京 | img-3pzfr17q | TencentOS Server 3.1 |
| 南京 | img-bd0v3ifi | Ubuntu20.04 |
OS镜像预装了如下软件:
备注1:
如果不使用「共享镜像」,镜像内需要增加一些补丁才能正常使用 ,包括:
1、GPU驱动(包括nvidia_peermem)、MLNX-OFED RDMA驱动安装命令建议包含以下参数./mlnxofedinstall --force --add-kernel-support --without-fw-update --ovs-dpdk --copy-ifnames-udev --distro rhel8.2 2、Linux内核增加ARP双发特性,支持RDMA的双发(提供内核patch) 3、镜像需使用UEFI启动模式
TKE场景 (不包含docker、Nvidia-container ,libnvidia,会自动安装)
地域 | 镜像id | 镜像名称 | 镜像信息 |
---|---|---|---|
南京 | img-1udzvide | HCCPNV6_TKE | TencentOS Server 3.1 |
备注2:
HCCPNV6对GPU驱动和CUDA版本有强制要求, 驱动:>= 535.161.07 CUDA: >= CUDA 12.3 (对应NGC 23.12及之后的版本) 建议使用该文档提供的OS镜像和容器镜像(3.2节)。
备注3:
购机选择合适的集群 HCCPNV6部署在上海八区/南京一区,建议新建HCC集群,或选择相同地域已有空集群。
ibdev2netdev
预期输出:
mlx5_bond_0 port 1 ==> bond0 (Up)
mlx5_bond_1 port 1 ==> bond1 (Up)
mlx5_bond_2 port 1 ==> bond2 (Up)
mlx5_bond_3 port 1 ==> bond3 (Up)
mlx5_bond_4 port 1 ==> bond4 (Up)
mlx5_bond_5 port 1 ==> bond5 (Up)
mlx5_bond_6 port 1 ==> bond6 (Up)
mlx5_bond_7 port 1 ==> bond7 (Up)
nvidia-smi topo -p2p n
预期输出:
GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
GPU0 X OK OK OK OK OK OK OK
GPU1 OK X OK OK OK OK OK OK
GPU2 OK OK X OK OK OK OK OK
GPU3 OK OK OK X OK OK OK OK
GPU4 OK OK OK OK X OK OK OK
GPU5 OK OK OK OK OK X OK OK
GPU6 OK OK OK OK OK OK X OK
GPU7 OK OK OK OK OK OK OK X
如果状态不符合预期,执行如下命令重启nvidia-fabricmanager
systemctl enable nvidia-fabricmanager.service && systemctl restart nvidia-fabricmanager.service
如果系统盘较小,比如50GB以下,建议挂载本地NVME盘,并将容器镜像的默认保存路径修改到本地NVME盘(所有训练节点都需要更新)。
# 挂载nvme0n1
printf "n\np\n1\n\n\nw\n" | fdisk /dev/nvme0n1
sleep 1
mkfs.ext4 /dev/nvme0n1p1
mkdir -p /data0 && mount /dev/nvme0n1p1 /data0
df -h
# (可选)修改fstab,添加系统重启之后自动挂载操作
# 修改docker默认保存路径
mv /var/lib/docker /data0/ && ln -sf /data0/docker /var/lib/docker
systemctl restart docker
// (所有节点)下载并启动测试镜像
docker run \
-itd \
--gpus all \
--privileged --cap-add=IPC_LOCK \
--ulimit memlock=-1 --ulimit stack=67108864 \
-v /data0:/data \
--net=host \
--ipc=host \
--name=ai haihub.cn/tencent/taco-train/cuda12.3-ofed5.8-nccl2.19.3-torch2.2-2.4:latest
该测试容器包含的软件版本如下:
该测试容器支持的demo模型包括:
/workspace/
├── Baichuan2 // baichuan2微调
├── bert // bert large微调
├── ChatGLM3 // chatGLM3微调
├── Megatron-LM // llama2、llama3、mixtral等模型预训练
├── classification // torchvision模型benchmark
├── diffusers // stable diffusion微调
├── mmdetection // mmdet训练仓库
└── tools // 脚本和工具
测试两机之间极限带宽和延时:带宽测试两机bond之间互打perftest write流量,延时测试同LA及跨LA情况下bond之间send延时。
带宽测试server:
taskset -c 10,11 ib_write_bw -d mlx5_bond_0 -x 3 -F --report_gbits -p 18500 -D 2 -q 16 --run_infinitely
taskset -c 12,13 ib_write_bw -d mlx5_bond_1 -x 3 -F --report_gbits -p 18501 -D 2 -q 16 --run_infinitely
taskset -c 14,15 ib_write_bw -d mlx5_bond_2 -x 3 -F --report_gbits -p 18502 -D 2 -q 16 --run_infinitely
taskset -c 16,17 ib_write_bw -d mlx5_bond_3 -x 3 -F --report_gbits -p 18503 -D 2 -q 16 --run_infinitely
taskset -c 100,101 ib_write_bw -d mlx5_bond_4 -x 3 -F --report_gbits -p 18504 -D 2 -q 16 --run_infinitely
taskset -c 102,103 ib_write_bw -d mlx5_bond_5 -x 3 -F --report_gbits -p 18505 -D 2 -q 16 --run_infinitely
taskset -c 104,105 ib_write_bw -d mlx5_bond_6 -x 3 -F --report_gbits -p 18506 -D 2 -q 16 --run_infinitely
taskset -c 106,107 ib_write_bw -d mlx5_bond_7 -x 3 -F --report_gbits -p 18507 -D 2 -q 16 --run_infinitely
带宽测试client:
taskset -c 10,11 ib_write_bw -d mlx5_bond_0 -x 3 -F --report_gbits -p 18500 -D 2 -q 16 --run_infinitely 30.139.10.138
taskset -c 12,13 ib_write_bw -d mlx5_bond_1 -x 3 -F --report_gbits -p 18501 -D 2 -q 16 --run_infinitely 30.139.10.246
taskset -c 14,15 ib_write_bw -d mlx5_bond_2 -x 3 -F --report_gbits -p 18502 -D 2 -q 16 --run_infinitely 30.139.11.118
taskset -c 16,17 ib_write_bw -d mlx5_bond_3 -x 3 -F --report_gbits -p 18503 -D 2 -q 16 --run_infinitely 30.139.11.138
taskset -c 100,101 ib_write_bw -d mlx5_bond_4 -x 3 -F --report_gbits -p 18504 -D 2 -q 16 --run_infinitely 30.139.11.170
taskset -c 102,103 ib_write_bw -d mlx5_bond_5 -x 3 -F --report_gbits -p 18505 -D 2 -q 16 --run_infinitely 30.139.11.238
taskset -c 104,105 ib_write_bw -d mlx5_bond_6 -x 3 -F --report_gbits -p 18506 -D 2 -q 16 --run_infinitely 30.139.11.50
taskset -c 106,107 ib_write_bw -d mlx5_bond_7 -x 3 -F --report_gbits -p 18507 -D 2 -q 16 --run_infinitely 30.139.11.98
延时测试server:
ib_send_lat -d mlx5_bond_0 -a -F
延时测试client:
ib_send_lat -d mlx5_bond_0 -a -F 30.7.64.146
注意:4机以上机器需要topo排序,否则跨机通信性能不是最优。如果4机及以下,可以跳过排序。
cd workspace/tools/
cat > ip_eth0.txt << EOF
10.0.0.1
10.0.0.10
10.0.0.8
10.0.0.9
EOF
bash get_rdma_order_by_ip.sh ip_eth0.txt
排序后的列表保存在当前目录的hostfile.txt中
10.0.0.10
10.0.0.8
10.0.0.9
10.0.0.1
declare -a ip_list=(
10.0.0.10
10.0.0.8
10.0.0.9
10.0.0.1
)
注意:为什么需要排序列表?参考:计算加速套件 TACO Kit TCCL 使用说明-TACO Train AI 训练加速引擎-文档中心-腾讯云
确认脚本/workspace/run_nccl_tests.sh中,变量『ip_list』包含了所有测试节点VPC IP(通过命令ifconfig eth0
获取)。
注意:由于该脚本使用mpirun启动测试,所以只需在master节点上执行。
// 运行4机32卡4G数据包的AllReduce
bash run_nccl_test.sh 0 4G 32
// 运行4机32卡128M数据包的AllToAll
bash run_nccl_test.sh 1 128M 32
8卡至32卡的AllReduce测试数据如下图。测试环境基于上述docker:
cd /workspace/Megatron-LM
// 下载数据集
bash download_dataset.sh
// 启动训练
// 支持llama2-7B、13B、70B(至少4机),llama3-8B、70B(至少4机)
bash start_llama.sh
cd /workspace/Megatron-LM
// 下载数据集
bash download_dataset.sh
// 启动训练,至少需要2台机器
bash start_mixtral.sh
cd /workspace/Baichuan2/fine-tune
// 下载数据集
bash download_model.sh
// 启动微调
bash start.sh
// FP8微调
bash start.sh 127.0.0.1 4 true
// 验证模型效果(需要适配checkpoints路径)
python infer.py
cd /workspace/ChatGLM3/finetune_demo
// 下载数据集和模型
bash download_dataset_model.sh
// 启动全量微调
bash start_ft.sh
// 验证模型效果(需要适配checkpoints路径)
python infer.py
cd /workspace/diffusers
// 下载数据集和模型
bash download_model_dataset.sh
// 启动微调
bash start.sh
cd /workspace/classification
// 启动训练(使用fake imagenet dataset)
// 可以修改训练参数,跑不同的torchvision model和配置参数
bash start_vit.sh
cd /workspace/bert
// 下载数据集和预训练模型
bash download_dataset_model.sh
// 启动训练
bash scripts/run_squad.sh
cd /workspace/mmdetection
//下载COCO 2017数据集
bash download_dataset.sh
//启动训练
bash tools/dist_train.sh configs/yolox/yolox_l_8xb8-300e_coco.py 8 --cfg-options fp16.loss_scale=dynamic train_dataloader.batch_size=24 train_dataloader.num_workers=8
cd /workspace/Megatron-LM
// 修改start_llama.sh中如下变量,使用fp8进行预训练
// ENABLE_FP8=true
bash start_llama2.sh
llama2-7B预训练Redpajama数据集,2000步情况下,BF16和FP8的收敛曲线基本一致(loss average diff: 3.64E-03)
1,Chatglm3 FP8微调步骤如下:
// 1,启动镜像
docker run -it --gpus all --privileged --cap-add=IPC_LOCK --ulimit memlock=-1 --ulimit stack=67108864 --net=host --ipc=host --name=finetune -v /data0:/data -w /workspace haihub.cn/tencent/taco/taco-train/cuda12.3-nccl2.20.3-torch2.3-nemo-24.03-1.4:latest
// 2,下载数据
cd chatglm3-6b-finetune/
bash download_dataset_model.sh
// 3,转换模型
bash convert.sh
// 4,finetune模型
bash run_chatglm_sft.sh
// 5,查看fintune效果
bash generate.sh
分别使用BF16和FP8在AdvertiseGen数据集上跑了1000 step,2者loss曲线如下所示。
由上图loss曲线对比可以看出,Chatglm3-6B微调AdvertiseGen数据集,2K步情况下,BF16和FP8的收敛曲线基本一致。
每个step Loss绝对差异曲线如下:
1000个step的平均loss为:0.006513。
详细日志可以从如下链接下载:
FP16
https://taco-1251783334.cos.ap-shanghai.myqcloud.com/H20/logs/chatglm/chatglm_sft_fp16_2024_04_22.log
FP8
https://taco-1251783334.cos.ap-shanghai.myqcloud.com/H20/logs/chatglm/chatglm_sft_fp8_2024_04_22.log
参考 https://github.com/baichuan-inc/Baichuan2
1,Baichuan2-7B FP8微调步骤如下:
// 1,启动镜像
docker run -it --gpus all --privileged --cap-add=IPC_LOCK --ulimit memlock=-1 --ulimit stack=67108864 --net=host --ipc=host --name=finetune -v /data0:/data -w /workspace haihub.cn/tencent/taco/taco-train/cuda12.3-nccl2.20.3-torch2.3-nemo-24.03-1.4:latest
// 2,下载数据
cd baichuan2-7b-finetune/
bash download_model.sh
// 3,转换模型
bash convert.sh
// 4,finetune模型
bash baichuan_sft_fp8.sh
// 5,查看fintune效果
bash generate_fp8.sh
分别使用FP16和FP8在belle_chat数据集上跑了200 step,2者loss曲线如下所示。
由上图loss曲线对比可以看出,Baichuan2-7B微调belle_chat数据集,200步情况下,BF16和FP8的收敛曲线基本一致。
每个step Loss绝对差异曲线如下:
200个step的平均loss为:0.0056。
这一步保证容器能够正确使用底层RDMA网卡。
RUN wget -q --show-progress https://taco-1251783334.cos.ap-shanghai.myqcloud.com/ofed/MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu22.04-x86_64.tgz && \
tar xf MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu22.04-x86_64.tgz && \
cd MLNX_OFED_LINUX-5.8-2.0.3.0-ubuntu22.04-x86_64 && \
./mlnxofedinstall --user-space-only --without-fw-update --without-ucx-cuda --force && cd ../ && rm MLNX_OFED_LINUX* -rf
NCCL插件提供了腾讯星脉网络的加速能力
RUN sed -i '/nccl_rdma_sharp_plugin/d' /etc/ld.so.conf.d/hpcx.conf
RUN wget -q --show-progress "https://taco-1251783334.cos.ap-shanghai.myqcloud.com/nccl/plugin/ubuntu22.04/nccl-rdma-sharp-plugins_1.4_amd64.deb" && \
dpkg -i nccl-rdma-sharp-plugins_1.4_amd64.deb && rm -f nccl-rdma-sharp-plugins_1.4_amd64.deb
ENV NCCL_SOCKET_IFNAME=eth0
ENV NCCL_IB_GID_INDEX=3
ENV NCCL_IB_DISABLE=0
ENV NCCL_NET_GDR_LEVEL=2
ENV NCCL_IB_QPS_PER_CONNECTION=4
ENV NCCL_IB_TC=160
ENV NCCL_IB_TIMEOUT=22
通过如下集群一致性检测脚本排除常见问题
获取方式:wget https://llm-diagnose-1258344699.cos.ap-guangzhou.myqcloud.com/tool/cluster_check.sh
使用方式:
集群检查: bash cluster_check.sh -f host.txt
单节点检查: bash cluster_check.sh -s
k8s模式集群检查: bash cluster_check.sh -f host.txt -k -kc kubectl.config -n namespace -c container_name
kubectl.config: 凭证文件
namespace: 命名空间
container_name: 容器名(获取方式: kubectl get pods xxxx -o jsonpath={.spec.containers[*].name})
host.txt: ip列表(每行一个 IP)
如果上述工具没有任何错误输出,建议联系售后支持解决。
HCCPNV6需要依赖CUDA 12.3+版本(CUBLAS 12.3.4.1以上版本)。如果使用低版本CUDA,比如CUDA 12.1,那么需要升级CUDA版本或者单独升级CUBLAS版本(参考如下命令)
// 单独升级cublas
pip3 install nvidia-cublas-cu12==12.3.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
另外,训练场景或者其他依赖CUDA的第三方组件的场景,也可能遇到类似的错误,
解决办法:升级组件版本。如果社区版本不支持最新CUDA,可以尝试基于CUDA 12.3+的环境编译安装相应组件。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。