先看现象。执行 faiss.index_cpu_to_gpu 时报 AssertionError,提示没有编译 GPU 支持,pip 装的 faiss-cpu 版本根本不带这个功能。
原因不止一个,得分开看。装的是 CPU 版本,函数存在但实现为空。还有一种是CUDA 版本与 faiss-gpu 轮子不匹配。
少数情况下是显存不足,索引放不进显卡。
不容易想到的是,驱动正常但运行时库缺失。
上来先确认当前包是否支持 GPU
python -c "import faiss;print(faiss.get_num_gpus())"
卸载 CPU 版装 GPU 版
pip uninstall -y faiss-cpu; pip install faiss-gpu-cu12
随后把索引搬到显卡并验证
res = faiss.StandardGpuResources(); gpu_index = faiss.index_cpu_to_gpu(res, 0, index)
数据量大时分片放多卡
python -c "print(faiss.get_num_gpus())"
这台环境是别人交接的,不少默认值被动过,只能一项项核。
同事提醒我看一下最近一次发布,时间点确实对得上。
改完先别撤,确认这几项。get_num_gpus 返回大于零,检索能在显卡上执行,批量查询耗时从数百毫秒降到几十毫秒,显存占用也在预期之内,日志里不再出现断言失败的堆栈。
提醒一点。GPU 索引对显存要求很高,百万级向量可能直接放不下,先算清内存再决定是否值得迁移。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。