Azure Databricks 上有关深度学习的最佳做法
Databricks 机器学习通过用于机器学习的 Databricks Runtime 提供预构建的深度学习基础结构。 用于机器学习的 Databricks Runtime 包括最常见的深度学习库(如 TensorFlow、PyTorch 和 Keras)和支持库(如 Petastorm、Hyperopt 和 Horovod)。 它还具有内置的预配置 GPU 支持,包括驱动程序和支持库。
Databricks Runtime ML 还包括 Azure Databricks 工作区的所有功能,例如群集创建和管理、库和数据管理、Databricks Repos 的代码管理、自动化支持(包括 Databricks 作业和 API)以及用于模型开发跟踪和模型部署和服务的集成 MLflow。
借助 Azure Databricks,可以使用任何库创建用于训练模型的逻辑。 通过预配置的 Azure Databricks,可以轻松缩放常见的机器学习和深度学习步骤。 本文包含有关 Azure Databricks 上的深度学习的提示,以及旨在优化深度学习工作负载的内置工具和库的信息,例如:
- 用于加载数据的 Delta 和 Petastorm
- 用于并行化训练的 Horovod 和 Hyperopt
- 用于推理的 Pandas UDF
资源和环境管理
Azure Databricks 有助于自定义深度学习环境并保持用户之间的环境一致。
自定义开发环境
使用 Databricks Runtime,可以在笔记本、群集和作业级别自定义开发环境。
- 使用笔记本范围的 Python 库或笔记本范围的 R 库来使用特定的库集或版本,而不会影响其他群集用户。
- 在群集级别安装库,以标准化团队或项目的版本。
- 设置 Azure Databricks 作业,以确保重复任务在一致且未更改的环境中运行。
使用群集策略
可以创建群集策略来指导数据科学家做出正确的选择,例如,使用单节点群集进行开发,对大型作业使用自动缩放群集。
加载数据的最佳做法
云数据存储通常未针对 I/O 进行优化,对于需要大型数据集的深入学习模型,这一点可能是一项挑战。 Databricks Runtime ML 包括 Delta Lake 和 Petastorm,以优化深度学习应用程序的数据吞吐量。
Databricks 建议使用 Delta Lake 表进行数据存储。 Delta Lake 简化了 ETL,使你能够高效地访问数据。 尤其是对于图像,Delta Lake 有助于优化训练和推理的融合。 适用于图像应用程序的参考解决方案提供了使用 Delta Lake 优化图像的 ETL 的示例。
Petastorm 提供的 API 可用于准备 Parquet 格式的数据,以供 TensorFlow、Keras 或 PyTorch 使用。 SparkConverter API 提供 Spark 数据帧集成。 Petastorm 还提供用于分布式处理的数据分片。 有关详细信息,请参阅使用 Petastorm 加载数据。
训练深度学习模型最佳做法
Databricks 建议对所有模型训练使用机器学习运行时、MLflow 跟踪和自动记录。
从单节点群集开始
对于深度学习模型开发,单节点(仅限驱动程序)GPU 群集通常最快且最经济高效。 对于深度学习训练,一个节点、每节点 4 GPU 可能比 4 个工作器节点、每节点 1 GPU 更快。 这是因为分布式训练会产生网络通信开销。
在快速迭代开发期间,单节点群集是一个不错的选择,并且适用于在中小型数据上训练模型。 如果数据集足够大,使单台计算机的训练速度变慢,请考虑迁移到多 GPU 甚至分布式计算。
使用 TensorBoard 和 Ganglia 监视训练过程
TensorBoard 预装在 Databricks Runtime ML。 可以在笔记本中或在单独的选项卡中使用。有关详细信息,请参阅 TensorBoard。
Ganglia 在所有 Databricks 运行时中均可用。 可以使用它来检查网络、处理器和内存使用情况,以检查瓶颈。 有关详细信息,请参阅 Ganglia 指标。
优化深度学习的性能
你可以并且应该在 Databricks 上使用深度学习性能优化技术。
提前停止
提前停止监视在验证集上计算的指标值,当指标停止改进时停止训练。 这种方式比花费很多时间猜测才能完成要好得多。 每个深度学习库都提供用于提前停止的本机 API;例如,请参阅 TensorFlow/Keras 和 PyTorch 闪电的 EarlyStopping 回调 API。 有关示例笔记本,请参阅在 Azure Databricks 中开始使用 TensorFlow Keras。
批大小优化
批大小优化有助于优化 GPU 利用率。 如果批大小太小,则计算无法完全使用 GPU 功能。 可以使用 Ganglia 指标 查看 GPU 指标。
根据学习速率调整批大小。 一个很好的经验法则是,将批大小增加 n 时,按 sqrt (n) 提升学习速率。 手动优化时,请尝试将批大小更改为 2 或 0.5 倍。 然后继续优化以优化性能,手动或使用 Hyperopt 等自动化工具测试各种超参数。
迁移学习
借助迁移学习,你可以从以前训练的模型开始,并根据需要对应用程序进行修改。 迁移学习可以显著减少训练和优化新模型所需的时间。 有关详细信息和示例,请参阅迁移学习的功能化。
移动到分布式训练
Databricks Runtime ML 包括 HorovodRunner、 spark-tensorflow-distributor 和 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 进行分布式训练。 请参阅示例笔记本。
Hyperopt
Hyperopt 为机器学习提供自适应超参数优化。 使用 SparkTrials 类,可以跨群集以迭代方式优化深度学习模型的参数。
推理最佳做法
本部分包含有关在 Azure Databricks 使用模型进行推理的一般提示。
为了最大程度地降低成本,请考虑 CPU 和推理优化的 GPU,例如 NC T4_v3系列。 没有明确的建议,因为最佳选择取决于模型大小、数据维度和其他变量。
使用 MLflow 简化部署和模型服务。 MLflow 可以记录任何深度学习模型,包括自定义预处理和后处理逻辑。 可以在 MLflow 模型注册表中注册的模型 部署为批处理、流式处理或联机推理。
批处理和流式处理推理
批处理和流式处理评分支持高吞吐量、低成本评分,延迟低至分钟。 有关详细信息,请参阅脱机(批量)预测。
- 如果希望多次访问用于推理的数据,请考虑在运行推理作业之前创建一个预处理作业,将数据 ETL 到 Delta Lake 表中。 这样一来,数据的多次读取会分散数据的输入和准备成本。 通过将预处理与推理分离,还可以选择每个作业的不同硬件,以优化成本和性能。 例如,可以使用 ETL 的 CPU 和用于推理的 GPU。
- 使用 Spark Pandas UDF 跨群集缩放批处理和流式推理。
- 从 Azure Databricks 记录模型时,MLflow 会自动提供推理代码,以将模型应用为 pandas UDF。
- 还可以进一步优化推理管道,尤其是对于大型深度学习模型。 有关示例,请参阅适用于图像 ETL 的参考解决方案。
联机服务
低延迟服务的最佳选择是,在 REST API 后联机服务。 Databricks 提供 Databricks 模型服务,用于联机推理。
MLflow 提供用于部署到各种托管服务以用于联机推理的 API,以及用于创建 Docker 容器的 API,以用于自定义服务解决方案。
其他常见的联机推理服务包括: