Merlin HugeCTR(以下简称 HugeCTR)是 GPU 加速的推荐程序框架,旨在在多个 GPU 和节点之间分配训练并估计点击率(Click-through rate)。
此次 v3.3 和 v3.3.1 更新涉及的模块主要为:
相关介绍:
V3.3.1
- 分层参数服务器改进:
- 新模型在线部署和旧模型回收:
在此版本中,HugeCTR Backend 将完全兼容 Triton 的模型控制协议。 新模型的配置已添加到 HPS 配置文件中。 HugeCTR Backend 现已支持 Triton 的 Load API 在线部署新模型。旧模型也可以通过 Unload API 进行在线回收 。
- 简化的数据库后端:
现在可以使用相同的配置对象配置多节点、单节点和所有其他类型的可变数据库后端。
- Redis 代码的多线程优化(比 HugeCTR v3.3 提速约 2.3 倍)
- 修复部分问题
- 解决了在线 Kafka 更新访问违规问题
- 解决了 Parquet 数据阅读器在多嵌入表的情况下错误解析分类特征索引的问题
- 解决了单次插入时未调用 HPS Redis 后端溢出处理的问题。
- 新的一组融合全连接层:
我们现在支持在构建模型图时添加一组融合全连接层。我们提供了简洁的 Python 接口供用户调整层数,以及指定每一层的输出维度,从而可以轻松利用 HugeCTR 中高度优化的融合全连接层。更多信息请参考 HugeCTR Layer Book.
V3.3
- 分级参数服务器:
- SOK:
- SOK 现已支持 TF v1.15。
- SOK 使用专用 CUDA 流。
- SOK 现已支持使用 pip 安装。
- 修复了当 TensorFlow 版本大于 2.4 时,tf.distribute.MirroredStrategy 的挂起问题。
- SOK 现已支持使用 tf.config 设置设备。
- MLPerf v1.1 集成:
- Hybrid Embedding 的索引预计算。
- 验证索引缓存:验证集的 Hybrid Embedding 索引在使用时被缓存,因此消除了在每次验证迭代时重新计算索引。
- MLP 权重/数据梯度计算重叠:MLP 的权重梯度相对于数据梯度是异步计算的,从而使这两个计算之间能够重叠。
- 更好的计算–通信重叠:计算和通信之间更好的重叠已被启用,以提高训练吞吐量。
- 融合权重转换:权重的 FP32 到 FP16 转换现在已融合到 SGD 优化器中,从而节省了内存行程。
- GraphScheduler:添加了 GrapScheduler 来控制 cudaGraph 启动的时间。使用 GraphScheduler,消除了相邻 cudaGraphs 之间的差距。
- HugeCTR 现已支持在无 RDMA 集群上的多节点训练:您可以将 allreduce 算法指定为 `AllReduceAlgo.NCCL`,它可以支持非 RDMA 硬件。更多信息请参考 all_reduce_algo。
- 模型导出现已支持自定义名称:我们支持与培训指定型号名称 API`CreateSolver`,这将倾与的 JSON 配置文件中 API `Model.graph_to_json`。该特性将方便 Triton 部署保存的 HugeCTR 模型,并有助于在 Kafka 将参数从训练端发送到推理端时区分模型。
- Embedding 层的细粒度控制:用户可以使用 API 冻结或解冻特定 Embedding 层的权重 `Model.freeze_embedding` 和 `Model.unfreeze_embedding`。此外,多个 Embedding 层的权重可以独立加载,这使得加载特定层的预训练 Embedding 成为可能。更多信息请参考 文档 和 Notebook。
已知问题
- 异步插入内存数据库时会出现丢失 Embedding Key 的情况。
目前我们仅通过 Kafka 的插入逻辑来修复数据库后端中的缺失。这意味着如果模型没有更新,我们也不会更新缓存。我们需要建立一个异步过程,该过程还将查找未命中的 Key 并插入数据库后端。
- Kafka 的异步连接建立可能导致消息丢失。
ProducerRdkafka 客户端的连接检查是在后台异步执行的,在此期间如果链接断开,程序会认为它已连接并不断产生数据,那么这些消息将永远不会到达 Kafka 并且会丢失。
已上是本次 3.3 与 3.3.1 版本的更新内容,更多最新 HugeCTR 讨论文章与详细配置信息,请参考 Github。