常用操作

日志说明

检索日志组件基于《CANN 软件安装》以及《CANN 日志参考》设计和开发。

对于标准态部署,检索的日志属于应用类日志,可以参考《CANN 日志参考》中的“查看日志(Ascend EP标准形态)”章节的“查看应用类日志”描述。默认路径为“$HOME/ascend/log”。也可以使用环境变量ASCEND_PROCESS_LOG_PATH指定日志落盘路径。命令参考如下:

export ASCEND_PROCESS_LOG_PATH=$HOME/xxx

可指定日志落盘路径为任意有读写权限的目录。

日志级别由低到高依次为DEBUG < INFO < WARNING < ERROR,级别越低,输出日志越详细,可以通过ASCEND_GLOBAL_LOG_LEVEL环境变量设置日志级别。命令参考如下:

export ASCEND_GLOBAL_LOG_LEVEL=1

不传入此参数,默认为ERROR等级。ASCEND_GLOBAL_LOG_LEVEL 全部取值说明如下:

0:DEBUG

1:INFO

2:WARNING

3:ERROR

4:NULL,NULL级别。不输出日志。

Note

  • 对于容器化场景中使用检索功能,应用类日志位于容器中,需要将日志目录挂载到宿主机才能实现持久化,否则日志将在容器退出时被销毁。
  • 应用类日志未配置自动轮转,日志会不断增多,因此需要用户定期清理该目录(可以使用系统自带的logrotate实现日志切分),否则可能导致磁盘空间不足,影响业务正常运行。
  • 软件包的安装升级卸载等管理面的相关日志会保存至“$HOME/log/mxIndex/deployment.log”,文件中保存有登录用户的用户名、访问端地址以及 hostname,用于支持后续的日志记录及审计的操作。

IVFRaBitQ 运行时诊断

AscendIndexIVFRaBitQ 提供三组可选调试环境变量,用于排查coarse centroid(聚类中心)NPU上传异常与L1粗排probe选择偏差。默认全部关闭,对生产路径零开销;仅在开发/联调环境按需开启。

Note

  • 环境变量在进程启动时读取,需在运行应用程序或测试用例之前export。
  • 诊断日志输出至 stderr 及 APP 日志(IVFRABITQ_VERIFY_COARSE_CENTER);建议重定向到 .log 文件便于 grep。
  • IVFRABITQ_VERIFY_L1_DIST与L1 golden对比会触发全量D2H,不要在性能基准测试中常开
  • 修改RotateAndL2AtFP32算子后须重新编译部署custom opp,否则诊断结果可能仍反映旧版算子行为。

环境变量说明

表 1 IVFRaBitQ 调试环境变量

环境变量名 取值 触发时机 用途
IVFRABITQ_VERIFY_COARSE_CENTER 非空且非 0 copyFrom / 训练后更新 centroid(updateCoarseCenterImpl 分阶段 D2H 校验:区分 H2D Memcpy 失败 vs rotate 算子输出不完整
IVFRABITQ_DEBUG_L1_PROBE 1 / stats / full 每次 search 的 L1 阶段 观察 probe 是否仅落在 [0,8192) 而忽略后半段 list
IVFRABITQ_VERIFY_L1_DIST 非空且非 0 每次 search 的 L1 阶段 CPU golden vs NPU L1 距离及 probe 一致性对比

关闭方式:

unset IVFRABITQ_VERIFY_COARSE_CENTER IVFRABITQ_DEBUG_L1_PROBE IVFRABITQ_VERIFY_L1_DIST
# 或设为 0
export IVFRABITQ_VERIFY_COARSE_CENTER=0

诊断决策流程

  1. recall 低且发生在copyFrom之后 → 开启IVFRABITQ_VERIFY_COARSE_CENTER=1,重跑copyFrom。
  2. 查看 centroidsOnDevice_rotated_full 日志中的 zeroRowsAfter2512
    • H2D后originCentroidsOnDevice与host一致,但 zeroRowsAfter2512 > 0 → 故障在 RotateAndL2AtFP32 算子。
    • H2D 即 mismatch → 排查Memcpy参数或buffer容量。
  3. centroid 已确认正常,recall仍低 → 开启IVFRABITQ_DEBUG_L1_PROBE=stats,检查probe在tile1/tile2的分布。
  4. 需对比8192边界L1距离 → 开启IVFRABITQ_VERIFY_L1_DIST=1IVFRABITQ_DEBUG_L1_PROBE=full

Coarse Center 上传诊断

export IVFRABITQ_VERIFY_COARSE_CENTER=1

# 边界测试(copyFrom 触发 updateCoarseCenterImpl)
./TestAscendIndexIVFRaBitQBoundary --gtest_filter="*CoarseCenterCopy10048*" 2>&1 | tee coarse_verify.log

grep -E 'CoarseCenterVerify|zeroRowsAfter2512' coarse_verify.log

修复后期望日志:

[CoarseCenterVerify] originCentroidsOnDevice: row 2512 OK vs host (devNorm=...)
[CoarseCenterVerify] centroidsOnDevice_rotated_full full: mismatchRows=0 zeroRowsBefore2512=0 zeroRowsAfter2512=0 / 7536

修复前典型异常(nlist=10048):

[CoarseCenterVerify] centroidsOnDevice_rotated: row 2512 is all-zero on device (devNorm=0.000000)
[CoarseCenterVerify] centroidsOnDevice_rotated_full full: zeroRowsAfter2512=7536 / 7536

关键判定:2512 = 10048 / 4,为四核 AIC 均匀分核时单核 batch 大小;row 2512 是首个“非 core 0”边界行。

L1 Probe 分布诊断

# 打印 q0 前 8 个 probe id
export IVFRABITQ_DEBUG_L1_PROBE=1

# 仅统计 probe 在 [0,8192) 与 [8192,nlist) 的分布(推荐,开销小)
export IVFRABITQ_DEBUG_L1_PROBE=stats

# probe 列表 + CPU golden 对比 + 分布统计(开销最大)
export IVFRABITQ_DEBUG_L1_PROBE=full

stats 模式示例:

[IVFRaBitQ] L1 probe stats q0: nprobe=1024 in[0,8192)=1024 in[8192,10048)=0 min=3 max=8191

异常信号:in[8192,nlist)=0 且 nlist > 8192,说明 probe 未覆盖后半段 list,常与 centroid device 零行或 L1 距离算子异常相关。

L1 距离 Golden 对比

export IVFRABITQ_VERIFY_L1_DIST=1
# 运行 search 场景
grep 'L1 dist golden\|jaccard' search.log

边界 id 距离(抽样 8191/8192/8193 及尾部行):

[IVFRaBitQ] L1 dist golden id=8192 cpu=15.678901 npu=15.678902 absErr=0.000001

Probe overlap:

[IVFRaBitQ] L1 probe overlap q0: nprobe=1024 overlap=980 jaccard=0.957 cpu_tile2=128
字段 含义 健康参考
overlap CPU top-nprobe 与 NPU probe 交集 接近 nprobe
jaccard overlap / nprobe > 0.95
cpu_tile2 CPU golden probe 落在 [8192,nlist) 的数量 若 NPU tile2=0 而 cpu_tile2>0,说明 NPU 遗漏后半段

推荐组合

场景 export 组合
验证 copyFrom 上传 IVFRABITQ_VERIFY_COARSE_CENTER=1
centroid 正常,排查 L1 IVFRABITQ_DEBUG_L1_PROBE=stats
8192 边界 L1 距离 IVFRABITQ_VERIFY_L1_DIST=1
一次性完整 dump IVFRABITQ_DEBUG_L1_PROBE=full

延伸阅读

Device 内存调试

AscendFaiss 提供两组可选环境变量,用于排查 Device HBM 分配失败、索引上传/扩容过程中的显存占用变化。默认全部关闭,对生产路径零开销;仅在开发/联调环境按需开启。环境变量一览见《附录》。

Note

  • 环境变量在进程首次查询时读取并缓存,需在运行应用程序或测试用例之前 export。
  • 调试日志输出至 stderr,并同步写入 APP 日志([MemDebug] 前缀);建议重定向到 .log 文件便于 grep。
  • 开启后会查询 aclrtGetMemInfo(ACL_HBM_MEM) 并抽样打印,不要在性能基准测试中常开

环境变量说明

表 2 Device 内存调试环境变量

环境变量名 取值 默认 用途
ASCENDFAISS_MEM_DEBUG 非空且非 0 / false / off(大小写不敏感) 关闭 总开关:开启分配抽样、HBM 余量打印;aclrtMalloc 失败时 dump 最近分配环形缓冲
ASCENDFAISS_MEM_DEBUG_EVERY 正整数 N 64 抽样周期:分配序号满足 seq % N == 0,或 size ≤ 4096 时打印明细;未设置/非法/0 时回退为 64

关闭方式:

unset ASCENDFAISS_MEM_DEBUG ASCENDFAISS_MEM_DEBUG_EVERY
# 或
export ASCENDFAISS_MEM_DEBUG=0

使用示例

# 开启内存调试(默认每 64 次分配抽样一次)
export ASCENDFAISS_MEM_DEBUG=1

# 提高采样密度(每 8 次分配打印一次)
export ASCENDFAISS_MEM_DEBUG=1
export ASCENDFAISS_MEM_DEBUG_EVERY=8

# 运行业务或 UT,并保存日志
./your_app 2>&1 | tee mem_debug.log
grep '\[MemDebug\]' mem_debug.log

日志解读

日志关键字 含义
[MemDebug] alloc seq=... 一次 Device 分配的抽样记录:序号、size、space、device、分配前 HBM free/total
[MemDebug] ... HBM free=... 关键路径上的 HBM 余量快照(如 copyVectorToDevice_*DeviceMemArena::GrowIndexIVFRaBitQ_resize
[MemDebug] aclrtMalloc FAILED ... 分配失败:当前请求 size/space/device、错误码、当时 HBM free/total
dumping last N alloc records 失败前最近最多 64 条分配记录(oldest→newest),用于定位耗尽显存的连续分配

典型排查流程:

  1. 复现 OOM / aclrtMalloc 失败场景前设置 ASCENDFAISS_MEM_DEBUG=1
  2. 在失败日志中查看 HBM_free 是否已接近 0,以及 size / spaceDEVICEDEVICE_HUGEPAGE)。
  3. 根据 dump 的最近分配记录,对照业务阶段(索引上传、list resize、arena grow)缩小泄漏或峰值分配点。
  4. 需要更密采样时增大频率:export ASCENDFAISS_MEM_DEBUG_EVERY=1(每笔分配都打印,日志量很大)。