Hybrid Embedding:蚂蚁集团万亿参数稀疏 CTR 模型解决方案

文章介绍了蚂蚁AIInfra团队在TFPlus项目中提出的HybridEmbedding方案,以应对大规模稀疏CTR模型的存储和通信开销。该方案结合NVMeSSD和层次化存储,解决了传统内存参数服务器的不足,通过冷热特征划分和动态缓存管理优化了资源使用。HybridEmbedding已在蚂蚁推荐场景中应用,显著节省了内存资源。

导读

稀疏 CTR 模型是用于预测点击率的一类深度学习模型的统称。通过处理高维稀疏特征数据实现高效的广告点击率预测,准确的 CTR 预测可以更好地进行广告投放决策,提升广告投放效果。在稀疏 CTR 模型场景下,通常使用大量高维稀疏特征,这类 Embedding 矩阵造成了巨大的存储开销。本文介绍了蚂蚁 AI Infra 团队在 TFPlus 项目中提出的 Hybrid Embedding 方案,以应对海量 Embedding 带来的存储资源、特征治理方面的挑战。

背景

在实际场景中,稀疏 CTR 模型会使用大量高维稀疏特征,如商品 ID、用户 ID 等,这些特征的取值可能非常稀疏。处理这样的稀疏 Embedding 矩阵需要引入巨量的存储和通信开销。实际场景中,稀疏层参数可达千亿甚至万亿,给系统设计带来巨大挑战。

由于传统的 TensorFlow Variable 存在静态 Shape 难以预估、特征冲突等问题,TFPlus 引擎基于 TensorFlow 的自定义算子的扩展能力,实现了 KvVariable 内存参数服务器。KvVariable 采用分布式哈希存储方案,针对稀疏 CTR 模型的超大 Embedding 层进行了一系列优化,如配合 DLRover 支持 Embedding 层的弹性扩缩容,增量更新方式提升模型上线速度,提供了特征裁剪、特征淘汰等能力。

在蚂蚁的推荐场景,KvVariable 内存参数服务器得到了广泛的应用,具体方案如下:

  1. 训练:采用了数据并行和模型并行的方式,并基于“有分片,无副本” (With-sharding,No-replica) 架构。多个 worker 节点进行异步的数据并行计算,负责执行深度神经网络的前向传播和反向传播计算;多个 ps 节点进行模型并行计算,负责稀疏 Embedding 参数的分片存储、收集汇总梯度以及参数的更新。

  2. 推理:采用了“无分片、有副本” (No-sharding,With-replicas) 架构。在这种架构中,不对稀疏 CTR 模型的

好的,我们选择 **解决方案二:更换 Embedding 模型源(国内镜像)** 来解决你无法从 Hugging Face 下载模型的问题。 --- ## ✅ 步骤一:使用国内镜像安装依赖 你可以使用清华源来加速下载 `sentence-transformers` 和相关依赖: ```bash pip install sentence-transformers -i https://pypi.tuna.tsinghua.edu.cn/simple ``` 或者如果你要指定缓存目录: ```bash pip install sentence-transformers --cache-dir ./local_cache -i https://pypi.tuna.tsinghua.edu.cn/simple ``` --- ## ✅ 步骤二:修改代码以使用本地缓存路径 你可以在加载 `HuggingFaceEmbeddings` 时指定一个本地缓存路径,避免每次重新下载模型。 ### 🔧 修改后的代码如下: ```python from langchain_huggingface import HuggingFaceEmbeddings # 使用 model_name 指定模型名称 # 使用 cache_folder 指定本地缓存路径 embeddings = HuggingFaceEmbeddings( model_name="sentence-transformers/all-MiniLM-L6-v2", cache_folder="./local_embeddings_cache" # 所有模型文件将缓存在这个目录下 ) ``` 这样,第一次运行时会从 Hugging Face 下载模型到 `./local_embeddings_cache/` 目录中; **后续再次运行时就会直接读取本地缓存,无需联网!** --- ## ✅ 步骤三:验证是否成功加载模型 你可以加一段测试代码验证是否能正常生成 Embedding: ```python text = "这是一个测试句子" embedding = embeddings.embed_query(text) print(f"Embedding 维度: {len(embedding)}") print(f"前5个向量值: {embedding[:5]}") ``` 输出类似如下表示成功: ``` Embedding 维度: 384 前5个向量值: [-0.0123, 0.0456, -0.0789, 0.0012, -0.0345] ``` --- ## ✅ 步骤四:完整整合到你的 RAG Pipeline 中 假设你原来的代码结构是这样的: ```python from langchain_huggingface import HuggingFaceEmbeddings model_name = "sentence-transformers/all-MiniLM-L6-v2" embeddings = HuggingFaceEmbeddings(model_name=model_name) ``` 请替换为: ```python model_name = "sentence-transformers/all-MiniLM-L6-v2" embeddings = HuggingFaceEmbeddings( model_name=model_name, cache_folder="./local_embeddings_cache" ) ``` --- ## 📁 缓存目录说明 运行一次后你会在项目根目录看到一个新文件夹: ``` ./local_embeddings_cache/ └── sentence-transformers_all-MiniLM-L6-v2/ ``` 该目录包含模型文件如: - `config.json` - `pytorch_model.bin` - `tokenizer_config.json` - `vocab.txt` 这些文件是你后续离线使用的依据。 --- ## ✅ 离线使用方法(进阶) 一旦模型已经下载并缓存到本地,你可以断网或部署到内网环境中使用: ```python embeddings = HuggingFaceEmbeddings( model_name="./local_embeddings_cache/sentence-transformers_all-MiniLM-L6-v2/" ) ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值