nv-embedding-cache
NV Embedding Cache SDK — 项目介绍
背景与定位
NV Embedding Cache SDK(以下简称 NVE)是 NVIDIA 开源的高性能嵌入向量缓存开发套件。项目聚焦于推荐系统推理场景中的 Embedding 查找加速——这是现代推荐系统中最核心也最昂贵的操作之一。在典型的深度学习推荐模型中,Embedding 表可能包含数亿甚至数十亿的 ID 对应的高维向量,总规模远超单张 GPU 的显存容量。NVE 通过组合 GPU 软件管理缓存、CPU 端哈希表以及远程参数服务器(如 Redis 或 RocksDB),形成多级存储层次结构,使得在显存受限的情况下仍然能够高效地进行 Embedding 查找。
项目以 Apache 2.0 许可证开源,由 NVIDIA 核心团队维护,版本号遵循年月日格式(当前版本 26.05.0)。代码仓库包含约 15 万行 C++/CUDA 源码、约 2000 行 Python 绑定代码以及完整的测试套件和示例程序。项目依赖了 cuEmbed(NVIDIA 的 CUDA 嵌入优化内核库)和 nvhashmap(NVIDIA 的 GPU 端高性能哈希表)等自研组件,以及 Abseil、RocksDB、Parallel Hashmap、Redis++、pybind11 等第三方库,全部以 git submodule 形式 vendored 在 third_party/ 目录下。
设计理念:三层次”按需选用”架构
NVE 的核心设计哲学是”按需选用”——将功能划分为三个抽象层次,用户可以根据自己的集成深度和性能需求选择合适的使用方式。
最高层是嵌入层(Embedding Layer)。这一层对外提供完整的 C++ 和 Python 对象,封装了所有嵌入数据的存储和查找服务。用户只需配置好表层次结构(GPU 缓存 → CPU 哈希表 → 远程存储),然后调用 lookup()、insert()、update()、accumulate() 等方法即可完成端到端的嵌入操作。这一层屏蔽了底层数据搬运、缓存淘汰、流同步等复杂性,适合希望快速集成到现有推理框架的用户。目前提供了三种嵌入层实现:GPUEmbeddingLayer(全 GPU 内存)、LinearUVMEmbeddingLayer(GPU 缓存 + 线性系统内存)和 HierarchicalEmbeddingLayer(完整三级缓存层级)。
中间层是表(Table)。表代表单一的存储位置,每种表封装一种具体的存储后端。GPU 表(GpuTable)使用设备显存,Host 表使用 CPU 端内存(可选用 std::unordered_map、Google Abseil、Parallel Hashmap、NVIDIA nvhashmap 等多种算法实现),Redis 表和 RocksDB 表则分别连接远程 Redis 集群和本地磁盘上的持久化数据库。表层提供了查询和修改的能力,但并不知道其他表的存在——这种多表协调逻辑由上层嵌入层完成。
最底层是基础组件。这是一组可独立使用的工具和机制,包括 cuEmbed CUDA 内核库(加速 Embedding 查找的 GPU kernel 集合)、EmbeddingCache(GPU 端集合关联缓存实现)、线程池(ThreadPool)、可插拔内存分配器(Allocator)、日志系统等。这些组件可以被上层表直接使用,也可以被高级用户独立集成到自己的软件栈中。
核心数据流:三级缓存协同
NVE 最引人注目的特性是分层缓存架构(Hierarchical Embedding Layer)。当执行一次 Embedding 查找时,数据流按照性能从高到低的顺序依次尝试三个层次。
第一层是 GPU 端集合关联缓存(Set-Associative Cache)。这是一块在 GPU 显存中管理的快速缓存,使用 CUDA kernel 并行查找标签(Tag),命中时直接将嵌入向量写入输出缓冲区。GPU 缓存的大小由用户配置,通常设为能覆盖最热门的那些 ID 即可。查找过程完全在 GPU 上进行,不需要 CPU 参与,延迟极低。
第二层是 CPU 端宿主表(Host Table)。如果某些 ID 在 GPU 缓存中未命中,剩余的缺页键会被回传到 CPU 端。CPU 端宿主表使用多线程并行的哈希表进行查找,每条线程独立处理一个分片(Partition),每个分片有独立的读写锁,从而实现高并发读取。CPU 端可选多种哈希表实现:默认的 std::unordered_map、Google 的 Swiss Table 或 Parallel Hashmap。
第三层是 远程存储(Remote Table)。对于 CPU 端也未命中的键,最终转发到远程参数服务器——可以是 Redis 集群(通过 hiredis + redis++ 库连接),也可以是本地磁盘上的 RocksDB 数据库。这一层通常用于存储全量嵌入向量,容量最大但延迟也最高。
这种三级缓存架构的关键优势在于:查找过程中,热点 ID 在 GPU 上就能直接命中,冷门 ID 则需要经过两级回退。对于推荐系统典型的二八分布(20% 的热门 ID 覆盖 80% 的访问),GPU 缓存命中率可以轻松达到 90% 以上,大多数查找只需一次 GPU kernel 调用即可完成。
此外,嵌入层还提供智能插入策略(InsertHeuristic),自动决定哪些键应该被提升到 GPU 缓存中。系统会跟踪每个 ID 的访问频率,并在一段时间内累积缺页键,当累积数量达到可配置的阈值时才批量插入 GPU 缓存,避免频繁的逐条插入带来性能损失。
灵活的插件系统:多后端存储支持
NVE 的插件系统是一套精巧的 C 符号约定 + 动态加载机制。每个插件被编译为独立的共享库(.so),通过 dlopen/dlsym 在运行时按需加载,而不是传统的 C++ 虚基类继承方式。
插件接口要求每个 .so 导出三个 C 语言链接函数:plugin_ident() 返回插件名称,plugin_developer() 返回开发者信息,enum_host_table_implementations() 枚举注册该插件提供的所有实现。每个实现对应一个 create_{name}_table_factory() 工厂函数,用于按 JSON 配置文件生产具体的表对象。整个加载流程由 load_host_table_plugin() 函数统一管理,先尝试给定路径加载,失败时回退到相对于当前 .so 的路径。
目前内置了五个插件:NVHM 插件使用 NVIDIA 自研的 nvhashmap GPU 端哈希表,是 GPU 缓存的核心后端;Abseil 插件使用 Google 的高性能 Swiss Table;PHMAP 插件使用 Parallel Hashmap;Redis 插件连接远程 Redis 集群,支持带 TLS 加密的认证连接;RocksDB 插件提供本地磁盘持久化存储,基于 LSM-Tree 引擎。即使不加载任何插件,系统也内置了一个基于 std::unordered_map 的降级实现,保证基础功能可用。
完善的接口覆盖:C++、C 与 Python
NVE 为用户提供了三种语言的接口,覆盖不同的集成场景。C++ API 是 SDK 的原生接口,通过模板类和虚基类提供类型安全和零开销抽象。所有 GPU 操作均通过执行上下文(ExecutionContext)管理——每个上下文持有独立的 CUDA lookup stream 和 modify stream,允许多线程并发执行查找,同时保证内部缓冲区的资源隔离。C API 提供扁平的函数接口,通过不透明句柄管理表和层的生命周期,使得非 C++ 语言(如 C、Rust、Go 等)也能方便地集成 NVE。Python API 通过 pybind11 绑定暴露,支持与 PyTorch 深度集成,pynve.NVEmbedding 类直接接受 PyTorch 张量作为输入输出,并提供了 torch.nn.Module 风格的包装类方便已有 PyTorch 模型的迁移。
高性能内核与优化技术
为了在 GPU 上达到极致性能,NVE 在多个层面上进行了深度优化。GPU 端的集合关联缓存采用多路组相联架构,替换策略支持随机淘汰、LRU 和 LFU 三种算法,用户可通过 JSON 配置灵活选择。在 CPU 端,所有哈希表都被划分为多个分片,每个分片独立持有读写锁,细粒度锁策略极大地减少了多线程下的锁竞争。NVE 还充分利用了 CPU 的 SIMD 指令集,构建时自动检测宿主机 AVX 支持情况,从 AVX、AVX2 到 AVX-512 选择最优编译路径。模板分发是 NVE 另一项关键优化——以 NVHM 插件为例,通过在 mask_size、key_size、overflow_handler、kernel_size、minimize_psl、auto_shrink、partitioner 等多维度上分发到编译时特化的具体类型,共可生成约 6144 种不同的组合,在热点查找路径上完全避免了运行时虚函数开销。
总结
NVE 是一个面向推荐系统推理场景的高性能 Embedding 加速 SDK,通过 GPU-CPU 混合缓存架构解决了大规模嵌入表在显存受限情况下的高效查找问题。其按需选用的三层抽象架构、灵活的插件化后端、完善的多语言接口以及深度优化的 CUDA 内核和 CPU 并行查找,使得它既可以作为 PyTorch 模型的一个简单替换层快速集成,也可以作为高性能推理框架的底层存储引擎深度定制。对于需要处理数亿到数十亿级别 Embedding 表的大规模推荐系统团队,NVE 提供了一个开箱即用且性能卓越的解决方案。