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
A100 GPU 是许多深度学习任务(例如训练和调整大型语言模型、自然语言处理、对象检测和分类以及推荐引擎)的有效选择。
- Databricks 支持所有云上的 A100 GPU。 有关支持的 GPU 类型的完整列表,请参阅支持的实例类型。
- A100 GPU 的可用性通常有限。 请联系云提供商进行资源分配,或考虑提前预留容量。
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 和群集指标来监视训练过程
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
TorchDistributor 是 PySpark 中的一个开源模块,它有助于在 Spark 集群上使用 PyTorch 进行分布式训练,允许你将 PyTorch 训练作业作为 Spark 作业启动。 请参阅使用 TorchDistributor 进行分布式训练。
Optuna
Optuna 为机器学习提供自适应超参数优化。
推理最佳做法
本部分包含有关在 Azure Databricks 使用模型进行推理的一般提示。
为了最大程度地降低成本,请考虑 CPU 和推理优化的 GPU,例如 NC T4_v3系列。 没有明确的建议,因为最佳选择取决于模型大小、数据维度和其他变量。
使用 MLflow 简化部署和模型服务。 MLflow 可以记录任何深度学习模型,包括自定义预处理和后处理逻辑。 Unity Catalog 中的模型或工作区模型注册表中注册的模型可以部署以进行批处理、流式处理或联机推理。
联机服务
低延迟服务的最佳选择是,在 REST API 后联机服务。 Databricks 提供模型服务,用于联机推理。 模型服务提供了用于部署、治理和查询 AI 模型的统一界面,并支持为以下项提供服务:
- 自定义模型。 这些是打包为 MLflow 格式的 Python 模型。 示例包括 scikit-learn、XGBoost、PyTorch 和 Hugging Face 转换器模型。
- 由基础模型 API 提供的最先进的开放模型。 这些模型是支持优化推理的特选基础模型体系结构。 例如,Llama-2-70B-chat、BGE-Large 和 Mistral-7B 等基本模型可按每标记付费定价立即使用。 对于需要性能保证和微调模型变体的工作负载,可以使用预配的吞吐量部署它们。
- 外部模型。 这些模型托管在 Databricks 外部。 例如,OpenAI 的 GPT-4、Anthropic 的 Claude 等生成式 AI 模型。 可以集中管理为这些模型提供服务的终结点,客户可以为其建立速率限制和访问控制。
另外,MLflow 提供用于部署到各种托管服务以进行联机推理的 API,以及适用于自定义服务解决方案的用于创建 Docker 容器的 API。
其他常见的联机推理服务包括:
批处理和流式处理推理
批处理和流式处理评分支持高吞吐量、低成本评分,延迟低至分钟。 有关详细信息,请参阅使用 MLflow 进行模型推理。
- 如果希望多次访问用于推理的数据,请考虑在运行推理作业之前创建一个预处理作业,将数据 ETL 到 Delta Lake 表中。 这样一来,数据的多次读取会分散数据的输入和准备成本。 通过将预处理与推理分离,还可以选择每个作业的不同硬件,以优化成本和性能。 例如,可以使用 ETL 的 CPU 和用于推理的 GPU。
- 使用 Spark Pandas UDF 跨群集缩放批处理和流式推理。
- 从 Azure Databricks 记录模型时,MLflow 会自动提供推理代码,以将模型应用为 pandas UDF。
- 还可以进一步优化推理管道,尤其是对于大型深度学习模型。 有关示例,请参阅适用于图像 ETL 的参考解决方案。