前言METADEF 是 CANNCompute Architecture for Neural Networks算子开发框架中的核心组件——算子元数据定义系统。它为昇腾 AI 处理器上的算子开发、部署和管理提供了一套标准化的元数据规范和管理能力。METADEF 的核心价值在于统一了算子定义、版本管理、依赖解析和算子发现等关键环节使得算子库的维护、升级和跨版本兼容性变得清晰可控。本文将详细介绍 METADEF 的设计理念、核心概念、使用方法以及最佳实践帮助开发者深入理解并高效利用这一系统来管理昇腾 AI 处理器的算子生态。METADEF 简介METADEFMetadata Definition是 CANNCompute Architecture for Neural Networks算子开发框架中的核心元数据管理系统。它专门用于管理昇腾 AI 处理器上各类算子的结构化元数据为算子的全生命周期开发、注册、版本管理、依赖解析、查找发现提供统一的标准和工具支持。METADEF 的主要功能包括1. 算子签名定义算子签名是算子与外部交互的“接口契约”。METADEF 使用 YAML 格式精确定义算子的输入inputs、输出outputs、属性attributes和参数parameters。签名不仅描述了数据类型如 tensor、scalar、精度float16、float32和形状静态或动态维度还可以包含默认值、约束条件等元信息。统一的签名格式确保了不同算子之间、算子与上层框架如 PyTorch、TensorFlow 适配层之间的接口一致性降低了集成复杂度。2. 版本信息管理METADEF 采用语义化版本Semantic Versioning对算子进行版本控制。每个算子定义都包含主版本、次版本和修订版本号。版本管理机制支持向后兼容性检查确保算子升级不会破坏现有模型。多版本共存允许同一算子的不同版本在系统中并存供不同模型或场景选用。版本查询与筛选开发者可以通过版本范围条件查找算子例如查找1.0.0且2.0.0的所有 Conv2d 算子。3. 依赖关系解析复杂算子往往依赖其他基础算子或库。METADEF 允许在算子定义中显式声明依赖项如依赖MatMul 1.0和Relu 1.0并提供自动依赖解析功能。该系统能够递归解析依赖树找出算子所有直接和间接依赖。版本冲突检测当多个算子依赖同一算子的不同版本时发出警告。依赖安装/加载可自动下载或加载缺失的依赖算子确保算子可执行。4. 算子查找和发现METADEF 提供丰富的查询接口帮助开发者快速定位所需算子按名称精确查找metadef.find(MatMul)。按条件过滤查找支持按算子类型如convolution、版本范围、输入输出数据类型等条件筛选。按分类浏览算子可按功能分类如normalization、activation组织方便按类查看。动态注册与发现支持运行时动态注册新算子并自动纳入发现机制。通过这些功能METADEF 实现了算子元数据的集中化、标准化管理显著提升了算子库的可维护性、可扩展性和跨版本兼容性是昇腾 AI 软件栈中连接算子开发与模型部署的关键桥梁。仓库地址https://atomgit.com/cann/metadef核心概念算子签名算子签名定义了算子的接口operator:MatMulversion:1.0inputs:-name:x1type:tensordtype:float16shape:[-1,-1]-name:x2type:tensordtype:float16shape:[-1,-1]outputs:-name:ytype:tensordtype:float16shape:[-1,-1]算子属性attributes:-name:trans_atype:booldefault:false-name:trans_btype:booldefault:false算子注册定义文件格式算子通过 YAML 文件定义name:Conv2dtype:operatorversion:1.0# 算子参数parameters:in_channels:intout_channels:intkernel_size:intstride:int 1padding:int 0dilation:int 1groups:int 1# 输入定义inputs:-name:inputtype:tensordtype:float16/float32shape:[N,C,H,W]# 输出定义outputs:-name:outputtype:tensordtype:float16/float32shape:[N,C_out,H_out,W_out]算子查找importmetadef# 通过名字查找算子opmetadef.find(MatMul)# 通过条件查找opsmetadef.find_all(typeconvolution,version1.0)print(fFound{len(ops)}operators)版本管理版本号规则版本号采用语义化版本主版本.次版本.修订版本 例如1.2.3 - 主版本不兼容的 API 变更 - 次版本向后兼容的功能新增 - 修订版本向后兼容的问题修正版本兼容性# 查找兼容版本opsmetadef.find_compatible(Conv2d,min_version1.0.0,max_version2.0.0)# 获取最新版本latestmetadef.find_latest(Conv2d)依赖管理依赖声明name:MyOperatorversion:1.0# 依赖其他算子depends:-name:MatMulversion:1.0-name:Reluversion:1.0依赖解析# 自动解析依赖depsmetadef.resolve_dependencies(MyOperator)fordepindeps:print(f{dep.name}:{dep.version})# 自动安装缺失依赖metadef.install_dependencies(MyOperator)算子类类定义name:NormOperatortype:operator_classcategory:normalizationoperators:-BatchNorm2d-LayerNorm-InstanceNorm类继承name:ConvNormActiviationtype:operator_classextends:[Conv2d,BatchNorm2d,Relu]fusion_rules:-pattern:[Conv2d,BatchNorm2d]result:ConvBN-pattern:[ConvBN,Relu]result:ConvBNReLU算子发现自动发现# 扫描目录发现算子metadef.scan_directory(/path/to/operators)# 列出所有算子all_opsmetadef.list_all()# 按分类查找conv_opsmetadef.list_by_category(convolution)norm_opsmetadef.list_by_category(normalization)动态注册# 动态注册算子metadef.register_operator({name:CustomOp,version:1.0,impl:custom_op_impl,})# 动态注销metadef.unregister_operator(CustomOp)与其他组件集成与 AscendCL 集成importaclimportmetadef# 查找算子op_defmetadef.find(MatMul)# 加载算子到 AscendCLacl.op.create(op_def.name,op_def.params)与 Catlass 集成importcatlassimportmetadef# 查找算子实现op_defmetadef.find(Conv2d)# 使用 Catlass 构建算子kernelcatlass.build(op_def)与 Runtime 集成importruntimeimportmetadef# 算子编译和执行op_defmetadef.find(MatMul)exeruntime.compile(op_def)resultexe.execute(input_data)性能影响使用 METADEF 的性能考虑操作开销算子查找1us依赖解析10us版本检查1us动态注册100us总结METADEF 是 CANN 的算子元数据管理系统提供了统一的算子定义版本管理依赖解析等能力更多技术细节https://atomgit.com/cann/metadef