amazon-dsstne
稀疏数据专用深度学习推荐引擎,支持多GPU模型并行,亚马逊内部推荐系统核心引擎开源版
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
稀疏数据专用深度学习推荐引擎,支持多GPU模型并行,亚马逊内部推荐系统核心引擎开源版
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
打开淘宝,输入"机械键盘",页面下方立刻出现一排你可能感兴趣的相关商品——红轴、茶轴、青轴、外设周边。这些推荐不是人工编辑的,而是算法在毫秒之间计算出来的。
这就是推荐系统的威力。在亚马逊平台上,每天有数亿用户在琳琅满目的商品海洋中寻找自己想要的商品。为了让每个用户都能快速发现自己可能感兴趣的商品,亚马逊很早就开始探索用深度学习做个性化推荐。2016年,亚马逊将内部使用的推荐系统核心引擎 DSSTNE 开源,这款引擎专为稀疏数据场景下的深度神经网络训练而设计。
推荐系统的数据有一个显著特点:极度稀疏。以一个拥有1亿商品和1亿用户的平台为例,用户实际交互过的商品可能只占总量的千分之一甚至万分之一。换句话说,99%以上的矩阵元素都是零。
这种稀疏性让通用深度学习框架(如 TensorFlow、PyTorch)面临严峻挑战。传统框架在处理稀疏数据时,会将大量零值填充进 GPU 内存进行计算,浪费宝贵的显存资源,同时计算效率低下。
亚马逊的工程团队在实践中遇到了更具体的问题:一个简单的三层自编码器,如果输入层有1亿个节点(对应1亿商品)、隐藏层1000个节点、输出层1亿个节点,其参数量就高达1万亿级别。哪怕是最顶级的 GPU,单卡显存也装不下这样的网络。
为此,亚马逊从零编写了 DSSTNE,其核心设计目标就是:在稀疏数据场景下,用更少的计算资源训练更大的模型。
DSSTNE 的技术核心有两个关键词:稀疏张量和模型并行。
通用深度学习框架会将稀疏矩阵 densify(密集化)后再计算,把大量零也放进 GPU 计算。DSSTNE 则采用了自定义 GPU CUDA 内核,只对非零值进行计算。其自定义 kernel(kernels.cu)通过 COO(坐标列表)格式直接存储和计算稀疏数据,跳过所有零值,显著降低显存占用和计算时间。
DSSTNE 的第二项核心技术是模型并行(Model Parallelism)。传统分布式训练通常将数据分片到多个 GPU(数据并行),但 DSSTNE 的模型并行策略可以将超大权重矩阵的不同部分分布到不同 GPU 上运行。这意味着即便是单台机器上,DSSTNE 也能将一个参数量达到万亿级的网络拆解到多张 GPU 上运行。
在亚马逊的基准测试中,使用 MovieLens 数据集,DSSTNE 在多 GPU 场景下实现了接近线性的加速扩展。
DSSTNE 的主体代码使用 C++ 编写,核心位于 src/amazon/dsstne/engine/ 目录,包含网络结构(NNNetwork)、层管理(NNLayer)、权重管理(NNWeight)和自定义 CUDA kernels。同时提供 Python 扩展模块(python/dsstnemodule.cc),通过 Python-C++ 绑定封装底层 C++ 引擎。数据格式使用 NetCDF,支持分布式训练(OpenMPI)。
DSSTNE 最适合电商推荐、内容推荐、搜索排序等稀疏数据场景。不适合计算机视觉等密集型输入场景。项目提供 Dockerfile 和 Singularity 容器文件,部署需配备 NVIDIA GPU(显存8GB以上)。
DSSTNE 代表了推荐系统深度学习化的一个重要方向——专为稀疏数据设计的定制化深度学习引擎。然而项目自2016年开源后更新缓慢,现已移至 amazon-archives 组织,处于维护模式,不再活跃开发。
| 维度 | 评价 |
|---|---|
| 架构设计 | 针对稀疏推荐场景的专用引擎,设计理念先进 |
| 性能 | 多 GPU 线性扩展能力强,稀疏计算效率高 |
| 易用性 | 需编译安装、熟悉 NetCDF 格式,门槛较高 |
| 生态活力 | 维护缓慢,逐渐被通用框架取代 |
| 推荐指数 | 三星 - 仅推荐给有自建推荐系统需求且对稀疏计算有深度了解的开发团队 |