分布式训练

Azure Databricks 建议尽量在一台计算机上训练神经网络;由于通信开销,用于训练和推理的分布式代码比单计算机代码更复杂,且速度更慢。 但是,如果模型或数据太大,以致无法装入一台计算机的内存中,则应该考虑使用分布式训练和推理。 对于这些工作负荷,Databricks Runtime ML 包括 TorchDistributor、Horovod 和 spark-tensorflow-distributo 包。

Azure Databricks 还通过 pyspark.ml.connect 模块为 Spark 机器学习模型提供分布式训练,请参阅使用 pyspark.ml 连接在 Databricks Connect 上训练 Spark 机器学习模型

注意

由于节点间网络性能低,Databricks 不建议使用 NC 系列 VM 运行多节点分布式训练。 而是,使用一个多 GPU 节点,或使用不同的 GPU VM 大小,例如支持加速网络的 NCasT4_v3 系列

DeepSpeed 分发服务器

DeepSpeed 分发服务器基于 TorchDistributor 构建,对于具有需要更高计算能力但受内存约束限制的模型的客户,它是推荐的解决方案。 DeepSpeed 是由 Azure 开发的开源库,提供优化的内存使用率、降低通信开销和高级管道并行度。 详细了解使用 DeepSpeed 分发服务器进行分布式训练

TorchDistributor

TorchDistributor 是 PySpark 中的一个开源模块,可帮助用户在其 Spark 群集上使用 PyTorch 进行分布式训练,因此它允许你将 PyTorch 训练作业作为 Spark 作业启动。 在后台,它会初始化环境,并会初始化辅助角色之间的信道,同时利用 CLI 命令 torch.distributed.run 在工作器节点之间运行分布式训练。 详细了解使用 TorchDistributor 进行的分布式训练

spark-tensorflow-distributor

spark-tensorflow-distributor 是 TensorFlow 中的开源原生包,用于在 Spark 群集上通过 TensorFlow 进行分布式训练。 详细了解使用 TensorFlow 2 进行的分布式训练

Ray

Ray 是一个开放源代码框架,专门用于缩放 ML 工作流和 AI 应用程序的并行计算处理。 请参阅在 Azure Databricks 上使用 Ray

Horovod

Horovod 是适用于 TensorFlow、Keras 和 PyTorch 的分布式训练框架。 Azure Databricks 支持使用 HorovodRunner 和 horovod.spark 包进行分布式深度学习训练。 对于使用 Keras 或 PyTorch 的 Spark ML 管道应用程序,可使用horovod.spark估算器 API

要求

Databricks Runtime ML。

使用 Horovod

下面的文章提供了有关使用 Horovod 进行分布式深度学习的一般信息,以及演示如何使用 HorovodRunner 和 horovod.spark 包的示例笔记本。

安装其他版本的 Horovod

若要在 ML 群集中从预安装的版本进行升级或降级,必须执行以下步骤来重新编译 Horovod:

  1. 卸载 Horovod 的当前版本。

    %pip uninstall -y horovod
    
  2. 如果使用 GPU 加速群集,请安装编译 Horovod 所需的 CUDA 开发库。 若要确保兼容性,请保持包版本不变。

    %sh
    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
    mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
    apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
    add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
    
    wget https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
    dpkg -i ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
    
    apt-get update
    apt-get install --allow-downgrades --no-install-recommends -y \
    cuda-nvml-dev-11-0=11.0.167-1 \
    cuda-nvcc-11-0=11.0.221-1 \
    cuda-cudart-dev-11-0=11.0.221-1 \
    cuda-libraries-dev-11-0=11.0.3-1 \
    libnccl-dev=2.11.4-1+cuda11.5\
    libcusparse-dev-11-0=11.1.1.245-1
    
  3. 下载所需版本的 Horovod 的源代码,并使用适当的标志进行编译。 如果无需任何扩展(例如 HOROVOD_WITH_PYTORCH),可删除这些标志。

    Cpu

    %sh
    HOROVOD_VERSION=v0.21.3 # Change as necessary
    git clone --recursive https://github.com/horovod/horovod.git --branch ${HOROVOD_VERSION}
    cd horovod
    rm -rf build/ dist/
    HOROVOD_WITH_MPI=1 HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITH_PYTORCH=1 \
    # For Databricks Runtime 8.4 ML and below, replace with /databricks/conda/envs/databricks-ml/bin/python
    sudo /databricks/python3/bin/python setup.py bdist_wheel
    readlink -f dist/horovod-*.whl
    

    Gpu

    %sh
    HOROVOD_VERSION=v0.21.3 # Change as necessary
    git clone --recursive https://github.com/horovod/horovod.git --branch ${HOROVOD_VERSION}
    cd horovod
    rm -rf build/ dist/
    HOROVOD_GPU_ALLREDUCE=NCCL HOROVOD_CUDA_HOME=/usr/local/cuda HOROVOD_WITH_MPI=1 HOROVOD_WITH_TENSORFLOW=1 HOROVOD_WITH_PYTORCH=1 \
    # For Databricks Runtime 8.4 ML and below, replace with /databricks/conda/envs/databricks-ml-gpu/bin/python
    sudo /databricks/python3/bin/python setup.py bdist_wheel
    readlink -f dist/horovod-*.whl
    
  4. 通过指定上一命令输出中的 Python wheel 路径,使用 %pip 重新安装 Horovod。 本例中显示的是 0.21.3

    %pip install --no-cache-dir /databricks/driver/horovod/dist/horovod-0.21.3-cp38-cp38-linux_x86_64.whl
    

排查 Horovod 安装问题

问题:导入 horovod.{torch|tensorflow} 引发 ImportError: Extension horovod.{torch|tensorflow} has not been built

解决方案:Horovod 预安装在 Databricks Runtime ML 上,因此,如果未正确更新环境,通常会发生此错误。 此错误表示 Horovod 是在所需库(PyTorch 或 TensorFlow)之前安装的。 由于 Horovod 是在安装过程中编译的,因此如果在 Horovod 安装过程中没有这些包,系统不会编译 horovod.{torch|tensorflow}。 要解决该问题,请执行以下步骤:

  1. 验证是否位于 Databricks Runtime ML 群集上。
  2. 确保已安装 PyTorch 或 TensorFlow 包。
  3. 卸载 Horovod (%pip uninstall -y horovod)。
  4. 安装 cmake (%pip install cmake)。
  5. 重新安装 horovod