You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
高性能计算 RDMA
在集群中使用 RDMA 资源(RoCE)
复制全文
下载 pdf
在集群中使用 RDMA 资源(RoCE)
容器服务支持通过组件使用 RDMA 资源,以消除传统网络通信带给计算任务的瓶颈。本文介绍 VKE 集群如何使用 RoCE 高性能计算集群中的 RDMA 资源。
说明
【公测】:VKE 集群中使用 RDMA 资源功能目前处于公测阶段。
背景信息
RDMA 概述
  • RDMA (Remote Direct Memory Access,远程直接内存访问)是一种高性能网络协议,能够减少 CPU 占用,减少内存带宽瓶颈,提高带宽利用率。主要具有以下优势:
  • Zero Copy:应用程序可以在不涉及网络软件堆栈的情况下执行数据传输,数据能够被直接发送到缓冲区或者直接从缓冲区接收,而不需要被复制到网络层。
  • Kernel Bypass:RDMA 提供一个专有的 Verbs interface,应用程序可以直接从用户空间执行数据传输,不需要在内核态与用户态之间执行上下文切换。
  • CPU Offload:应用程序可以访问远程主机内存,不消耗远程主机中的任何 CPU。远程内存机器将在没有远程进程(或 CPU)的任何干预情况下被读取,远程 CPU 中的缓存不会被所访问的内存内容填充。
  • 高性能计算集群(High Performance Compute Cluster,HPC)是一种用于处理大规模计算任务的集群计算环境,通常由大量计算节点组成,节点间通过 RDMA 高速网络互联,用于处理大规模计算任务的集群计算环境,支持 RoCE 和 InfiniBand 两种网络模式。
  • 高性能计算集群可以提供强大的计算能力、大内存、高速存储和高速网络,以满足对计算密集型、数据密集型或两者结合的工作负载的需求。在高性能计算集群中,计算任务会被分配到各个计算节点上进行并行处理,可以充分利用多个节点的计算能力,加快计算速度,提高效率。详情请参见 高性能计算集群概述
RDMA 插件模式
RoCE 网络模式下,RDMA 插件目前支持以下几种模式。不同模式的介绍和使用限制,如下表所示。
RDMA 插件模式
模式说明
使用限制
shared(共享)
将 RDMA 物理网卡进行虚拟化切割,创建成 1 张共享虚拟网卡,提供给容器集群中的 Pod 使用。
  • 每张 RDMA 物理网卡仅允许创建 1 张共享虚拟网卡。
  • 需要 RDMA 网卡掩码小于 30,例如/29/28等。
shared-multi(1:N 共享)
将 RDMA 物理网卡进行虚拟化切割,按需创建成多张共享虚拟网卡,提供给容器集群中的 Pod 使用。
  • 不建议与 GPU 一起使用。
  • 需要 RDMA 网卡掩码小于 30,例如/29/28等。
shared-host(整机分配)
将整机中所有的 RDMA 网卡以 IPVLAN 子接口方式插入到容器中,提供给容器集群中的 Pod 使用。
说明
邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。
  • 暂不支持 katalyst 拓扑调度。
  • 需要 RDMA 网卡掩码小于 30,例如/29/28等。
  • 如需使用 shared-host(整机分配)模式,组件版本要求为
  • 请将 rdma-device-plugin 组件升级至 v3.5.1-vke.12 及以上版本。
  • 请将 vpc-cni 组件升级至 v1.8.9 及以上版本。
exclusive(独占)
【不推荐使用】将 RDMA 物理网卡直接透传给容器集群中的 Pod 使用,适用于物理设备无法虚拟化切割的场景。
  • 暂不支持在 vePFS 场景中使用。
  • 部分机型使用该模式时存在性能下降的情况。若不存在强制依赖,不推荐使用该模式,例如:使用 BF3 mini 网卡的机型。
  • 2026 年后的新增机型不保证支持该模式。
说明
如果您的 Pod 需要使用 HostNetwork,推荐基于开源组件使用 RDMA 资源。详情请参见 开源文档
注意事项
  • 下文主要介绍容器服务测试并验证通过的实践内容,为了获得符合预期的结果,同时符合容器服务的 使用限制请按照本文方案(或在本文推荐的资源上)操作。如需替换方案,您可以联系对应的客户经理咨询。
  • 在在集群中使用 RDMA 资源时,请勿强行删除 RDMA Pod,强行删除 Pod 会导致节点 RDMA 网卡残留,后续 Pod 分配的 RDMA 网卡 GID INDEX 可能会变化,导致 NCCL 等强依赖 GID INDEX 一致性的代码运行失败。
使用限制
  • Pod 不能同时使用 mGPU 与 RDMA 设备插件。
  • RDMA 设备仅支持在 VPC-CNI 网络模型的集群中使用,且 vpc-cni 组件需升级至 v1.7.1 及以上版本。
  • 集群 Kubernetes 版本要求如下。如集群版本过低,请先升级版本。详情请参见 升级集群
  • 若 RDMA 环境运行过程中发生 NCCL 网络错误相关报错,可参考 FAQ 解决。
操作步骤:新建资源(推荐)
推荐新建容器服务集群和节点池使用 RDMA 资源,详细使用步骤如下。
步骤一:创建高性能计算集群
  1. 单击 创建高性能计算集群,参考以下说明配置参数。
  • alt
  • 配置项
    说明
    地域及可用区
    不同地域间内网完全隔离。建议选择距离您业务更近的地域,可以降低网络延时,提高访问速度。可用区是指同一地域中电力、网络隔离的物理区域。
    本场景要求节点子网、计算规格、高性能计算集群属于同一可用区。例如:可用区 C。
    名称
    自定义高性能计算集群的名称。
    集群属性
    高性能计算集群的属性,不同属性集群的使用场景和使用限制不同。本场景选择 RoCE。
    • RoCE(RDMA over Converged Ethernet)是基于以太网的远程直接内存访问的网络协议,具有高性能和高性价比等特点,用于高性能计算集群内实例间的数据互联。
    • InfiniBand 是一种专为远程直接内存访问的网络通信协议,具有高吞吐、低延迟等特点,用于高性能计算集群内实例间的数据互联。您需要选择与实例匹配的集群属性。
    说明
    • InfiniBand 属性的高性能计算集群目前仅支持添加高性能计算 GPU 型实例中的ecs.hpcpni3.45xlarge;RoCE 属性的高性能计算集群支持添加除ecs.hpcpni3.45xlarge以外的高性能计算 GPU 型实例。
    • InfiniBand 集群只能添加、扩容配置 InfiniBand 网路的实例;RoCE 集群只支持添加、扩容配置 RoCE 网络的实例。
    描述
    高性能计算集群相关描述或备注信息,根据实际情况填写。
步骤二:创建集群并准备资源
说明
本步骤仅针对使用 RDMA 资源的关键配置进行详细介绍,包括:创建节点池、添加节点标签、配置 Kubelet 自定义参数、安装 RDMA 组件。创建集群的操作步骤和详细配置参见:创建集群
  1. 在左侧导航栏选择 集群,单击 创建集群,配置创建集群所需的参数。
  • 集群配置步骤的关键配置项如下,其他参数按需配置即可。
  • 配置项
    说明
    容器网络模型
    配置集群的容器网络(CNI)方案,本场景必须选择 VPC-CNI。
    • Flannel:独立的 Underlay 容器网络模型,配合 VPC 的全局路由能力,实现集群高性能的网络体验。
    • VPC-CNI:基于私有网络的弹性网卡 ENI 实现的 Underlay 容器网络模型,具有较高的网络通信性能。
  1. 在节点池配置步骤,新建节点池并完成节点标签、Kubelet 自定义参数等关键配置,完成后单击 下一步:组件配置
  • 节点池配置步骤的关键配置项如下,其他参数按需配置即可。
  • 配置项
    说明
    节点池
    为确保集群可以正常使用,本场景选择 立即创建
    ECS 节点来源
    节点的来源,本场景选择 创建节点
    可用区
    可用区是同一地域下电力、网络隔离的物理区域,可用区之间内网互通,不同可用区之间物理隔离。不同地域支持的可用区不同,详情请参见 地域和可用区
    本场景必须指定一个可用区,以保证节点子网、计算规格、高性能计算集群属于同一可用区。例如:可用区 C。
    节点子网
    在指定可用区内选择可用子网,为节点提供网络支撑。
    计算规格
    计算规格用于定义节点 CPU、内存、GPU、RDMA 等参数,本场景需要选择具备 RDMA 设备的计算规格,例如:高性能计算 GPU 型。
    高性能计算集群
    一种用于处理大规模计算任务的集群计算环境,通常由大量的计算节点组成,这些节点通过 RDMA 高速网络互联,并协同工作以处理复杂的计算任务。
    本场景选择步骤一中创建的 RoCE 属性的高性能计算集群。
    节点标签(Labels)
    对应 Kubernetes 中的 Label,能够为节点定义不同的属性,方便批量筛选等需求,可为节点池中的节点批量添加相同标签。
    本场景通过手动添加vke.node.rdma.mode:{value} 标签方式,为节点或节点池配置 RDMA 模式,支持:exclusive(独占)、shared(共享)、shared-multi(1:N 共享)和 shared-host(整机分配)。
    注意
    • 除 ecs.hpcg1ve.21xlarge 和华北 ecs.hpcpni2.28xlarge 机型外,均推荐使用 shared 模式,且优先推荐使用 shared。
    • 您可以通过开启或关闭节点池的 节点标签及污点自动更新 功能,控制是否同步标签到节点池中的存量节点中。关闭该功能时,可能导致集群无法使用节点池中的存量 RDMA 节点资源,请谨慎配置。
    Kubelet 自定义参数
    针对时延敏感性较高的业务,提供 Kubelet 自定义参数,用于配置 NUMA 亲和策略,可将为 Container (或 Pod) 分配的资源对齐到一个或多个 NUMA 上,从而提高业务的性能。
    • 当 RDMA 模式为 exclusive(独占)、shared(共享)、shared-multi(1:N 共享)时,需要添加自定义参数topologyManagerPolicy: best-effort,确保 GPU 和 RDMA 分配在同一个 NUMA 下。
    • 当 RDMA 模式为 shared-host(整机分配)时,无须额外配置。
  1. 在组件配置步骤,要求勾选 rdma-device-plugin 组件,其他组件按需配置即可。完成后单击 下一步:确认配置
  1. 确认新建集群信息和计费准确无误后,阅读 《容器服务专用服务条款》 并勾选同意,单击页面 确定 ,开始创建集群。
步骤三:使用 RDMA 资源
集群创建完成后,可以在创建工作负载时使用 RDMA 资源,本场景以无状态工作负载为例进行介绍。
使用控制台配置
使用 YAML 配置
  1. 登录 容器服务控制台,单击目标集群名称进入集群管理页面。
  1. 在左侧导航栏选择 工作负载 > 无状态负载,进入无状态负载管理页面。
  1. 单击 创建无状态负载,在容器配置步骤的资源配额页签,按需配置 RDMA 卡数。工作负载其他配置参数说明,请参见 创建无状态负载
注意
  • 当 RDMA 模式为 exclusive(独占)、shared(共享)或 shared-multi(1:N 共享)时,为了 GPU 训练或者推理任务发挥最佳性能,推荐 RDMA 卡数配置为整机或整机的一半。例如当整机为 4 张 RDMA 网卡时,可以配置为:2 或 4;当整机为 8 张 RDMA 网卡时,可以配置为:4 或 8。
  • 如不关注 RDMA 网卡数量,可以使用 shared-host(整机分配)模式。当前暂不支持使用控制台配置 shared-host(整机分配)模式,如有需要,请参照下文使用 YAML 配置。
共享模式下容器内运行 NCCL 需要显式指定 NCCL_IB_GID_INDEX 环境变量,可执行source nccl_env.sh命令获取 RDMA 环境变量。动态获取 NCCL 环境变量的参考示例脚本nccl_env.sh内容如下。
注意
务必确保 NCCL_IB_GID_INDEX 设置正确,可执行 show_gids 命令获取 RoCE v2 IPv4 的 gid index,show_gids 命令脚本可以从主机获取。
#!/usr/bin/env bash
devs=()
ports=()
idxes=()
rdmaIdx=""
rdmaRate=""
rdmaErr=""
function scan_devices() {
allocDevs=()
for d in $(ls /sys/class/infiniband/) ; do
allocDevs+=($d)
done
for d in "${allocDevs[@]}" ; do
for p in $(ls /sys/class/infiniband/$d/ports/) ; do
for g in $(ls /sys/class/infiniband/$d/ports/$p/gids/) ; do
gid=$(cat /sys/class/infiniband/$d/ports/$p/gids/$g);
if [ $(echo $gid | cut -d ":" -f -1) != "0000" ] ; then
continue
fi
if [ $gid = 0000:0000:0000:0000:0000:0000:0000:0000 ] ; then
continue
fi
RoCEVer=$(cat /sys/class/infiniband/$d/ports/$p/gid_attrs/types/$g 2>/dev/null| grep -o "[Vv].*")
if [ ${RoCEVer,,} != "v2" ]; then
continue
fi
# device not Up
ethDev=$(cat /sys/class/infiniband/$d/ports/$p/gid_attrs/ndevs/$g 2>/dev/null)
if [[ ! -f /sys/class/net/$ethDev/dev_id ]] || [[ ! -f /sys/class/net/$ethDev/carrier ]] || (( ! $(cat /sys/class/net/$ethDev/carrier 2> /dev/null) == 1 )); then
continue
fi
mtu=$(cat /sys/class/net/$ethDev/mtu 2>/dev/null)
if [[ -z "$mtu" ]] || (( mtu <= 1500 )); then
continue
fi
devs+=($d)
ports+=($p)
idxes+=($g)
done #g (gid)
done #p (port)
done #d (dev)
if [[ -z $devs ]]; then
echo "Not found RDMA device, list devices error"
return 1
fi
}
function export_nccl_env() {
scan_devices
if [[ -z $devs ]]; then
echo "Not found RDMA device, get max rate device error"
return 1
fi
for ((i=0; i<${#devs[@]}; i+=1)); do
rate=$(cat /sys/class/infiniband/${devs[i]}/ports/${ports[i]}/rate 2>/dev/null|cut -f 1 -d " ")
if [[ -z "$rdmaRate" ]] || [[ "$rate" -gt "$rdmaRate" ]]; then
rdmaDevs=(${devs[i]})
rdmaPorts=(${ports[i]})
rdmaIdx=${idxes[i]}
rdmaErr=""
rdmaRate=$rate
elif [[ "$rate" == "$rdmaRate" ]]; then
rdmaDevs+=(${devs[i]})
rdmaPorts+=(${ports[i]})
if [[ "$rdmaIdx" != "${idxes[i]}" ]]; then
rdmaErr="rdma devs index inconsistent"
fi
fi
done
if [[ -n $rdmaErr ]]; then
echo $rdmaErr
return 1
fi
hca=()
for ((i=0; i<${#rdmaDevs[@]}; i+=1)); do
hca+=("${rdmaDevs[i]}:${rdmaPorts[i]}")
done
IFS=","
export NCCL_IB_HCA=${hca[*]}
unset IFS
export NCCL_IB_GID_INDEX=$rdmaIdx
}
export_nccl_env
操作步骤:存量资源
已经创建容器服务集群和节点池的情况下,可参考以下步骤,直接在存量 VKE 集群和节点池中使用 RDMA 资源。
步骤一:安装 RDMA 设备插件
  1. 登录 容器服务控制台,单击目标集群名称进入集群管理页面。
  1. 在左侧导航栏选择 组件管理,查找 网络 页签中的 rdma-device-plugin 组件。
  1. 将鼠标移动到组件卡片上,单击 部署,为集群安装 RDMA 设备插件。
步骤二:准备节点资源
需要准备支持 RDMA 设备的节点(例如:高性能计算 GPU 型),可新建或使用存量符合要求的节点。并通过手动添加vke.node.rdma.mode: {value} 标签方式为节点或节点池配置 RDMA 使用模式,支持:exclusive(独占)、shared(共享)、shared-multi(1:N 共享)和 shared-host(整机分配)。
注意
  • 除 ecs.hpcg1ve.21xlarge 和华北 ecs.hpcpni2.28xlarge 机型外,均推荐使用 shared 模式,且优先推荐使用 shared。
  • 若修改标签切换 RDMA 使用模式,请确认当前存量业务已经运行结束,并重启节点后生效。
方式一:存量节点添加标签
  1. 登录 容器服务控制台,单击目标集群名称进入集群管理页面。
  1. 在左侧导航栏选择 节点管理 > 节点,单击目标节点右侧操作列...中的 标签管理
  1. 单击 添加标签,为存量节点添加上述标签,完成后单击弹框 确定 保存配置。
  • YAML 示例如下:
  • type: Node
    label:
    vke.node.rdma.mode: shared
    status:
    capacity:
    vke.volcengine.com/rdma: 4
方式二:节点池添加节点标签
  1. 登录 容器服务控制台,单击目标集群名称进入集群管理页面。
  1. 在左侧导航栏选择 节点管理 > 节点池,创建节点池或单击目标集群右侧操作列中的 编辑,以节点池为单位添加节点标签,完成后单击 确定 保存配置。
步骤三:修改节点 kubelet 拓扑管理策略
不同 RDMA 模式时的节点 kubelet 拓扑管理策略不同:
  • 当 RDMA 模式为 exclusive(独占)、shared(共享)、shared-multi(1:N 共享)时,需要配置节点 kubelet 拓扑管理策略,添加自定义参数topologyManagerPolicy: best-effort,确保 GPU 和 RDMA 分配在同一个 NUMA 下。
  • 当 RDMA 模式为 shared-host(整机分配)时,无须额外配置节点 kubelet 拓扑管理策略。
警告
在存量节点池中修改 kubelet 自定义参数时,默认仅对新增节点生效,不对存量节点生效。如果需要对存量节点生效,则需要执行存量节点参数同步操作,详情请参见 存量节点参数同步
  1. 登录 容器服务控制台,单击目标集群名称进入集群管理页面。
  1. 在左侧导航栏选择 节点管理 > 节点池,进入节点池管理页面。
  1. 单击目标节点池名称,在 Kubelet 自定义参数 页签,单击右上角 编辑 ,手动添加参数,完成后单击 确定 保存配置。
  • YAML 示例如下:
  • topologyManagerPolicy: best-effort
步骤四:使用 RDMA 资源
配置完成后,即可在创建工作负载时使用 RDMA 资源,本场景以无状态工作负载为例进行介绍。
使用控制台配置
使用 YAML 配置
  1. 登录 容器服务控制台,单击目标集群名称进入集群管理页面。
  1. 在左侧导航栏选择 工作负载 > 无状态负载,进入无状态负载管理页面。
  1. 单击 创建无状态负载,在容器配置步骤的资源配额页签,按需配置 RDMA 卡数。工作负载其他配置参见:创建无状态负载
注意
  • 当 RDMA 模式为 exclusive(独占)、shared(共享)或 shared-multi(1:N 共享)时,为了 GPU 训练或者推理任务发挥最佳性能,推荐 RDMA 卡数配置为整机或整机的一半。例如当整机为 4 张 RDMA 网卡时,可以配置为:2 或 4;当整机为 8 张 RDMA 网卡时,可以配置为:4 或 8。
  • 如不关注 RDMA 网卡数量,可以使用 shared-host(整机分配)模式。当前暂不支持使用控制台配置 shared-host(整机分配)模式,如有需要,请参照下文使用 YAML 配置。
共享模式下容器内运行 NCCL 需要显式指定 NCCL_IB_GID_INDEX 环境变量,可执行source nccl_env.sh命令获取 RDMA 环境变量。动态获取 NCCL 环境变量的参考示例脚本nccl_env.sh内容如下。
注意
务必确保 NCCL_IB_GID_INDEX 设置正确,可执行 show_gids 命令获取 RoCE v2 IPv4 的 gid index,show_gids 命令脚本可以从主机获取。
#!/usr/bin/env bash
devs=()
ports=()
idxes=()
rdmaIdx=""
rdmaRate=""
rdmaErr=""
function scan_devices() {
allocDevs=()
for d in $(ls /sys/class/infiniband/) ; do
allocDevs+=($d)
done
for d in "${allocDevs[@]}" ; do
for p in $(ls /sys/class/infiniband/$d/ports/) ; do
for g in $(ls /sys/class/infiniband/$d/ports/$p/gids/) ; do
gid=$(cat /sys/class/infiniband/$d/ports/$p/gids/$g);
if [ $(echo $gid | cut -d ":" -f -1) != "0000" ] ; then
continue
fi
if [ $gid = 0000:0000:0000:0000:0000:0000:0000:0000 ] ; then
continue
fi
RoCEVer=$(cat /sys/class/infiniband/$d/ports/$p/gid_attrs/types/$g 2>/dev/null| grep -o "[Vv].*")
if [ ${RoCEVer,,} != "v2" ]; then
continue
fi
# device not Up
ethDev=$(cat /sys/class/infiniband/$d/ports/$p/gid_attrs/ndevs/$g 2>/dev/null)
if [[ ! -f /sys/class/net/$ethDev/dev_id ]] || [[ ! -f /sys/class/net/$ethDev/carrier ]] || (( ! $(cat /sys/class/net/$ethDev/carrier 2> /dev/null) == 1 )); then
continue
fi
mtu=$(cat /sys/class/net/$ethDev/mtu 2>/dev/null)
if [[ -z "$mtu" ]] || (( mtu <= 1500 )); then
continue
fi
devs+=($d)
ports+=($p)
idxes+=($g)
done #g (gid)
done #p (port)
done #d (dev)
if [[ -z $devs ]]; then
echo "Not found RDMA device, list devices error"
return 1
fi
}
function export_nccl_env() {
scan_devices
if [[ -z $devs ]]; then
echo "Not found RDMA device, get max rate device error"
return 1
fi
for ((i=0; i<${#devs[@]}; i+=1)); do
rate=$(cat /sys/class/infiniband/${devs[i]}/ports/${ports[i]}/rate 2>/dev/null|cut -f 1 -d " ")
if [[ -z "$rdmaRate" ]] || [[ "$rate" -gt "$rdmaRate" ]]; then
rdmaDevs=(${devs[i]})
rdmaPorts=(${ports[i]})
rdmaIdx=${idxes[i]}
rdmaErr=""
rdmaRate=$rate
elif [[ "$rate" == "$rdmaRate" ]]; then
rdmaDevs+=(${devs[i]})
rdmaPorts+=(${ports[i]})
if [[ "$rdmaIdx" != "${idxes[i]}" ]]; then
rdmaErr="rdma devs index inconsistent"
fi
fi
done
if [[ -n $rdmaErr ]]; then
echo $rdmaErr
return 1
fi
hca=()
for ((i=0; i<${#rdmaDevs[@]}; i+=1)); do
hca+=("${rdmaDevs[i]}:${rdmaPorts[i]}")
done
IFS=","
export NCCL_IB_HCA=${hca[*]}
unset IFS
export NCCL_IB_GID_INDEX=$rdmaIdx
}
export_nccl_env
结果验证
查看 RDMA 网卡信息
创建 Pod 并配置 RDMA 资源后,您可以在控制台或 YAML 中查看 Pod 挂载的 RDMA 网卡。本文以在控制台查看为例。
  1. 单击目标 Pod 名称,进入 Pod 详情页。
  1. 选择 概览 页签,在 网络配置 模块中,可以查看该 Pod 挂载的 RDMA 网卡信息。
  1. 在 Pod 详情页面右上角选择 ... > 编辑 Yaml,查看 Pod 的 YAML 配置。支持查看 Pod 挂载的 RDMA 网卡信息,包括 IP 地址、MAC 地址等。
注意
当 RDMA 插件模式为 exclusive(独占)时,RDMA 网卡在主机的状态为 Down。
查看 RDMA 监控
可根据 RDMA 监控数据中提供的指标确认分配的 RDMA 资源是否已经被使用,RDMA 监控查看方法参见:AI 资源观测 查看实例 GPU/RDMA 监控数据
最近更新时间:2026.08.26 11:44:31
这个页面对您有帮助吗?
有用
有用
无用
无用