当前位置: 首页 > news >正文

CANN/hcomm通信算子开发快速入门

快速上手

【免费下载链接】hcommHCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm

本节以AI CPU的点对点通信算子为例,介绍使用HCCL通信编程接口开发通信算子的整体流程,帮助用户快速了解通信算子的开发步骤。

点对点通信算子

本节以点对点通信算子Send/Receive为例进行介绍:

  • Send:将本端rank的数据发送到对端rank。
  • Receive:接收对端rank发送过来的数据,需要与Send算子配对使用。

样例介绍

开发者可以点击样例链接获取完整样例代码,该样例使用HCCL通信算子开发接口实现了基于AI CPU通信引擎的Send和Receive算子,主要实现流程如下所示:

  • 查询通信域的拓扑信息:调用拓扑信息查询接口HcclGetRankId()和HcclGetRankSize()获取当前线程操作的rank_id和通信域的rank数量。

  • 创建Thread资源:调用资源管理接口HcclThreadAcquire()分配通信线程资源。

  • 建立通信通道:调用HcclChannelAcquire()接口创建rank间的channel链路。

  • 获取远端通信内存信息:调用HcclChannelGetHcclBuffer()接口获取远端的通信内存地址。

  • 准备输入数据:Send算子调用HcommLocalCopyOnThread()接口将输入数据拷贝到通信内存。

  • 前同步

    • Send算子HcommChannelNotifyRecordOnThread()接口告知远端数据已经准备完成;
    • Receive算子调用HcommChannelNotifyWaitOnThread()接口等待远端数据准备完成。
  • 读取远端数据:Receive算子调用HcommReadOnThread()接口读取远端通信内存中的数据。

  • 后同步

    • Receive算子调用HcommChannelNotifyRecordOnThread()接口告知远端已经读取完成。
    • Send算子调用HcommChannelNotifyWaitOnThread()接口等待远端读取完成。

图 1Send/Receive算子测试样例示意图
![Send-Receive算子测试样例示意图](https://raw.gitcode.com/cann/hcomm/raw/3766b7bc443d74b23c19901efe098c0897ec2f5c/docs/comm_op_dev_guide/figures/send_receive_sample.png ""?utm_source=gitcode_repo_files)

同时,该样例中还包含了测试程序,其中创建1个通信域,rank为偶数的通信成员负责发送数据,rank为奇数的通信成员负责接收数据,发送数据为偶数rank的编号。包含以下功能点:

  • 设备检测,通过aclrtGetDeviceCount()接口查询可用设备数量。
  • 将rank0作为root节点,通过HcclGetRootInfo()接口生成root节点的rootinfo标识信息。
  • 在每个线程中,基于rootinfo标识信息通过HcclCommInitRootInfo()接口初始化通信域。
  • 调用算子接口HcclSendCustom()和HcclRecvCustom(),验证基础收发功能,并打印接收结果。

编译安装

在CANN/hccl代码仓根目录下执行如下命令,编译并安装自定义算子包:

# 设置CANN软件包环境变量,此处以root用户默认安装路径为例 source /usr/local/Ascend/cann/set_env.sh # 执行build.sh脚本进行编译,通过custom_ops_path指定自定义算子工程路径 bash build.sh --vendor=cust --ops=p2p --custom_ops_path=./examples/04_custom_ops_p2p # 自定义算子安装包在代码仓的build_out目录下 ./build_out/cann-hccl_custom_p2p_linux-<arch>.run --install

自定义算子包安装信息如下:

  • 头文件:${ASCEND_HOME_PATH}/opp/vendors/cust/include/hccl_custom_p2p.h

  • 动态库:${ASCEND_HOME_PATH}/opp/vendors/cust/lib64/libhccl_custom_p2p.so

  • AI CPU算子描述文件:${ASCEND_HOME_PATH}/opp/vendors/cust/aicpu/config/libp2p_aicpu_kernel.json

  • AI CPU算子包:${ASCEND_HOME_PATH}/opp/vendors/cust/aicpu/kernel/aicpu_hccl_custom_p2p.tar.gz

  • 安装脚本:${ASCEND_HOME_PATH}/opp/vendors/cust/scripts/install.sh

执行样例

  1. 关闭AI CPU算子验签功能。

    AI CPU算子包会在业务启动时加载至Device,加载过程中驱动默认会执行安全验签,以确保包的可信性。但用户自行编译生成的AI CPU算子包不包含签名头,因此需要手工关闭驱动的验签机制,才可以正常加载。

    参考如下命令,使用root用户在物理机上执行, 以device 0为例:

    npu-smi set -t custom-op-secverify-enable -i 0 -d 1 # 使能验签配置 npu-smi set -t custom-op-secverify-mode -i 0 -d 0 # 关闭自定义验签

    [!NOTE]说明

    • 关闭驱动安全验签机制存在一定的安全风险,需要用户自行确保自定义通信算子的安全可靠,防止恶意攻击行为。
    • 更多命令可参考Ascend HDK配套版本的《 npu-smi 命令参考》中“AI CPU算子验签”相关章节。
  2. 修改AI CPU白名单。

    若用户新增AI CPU算子包,需同步将该AI CPU算子包配置到AI CPU白名单中。以root用户默认安装路径为例,编辑ascend_package_load.ini文件:

    vim /usr/local/Ascend/cann/conf/ascend_package_load.ini

    将下列内容追加到ascend_package_load.ini中:

    name:aicpu_hccl_custom_p2p.tar.gz install_path:2 optional:true package_path:opp/vendors/cust/aicpu/kernel load_as_per_soc:false
  3. 编译并执行测试样例。

    # 进入样例代码目录 cd examples/04_custom_ops_p2p/testcase # 编译 make # 执行测试用例 make test

结果解析

rank为偶数的节点负责发送数据,内容为其rank编号,rank为奇数的节点负责接收数据,因此打印结果中各个奇数rank接收到的是上一rank的编号。

Found 8 NPU device(s) available rankId: 1, output: [ 0 0 0 0 0 0 0 0 ] rankId: 3, output: [ 2 2 2 2 2 2 2 2 ] rankId: 5, output: [ 4 4 4 4 4 4 4 4 ] rankId: 7, output: [ 6 6 6 6 6 6 6 6 ]

关键代码解析

下面以自定义Send/Receive算子为例,讲解其实现细节。

  1. 解析通信域的拓扑信息。

    uint32_t rank, rankSize; CHK_RET(HcclGetRankId(comm, &rank)); CHK_RET(HcclGetRankSize(comm, &rankSize));
  2. 创建资源。

    CommEngine engine = CommEngine::COMM_ENGINE_AICPU; ACLCHECK(aclrtCreateNotify(&(g_notifies[0]), ACL_NOTIFY_DEFAULT)); ACLCHECK(aclrtCreateNotify(&(g_notifies[1]), ACL_NOTIFY_DEFAULT)); AlgResourceCtx resCtxHost; for (uint32_t idx = 0; idx < AICPU_CONTROL_NOTIFY_NUM; idx++) { ACLCHECK(aclrtGetNotifyId(g_notifies[idx], &(resCtxHost.notifyIds[idx]))); } CHK_RET(HcclThreadAcquire(comm, engine, 1, 0, &(resCtxHost.threadHandle)));
  3. 建立通信链路。

    HcclChannelDesc channelDesc; HcclChannelDescInit(&channelDesc, 1); channelDesc.remoteRank = destRank; channelDesc.channelProtocol = CommProtocol::COMM_PROTOCOL_HCCS; channelDesc.notifyNum = 2; CHK_RET(HcclChannelAcquire(comm, engine, &channelDesc, 1, &(resCtxHost.channelHandle)));
  4. 获取远端的通信内存地址。

    CHK_RET(HcclChannelGetHcclBuffer(comm, resCtxHost.channelHandle, &(resCtxHost.remoteBuffer.addr), &(resCtxHost.remoteBuffer.size)));
  5. 读取远端数据。

    // 单边读 CHK_RET(HcommReadOnThread(resCtx->threadHandle, resCtx->channelHandle, param.outputPtr, resCtx->remoteBuffer.addr, size));

【免费下载链接】hcommHCOMM(Huawei Communication)是HCCL的通信基础库,提供通信域以及通信资源的管理能力。项目地址: https://gitcode.com/cann/hcomm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

http://www.jsqmd.com/news/785215/

相关文章:

  • TensorFlow优化器完全指南:Adam、SGD、RMSprop算法性能深度对比与实战选择
  • 如何在3分钟内为Word安装APA第7版参考文献格式:解决学术写作最大痛点
  • AI工具搭建自动化视频生成Jira
  • AI编程实测:ChatGPT在专业OJ平台Kattis的解题能力与局限分析
  • 别急着重装!利用Parallels快照对比法,快速定位Tools安装失败的根本原因
  • 2026 北京茅台老酒回收商家怎么选更好放心?第三方深度测评商家排行榜 - 资讯焦点
  • 终极指南:Handlebars.js如何快速解析模板字符串的核心原理
  • 全球AI法规地图:技术中立与风险分级下的合规实战指南
  • 从零构建MCP-Server实战
  • CANN/hccl AlltoAllVC算子API文档
  • 适合小学生的素养课TOP4推荐:2026四大思维课程深度测评 - 资讯焦点
  • ESLint规则自动翻译为AI助手指令:统一AI代码生成风格
  • 苹果手机怎么把照片抠图?2026年最全工具测评与免费方案
  • AI与韦伯理性化:构建税收政策智能模拟器的工程实践
  • Taxonomy仪表盘:终极数据可视化监控指南
  • PL/SQL Developer从安装到效率翻倍:一份超全的界面美化、代码提示与快捷键配置指南
  • LabVIEW与Xplane飞行界面数据仿真交互
  • GitSavvy Fixup和Squash助手:如何保持干净提交历史的秘诀
  • CANN 数据移动约束
  • 陕西公考培训新范式:系统化教学与协同服务体系解析 - 资讯焦点
  • 前端性能优化终极指南:如何利用WebAssembly实现高性能计算
  • AI工具搭建自动化视频生成Asana
  • AI Agent全栈开发框架:架构先行与垂直切片验证实践
  • 收藏!2026年普通人也能干的5个高薪AI新职业(无需代码,小白也能学)
  • 2026年降AI工具维普专项实测:五款工具维普AIGC检测通过率完整横向对比分析
  • 2026广东狐臭医生口碑测评:5位高性价比医生推荐 - 速递信息
  • 在团队开发中统一大模型调用配置与密钥管理的实践
  • 一天一个开源项目(第96篇):OpenHarness - 轻量级 AI 代理基础设施框架
  • Classiq量子编程平台:5分钟快速入门量子计算
  • 2026口腔答疑测评!牙黄口臭牙结石怎么救?美白去黄清新溶石牙膏推荐 - 资讯焦点