RDMA是主流AI网络技术,提供高性能、低时延、大带宽的网络。RDMA可编程拥塞控制允许用户根据网络流量特征,自定义最优的拥塞算法策略,缓解流量冲突,提升网络的质量,加速分布式训练。

FlexDA是面向华为智能网卡的开发套件,其提供RDMA UCC框架、拥塞控制算法编程接口,支持用户实现私有的网络拥塞控制算法,并通过配套工具链,实现私有算法的硬化卸载运行,为RDMA网络的高级用户提供网络质量优化的重要手段。

特性介绍

FlexDA RDMA UCC基于华为智能网卡的RoCEv2协议,支持多种拥塞事件检测能力,算法编程接口和可编程流控机制。开发者可以实时获取网络拥塞状态,实现自定义拥塞控制算法,并基于算法结果进行流控。

具体网络拥塞控制原理如下:

提供基于ECN和RTT的拥塞检测能力,开放拥塞状态检测结果给拥塞控制算法。ECN机制配合网络交换机,提供ECN状态的反馈报文,并通过CNP事件触发拥塞控制算法调用;RTT机制提供RTT探测报文发送接口,并通过RTT事件触发拥塞控制算法调用。

网卡RDMA主流程中,开放拥塞控制算法编程接口,实现私有拥塞控制算法与RDMA主流程之间,事件触发,融合运行。

提供基于window和基于rate的流控机制,兼容不同算法的流控策略要求

Image

为实现自定义算法的硬化卸载运行,FlexDA RDMA UCC提供端到端构建工具链,通过在线算法切换和动态加载,将自定义拥塞控制算法卸载到网卡上运行,以实现算法效率的最大化。

Image

端到端开发工具链,支持私有拥塞控制算法的交叉编译、动态加载、运行时调试、故障分析和性能分析。

VSCode IDE集成支持,实现开发过程的全链路整合,基于IDE图形化界面打通开发流程。

算法初始参数在线配置,算法逻辑动态加载,卸载运行。

优势分析

FlexDA UCC为用户在AI NIC的拥塞控制方面提供更加灵活的选择,AI NIC上默认通常提供DCQCN算法,需要配合交换机PFC功能同时使用,通过FlexDA UCC,用户可开发更高效的自定义RTT算法,避免对网络交换机的配置依赖和开启PFC后的网络管理挑战。

FlexDA的UCC框架支持异构网卡的混合组网能力: 支持标准协议的ECN检测机制,支持基于MAD格式的RTT拥塞探测报文,在异构网卡场景下实现拥塞检测能力互通,多种流控机制能力可根据算法选择,异构组网环境下使用统一拥塞控制算法时,性能波动小于3%。

通用开放编程模型,提供统一的编程接口、丰富的拥塞检测、流量控制和事件触发机制,已适配多种主流的商用开源拥塞控制算法,和客户的私有拥塞控制算法,同时也支持单路径和多路径拥塞控制算法。

上手教程

步骤1:软件包准备

获取必要软件包: 

https://www.hikunpeng.com/cn/dakit/flexda

FlexDA编程框架开发态包:FlexDA-Devtools.tar.gz

FlexDA编程框架运行态包:FlexDA-runtime-BM.tar.gz

步骤2:开发环境部署

将FlexDA编程框架开发态包上传至开发环境并解压,使用如下命令进行开发态包的安装

bash flexda_ctl.sh {板卡型号} –install

安装完成后的目录结构如下:

flexda_sdk/
├── build
├── include
├── lib
└── tools

说明

需参考相关用户指南完成开发环境的编译依赖安装。

步骤3:定制化算法开发

参考用户指南实现自定义拥塞控制算法。代码段实例如下

void dcqcn_init(ucc_event_e event_type, ucode_ucc_ext_ctx_s *const ucc_ctx, const roce_ucc_event_input_s *const input)
{
   // 初始化上下文信息,如利用相关API获取拥塞算法参数进行上下信息的初始化
}
void algo_main(ucc_event_e event_type, ucode_ucc_ext_ctx_s *const ucc_ctx, const roce_ucc_event_input_s *const input)
{
    switch (event_type) {
        case UCC_EVENT_DATA_TX:
            // 用户自定义TX事件处理逻辑
            break;
        case UCC_EVENT_CNP:
            // 用户自定义CNP事件处理逻辑
            break;
        // … 
// 其他事件处理逻辑
        default:
            break;
    }
}
// FlexDA提供的用户RP侧自定义拥塞控制算法入口函数,用户可根据不同的拥塞控制事件、拥塞控制上下文等输入实现拥塞控制算法。
void flexda_ucc_user_rp_algo(ucc_event_e event_type, ucode_ucc_ext_ctx_s *const ucc_ctx,
    const roce_ucc_event_input_s *const input, u8 algo_id)
{
    switch (algo_id) {
        case XXX_ALGO: // 算法ID
            algo_main(event_type, ucc_ctx, input);
            break;
        default:
            break;
    }
}
// FlexDA提供的初始化用户自定义拥塞控制算法上下文信息的入口函数
void flexda_ucc_init_algo_ctx(ucc_event_e event_type, ucode_ucc_ext_ctx_s *const ucc_ctx,
    const roce_ucc_event_input_s *const input, u8 algo_id)
{
    switch (algo_id) {
        case XXX_ALGO: // 算法ID
            algo_init(event_type, ucc_ctx, input);
            break;
        default:
            break;
    }
}

步骤4:用户定制化固件编译

将步骤3开发的代码放置至如下路径。


flexda_sdk/
├── build
├── example # 定制化开发代码路径
├── include
├── lib
└── tools

    进入该路径进行用户固件的编译。

    
    cd example
    mkdir build
    cd build 
    cmake .. && make

    ​​​​编译成功输出:

    [100%] Built target flash_bin

    进入输出路径获取用户定制化固件Hinic3_flash.bin

    cd example/bin/flash/hinic_flash_{板卡类型}

    步骤5:驱动部署与全量固件升级

    在业务环境安装部署如下RDMA业务所需网卡驱动,可使用rpm相关命令进行安装

    Image

    驱动安装完成后,使用如下命名进行全量固件的升级,并在BMC上进行上下电重启。

    hinicadm3 updatefw -i hinic0 -f {全量固件} -a cold

    步骤6:运行态包安装部署

    在运行环境解压FlexDA编程框架运行态包,在运行态根目录下执行如下命令完成运行态包的安装

    sh flexda_install.sh install

    说明

    该运行态包中包含内核态驱动hiflexda_dynamic_load-{版本号}.rpm和用户态驱动hiflexda_hinicadm-lib-{版本号}.rpm,安装完成后需进行重启操作。

    步骤7:用户固件更新

    将步骤4所得到用户固件Hinic3_flash.bin上传至运行环境,使用如下命令进行用户固件的动态加载更新

    hinicadm3 updatesdk -i hinic0 -f {编译的NPU固件} -a hot -l on

    执行成功的打印信息包含如下所示。

    The dynamic auto load is enabled successfully.

    说明

    1、`-l`用于控制重启后自动加载用户固件,若用户固件更新命令未指定`-l on`参数,则每次重启DPU环境都需重新进行用户固件的更新。

    2、若客户需要修改自定义算法代码,仅需重新执行步骤4、步骤7及后续步骤,无需重复执行全量固件的安装部署及运行态包的安装部署。

    步骤8:自定义算法使能和配置算法参数

    在运行环境使用如下命令使能自定义算法。

    echo user_cc_6 > /sys/class/net/enp1s0f0/ecn/cc_algo # 6代表算法ID为步骤3中所自定义算法的algo_id的实际值。

    以4字节为单位分别将对应算法参数配置写入配置文件,如算法定义了参数

    
    typedef struct roce_ucc_algo_param {
        union {
            struct {
                u32 min_rate : 12;
                u32 rsvd : 20;
            } bs;
            u32 value;
        } dw0;
        union {
            struct {
                u32 rate_inc_period : 10;
                u32 alpha_dec_period : 10;
                u32 rsvd : 12;
            } bs;
            u32 value;
        } dw1;
    } roce_ucc_algo_param _s;

    ​​​​​则将如下配置写入
    /sys/class/net/enp1s0f0/ecn/roce3_ucc/param0。

    min_rate:1:12 # 其中min_rate 为参数名,1为配置值,12为该参数的位宽rsvd:0:20​​​​​​
    

    将下列配置写入
    “/sys/class/net/enp1s0f0/ecn/roce3_ucc/param1”。

    rate_inc_period:480:10alpha_dec_period:160:10rsvd:0:12

    步骤9:测试验证

    在服务端和客户端执行以下命令进行测试。

    ib_send_bw -d hrn3_0 -i 1 -s 64K --report_gbits --run_infinitely -D 5 #服务端ib_send_bw -d hrn3_0 -i 1 IP_Address -s 64K --report_gbits --run_infinitely -D 5 #客户端

    相关参数说明如下表

    Image

    结语​​​​​​​

    AI业务的爆发式增长,对AI NIC的Scale-out网络不断提出新的挑战。各个厂商也在AI NIC上持续迭代出新的产品以满足网络的高标准要求,但是硬化的解决方案缺少灵活性,难以跟上网络协议快速演进变化。网络协议的开放可编程能力作为破局之法,已经被越来越多的厂商所支持。FlexDA编程框架产品基于华为AI NIC系列硬件产品,开放NIC上的基础协议和网络算力,提供完整的开发工具链,支持开发者快速对网络基础协议进行扩展编程,以实现业务场景在网络层面上的个性化优化加速。FlexDA的RDMA UCC特性,正是FlexDA产品在RDMA网络上支持的个性化扩展编程能力。未来,FlexDA还将在AI NIC领域,不断开放更多的可编程能力,以满足客户在网络协议定制、虚拟化、安全和高层协议的卸载加速要求。

    提供完备的编程库和端到端的开发流程,配套工具链,与鲲鹏AI NIC RDMA协议演进深度配合,实现性能最优,兼容硬件代际。

    Logo

    鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

    更多推荐