Azure Databricks 上有关深度学习的最佳做法

本文提供有关 Azure Databricks 深度学习的提示,以及有关旨在优化深度学习工作负荷的内置工具和库的信息,例如:

Databricks 机器学习通过用于机器学习的 Databricks Runtime 提供预构建的深度学习基础结构,其中包括最常见的深度学习库,如 TensorFlow、PyTorch 和 Keras。 它还具有内置的预配置 GPU 支持,包括驱动程序和支持库。

Databricks Runtime ML 还包括 Azure Databricks 工作区的所有功能,例如群集创建和管理、库和环境管理、使用 Databricks Git 文件夹的代码管理、包括 Databricks 作业和 API 的自动化支持,以及用于模型开发跟踪和模型部署与服务的集成式 MLflow。

资源和环境管理

Azure Databricks 有助于自定义深度学习环境并保持用户之间的环境一致。

自定义开发环境

使用 Databricks Runtime,可以在笔记本、群集和作业级别自定义开发环境。

使用群集策略

可以创建群集策略来指导数据科学家做出正确的选择,例如,使用单节点群集进行开发,对大型作业使用自动缩放群集。

考虑适用于深度学习工作负荷的 A100 GPU

A100 GPU 是许多深度学习任务(例如训练和调整大型语言模型、自然语言处理、对象检测和分类以及推荐引擎)的有效选择。

  • Databricks 支持所有云上的 A100 GPU。 有关支持的 GPU 类型的完整列表,请参阅支持的实例类型
  • A100 GPU 的可用性通常有限。 请联系云提供商进行资源分配,或考虑提前预留容量。

加载数据的最佳做法

云数据存储通常未针对 I/O 进行优化,对于需要大型数据集的深入学习模型,这一点可能是一项挑战。 Databricks Runtime ML 包括 Delta LakePetastorm,以优化深度学习应用程序的数据吞吐量。

Databricks 建议使用 Delta Lake 表进行数据存储。 Delta Lake 简化了 ETL,使你能够高效地访问数据。 尤其是对于图像,Delta Lake 有助于优化训练和推理的融合。 适用于图像应用程序的参考解决方案提供了使用 Delta Lake 优化图像的 ETL 的示例。

Petastorm 提供的 API 可用于准备 Parquet 格式的数据,以供 TensorFlow、Keras 或 PyTorch 使用。 SparkConverter API 提供 Spark 数据帧集成。 Petastorm 还提供用于分布式处理的数据分片。 有关详细信息,请参阅使用 Petastorm 加载数据

训练深度学习模型最佳做法

Databricks 建议对所有模型训练使用用于机器学习的 Databricks RuntimeMLflow 跟踪自动日志记录

从单节点群集开始

对于深度学习模型开发,单节点(仅限驱动程序)GPU 群集通常最快且最经济高效。 对于深度学习训练,一个节点、每节点 4 GPU 可能比 4 个工作器节点、每节点 1 GPU 更快。 这是因为分布式训练会产生网络通信开销。

在快速迭代开发期间,单节点群集是一个不错的选择,并且适用于在中小型数据上训练模型。 如果数据集足够大,使单台计算机的训练速度变慢,请考虑迁移到多 GPU 甚至分布式计算。

使用 TensorBoard 和群集指标来监视训练过程

TensorBoard 预装在 Databricks Runtime ML。 可以在笔记本中或在单独的选项卡中使用。有关详细信息,请参阅 TensorBoard

群集指标在所有 Databricks 运行时中可用。 可以检查网络、处理器和内存使用率,以查找瓶颈。 有关详细信息,请参阅群集指标

优化深度学习的性能

你可以并且应该在 Databricks 上使用深度学习性能优化技术。

提前停止

提前停止监视在验证集上计算的指标值,当指标停止改进时停止训练。 这种方式比花费很多时间猜测才能完成要好得多。 每个深度学习库都提供用于提前停止的本机 API;例如,请参阅 TensorFlow/KerasPyTorch 闪电的 EarlyStopping 回调 API。 有关示例笔记本,请参阅 TensorFlow Keras 示例笔记本

批大小优化

批大小优化有助于优化 GPU 利用率。 如果批大小太小,则计算无法完全使用 GPU 功能。 可以使用群集指标来查看 GPU 指标。

根据学习速率调整批大小。 一个很好的经验法则是,将批大小增加 n 时,按 sqrt (n) 提升学习速率。 手动优化时,请尝试将批大小更改为 2 或 0.5 倍。 然后继续优化以优化性能,手动或使用 Hyperopt 等自动化工具测试各种超参数。

迁移学习

借助迁移学习,你可以从以前训练的模型开始,并根据需要对应用程序进行修改。 迁移学习可以显著减少训练和优化新模型所需的时间。 有关详细信息和示例,请参阅迁移学习的功能化

移动到分布式训练

Databricks Runtime ML 包括 HorovodRunner、spark-tensorflow-distributor、TorchDistributor 和 Hyperopt,用于简化从单节点训练到分布式训练的过渡。

HorovodRunner

Horovod 是一个开源项目,用于将深度学习训练扩展到多 GPU 或分布式计算。 HorovodRunner 由 Databricks 生成并包含在 Databricks Runtime ML 中,是提供 Spark 兼容性的 Horovod 包装器。 通过 API,可以缩放单节点代码,只需进行少量的更改。 HorovodRunner 适用于 TensorFlow、Keras 和 PyTorch。

spark-tensorflow-distributor

spark-tensorflow-distributor 是 TensorFlow 中的开源原生包,用于在 Spark 群集上通过 TensorFlow 进行分布式训练。 请参阅示例笔记本

TorchDistributor

TorchDistributor 是 PySpark 中的一个开源模块,它有助于在 Spark 集群上使用 PyTorch 进行分布式训练,允许你将 PyTorch 训练作业作为 Spark 作业启动。 请参阅使用 TorchDistributor 进行分布式训练

Hyperopt

Hyperopt 为机器学习提供自适应超参数优化。 使用 SparkTrials 类,可以跨群集以迭代方式优化深度学习模型的参数。

推理最佳做法

本部分包含有关在 Azure Databricks 使用模型进行推理的一般提示。

  • 为了最大程度地降低成本,请考虑 CPU 和推理优化的 GPU,例如 NC T4_v3系列。 没有明确的建议,因为最佳选择取决于模型大小、数据维度和其他变量。

  • 使用 MLflow 简化部署和模型服务。 MLflow 可以记录任何深度学习模型,包括自定义预处理和后处理逻辑。

联机服务

低延迟服务的最佳选择是,在 REST API 后联机服务。 Databricks 提供 Azure Databricks 上的经典 MLflow 模型服务用于在线推理。

MLflow 提供用于部署到各种托管服务以用于联机推理的 API,以及用于创建 Docker 容器的 API,以用于自定义服务解决方案。

其他常见的联机推理服务包括:

批处理和流式处理推理

批处理和流式处理评分支持高吞吐量、低成本评分,延迟低至分钟。 有关详细信息,请参阅使用 MLflow 进行模型推理

  • 如果希望多次访问用于推理的数据,请考虑在运行推理作业之前创建一个预处理作业,将数据 ETL 到 Delta Lake 表中。 这样一来,数据的多次读取会分散数据的输入和准备成本。 通过将预处理与推理分离,还可以选择每个作业的不同硬件,以优化成本和性能。 例如,可以使用 ETL 的 CPU 和用于推理的 GPU。
  • 使用 Spark Pandas UDF 跨群集缩放批处理和流式推理。