CANN ops-nn EmbeddingHashTableExport 算子解析:hash 表导出功能、参数与实现原理
人工智能算子库深度学习CANNAscend【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-nn点击查看免费下载EmbeddingHashTableExport 是 CANN ops-nn 算子库hash 目录中负责将整张 embedding hash 表内容导出为可查询张量序列的算子。本文以 hash/embedding_hash_table_export/README.md 为主体结合其算子定义、InferShape、Tiling 与 kernel 源码系统讲解其产品支持范围、全部输入输出与属性参数、shape 推导规则、桶内数据结构与导出算法帮助读者在推荐系统/大规模稀疏特征场景中正确理解并调用该算子。产品支持情况当前算子仅支持以下产品形态其余训练/推理系列产品均不支持产品是否支持Ascend 950PR/Ascend 950DT√Atlas A3 训练系列产品/Atlas A3 推理系列产品✗Atlas A2 训练系列产品/Atlas A2 推理系列产品✗Atlas 200I/500 A2 推理产品✗Atlas 推理系列产品✗Atlas 训练系列产品✗该支持范围与源码中的 AICore 注册配置完全一致embedding_hash_table_export_def.cpp 中通过this-AICore().AddConfig(...)仅注册了ascend950、ascend960dt、ascend350三个平台配置与 README 表格中的 Ascend 950PR/Ascend 950DT 一一对应。对应平台还提供了独立的算子二进制配置清单ascend350、ascend950、ascend960dt因此使用前务必确认目标设备的 SoC 型号。功能说明算子功能导出整个 table 表。在基于 hash 结构的 embedding 参数存储方案中训练/推理过程中产生的 key-value 数据以桶bucket为单位存放在设备端 hash 表中。EmbeddingHashTableExport 的作用就是把一张或多张 hash 表中的全部桶数据按顺序取出整理为紧凑的 key、counter、filter_flag、value 张量序列输出供上层框架做检查点保存、参数序列化或后续离线处理使用。从源码结构看hash 目录下与它配套的还有 lookup/import、apply_adam_w 等一组 embedding hash 表算子它们共享table handle 桶数组这一底层内存契约本算子读取 handle 结构体中的表地址等元信息见 embedding_hash_table_export.h因此理解本算子对理解整套 hash 表算子体系同样有帮助。参数说明算子共包含 4 个输入、4 组动态输出和 2 个属性完整参数表如下与 README 一致并补充了源码中确认的细节参数名输入/输出/属性描述数据类型数据格式table_handles输入输入 hash 表 handle 句柄里面包含了 hash 表的表头地址等INT64NDtable_sizes输入table 数量INT64NDembedding_dims输入hash 表桶深度INT64NDbucket_sizes输入hash 表桶数量INT64NDkeys输出插入 key 序列INT64NDcounters输出导出 key 数量UINT64NDfilter_flags输出准入标志UINT8NDvalues输出导出 key 对应的 value 序列FLOATNDexport_mode输入属性导出模式默认 all全量导出STRING-filtered_export_flag输入属性是否按准入标志过滤导出默认 falseBOOL-输入输出在源码中的定义输入全部为必选REQUIRED且数据类型固定为DT_INT64、格式固定为FORMAT_ND见 embedding_hash_table_export_def.cpp。四组输出均为动态输出DYNAMIC即每个输出位置上实际包含的张量数量在编译期不固定由输入 table 数量决定keys 为DT_INT64counters 为DT_UINT64filter_flags 为DT_UINT8values 为DT_FLOATembedding_hash_table_export_def.cpp。属性默认值export_mode默认allfiltered_export_flag默认falseembedding_hash_table_export_def.cpp。在 graph 定义embedding_hash_table_export_proto.h中同样以all与false作为默认值且export_mode的合法取值在注释中明确为all或new两种。算子注册时开启了DynamicCompileStaticFlag(true)、DynamicShapeSupportFlag(true)、DynamicRankSupportFlag(true)等能力embedding_hash_table_export_def.cpp意味着该算子支持动态 shape 与动态编译上层可以传入运行期才确定形状的输入。二进制配置中的参数形态以 ascend950 的 binary 配置为例输入输出 shape 均为-2动态维度输出按[[...]]双层结构组织表示每个输出位置是一组张量属性区声明了export_modestringvalue 为 null即使用默认值与filtered_export_flagbool默认 false。这说明实际部署时四个输入都需要以 1 维动态张量传入。shape 推导规则InferShape 实现了关键推导逻辑embedding_hash_table_export_infershape.cpp输入形状一致性校验table_sizes、embedding_dims、table_handles、bucket_sizes四个输入的 shape size元素个数必须完全相等且table_sizes的 shape size 必须 ≥ 0否则报错并返回GRAPH_FAILEDCheckEmbeddingHashTableExportParams。输出张量数量校验每个动态输出列表中的张量个数 table 数量 × 4keys/counters/filter_flags/values 各一组总输出数必须等于numTable * 4。输出 shape 推导对第 i 张表keys、counters、filter_flags 输出 shape 均为[tableSizes[i]]values 输出 shape 为[tableSizes[i], embeddingDims[i]]InferShape4EmbeddingHashTableExport。若table_sizes为运行期值指针为空则各输出退化为[-1]/[-1, -1]的动态形状InferShape4EmbeddingHashTableExportNull。数据类型推导keys/counters/filter_flags/values 的输出类型分别固定为 INT64/UINT64/UINT8/FLOATInferDataType4EmbeddingHashTableExport。shape 推导依赖table_sizes与embedding_dims的具体取值InputsDataDependency({INPUT_TABLE_SIZE_IDX, INPUT_EMBEDDING_DIMS_IDX})这两个输入属于值依赖输入embedding_hash_table_export_def.cpp 中ValueDepend(OPTIONAL)。约束说明README 中约束说明为无但算子原型注释embedding_hash_table_export_proto.h与 Tiling 实现embedding_hash_table_export_tiling_arch35.cpp补充了两条使用约束可作为实操时的隐性要求table_handles、table_sizes、embedding_dims、bucket_sizes四个输入具有相同的 shape len元素个数相同每个动态输出张量列表keys/counters/filter_flags/values中的张量个数须等于table_handles的 shape lenvalues 数据类型在 kernel 侧仅支持 float32见 tiling 中的 SUPPORT_VALUES_DATA_TYPE。实现原理与内部细节桶内存布局kernel 源码开头的注释明确了每个桶bucket的数据结构current Bucket contains:int64_t key, uint64_t count, uint8 flag, int64_t value[embeddingDims]对应的字节布局常量embedding_hash_table_export.hflag 字节位于桶内偏移23 字节处KEY_FLAG_OFFSET_OF_BYTE 23value 区起始于偏移24 字节KEY_VALUE_OFFSET_OF_BYTE 24每个桶的行宽keyWidthByte 24 align8(sizeof(T) * embeddingDims)即 value 区按 8 字节向上对齐SingleTableCompute。flag 字节采用位图方式编码共使用 4 个 bit掩码含义VALID_FLAG_MASK 0b00000001桶位有效已被写入 keyFILTER_FLAG_MASK 0b00000010命中准入过滤条件EXPORT_FLAG_MASK 0b00000100已被导出过EVICTED_FLAG_MASK 0b00001000桶位已被驱逐导出判定条件kernel 在逐桶扫描时只有同时满足以下条件的桶才会被导出CountPerThread / ExportPerThreadflag VALID_FLAG_MASK为真桶位有效flag EVICTED_FLAG_MASK为假未被驱逐当export_mode new时要求flag EXPORT_FLAG_MASK为假从未导出过的新 key当export_mode all默认时不做该限制。导出流程对每张表Process()循环执行以下阶段embedding_hash_table_export.h统计阶段各 SIMT 线程扫描自己负责的桶区间统计待导出 key 数量并写入 UBCountPerThread随后用ReduceSum求整核导出数跨核同步每个 AICore 将本核导出数写入 workspace 中的核间同步区SaveToCoreSyncWorkspace再通过SyncAll()同步保证所有核的计数对彼此可见偏移计算各核根据前序核的导出数累加出本核输出起始偏移CalcOffset写出阶段ExportPerThread按偏移连续写出 keyINT64、counterUINT64与 filter_flagsUINT8命中FILTER_FLAG_MASK写 1否则写 0并将 value 区按float2/float4短向量访存合并方式拷贝到输出 values 张量对应行CopyExportValuesMergedembeddingDims%40 且行基址 16B 对齐时用 4 元素合并档否则回退 2/1 元素档刷新导出标志仅当桶此前未被导出时置位EXPORT_FLAG_MASK并统计首次导出数量原子更新计数通过asc_atomic_sub对 table handle 结构体索引 4 处的未导出数量字段做原子减操作AtomicSubToGm供export_modenew的下一次导出判定使用再SyncAll()保证跨核一致。值得注意的是 kernel 仅注册了一个入口模板EmbeddingHashTableExportfloatembedding_hash_table_export.cpp配合 tiling key 6BIT4WIDTH_TILING_KEY分发与 values 仅支持 float32 的约束一致。Tiling 策略Tiling 阶段embedding_hash_table_export_tiling_arch35.cpp做了以下决策解析属性export_mode为new时置exportMode1否则为 0全量导出filtered_export_flag直接透传计算可用核数/线程数核数取平台 AIV 核数与 64 的最小值MAX_CORE_NUM线程数取平台 SIMT 线程数与 256 的最小值MAX_THREAD_NUM平台能力在TilingPrepare阶段通过platform_ascendc::PlatformAscendC获取TilingPrepareForEmbeddingHashTableExport写入 TilingDatatableNum、exportMode、filteredExportFlag、bitWidth6同时作为 tiling key、maxCoreNum、maxThreadNum六个字段TilingData 结构定义见 embedding_hash_table_export_tiling_arch35.h设置调度模式为 batch 模式SetScheduleMode(1)注释说明因 kernel 使用SyncAll需要所有核同时启动并按maxThreadNum*6*8字节申请本地内存申请 workspace16MBASCENDC_TOOLS_WORKSPACE 核数×8×表数量其中核间同步区用于各核上报导出数workspace 计算。调用说明与验证README 的调用说明一节当前为无即该算子暂未在 README 中提供可直接粘贴的样例代码其标准用法是由上层图引擎按上述参数表构造算子节点输入为四个 1 维 INT64/ND 张量输出为四组动态张量列表。对调用方式与行为最直接的参考是仓库自带的单元测试test_embedding_hash_table_export_tiling.cpp 模拟了Ascend95064 AICore平台上的 TilingParse Tiling 全流程输入输出 shape 取{1}/{1024}属性取export_modeall、filtered_export_flagtrue验证 tiling 函数返回GRAPH_SUCCESS可直接作为调用参数形态的参考test_embedding_hash_table_export_infershape.cpp 在Ascend950平台注册信息下验证了 4 输入、4 组动态输出的 InferShape 与数据类型推导流程。小结EmbeddingHashTableExport 是 CANN ops-nn 中面向 embedding hash 表持久化的关键算子它通过table handle 桶数组的底层契约将整张或多张hash 表按桶序导出为 keys/counters/filter_flags/values 四组张量export_mode属性支持全量导出与仅导出新 key两种模式filtered_export_flag支持按准入标志过滤。在 950 系列设备上该算子以 SIMT 多核并行 跨核 workspace 同步 原子计数的方式实现高效导出。使用者只需保证四个输入 1 维张量长度一致、values 为 float32即可通过标准图接口接入该算子具体接入形式可参照上文提到的两个单元测试。赞分享人工智能算子库深度学习CANNAscend【免费下载链接】ops-nn本项目是CANN提供的神经网络类计算算子库实现网络在NPU上加速计算。项目地址https://gitcode.com/cann/ops-nn点击查看免费下载相关推荐G-Helper深度解析华硕笔记本性能调优的5大技术突破与实战应用G Helper深度解析华硕笔记本性能调优的5大技术突破与实战应用 G Helper作为一款专为华硕笔记本设计的轻量级开源控制工具在技术架构、性能优化和用户人工智能算子库深度学习CANNAscendCANN ops-nn 仓库 PReLU 算子aclnnPrelu详解功能、参数与 AICore 实现剖析CANN ops nn 仓库 PReLU 算子aclnnPrelu详解功能、参数与 AICore 实现剖析 导读 PReLUParametric Rec人工智能算子库深度学习CANNAscendCANN ops-nn 算子解读ApplyAdagradD 参数更新算子的原理、配置与 NPU 实现CANN ops nn 算子解读ApplyAdagradD 参数更新算子的原理、配置与 NPU 实现 ApplyAdagradD 是 CANN ops nn人工智能算子库深度学习CANNAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

V8 垃圾回收(Garbage Collection)机制深度剖析:从 Scavenger 到 Mark-Sweep-Compact 的分代回收全景

V8 垃圾回收(Garbage Collection)机制深度剖析:从 Scavenger 到 Mark-Sweep-Compact 的分代回收全景

语言运行时编译器JIT编译解释器内存管理 【免费下载链接】v8 The official mirror of the V8 Git repository 项目地址: https://gitcode.com/gh_mirrors/v81/v8 点击查看 免费下载 V8 是 Google 开发的 JavaScript 引擎,其自动内存管理依赖一套高度复杂…

2026/9/21 16:10:14 阅读更多 →
EMQX 开源仓库贡献指南:分支同步链、Conventional Commit 规范与 Changelog 工程实践

EMQX 开源仓库贡献指南:分支同步链、Conventional Commit 规范与 Changelog 工程实践

EMQX 开源仓库贡献指南:分支同步链、Conventional Commit 规范与 Changelog 工程实践 【免费下载链接】emqx The most scalable and reliable MQTT broker for AI, IoT, IIoT and connected vehicles 项目地址: https://gitcode.com/gh_mirrors/em/emqx 本文以…

2026/9/21 16:10:14 阅读更多 →
flutter_plugin_android_lifecycle 插件深度解析:在 Flutter Android 插件中安全访问 Lifecycle 对象

flutter_plugin_android_lifecycle 插件深度解析:在 Flutter Android 插件中安全访问 Lifecycle 对象

flutter_plugin_android_lifecycle 插件深度解析:在 Flutter Android 插件中安全访问 Lifecycle 对象 【免费下载链接】plugins Plugins for Flutter maintained by the Flutter team 项目地址: https://gitcode.com/gh_mirrors/pl/plugins 本篇文章围绕 Flu…

2026/9/21 16:10:14 阅读更多 →

最新新闻

Ceph 分布式追踪实战:基于 LTTng 的事件追踪与 Blkin/Zipkin 端到端请求链路分析

Ceph 分布式追踪实战:基于 LTTng 的事件追踪与 Blkin/Zipkin 端到端请求链路分析

存储分布式文件系统对象存储后端高可用 【免费下载链接】ceph Ceph is a distributed object, block, and file storage platform 项目地址: https://gitcode.com/gh_mirrors/ce/ceph 点击查看 免费下载 Ceph 作为统一的分布式对象、块与文件存储平台,…

2026/9/21 17:04:58 阅读更多 →
SkillOpt-Sleep 在 Cursor 中的实战指南:从本地会话收割到验证门控的技能沉淀

SkillOpt-Sleep 在 Cursor 中的实战指南:从本地会话收割到验证门控的技能沉淀

人工智能大模型AI Agent提示工程 【免费下载链接】SkillOpt SkillOpt is a text-space optimizer that trains reusable natural-language skills for frozen LLM agents through trajectory-driven edits, validation-gated updates, and deployable best_skill.md artifacts.…

2026/9/21 17:04:58 阅读更多 →
CANN ops-math aclnnInplaceNormal 算子使用指南:用正态分布随机数原位填充张量

CANN ops-math aclnnInplaceNormal 算子使用指南:用正态分布随机数原位填充张量

CANN ops-math aclnnInplaceNormal 算子使用指南:用正态分布随机数原位填充张量 【免费下载链接】ops-math 本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-math 本篇技术指南以 CAN…

2026/9/21 17:04:58 阅读更多 →
nix-store --print-env 命令详解:导出并调试 Nix 派生(Derivation)的构建环境

nix-store --print-env 命令详解:导出并调试 Nix 派生(Derivation)的构建环境

开发工具CLI 【免费下载链接】nix Nix, the purely functional package manager 项目地址: https://gitcode.com/gh_mirrors/ni/nix 点击查看 免费下载 nix-store --print-env 是 Nix 包管理器中用于将某个派生(derivation,即 .drv 文件&…

2026/9/21 17:03:57 阅读更多 →
BentoPDF 单页拼接(Combine to Single Page)原理与实战:把多页 PDF 无缝缝合为一张连续长页

BentoPDF 单页拼接(Combine to Single Page)原理与实战:把多页 PDF 无缝缝合为一张连续长页

BentoPDF 单页拼接(Combine to Single Page)原理与实战:把多页 PDF 无缝缝合为一张连续长页 【免费下载链接】bentopdf The Privacy First PDF Toolkit 项目地址: https://gitcode.com/gh_mirrors/be/bentopdf 将 PDF 的每一页按顺序拼…

2026/9/21 17:03:57 阅读更多 →
Neovide 功能全景指南:从连字渲染、光标特效到远程 Neovim 实例连接

Neovide 功能全景指南:从连字渲染、光标特效到远程 Neovim 实例连接

Neovide 功能全景指南:从连字渲染、光标特效到远程 Neovim 实例连接 【免费下载链接】neovide No Nonsense Neovim Client in Rust 项目地址: https://gitcode.com/gh_mirrors/ne/neovide Neovide 是一款用 Rust 编写的 "No Nonsense" Neovim GUI …

2026/9/21 17:03:57 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →