前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HCCPNV6测试指导文档

HCCPNV6测试指导文档

原创
作者头像
Yellowsun
修改2024-11-04 15:40:46
2260
修改2024-11-04 15:40:46

版本

日期

更新日志

版本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共享镜像

在「镜像」、「共享镜像」标签中,按需选择合适镜像。如果找不到对应的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镜像预装了如下软件:

  • 操作系统:TencentOS Server 3.1 (TK4,与Centos 8同源,使用yum安装软件包)
  • 内核版本:5.4.119-19.0009.28(优化版内核)
  • GPU驱动版本:535.161.07
  • CUDA版本:12.4.0
  • cuDNN版本:8.9.7
  • Docker版本: 26.1.0,build 9714adc
  • nvidia-docker2

备注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集群,或选择相同地域已有空集群。

二、系统检查

2.1. 网卡检查

代码语言:txt
复制
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)

2.2. GPU检查

代码语言:txt
复制
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

代码语言:txt
复制
systemctl enable nvidia-fabricmanager.service && systemctl restart nvidia-fabricmanager.service

三、环境准备

3.1. 挂载本地NVME盘(可选)

如果系统盘较小,比如50GB以下,建议挂载本地NVME盘,并将容器镜像的默认保存路径修改到本地NVME盘(所有训练节点都需要更新)。

代码语言:txt
复制
# 挂载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

3.2. 启动容器镜像

代码语言:txt
复制
// (所有节点)下载并启动测试镜像
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

该测试容器包含的软件版本如下:

  • base: nvcr.io/nvidia/pytorch:24.03-py3
  • OS:Ubuntu 22.04.3
  • CUDA:V12.4.99
  • python:3.10.12
  • torch:2.3.0a0+40ec155e58.nv24.3
  • deepspeed: 0.13.4
  • transformer-engine: 1.4.0+0fbc76a
  • flash-attn: 2.4.2
  • accelerate: 0.27.2
  • mmcv:2.1.0
  • mmengine:0.10.3
  • mmdet:3.3.0

该测试容器支持的demo模型包括:

/workspace/

├── Baichuan2 // baichuan2微调

├── bert // bert large微调

├── ChatGLM3 // chatGLM3微调

├── Megatron-LM // llama2、llama3、mixtral等模型预训练

├── classification // torchvision模型benchmark

├── diffusers // stable diffusion微调

├── mmdetection // mmdet训练仓库

└── tools // 脚本和工具

四、RDMA测试(裸机上)

测试两机之间极限带宽和延时:带宽测试两机bond之间互打perftest write流量,延时测试同LA及跨LA情况下bond之间send延时。

带宽测试server:

代码语言:txt
复制
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:

代码语言:txt
复制
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
  • 其中client侧需要指定server端IP, taskset绑核需要与网卡numa node一致, 并且由于pcie switch限制,若同一pcie switch上插了多张卡(比如bond0和bond1的网卡插在同一pcie switch上,则bond0和bond1需要错开测试),网卡需要错开pcie switch验证, 例如bond0/2/4/6同时测,bond1/3/5/7同时测;若每个bond的网卡有独立的pcie switch,可以同时并发测8个bond,达到3.2T带宽(pcie switch分布可以通过lspci -tv命令查询)
  • 由于单个QP只能使用一个端口,所以需要配置多个QP端口将bond带宽打满

延时测试server:

代码语言:txt
复制
ib_send_lat -d mlx5_bond_0 -a -F

延时测试client:

代码语言:txt
复制
ib_send_lat -d mlx5_bond_0 -a -F 30.7.64.146
  • 其中client侧需要指定server端IP

五、集合通信测试(容器内)

5.1. 机器列表排序

注意:4机以上机器需要topo排序,否则跨机通信性能不是最优。如果4机及以下,可以跳过排序。

  • 进入任意一台机器上容器的如下目录(保证所有机器都启动了3.2节中的容器镜像)
代码语言:txt
复制
cd workspace/tools/
  • 将要参与nccl测试机器的ENI ip(通过ifconfig eth0获取)存放到ip_eth0.txt 中,例如:
代码语言:txt
复制
cat > ip_eth0.txt << EOF
10.0.0.1
10.0.0.10
10.0.0.8
10.0.0.9
EOF
  • 排序(基于网络拓扑)
代码语言:txt
复制
bash get_rdma_order_by_ip.sh ip_eth0.txt

排序后的列表保存在当前目录的hostfile.txt

代码语言:txt
复制
10.0.0.10 
10.0.0.8
10.0.0.9
10.0.0.1
  • 上述清单中的第一个ip(10.0.0.10)将作为master节点,进入master机器的容器
  • 将排序后的ip list写入到/workspace/run_nccl_tests.sh变量『ip_list』,例如:
代码语言:txt
复制
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 训练加速引擎-文档中心-腾讯云

5.2. 启动测试nccl测试

确认脚本/workspace/run_nccl_tests.sh中,变量『ip_list』包含了所有测试节点VPC IP(通过命令ifconfig eth0获取)。

注意:由于该脚本使用mpirun启动测试,所以只需在master节点上执行。

代码语言:txt
复制
// 运行4机32卡4G数据包的AllReduce
bash run_nccl_test.sh 0 4G 32

// 运行4机32卡128M数据包的AllToAll
bash run_nccl_test.sh 1 128M 32

5.3. 参考性能数据

8卡至32卡的AllReduce测试数据如下图。测试环境基于上述docker:

descript
descript
descript
descript

六、AI测试(容器内)

6.1. llama预训练

代码语言:txt
复制
cd /workspace/Megatron-LM

// 下载数据集
bash download_dataset.sh

// 启动训练
// 支持llama2-7B、13B、70B(至少4机),llama3-8B、70B(至少4机)
bash start_llama.sh

6.2. mixtral-8x7B预训练

代码语言:txt
复制
cd /workspace/Megatron-LM

// 下载数据集
bash download_dataset.sh

// 启动训练,至少需要2台机器
bash start_mixtral.sh

6.3. baichuan2微调

代码语言:txt
复制
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

6.4. chatGLM3微调

代码语言:txt
复制
cd /workspace/ChatGLM3/finetune_demo

// 下载数据集和模型
bash download_dataset_model.sh

// 启动全量微调
bash start_ft.sh

// 验证模型效果(需要适配checkpoints路径)
python infer.py

6.5. stable diffusion微调

代码语言:txt
复制
cd /workspace/diffusers

// 下载数据集和模型
bash download_model_dataset.sh

// 启动微调
bash start.sh

6.6. ViT训练

代码语言:txt
复制
cd /workspace/classification

// 启动训练(使用fake imagenet dataset)
// 可以修改训练参数,跑不同的torchvision model和配置参数
bash start_vit.sh

6.7 Bert微调

代码语言:txt
复制
cd /workspace/bert

// 下载数据集和预训练模型
bash download_dataset_model.sh

// 启动训练
bash scripts/run_squad.sh

6.8. mmdet yolox

代码语言:txt
复制
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

6.9. 性能数据

descript
descript
descript
descript

6.10. FP8精度

6.10.1 LLama预训练(Megatron-LM)

代码语言:txt
复制
cd /workspace/Megatron-LM

// 修改start_llama.sh中如下变量,使用fp8进行预训练
//     ENABLE_FP8=true

bash start_llama2.sh
descript
descript

llama2-7B预训练Redpajama数据集,2000步情况下,BF16和FP8的收敛曲线基本一致(loss average diff: 3.64E-03)

descript
descript

6.10.2 Chatglm3-6B FP8微调(Nemo)

1,Chatglm3 FP8微调步骤如下:

代码语言:txt
复制
// 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曲线如下所示。

descript
descript

由上图loss曲线对比可以看出,Chatglm3-6B微调AdvertiseGen数据集,2K步情况下,BF16和FP8的收敛曲线基本一致。

每个step Loss绝对差异曲线如下:

descript
descript

1000个step的平均loss为:0.006513。

详细日志可以从如下链接下载:

代码语言:txt
复制
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

6.10.3 Baichuan2-7B FP8微调(Nemo)

参考 https://github.com/baichuan-inc/Baichuan2

1,Baichuan2-7B FP8微调步骤如下:

代码语言:txt
复制
// 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曲线如下所示。

descript
descript

由上图loss曲线对比可以看出,Baichuan2-7B微调belle_chat数据集,200步情况下,BF16和FP8的收敛曲线基本一致。

每个step Loss绝对差异曲线如下:

descript
descript

200个step的平均loss为:0.0056。

七、制作自定义容器镜像

7.1. 安装用户态RDMA驱动

这一步保证容器能够正确使用底层RDMA网卡。

代码语言:txt
复制
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

7.2. NCCL插件和环境变量

NCCL插件提供了腾讯星脉网络的加速能力

代码语言:txt
复制
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

八、常见问题排查

8.1 训练集群一致性检查

通过如下集群一致性检测脚本排除常见问题

代码语言:txt
复制
获取方式: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)

如果上述工具没有任何错误输出,建议联系售后支持解决。

8.2 遇到「Floating point exception (core dumped)」

HCCPNV6需要依赖CUDA 12.3+版本(CUBLAS 12.3.4.1以上版本)。如果使用低版本CUDA,比如CUDA 12.1,那么需要升级CUDA版本或者单独升级CUBLAS版本(参考如下命令)

代码语言:txt
复制
// 单独升级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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、购机选择正确的OS共享镜像
  • 二、系统检查
    • 2.1. 网卡检查
      • 2.2. GPU检查
      • 三、环境准备
        • 3.1. 挂载本地NVME盘(可选)
          • 3.2. 启动容器镜像
          • 四、RDMA测试(裸机上)
          • 五、集合通信测试(容器内)
            • 5.1. 机器列表排序
              • 5.2. 启动测试nccl测试
                • 5.3. 参考性能数据
                • 六、AI测试(容器内)
                  • 6.1. llama预训练
                    • 6.2. mixtral-8x7B预训练
                      • 6.3. baichuan2微调
                        • 6.4. chatGLM3微调
                          • 6.5. stable diffusion微调
                            • 6.6. ViT训练
                              • 6.7 Bert微调
                                • 6.8. mmdet yolox
                                  • 6.9. 性能数据
                                    • 6.10. FP8精度
                                      • 6.10.1 LLama预训练(Megatron-LM)
                                      • 6.10.2 Chatglm3-6B FP8微调(Nemo)
                                      • 6.10.3 Baichuan2-7B FP8微调(Nemo)
                                  • 七、制作自定义容器镜像
                                    • 7.1. 安装用户态RDMA驱动
                                      • 7.2. NCCL插件和环境变量
                                      • 八、常见问题排查
                                        • 8.1 训练集群一致性检查
                                          • 8.2 遇到「Floating point exception (core dumped)」
                                          相关产品与服务
                                          高性能计算集群
                                          高性能计算集群(Tencent Hyper Computing Cluster)以高性能云服务器为节点,通过 RDMA 互联,大幅提升网络性能,提供高带宽和极低延迟的网络服务。
                                          领券
                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档