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