已合并
feat: 对齐CPU训练一致性 #168
lan_xin创建于 9月1日
feat: 对齐CPU训练一致性 #168
已合并
lan_xin创建于 9月1日
lan_xin成员
9月1日

问题/功能描述

以「对齐 CPU 训练一致性」为目标,将 NPU 侧 IVFPQ 的 K-means 训练与赋值流程向 CPU(faiss::Clustering)行为靠拢:为 K-means 引入 nredo 多次重跑并按目标函数择优、使赋值算子同时支持 L2 与内积(IP)度量、将残差编码回退到 CPU 路径以规避已知算子缺陷,并顺带修正算子 kernel 的同步与偏移问题,保证 NPU 训练结果与 CPU 一致。

修改方案描述

  • K-means 多轮重跑择优:在 IVFPQ::trainKMeansOnNpu 与 trainKMeansOnNpuDistributed 中新增 nredo 参数,循环执行训练并用新增的 computeKMeansObjective 按目标值(L2 取最小、IP 取最大)选出最优质心,trainImpl_ 返回值由 void 改为 float objective,对齐 faiss::Clustering 的 redo 语义;同时 NpuIndexIVFPQ 改为透传 pq.cp.nredo、pq.cp.spherical、metric_type 等参数。
  • 赋值度量扩展:训练与赋值链路新增 assignmentMetric(faiss::METRIC_L2 / METRIC_INNER_PRODUCT)贯穿 runKMeans_、runTrainAssignOp_ 等;assignCentroidOnDevice 的 IP 路径不再构造零质心范数缓冲,改由算子内部处理。
  • ascendc_ivfpq_coarse_assign 算子支持度量类型:算子定义新增必填 metric_type 属性,tiling 校验其取值(0/1)并写入 tilingData.metricType;kernel 按 metricType 分支,IP 用 -q.c 的 argmin 形式(避免范数累积与相消),L2 保持 |q-c|^2 计算。
  • 残差编码回退 CPU:IVFPQ::encodeResidualsOnDevice 直接返回 false,因 AscendcIvfpqResidualEncode 算子存在已知 task-step bug(vectorCoreNum_ = usedCoreNum_ * 2 跳过一半任务,导致 dim=1024 残差召回率降至约 2%),改为走 CPU fallback 路径。
  • 一致性细节修正:normL2_ 改用 FAISS 的 faiss::fvec_renorm_L2 实现;updateCentroids_ 的计数改为 float(新增 centroidCounts 字段);kernel 的 CopyLabels 增加 PIPE_S 到 PIPE_MTE3 的同步并修正 tail tile 输出偏移(改用 formerTileLength 索引);相关测试将 kDim 由 128 改为 1024,测试数据由均匀分布 np.random.random 改为标准正态 np.random.standard_normal。

开发自检

============================================================
  NPU 索引准备: NpuIndexIVFPQ (nlist=262144, M=32, nbits=8)
============================================================
检测到 16 个 NPU 设备
NPU 资源获取成功
  [distributed] deviceList = [0, 1, 2, 3, 4, 5, 6, 7]
  [distributed] cp.max_points_per_centroid=20
创建索引完成 (0.00s)
  [distributed] deviceList(actual) = [0, 1, 2, 3, 4, 5, 6, 7]
NPU 训练中...
训练完成 (87.72s)
添加向量 (200000000 条)...
添加完成, ntotal=200000000 (637.04s)
nprobe 设置为 32
  [cache] NPU 索引无法直接序列化, 转出 CPU 索引再保存: ivfpq_cache/ivfpq_32_262144_200000000_cea2b34c09904a30.index
  [cache] 已保存 CPU 索引: ivfpq_cache/ivfpq_32_262144_200000000_cea2b34c09904a30.index
NPU 搜索完成 (0.8662s)
NPU 搜索有效 label: 640/640

============================================================
  NPU -> CPU copyTo roundtrip 检查
============================================================
copyTo 完成 (23.88s), ntotal=200000000
copyTo 后 CPU search 完成: valid_labels=640/640, metric=IP
  [cache] 已加载 CPU 索引: ivfpq_cache/ivfpq_32_262144_200000000_cea2b34c09904a30.index (ntotal=200000000)
CPU 搜索完成 (0.0258s)
likedislike
Pull Request已成功合入, 合并人@ascend-robot
(感谢 lan_xin 的贡献)
AtlasAccount
AtlasAccount成员
9月1日 评论:

compile

likedislike
atomgit-bot
atomgit-bot
9月1日 评论:

变更摘要

该 PR 以「对齐 CPU 训练一致性」为目标,将 NPU 侧 IVFPQ 的 K-means 训练与赋值流程向 CPU(faiss::Clustering)行为靠拢:为 K-means 引入 nredo 多次重跑并按目标函数择优、使赋值算子同时支持 L2 与内积(IP)度量、将残差编码回退到 CPU 路径以规避已知算子缺陷,并顺带修正算子 kernel 的同步与偏移问题,保证 NPU 训练结果与 CPU 一致。

主要改动

  • K-means 多轮重跑择优:在 IVFPQ::trainKMeansOnNpu 与 trainKMeansOnNpuDistributed 中新增 nredo 参数,循环执行训练并用新增的 computeKMeansObjective 按目标值(L2 取最小、IP 取最大)选出最优质心,trainImpl_ 返回值由 void 改为 float objective,对齐 faiss::Clustering 的 redo 语义;同时 NpuIndexIVFPQ 改为透传 pq.cp.nredo、pq.cp.spherical、metric_type 等参数。
  • 赋值度量扩展:训练与赋值链路新增 assignmentMetric(faiss::METRIC_L2 / METRIC_INNER_PRODUCT)贯穿 runKMeans_、runTrainAssignOp_ 等;assignCentroidOnDevice 的 IP 路径不再构造零质心范数缓冲,改由算子内部处理。
  • ascendc_ivfpq_coarse_assign 算子支持度量类型:算子定义新增必填 metric_type 属性,tiling 校验其取值(0/1)并写入 tilingData.metricType;kernel 按 metricType 分支,IP 用 -q.c 的 argmin 形式(避免范数累积与相消),L2 保持 |q-c|^2 计算。
  • 残差编码回退 CPU:IVFPQ::encodeResidualsOnDevice 直接返回 false,因 AscendcIvfpqResidualEncode 算子存在已知 task-step bug(vectorCoreNum_ = usedCoreNum_ * 2 跳过一半任务,导致 dim=1024 残差召回率降至约 2%),改为走 CPU fallback 路径。
  • 一致性细节修正:normL2_ 改用 FAISS 的 faiss::fvec_renorm_L2 实现;updateCentroids_ 的计数改为 float(新增 centroidCounts 字段);kernel 的 CopyLabels 增加 PIPE_S 到 PIPE_MTE3 的同步并修正 tail tile 输出偏移(改用 formerTileLength 索引);相关测试将 kDim 由 128 改为 1024,测试数据由均匀分布 np.random.random 改为标准正态 np.random.standard_normal。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月1日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
Xxiangjie10成员
9月1日 添加了label:pr-audit-failed
此处折叠了91条消息 查看更多
yihao1234成员
9月12日 评论:

/approve

likedislike
ascend-robotascend-robot成员
9月12日 添加了label:approved
ascend-robotascend-robot成员
9月12日 关闭了关联的issue
ascend-robotascend-robot成员
9月12日 合入了pull request,合并节点 SHA:2addefea9a653478586d7e3298fc5edc2f974d95
ascend-robot
ascend-robot成员
9月12日 评论:

Pull Request 已合并或已关闭。

If you want to solve this problem, you can click here to do it in the FAQs.

likedislike