人工智能/深度学习

Merlin HugeCTR v3.3 & v3.3.1 发布说明

Merlin HugeCTR(以下简称 HugeCTR)是 GPU 加速的推荐程序框架,旨在在多个 GPU 和节点之间分配训练并估计点击率(Click-through rate)。

此次 v3.3 v3.3.1 更新涉及的模块主要为

  1. HugeCTR 分级参数服务器
  2. HugeCTR Sparse Operation kit
  3. MLPerf

相关介绍

V3.3.1

  1. 分层参数服务器改进:
    1. 新模型在线部署和旧模型回收:

在此版本中,HugeCTR Backend 将完全兼容 Triton 的模型控制协议。 新模型的配置已添加到 HPS 配置文件中。 HugeCTR Backend 现已支持 Triton 的 Load API 在线部署新模型。旧模型也可以通过 Unload API 进行在线回收 。

  1. 简化的数据库后端:

现在可以使用相同的配置对象配置多节点、单节点和所有其他类型的可变数据库后端。

  1. Redis 代码的多线程优化(比 HugeCTR v3.3 提速约 2.3 倍)
  2. 修复部分问题
    1. 解决了在线 Kafka 更新访问违规问题
    2. 解决了 Parquet 数据阅读器在多嵌入表的情况下错误解析分类特征索引的问题
    3. 解决了单次插入时未调用 HPS Redis 后端溢出处理的问题。
  1. 新的一组融合全连接层:

我们现在支持在构建模型图时添加一组融合全连接层。我们提供了简洁的 Python 接口供用户调整层数,以及指定每一层的输出维度,从而可以轻松利用 HugeCTR 中高度优化的融合全连接层。更多信息请参考 HugeCTR Layer Book.

V3.3

  1. 分级参数服务器:
    1. 支持在线训练增量模型更新,详见 demo
    2. 支持 Embedding Key 驱逐机制。
    3. 支持增量 Embedding Key 异步刷新到 Embedding Cache,详见文档
    4. 其他小改进:
      1. 完全可配置的数据库后端。
      2. JSON 解析器可以更好地应对不准确的参数化。
      3. 完善了整个参数服务器数据库后端 API 的日志级别。
      4. 提高了 CPU 内存数据库后端的性能。
  1. SOK:
    1. SOK 现已支持 TF v1.15
    2. SOK 使用专用 CUDA
    3. SOK 现已支持使用 pip 安装
    4. 修复了当 TensorFlow 版本大于 2.4 时,tf.distribute.MirroredStrategy 的挂起问题。
    5. SOK 现已支持使用 tf.config 设置设备
  1. MLPerf v1.1 集成:
    1. Hybrid Embedding 的索引预计算
    2. 验证索引缓存:验证集的 Hybrid Embedding 索引在使用时被缓存,因此消除了在每次验证迭代时重新计算索引。
    3. MLP 权重/数据梯度计算重叠:MLP 的权重梯度相对于数据梯度是异步计算的,从而使这两个计算之间能够重叠。
    4. 更好的计算通信重叠:计算和通信之间更好的重叠已被启用,以提高训练吞吐量。
    5. 融合权重转换:权重的 FP32 到 FP16 转换现在已融合到 SGD 优化器中,从而节省了内存行程。
    6. GraphScheduler添加了 GrapScheduler 来控制 cudaGraph 启动的时间。使用 GraphScheduler,消除了相邻 cudaGraphs 之间的差距。

  2. HugeCTR 现已支持在无 RDMA 集群上的多节点训练:您可以将 allreduce 算法指定为 `AllReduceAlgo.NCCL`,它可以支持非 RDMA 硬件。更多信息请参考 all_reduce_algo
  1. 模型导出现已支持自定义名称:我们支持与培训指定型号名称 API`CreateSolver`,这将倾与的 JSON 配置文件中 API `Model.graph_to_json`。该特性将方便 Triton 部署保存的 HugeCTR 模型,并有助于在 Kafka 将参数从训练端发送到推理端时区分模型。

  2. Embedding 层的细粒度控制:用户可以使用 API 冻结或解冻特定 Embedding 层的权重 `Model.freeze_embedding` 和 `Model.unfreeze_embedding`。此外,多个 Embedding 层的权重可以独立加载,这使得加载特定层的预训练 Embedding 成为可能。更多信息请参考 文档Notebook

已知问题

  1. 异步插入内存数据库时会出现丢失 Embedding Key 的情况。

目前我们仅通过 Kafka 的插入逻辑来修复数据库后端中的缺失。这意味着如果模型没有更新,我们也不会更新缓存。我们需要建立一个异步过程,该过程还将查找未命中的 Key 并插入数据库后端。

  1. Kafka 的异步连接建立可能导致消息丢失。

ProducerRdkafka 客户端的连接检查是在后台异步执行的,在此期间如果链接断开,程序会认为它已连接并不断产生数据,那么这些消息将永远不会到达 Kafka 并且会丢失。

已上是本次 3.3 与 3.3.1 版本的更新内容,更多最新 HugeCTR 讨论文章与详细配置信息,请参考 Github

Tags