TorchRec嵌入表分片策略详解:10种方法优化大规模推荐系统
【免费下载链接】torchrecPytorch domain library for recommendation systems项目地址: https://gitcode.com/gh_mirrors/to/torchrec
TorchRec是PyTorch生态中专注于推荐系统的领域库,提供了丰富的嵌入表分片策略来解决大规模推荐系统中的存储和计算挑战。本文将深入解析10种核心分片方法,帮助开发者根据实际场景选择最优方案,提升推荐系统性能。
为什么需要嵌入表分片?
在现代推荐系统中,用户和物品的嵌入表往往规模巨大,单个GPU或节点难以承载。嵌入表分片技术通过将大型嵌入表分布到多个设备或节点上,实现了存储扩展和计算并行,是构建高性能推荐系统的关键技术之一。
图:TorchRec嵌入表分片架构示意图,展示了如何将大型嵌入表分布到多个计算节点
核心分片策略解析
1. 表 wise 分片(Table-wise Sharding)
表 wise 分片是最基础的分片策略,将每个完整的嵌入表分配到单个设备上。这种策略实现简单,适合表之间独立性强的场景。
# 表 wise 分片核心实现 class TwPooledEmbeddingSharding(BaseTwEmbeddingSharding): """ Shards embedding bags table-wise, i.e. a given embedding table is entirely placed on a selected rank. """适用场景:中小型嵌入表、表之间访问频率差异大的场景
2. 列 wise 分片(Column-wise Sharding)
列 wise 分片将嵌入表的列(特征维度)分布到不同设备,每个设备存储嵌入向量的一部分维度。这种方式适合特征维度特别高的场景。
实现位置:torchrec/distributed/sharding/cw_sharding.py
优势:
- 支持超大型嵌入向量
- 计算过程中自动并行化
- 适合需要对特征维度进行特殊处理的场景
3. 行 wise 分片(Row-wise Sharding)
行 wise 分片将嵌入表的行(实体)分布到不同设备,每个设备存储一部分实体的完整嵌入向量。这是处理大规模用户/物品嵌入的常用策略。
图:行 wise 分片的KV管道预取流程,提升数据访问效率
关键特性:
- 支持百亿级实体规模
- 可结合缓存机制减少远程访问
- 实现位置:torchrec/distributed/sharding/rw_sharding.py
4. 动态分片(Dynamic Sharding)
动态分片能够根据运行时条件(如负载、内存使用情况)动态调整分片策略,是处理动态变化工作负载的高级策略。
def update_module_sharding_plan( module: Module, plan: ShardingPlan, device: torch.device, env: ShardingEnv, ) -> None: """ Dynamically updates the sharding plan of a module. """实现位置:torchrec/distributed/sharding/dynamic_sharding.py
5. 网格分片(Grid Sharding)
网格分片结合了行和列两个维度的分片,将嵌入表划分成二维网格,每个设备存储网格中的一个单元格。这种策略提供了更高的灵活性和并行度。
实现位置:torchrec/distributed/sharding/grid_sharding.py
适用场景:
- 超大规模嵌入表(千万级以上实体,高维度特征)
- 多维度并行计算需求
- 分布式训练环境
6. 序列分片(Sequence Sharding)
序列分片专为处理序列数据设计,能够根据序列特征的特点进行智能分片,优化序列推荐模型的计算效率。
# 序列分片上下文示例 SequenceShardingContext(batch_size_per_rank_per_feature=[])7. 数据并行分片(Data Parallel Sharding)
数据并行分片在多个设备上复制完整的嵌入表,每个设备处理不同的数据批次。这种策略适合嵌入表规模适中,但训练数据量巨大的场景。
实现位置:torchrec/distributed/sharding/dp_sharding.py 和 torchrec/distributed/sharding/dp_sequence_sharding.py
8. 混合分片策略(Hybrid Sharding)
混合分片策略结合了多种基础分片方法的优点,如TwRw(Table-wise + Row-wise)和TwCw(Table-wise + Column-wise)等组合方式。
# 混合分片实现示例 class TwRwPooledEmbeddingSharding(BaseTwRwEmbeddingSharding): """ Hybrid sharding combining table-wise and row-wise strategies """实现位置:torchrec/distributed/sharding/twrw_sharding.py 和 torchrec/distributed/sharding/twcw_sharding.py
9. 张量池分片(Tensor Pool Sharding)
张量池分片通过对象池机制管理分片的嵌入表,优化内存使用和设备间通信,特别适合动态变化的嵌入表。
实现位置:torchrec/distributed/sharding/rw_tensor_pool_sharding.py
10. Keyed Jagged Tensor 池分片
针对Keyed Jagged Tensor这种特殊数据结构的分片策略,优化稀疏特征的存储和访问效率。
实现位置:torchrec/distributed/sharding/rw_kjt_pool_sharding.py
分片策略选择指南 📊
选择合适的分片策略需要考虑以下因素:
- 嵌入表规模:小表适合表 wise 分片,大表适合行/列 wise 或网格分片
- 访问模式:随机访问适合行 wise,顺序访问可考虑列 wise
- 硬件环境:单机多卡 vs. 多机集群
- 模型架构:DNN vs. 序列模型 vs. 图模型
- 训练/推理:训练阶段可能需要更灵活的分片,推理阶段注重低延迟
图:TorchRec完整训练流程,展示了分片策略在整个推荐系统训练中的位置
分片性能优化实践
- 合理设置分片粒度:过细的分片会增加通信开销,过粗的分片则无法充分利用并行计算能力
- 结合缓存机制:热门嵌入向量本地缓存,减少远程访问
- 通信优化:使用量化通信(Quantized Comm Codecs)减少数据传输量
- 动态负载均衡:利用动态分片策略应对工作负载变化
- 监控与调优:通过torchrec/distributed/planner/stats.py分析分片效果
总结
TorchRec提供了全面的嵌入表分片解决方案,从基础的表 wise 分片到复杂的混合分片策略,满足不同规模和类型的推荐系统需求。选择合适的分片策略能够显著提升系统性能,降低存储压力,是构建大规模推荐系统的关键步骤。
通过灵活运用这些分片技术,开发者可以构建高效、可扩展的推荐系统,轻松应对海量用户和物品数据带来的挑战。
官方文档:docs/source/concepts.rst 分片实现源码:torchrec/distributed/sharding/
【免费下载链接】torchrecPytorch domain library for recommendation systems项目地址: https://gitcode.com/gh_mirrors/to/torchrec
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考