Skip to main content

HCA 与 RDMA 详解

一、HCA 是什么

查看你的设备上是否有IB网卡?

$ ls /dev/infiniband/
issm0 issm1 rdma_cm umad0 umad1 uverbs0 uverbs1

$ ibv_devices
device node GUID
------ ----------------
mlx5_0 e8ebd303004325cc
mlx5_1 e8ebd303004325cd

查看IB设备详细信息:

$ ibv_devinfo
hca_id: mlx5_0
transport: InfiniBand (0)
fw_ver: 16.27.4200
node_guid: e8eb:d303:0043:25cc
sys_image_guid: e8eb:d303:0043:25cc
vendor_id: 0x02c9
vendor_part_id: 4119
hw_ver: 0x0
board_id: MT_0000000080
phys_port_cnt: 1
port: 1
state: PORT_ACTIVE (4)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet

hca_id: mlx5_1
transport: InfiniBand (0)
fw_ver: 16.27.4200
node_guid: e8eb:d303:0043:25cd
sys_image_guid: e8eb:d303:0043:25cc
vendor_id: 0x02c9
vendor_part_id: 4119
hw_ver: 0x0
board_id: MT_0000000080
phys_port_cnt: 1
port: 1
state: PORT_DOWN (1)
max_mtu: 4096 (5)
active_mtu: 1024 (3)
sm_lid: 0
port_lid: 0
port_lmc: 0x00
link_layer: Ethernet

HCA = Host Channel Adapter(主机通道适配器)

HCA 是 InfiniBand 网络中主机端的网络硬件设备,相当于以太网中的网卡(NIC),但功能更强大。

对比项以太网InfiniBand
主机端设备NIC(网卡)HCA
交换机端设备交换机端口TCA(Target Channel Adapter)
典型厂商Intel, BroadcomMellanox/NVIDIA, Intel

二、HCA 的核心特性

┌─────────────────────────────────────────────────────┐
│ 应用程序 │
├─────────────────────────────────────────────────────┤
│ 用户态 RDMA 库 (libibverbs) │
├─────────────────────────────────────────────────────┤
│ 内核驱动 │
├─────────────────────────────────────────────────────┤
│ HCA 硬件 │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌──────────┐ │
│ │ RDMA │ │ DMA │ │ 协议 │ │ 网络 │ │
│ │ 引擎 │ │ 引擎 │ │ 处理 │ │ 接口 │ │
│ └─────────┘ └─────────┘ └─────────┘ └──────────┘ │
└─────────────────────────────────────────────────────┘

HCA 硬件内置了:

  • RDMA 引擎:硬件实现 RDMA 协议,无需 CPU 参与
  • DMA 引擎:直接访问主机内存
  • 协议卸载:传输层协议由硬件处理
  • 多队列支持:支持大量并发 QP(Queue Pair)

三、RDMA 是什么

RDMA = Remote Direct Memory Access(远程直接内存访问)

RDMA 是一种通信技术/协议,允许一台机器直接读写另一台机器的内存,无需对方 CPU 参与。

RDMA 的三种实现方式

技术网络类型硬件要求性能
InfiniBand专用 IB 网络HCA + IB 交换机最高(延迟 < 1μs)
RoCE (RDMA over Converged Ethernet)以太网支持 RoCE 的网卡高(延迟 ~ 2μs)
iWARP以太网 (TCP)支持 iWARP 的网卡中等

四、HCA 与 RDMA 的关系

┌─────────────────────────────────────────────────────────────┐
│ RDMA(概念/协议) │
│ │
│ "远程直接内存访问" - 一种零拷贝、内核旁路的通信方式 │
└─────────────────────────────────────────────────────────────┘

│ 需要硬件支持

┌─────────────────────────────────────────────────────────────┐
│ HCA / RNIC(硬件实现) │
│ │
│ HCA = InfiniBand 网络的 RDMA 硬件 │
│ RNIC = 以太网的 RDMA 网卡(支持 RoCE/iWARP) │
└─────────────────────────────────────────────────────────────┘

简单类比

  • RDMA 类似于 "TCP/IP 协议" — 是一套通信规范
  • HCA 类似于 "网卡硬件" — 是实现这套规范的硬件设备

五、RDMA 操作原理

传统网络 vs RDMA

传统网络通信:                      RDMA 通信:

App A App B App A App B
│ │ │ │
▼ ▼ │ │
Socket Socket │ │
│ │ ▼ ▼
▼ ▼ ┌──────────────────┐
Kernel Kernel │ 用户态直通 │
│ │ │ (Kernel Bypass) │
▼ ▼ └──────────────────┘
NIC ◄──────► NIC HCA ◄──────────► HCA

零拷贝 + CPU 不参与

RDMA 核心操作

操作说明
RDMA Write直接写入远端内存,远端 CPU 无感知
RDMA Read直接读取远端内存,远端 CPU 无感知
Send/Recv类似传统消息传递,但仍是零拷贝

六、为什么 GPU 训练用 RDMA/HCA

优势说明
超低延迟< 1μs,传统以太网 ~50-100μs
高带宽单端口 200/400 Gbps
零拷贝数据不经过 CPU,直达 GPU 显存 (GPUDirect RDMA)
CPU 卸载CPU 不参与数据传输,可专注计算

这就是为什么你之前的配置中使用 mlx5_*(Mellanox HCA)来加速 NCCL 集合通信。

比如对deepseek R1进行Lora, 使用了NCCL_IB_HCA环境变量指定HCA:

IB_DEVICES=$(find /dev/infiniband/* -maxdepth 1 -not -type d | xargs -I{} echo '--device {}:{}')
DOCKER_NAME=lora
IMAGE=xxx/hpcaitech/colossalai:vxxx
docker run ${IB_DEVICES} --device /dev/gdrdrv:/dev/gdrdrv -v /etc/topo:/etc/topo -v /nfs:/nfs --name $DOCKER_NAME -d --rm -it --gpus=all --cap-add SYS_NICE --cap-add IPC_LOCK --network=host --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 $IMAGE bash

export NCCL_DEBUG_SUBSYS=init,graph,env
export NCCL_DEBUG=INFO
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_HCA=mlx5_1,mlx5_2,mlx5_3,mlx5_4,mlx5_5,mlx5_6,mlx5_7,mlx5_8
export NCCL_IB_GID_INDEX=3
export NCCL_IB_QPS_PER_CONNECTION=8
export NCCL_IB_TIMEOUT=23
export NCCL_IB_RETRY_CNT=7
export UCX_TLS=tcp
export UCX_NET_DEVICES=eth0
export NCCL_SET_THREAD_NAME=1
colossalai run --hostfile hostfile --nproc_per_node 8 /nfs/LoRA/lora_finetune.py --pretrained /nfs/DeepSeek-R1-BF16/ --dataset /nfs/LoRA/dataset.jsonl --plugin moe --lr 2e-5 --max_length 256 -g --ep 8 --pp 3 --batch_size 24 --lora_rank 8 --lora_alpha 16 --num_epochs 2 --warmup_steps 8 --tensorboard_dir logs --save_dir /nfs/DeepSeek-R1-BF16-LoRA