已合并
feat: 对齐CPU训练一致性 #168
lan_xin创建于 9月1日
feat: 对齐CPU训练一致性 #168
已合并
Pull Request已成功合入, 合并人@ascend-robot
(感谢 lan_xin 的贡献)AtlasAccount
9月1日 评论:
9月1日 评论:
compile


atomgit-bot
9月1日 评论:
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改为floatobjective,对齐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。


不准确?
atomgit-bot
9月1日 评论:
9月1日 评论:
AtlasAccount
9月1日 评论:
9月1日 评论:
9月1日 添加了label:pr-audit-failed
此处折叠了91条消息 查看更多
9月12日 添加了label:approved
9月12日 关闭了关联的issue
9月12日 合入了pull request,合并节点 SHA:2addefea9a653478586d7e3298fc5edc2f974d95
ascend-robot
9月12日 评论:
9月12日 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


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