人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载HcclServerType 是 asc-devkitCANN 昇腾 AI 处理器算子开发语言在 Host 侧原型注册阶段用于配置 HCCL 服务端类型的接口它与通信域名称配置接口 HcclGroup 共同构成 OpMC2Def 通算融合MC2算子注册体系。阅读本文后你将掌握 HcclServerType 的函数原型、HcclServerType 枚举取值范围、按 AI 处理器型号粒度配置通信服务端的规则与优先级并能结合原型注册代码完成从 MC2 注册到服务端类型下发的完整配置。一、接口定位MC2 通算融合算子注册体系中的一环HcclServerType 并不是一个孤立接口它归属于 OpMC2Def 原型注册类。在 asc-devkit 的原型注册与管理体系见 prototype_register_management 文档中算子原型通过OpDef及其派生定义对象描述其中OpAICoreDef负责 AI Core 侧的定义与配置如 AddConfig 接口 注册算子支持的 AI 处理器型号OpMC2Def专门用于通算融合MC2算子的 Host 侧配置。根据 OpMC2Def 简介该类用于在 Host 侧配置通算融合算子的通信域名称配置后在核函数Kernel侧可以获取通信域对应的 context消息区地址。HcclServerType 正是该类的成员接口之一它的职责是配置 HCCL 的服务端类型即决定该 MC2 算子在不同 AI 处理器型号上使用何种 HCCL 通信服务端执行通信任务。从接口使用链路看MC2 通算融合算子完成一次通信配置需要三步详见 MC2 接口文档调用MC2()接口注册算子是通算融合算子返回OpMC2Def结构调用HcclGroup()配置通信域名称参见 HcclGroup 接口文档调用HcclServerType()为指定 AI 处理器型号配置通信服务端类型——这正是本文的主题。二、函数原型与参数说明2.1 函数原型HcclServerType 的函数原型为void HcclServerType(enum HcclServerType type, const char *socnullptr)该接口通过OpMC2Def对象链式调用典型调用形式为this-MC2().HcclServerType(HcclServerType::AICPU, ascendxxx1);2.2 参数说明参数输入/输出说明type输入HCCL 的服务端类型为 HcclServerType 枚举类定义见下文soc输入AI 处理器型号为该型号配置服务端类型。可选参数nullptr或表示为算子支持的所有型号配置服务端类型2.3 HcclServerType 枚举定义type参数取值为ops命名空间下的HcclServerType枚举定义如下namespace ops{ enum HcclServerType : uint32_t { AICPU 0, // AI CPU服务端 AICORE, // AI Core服务端 CCU, // CCU服务端仅在AI处理器包含CCU单元时支持 MAX // 预留参数不支持使用 }; }各取值的语义与使用约束为AICPU0AI CPU 服务端。在 HCCL 通信任务中AI CPU 路径将通信任务组装后交由 AI CPU 侧服务端执行。AICOREAI Core 服务端。通信任务由 AI Core 侧执行对应源码生成的NNOPBASE_HCCL_SERVER_TYPE_MTE宏。CCUCCU 服务端仅在 AI 处理器包含 CCU计算控制单元单元时支持。CCU 路径通常配合CCU_SCHED调度模式使用。MAX预留参数不支持使用。同时它也是接口内部判断未配置服务端类型的哨兵值——从源码看当GetHcclServerType()返回MAX时生成器判定该算子没有配置全局 MC2 服务端类型见 op_aclnn_generator.cpp。2.4 soc 参数的填写规则soc参数指定 AI 处理器型号使用时需遵守以下规则nullptr或表示为算子支持的所有型号配置服务端类型即全局配置指定具体型号时soc 取值必须落在算子已支持的 AI 处理器型号范围内即已通过AICore().AddConfig()接口注册的型号参见 AddConfig 接口文档型号命名规则可参考算子工程目录下编译配置项文件CMakePresets.json中的ASCEND_COMPUTE_UNIT字段该字段取值在使用 msOpGen 创建算子工程时自动生成。三、约束说明使用 HcclServerType 接口需满足以下约束必须先注册 MC2使用该接口前算子需要先通过MC2()接口注册该算子是通算融合算子注册后即返回一个OpMC2Def结构参见 MC2 接口文档。特定型号配置优先级更高同时为特定 AI 处理器型号和所有 AI 处理器型号配置服务端类型时特定 AI 处理器型号配置的优先级更高。也就是说HcclServerType(AICPU, ascendxxx1)按型号配置会覆盖HcclServerType(AICORE)全局配置在ascendxxx1型号上的生效值。四、调用示例按型号差异化配置通信服务端以下示例完整展示了在一个 MC2 自定义算子原型中如何为不同 AI 处理器型号配置不同的 HCCL 服务端类型class MC2Custom : public OpDef { public: MC2Custom(const char* name) : OpDef(name) { this-Input(x).ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this-Input(y).ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this-Output(z).ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this-Attr(group).AttrType(REQUIRED).String(); this-AICore().AddConfig(ascendxxx1); this-AICore().AddConfig(ascendxxx2); this-MC2().HcclGroup(group); // 配置通信域名称为group this-MC2().HcclServerType(HcclServerType::AICPU, ascendxxx1); // 配置ascendxxx1型号的通信模式为AI CPU this-MC2().HcclServerType(HcclServerType::AICORE); // 配置其他型号即ascendxxx2的通信模式为AI Core } }; OP_ADD(MC2Custom);该示例的配置逻辑可以拆解为注册输入输出与属性x、y为 REQUIRED 的 float、ND 格式输入z为 REQUIRED 输出group为 REQUIRED 的 String 类型属性属性名即为后续通信域名称注册支持的型号通过AICore().AddConfig()注册ascendxxx1与ascendxxx2两个型号配置通信域HcclGroup(group)配置通信域名称为group按型号配置服务端类型HcclServerType(AICPU, ascendxxx1)指定ascendxxx1型号使用 AI CPU 服务端HcclServerType(AICORE)不指定 soc作为全局兜底因此其余型号即ascendxxx2使用 AI Core 服务端注册原型通过OP_ADD(MC2Custom)完成原型注册。五、源码级验证服务端类型如何被编译进算子HcclServerType 的配置并非只停留在原型对象内部它会在算子构建阶段被 opbuild 工具链读取并生成对应的运行时下发代码。仓库中的生成器实现给出了完整的证据链。5.1 枚举到运行时宏的映射在 op_aclnn_generator.cpp 中ops::HcclServerType枚举被映射为 NNOPBASE 运行时宏const std::mapops::HcclServerType, std::string HCCL_SERVER_TYPE_MAP { {ops::HcclServerType::AICPU, NNOPBASE_HCCL_SERVER_TYPE_AICPU}, {ops::HcclServerType::AICORE, NNOPBASE_HCCL_SERVER_TYPE_MTE}, {ops::HcclServerType::CCU, NNOPBASE_HCCL_SERVER_TYPE_CCU}, {ops::HcclServerType::MAX, NNOPBASE_HCCL_SERVER_TYPE_END}, };可见 AICORE 服务端在运行时层面对应 MTEMemory Transfer Engine宏这与 AI Core 侧通过 MTE 通道执行通信数据搬运的实现语义一致。5.2 按型号展开服务端类型列表AclnnOpGenHcclServerTypeListop_aclnn_generator.cpp负责将原型中的服务端类型配置展开为与型号一一对应的数组。其核心逻辑为对每个已注册型号entries若该型号没有 AI Core 配置hasAicoreConfig为假则输出NNOPBASE_HCCL_SERVER_TYPE_END占位否则调用opDef.MC2().GetHcclServerType(entry.originalKey)查询该型号对应的服务端类型返回MAX说明未配置同样输出END占位若配置了服务端类型但没有任何型号命中生成器会输出告警日志Opbuild: op %s has HcclServerType configured but none of the MC2 SOC names match the AddConfig SOC list提示开发者检查 HcclServerType 中的型号名是否与 AddConfig 注册的型号一致——这与文档中soc 取值需确保在算子支持的型号范围内的约束相互印证。生成的产物形如来自测试用例 aclnn_mc2_test.cpp.txtenum NnopbaseHcclServerType { NNOPBASE_HCCL_SERVER_TYPE_AICPU 0, NNOPBASE_HCCL_SERVER_TYPE_MTE, NNOPBASE_HCCL_SERVER_TYPE_CCU, NNOPBASE_HCCL_SERVER_TYPE_END }; NnopbaseHcclServerType hcclServerTypeList[] {NNOPBASE_HCCL_SERVER_TYPE_AICPU,NNOPBASE_HCCL_SERVER_TYPE_MTE};5.3 运行时下发生成在生成的 aclnn 执行入口中op_aclnn_generator.cpp当GetHcclServerType()不等于MAX时会生成调用NnopbaseSetHcclServerTypeBySocName按型号名下发优先或NnopbaseSetHcclServerTypeList按 soc 支持列表下标下发兜底的代码将服务端类型列表传递给 HCCL 执行器。对应测试用例 aclnn_mc2_test.cpp.txt 中同样体现了优先按 SocName、否则按支持列表的双路径下发策略。5.4 测试用例佐证仓库中的原型测试用例 test_ops.cpp 覆盖了 HcclServerType 的组合配置场景class MC2Test : public OpDef { public: MC2Test(const char* name) : OpDef(name) { this-Input(x).ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this-Output(y).ParamType(REQUIRED).DataType({ge::DT_FLOAT}).Format({ge::FORMAT_ND}); this-Attr(group1).AttrType(REQUIRED).String(); this-Attr(group2).AttrType(OPTIONAL).String(); OpAICoreConfig aicConfig; this-AICore().AddConfig(ascend910, aicConfig); this-AICore().AddConfig(ascend910b, aicConfig); this-MC2().HcclGroup({group2, group1}); this-MC2().HcclServerType(HcclServerType::AICPU, ascend); this-MC2().HcclServerType(HcclServerType::AICPU, ascend910); this-MC2().HcclServerType(HcclServerType::AICORE); this-EnableFallBack(); } }; OP_ADD(MC2Test);此外 test_ops.cpp 中的MC2TestDavid还覆盖了 CCU 服务端类型与无效型号ascend_undefined_soc的配置场景用于验证生成器的告警与容错路径。六、与 Kernel 侧 HCCL 使用的衔接配置好服务端类型后HCCL 服务端类型将影响算子运行时的通信执行路径。与 HcclServerType 直接相关的 HCCL 通信接口位于 include/adv_api/hccl/hccl.h其模板声明为template HcclServerType serverType HcclServerType::HCCL_SERVER_TYPE_AICPU, const auto config DEFAULT_CFG class Hccl {也就是说Kernel 侧的Hccl通信类本身就以上述服务端类型作为模板参数默认使用 AICPU 服务端。在 Kernel 侧使用 HCCL 通信时典型流程为在所有核上创建Hccl对象调用InitV2接口传入通信上下文context与 TilingData 初始化参见 InitV2 接口文档调用SetCcTilingV2设置 CC 侧 Tiling 偏移通过Prepare、Commit、Wait、Finalize等接口下发并同步通信任务。通信上下文通过GetHcclContext获取正是 Host 侧HcclGroup配置的通信域名称所对应的 context消息区地址。HcclServerType 与 HcclGroup 一类型一名称配合共同决定了 MC2 通算融合算子运行时通信任务在哪个服务端、哪个通信域中执行。七、常见配置场景与注意事项单型号场景只需HcclServerType(HcclServerType::AICPU)全局配置即可无需指定 soc多型号差异化场景先全局配置默认服务端类型再对个别型号调用带 soc 的接口覆盖利用特定型号优先级更高的规则实现差异化CCU 场景仅当 AI 处理器包含 CCU 单元时才能配置HcclServerType::CCUCCU 场景建议在 Host 侧配合CCU_SCHED调度模式使用型号名合法性soc 参数必须与AddConfig注册的型号一致否则 opbuild 阶段会产生告警生成的列表中对应位置会被END占位工程兼容性基于不支持 MC2 特性的旧版本 CANN 包生成的自定义算子工程无法兼容 MC2 接口。可通过检查算子工程cmake/util/ascendc_impl_build.py中是否存在_build_mc2_ctx字段确认工程是否支持该特性未找到该字段时需要重新生成自定义算子工程以启用 MC2 特性参见 MC2 接口文档 的约束说明。八、关联文档速查OpMC2Def 简介OpMC2Def 构造函数HcclGroup通信域名称配置MC2通算融合算子注册AddConfigAI 处理器型号注册生成器实现op_aclnn_generator.cpp测试用例test_ops.cpp、aclnn_mc2_test.cpp.txt赞分享人工智能深度学习算子库CANNAscend【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言原生支持C和C标准规范主要由类库和语言扩展层构成提供多层级API满足多维场景算子开发诉求。项目地址https://gitcode.com/cann/asc-devkit点击查看免费下载相关推荐asc-devkit 通算融合算子原型注册详解MC2 接口与 OpMC2Def 通信域配置指南asc devkit 通算融合算子原型注册详解MC2 接口与 OpMC2Def 通信域配置指南 导读 本文聚焦 CANN asc devkit 算子原型注册体人工智能深度学习算子库CANNAscendasc-devkit 算子原型注册OpAICPUDef::Engine 接口详解与 AICPU 算子引擎配置实战asc devkit 算子原型注册OpAICPUDef::Engine 接口详解与 AICPU 算子引擎配置实战 本篇技术指南围绕 asc devkitCA人工智能深度学习算子库CANNAscendasc-devkit 算子原型注册OpDef::FormatMatchMode 接口详解与 format 匹配模式配置实战asc devkit 算子原型注册OpDef::FormatMatchMode 接口详解与 format 匹配模式配置实战 FormatMatchMode 是人工智能深度学习算子库CANNAscend上一篇elasticsearch-dump与Terraform集成基础设施即代码中的数据迁移下一篇以终止契约约束 /goal 命令goal-prompt 插件 grounded-migration 评估的设计与判定准则创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考