已开启
[Bug]: A3(Ascend910_9382)环境下 Flat FP16/INT8 功能测试失败 #47
haozhang创建于  3 天前
haozhang
haozhang
3 天前 创建

在提交新问题之前,请确保您已经在社区中搜索过相关问题,并使用了社区中提供的资源/工具后,仍未找到满意的解决方式。

⚠️ 安全信息提醒:请仔细检查提供的文本内容,确保其不包含敏感数据信息,包括但不限于:

  • API 令牌或密钥
  • 密码或身份验证凭证
  • 私有网址或接口地址
  • 个人或机密数据
  • ...

在分享配置信息或代码示例时,请将敏感信息脱敏处理,或使用 <TOKEN> 等占位符替代原有内容。

环境信息

架构:aarch64
SoC:Ascend910_9382
算子编译目标:ascend910_93
CANN:9.1.0
Python:3.12.13
Faiss:faiss-ascend 1.13.2
可见 NPU:2 个,健康状态均为 OK

🐛 问题描述

标题

A3(Ascend910_9382)环境下 Flat FP16/INT8 功能测试失败

问题描述

在 Ascend A3 设备上分别搭建了 Ubuntu 22.04 和 openEuler 24.03 环境,对 Faiss NPU 源码进行了编译、安装和真机功能测试。

两个环境均使用以下配置:

  • 架构:aarch64
  • SoC:Ascend910_9382
  • 算子编译目标:ascend910_93
  • CANN:9.1.0
  • Python:3.12.13
  • Faiss:faiss-ascend 1.13.2
  • 可见 NPU:2 个,健康状态均为 OK

源码可以正常完成编译和安装,但执行以下 Flat 精度测试时,四个测试项全部失败:

cd faiss/npu/test/scripts
python3 test_flat_accuracy.py

失败项目包括:

flat_fp16_l2
flat_fp16_ip
flat_int8_l2
flat_int8_cos

未修复时的测试结果为:

总计: 0 通过, 4 失败, 0 跳过 / 4

Ubuntu 和 openEuler 环境均能复现相同问题,说明该问题与具体 Linux 发行版无关。

遇到的问题

1. FP16 Flat 使用了错误的核心数

在以下文件中:

faiss/npu/impl/FlatIndex.cpp

核心数被固定为 40:

constexpr int32_t coreNum = 40;

但当前设备的 SoC 为 Ascend910_9382,实际需要使用 48 个核心。

使用 40 核时,FP16 L2/IP 会返回无效结果,例如:

NPU ID: 4294967295
NPU distance: 65504 或 -65504

部分运行还会出现异常的大整数 ID、异常距离、nan,以及以下运行时错误:

aclrtSynchronizeStream failed, error: 507015

我们对 DistanceFlatL2 算子进行了 A/B 测试:

使用 40 核时:

aclrtSynchronizeStream failed, error: 507015
DISTANCE_L2_TEST_EXIT=135

仅将核心数改为 48 后:

通过比例:100.0000% (524288/524288)
验证结果:PASS
DISTANCE_L2_CORE48_EXIT=0

因此确认 FP16 失败是由硬编码的 40 核导致的。

2. INT8 Flat L2 未注册 ascend910_93

以下文件只注册了 ascend910bascend910_95

faiss/npu/ops/op_impl/ascendc_dist_int8_flat_l2/op_host/ascendc_dist_int8_flat_l2_def.cpp

缺少:

this->AICore().AddConfig("ascend910_93");

因此在 Ascend910_9382 上执行 INT8 L2 时出现:

INT8 distance GetWorkspaceSize failed!

3. INT8 Flat COS 未注册 ascend910_93

以下文件只注册了 ascend910b

faiss/npu/ops/op_impl/ascendc_dist_int8_flat_cos/op_host/ascendc_dist_int8_flat_cos_def.cpp

同样缺少:

this->AICore().AddConfig("ascend910_93");

因此 INT8 COS 也会出现:

INT8 distance GetWorkspaceSize failed!

修复方法

我们进行了以下三处修改。

1. 根据设备动态获取核心数

faiss/npu/impl/FlatIndex.cpp 中引入:

#include <faiss/npu/utils/NpuSocInfo.h>

并将:

constexpr int32_t coreNum = 40;

修改为:

const int32_t coreNum =
        NpuSocInfo::getInstance().getCoreNum();

这样可以根据实际 SoC 获取核心数,Ascend910_9382 会使用 48 核。

2. 为 INT8 Flat L2 注册 ascend910_93

在:

faiss/npu/ops/op_impl/ascendc_dist_int8_flat_l2/op_host/ascendc_dist_int8_flat_l2_def.cpp

中增加:

this->AICore().AddConfig("ascend910_93");

3. 为 INT8 Flat COS 注册 ascend910_93

在:

faiss/npu/ops/op_impl/ascendc_dist_int8_flat_cos/op_host/ascendc_dist_int8_flat_cos_def.cpp

中增加:

this->AICore().AddConfig("ascend910_93");

修复后的验证结果

应用上述三处修改后,分别在 Ubuntu 22.04 和 openEuler 24.03 环境中重新编译、安装并执行相同的真机测试。

两个环境均得到以下结果:

flat_fp16_l2   PASS
flat_fp16_ip   PASS
flat_int8_l2   PASS
flat_int8_cos  PASS

总计: 4 通过, 0 失败, 0 跳过 / 4
[PASS] 全部测试通过
exit code = 0

欢迎加入社区,感谢您对社区的贡献 🎉!

likedislike
xiangjie10成员
3 天前 评论:

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

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

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

/label add triaged

likedislike
ascend-robotascend-robot成员
3 天前 添加了label:bug
ascend-robotascend-robot成员
3 天前 添加了label:triaged
QanlyQanly成员
1 天前 关联了pull request:【fix】修复flat算法在A3上无法正常执行问题