百万级数据集下Milvus GPU向量搜索无加速效果的问题排查请求
背景
我有100万条1536维的向量数据,希望通过GPU加速向量查询与搜索。
资源信息
CPU
Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian Address sizes: 46 bits physical, 57 bits virtual CPU(s): 104 On-line CPU(s) list: 0-103 Thread(s) per core: 2 Core(s) per socket: 26 Socket(s): 2 NUMA node(s): 2 Vendor ID: GenuineIntel CPU family: 6 Model: 106 Model name: Intel(R) Xeon(R) Gold 5320 CPU @ 2.20GHz Stepping: 6 CPU MHz: 2800.167 BogoMIPS: 4400.00 Virtualization: VT-x
GPU
+-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 555.42.02 Driver Version: 555.42.02 CUDA Version: 12.5 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA A100 80GB PCIe Off | 00000000:17:00.0 Off | 0 | | N/A 40C P0 64W / 300W | 1MiB / 81920MiB | 1% Default | | | | Disabled | +-----------------------------------------+------------------------+----------------------+ | 1 NVIDIA A100 80GB PCIe Off | 00000000:CA:00.0 Off | 0 | | N/A 42C P0 69W / 300W | 1MiB / 81920MiB | 3% Default | +-----------------------------------------+------------------------+----------------------+
操作步骤
- 启动CPU版Milvus服务:参考官方文档《Run Milvus in Docker》
- 启动GPU版Milvus服务:参考官方文档《Run Milvus with GPU Support Using Docker Compose》
- 插入数据:基于官方示例
hello_milvus.py修改:- 数据规模:100万条1536维向量
- 索引配置:CPU版用
IVF_FLAT,nlist=2048;GPU版用GPU_IVF_FLAT,nlist=2048
- 搜索测试:使用以下代码执行搜索:
from pymilvus import MilvusClient, DataType import time import numpy as np import string import random milvus_uri = "" collection_name = "" client = MilvusClient(uri=milvus_uri) client.load_collection(collection_name) search_params = { "metric_type": "L2", "params": {"nprobe": 32}, } vectors_to_search = [np.random.rand(1536).tolist() ] start_time = time.time() result = client.search( collection_name=collection_name, data=vectors_to_search, filter = filter_expr, anns_field="embeddings", search_params=search_params, limit=10, output_fields=["random"], consistency_level="Eventually" ) end_time = time.time() print(f"time cost {end_time-start_time}")
- 性能测试:通过多进程发起并发搜索请求,分别测试CPU和GPU服务的性能,结果如下:
GPU IVF_FLAT(nprobe=32)
| 并发数 | QPS |
|---|---|
| 1 | 681 |
| 5 | 594 |
| 10 | 546 |
CPU IVF_FLAT(nprobe=32)
| 并发数 | QPS |
|---|---|
| 1 | 680 |
| 5 | 609 |
| 10 | 580 |
问题
为何GPU版未实现向量搜索加速效果?请排查上述操作是否存在问题。
排查方向与原因分析
1. GPU资源未被实际利用
从NVIDIA-SMI输出看,GPU显存仅占用1MiB,利用率最高3%,说明Milvus的GPU索引并未真正加载到GPU显存中,搜索过程可能仍在CPU上执行:
- 检查GPU版Milvus的启动配置:确认
docker-compose.yml中是否正确映射GPU设备,是否配置MILVUS_GPU_ENABLED=true,以及指定NVIDIA_VISIBLE_DEVICES=all。 - 查看Milvus日志:执行
client.load_collection后,确认是否有Load GPU index successfully类的成功加载日志。
2. 索引参数未适配GPU特性
当前nlist=2048、nprobe=32的配置未能充分发挥GPU并行计算能力:
- 100万条数据搭配
nlist=2048,每个簇仅约488条向量,GPU并行优势难以体现,建议增大nlist至8192或16384,让簇规模更适配GPU批量计算。 nprobe=32探测簇数量过少,GPU算力未被充分调用,可尝试提高到64、128,观察性能变化。
3. 测试场景局限性
你的CPU是104核心的Xeon Gold 5320,低并发场景下多核CPU可轻松处理请求,GPU加速效果在高并发或更大数据量场景才会凸显:
- 把并发数提升至50、100甚至更高,对比CPU和GPU的QPS差异。
- 测试单条搜索延迟:GPU单条请求可能因CPU→GPU数据传输开销略慢,但高并发下吞吐量会显著超过CPU。
4. 单条搜索的传输开销抵消GPU优势
每次仅搜索1条向量时,CPU到GPU的数据传输开销占比过高,抵消了GPU计算的优势:
- 修改测试代码,每次批量传入100条以上向量,减少单次传输的开销占比,观察GPU性能是否提升。
5. Milvus版本与CUDA兼容性问题
确认使用的Milvus版本是否支持CUDA 12.5,部分旧版本对高版本CUDA兼容性不佳,会导致GPU加速失效:
- 核对官方文档的版本兼容性说明,必要时升级到Milvus最新稳定版。
内容的提问来源于stack exchange,提问作者Qi Xiang
相关产品推荐
相关产品推荐

