当我们在淘宝搜索"运动鞋"时,系统需要在毫秒内从上亿商品中找到最符合需求的推荐;当使用人脸解锁手机时,设备要瞬间从海量特征库中匹配你的生物信息。这些场景背后都依赖近似最近邻搜索(ANN)技术。但随着数据规模突破百亿级别,传统基于DRAM的算法已力不从心。
我参与过一个电商推荐系统项目,当用户特征库从千万级增长到十亿级时,单机内存成本从3万元飙升至300万元。这促使我们转向异构硬件架构,但随之而来的是三大技术挑战:
内存墙困境:在GPU加速的案例中,我们发现当向量维度达到1024时,HNSW算法的内存访问延迟占比高达78%。就像在大型图书馆找书,虽然知道书架位置(计算快),但来回取书(数据搬运)反而成了瓶颈。
存储计算失衡:测试SmartSSD设备时,NVMe SSD的4GB/s带宽看似充足,但实际ANN查询的随机访问特性使其有效带宽利用率不足15%。好比拥有八车道高速公路,但车辆都在频繁变道(随机IO)。
硬件异构鸿沟:在CXL内存池实验中,同一ANN算法在本地DRAM和CXL内存的性能差异可达5倍。这就像用跑车发动机(计算单元)配自行车链条(内存子系统)。
DiskANN的出现犹如ANN领域的"MapReduce时刻"。我们团队复现其实验时,通过三个关键设计将SSD检索性能提升9倍:
数据耦合布局:将每个节点的原始向量与邻居列表连续存储。就像把菜谱和所需食材打包在一起,避免来回翻找。实测这种布局使4KB读取的有效数据量提升4.3倍。
python复制# DiskANN数据布局示例
struct DiskANNNode {
float vector[128]; // 原始向量
uint32_t neighbors[50]; // 邻居ID列表
uint32_t padding[2]; // 4KB对齐
};
光束搜索优化:设置W=8的批量读取策略,相当于超市购物时按清单批量拿货,减少走动次数。这使IOPS需求从3000降至400。
缓存热点策略:保留入口点3跳内的节点在内存,类似快递网点缓存热销商品。测试显示该策略减少67%的SSD访问。
参与某金融风控项目时,我们发现传统方案需要将200GB特征库全部加载到内存。采用Cognitive SSD方案后,通过三项创新实现in-storage处理:
闪存页优化:将相邻节点存入同一闪存页(16KB),使单次读取获取更多有效数据。实测读放大系数从4.7降至1.2。
计算下推:在存储设备内完成距离计算,仅返回结果。这如同在仓库直接验货,只把合格品运出。带宽需求降低82%。
流水线调度:使用io_uring实现异步IO,就像餐厅让厨师边做菜边接新订单。某支付系统延迟从23ms降至9ms。
在构建CXL-ANNS系统时,我们遇到扩展内存访问延迟高的问题。通过以下方案实现性能逆转:
预取流水线:当主机还在处理候选列表时,CXL设备已预取下一跳节点。就像助理提前准备老板可能需要的文件。测试显示该技术隐藏75%的内存延迟。
计算卸载:在CXL设备端完成距离计算,仅传回float结果而非整个向量。某推荐系统吞吐量因此提升3倍。
bash复制# CXL设备计算卸载示例
$ cxlannd --compute-distance \
--query-vec query.bin \
--target-vec target.bin \
--return-type scalar
HM-ANN项目揭示了有趣的现象:将HNSW底层放在NVM中,上层放在DRAM,配合以下优化:
度数优先构建:让连接数多的节点上浮到DRAM层。实测使搜索路径长度缩短41%。
多入口并行:同时从多个入口点搜索,充分利用NVM带宽。在128核服务器上实现近乎线性扩展。
FusionANNS系统的设计经历令人印象深刻。最初直接移植到GPU反而性能下降,最终采用三级流水:
某视频检索系统因此实现15000 QPS,比纯CPU方案快17倍。
VStore项目的失败教训很有价值。第一版设计直接在图遍历中嵌入计算单元,导致SSD控制器过热。改进方案包含:
查询编排器:重新排序相似查询,使缓存命中率提升60%
布隆过滤器:用0.3%的精度损失换取3倍visited list检查加速
闪存感知调度:合并同一闪存页的请求,通道利用率达91%
在SmartANNS系统中,我们通过硬件反馈优化算法参数:
动态分片策略:根据SSD延迟监测自动调整聚类数量。当延迟>2ms时减少活跃分片25%。
温度感知调度:当芯片温度达70°C时切换为低功耗搜索模式,吞吐量保持80%的同时温度下降12°C。
带宽自适应:检测PCIe拥塞时增加计算压缩比,使带宽需求降低40%。
这些实战经验表明,未来ANN发展必须打破算法与硬件间的藩篱。就像赛车手需要同时了解发动机性能和赛道特性,工程师需要建立跨层优化思维。每次技术突破都源于对硬件特性的创造性利用,而这需要更紧密的跨领域协作。