已关闭
IndexFlatIP 在 search 时内积结果未做最大内积等价转换,返回排序方向与 CPU 相反 #17
崇理战队创建于  7月8日关闭于  7月9日
崇理战队
7月8日 创建

在用 faiss_npu FlatIndex 做向量检索,测距方式 METRIC_INNER_PRODUCT。

在 CPU faiss 里,IP 搜索结果按内积从大到小排序(越大越相似)。但 NPU 侧的 FlatIndex search 返回的结果是按内积从小到大排序的。

对比验证:

import faiss
import faiss_npu

d = 128
xb = np.random.randn(1000, d).astype(np.float32)
xq = np.random.randn(1, d).astype(np.float32)

cpu_index = faiss.IndexFlatIP(d)
cpu_index.add(xb)
D_cpu, I_cpu = cpu_index.search(xq, 10)  # D_cpu 递减

npu_index = faiss_npu.IndexFlatIP(d)
npu_index.add(xb)
D_npu, I_npu = npu_index.search(xq, 10)  # D_npu 递增(?)

看了 #16 说到 FlatIndex 在 reserve/add 阶段未区分 L2 和 IP,应该也是同一类问题——IP 的搜索结果排序和 L2 统一用了升序。

NPU 侧做 IP reduce 时,如果直接找最小值(相当于 L2 的逻辑),肯定是反的。建议 IP 模式下在 search 出口处翻转排序方向,或者用 max reduce 替代 min reduce。

likedislike
崇理战队
7月8日 添加了label:bug
xiangjie10成员
7月8日 评论:

👋 您好,感谢向 faiss 提交 Issue!
🎉 我们已收到您的反馈,感谢你对开源社区的支持!

📅 处理时效 维护团队将在工作日 24 小时内查看并回复您的问题。
🔍 自助排查(推荐优先查看) 在等待回复期间,您可以先查阅仓库README以及历史 Issue 中相似问题的解决方案,多数问题可快速解决。
💡 为了更快定位问题,请您确保 Issue 包含:

  • 清晰的问题描述
  • 可复现的操作步骤
  • 相关日志、截图或环境信息
    我们会尽快跟进,感谢您的理解与配合!
likedislike
xiangjie10成员
7月8日 评论:

/label add triaged

likedislike
ascend-robotascend-robot成员
7月8日 添加了label:triaged
Qanly
Qanly成员
7月9日 评论:

您好,首先感谢您的关注,但是 faiss-npu 不是这样调用的,请参考相关文档。

likedislike
QanlyQanly成员
7月9日 issue状态由 TODO 改变为 DONE
QanlyQanly成员
7月9日 关闭了 issue
ascend-robotascend-robot成员
7月9日 添加了label:resolved