PyTorch

PyTorch 项目是一个 Python 包,可提供 GPU 加速的张量计算和用于构建深度学习网络的高级功能。 如需许可详细信息,请参阅 GitHub 上的 PyTorch 许可文档

若要监视和调试 PyTorch 模型,请考虑使用 TensorBoard

PyTorch 包含在用于机器学习的 Databricks Runtime 中。 如果使用 Databricks Runtime,请参阅安装 PyTorch,了解有关安装 PyTorch 的说明。

注意

本文并不是 PyTorch 的全面指南。 有关详细信息,请参阅 PyTorch 网站

单节点和分布式训练

若要测试和迁移单计算机工作流,请使用单节点群集

有关深度学习的分布式训练选项,请参阅分布式训练

示例笔记本

PyTorch 笔记本

获取笔记本

安装 PyTorch

用于 ML 的 Databricks Runtime

用于机器学习的 Databricks Runtime 包括 PyTorch,因此你可以创建群集并开始使用 PyTorch。 有关所使用的 Databricks Runtime ML 版本中安装的 PyTorch 版本,请参阅发行说明

Databricks Runtime

Databricks 建议你使用用于机器学习的 Databricks Runtime 中包含的 PyTorch。 但是,如果必须使用标准 Databricks Runtime,可以 Databricks PyPI 库的形式安装 PyTorch。 下面的示例演示如何安装 PyTorch 1.5.0:

  • 在 GPU 群集上,通过指定以下内容来安装 pytorchtorchvision

    • torch==1.5.0
    • torchvision==0.6.0
  • 在 CPU 群集上,使用以下 Python wheel 文件安装 pytorchtorchvision

    https://download.pytorch.org/whl/cpu/torch-1.5.0%2Bcpu-cp37-cp37m-linux_x86_64.whl
    
    https://download.pytorch.org/whl/cpu/torchvision-0.6.0%2Bcpu-cp37-cp37m-linux_x86_64.whl
    

分布式 PyTorch 的错误和故障排除

下面的各个部分介绍了以下类的常见错误消息和故障排除指南:PyTorch DataParallelPyTorch DistributedDataParallel。 其中大多数错误都可以使用 TorchDistributor 解决,后者在 Databricks Runtime ML 13.0 及更高版本中可用。 但是,如果 TorchDistributor 不是可行的解决方案,每个部分中还提供了建议的解决方案。

下面是 TorchDistributor 的用法示例:


from pyspark.ml.torch.distributor import TorchDistributor

def train_fn(learning_rate):
        # ...

num_processes=2
distributor = TorchDistributor(num_processes=num_processes, local_mode=True)

distributor.run(train_fn, 1e-3)

“进程 0 终止,退出代码为 1”

使用笔记本时,无论环境是 Databricks、本地计算机还是其他,都可能会出现此错误。若要避免此错误,请将 torch.multiprocessing.start_processesstart_method=fork 一起使用,而不是使用 torch.multiprocessing.spawn

例如:

import torch

def train_fn(rank, learning_rate):
    # required setup, e.g. setup(rank)
        # ...

num_processes = 2
torch.multiprocessing.start_processes(train_fn, args=(1e-3,), nprocs=num_processes, start_method="fork")

“服务器套接字无法绑定到 [::]:{PORT NUMBER} (errno: 98 - 地址已被使用)。”

在训练期间中断单元后,如果重启分布式训练,则会出现此错误。

若要解决该问题,请重启群集。 如果重启群集不能解决问题,则原因可能是训练函数代码中存在错误。

你可能会遇到 CUDA 的其他问题,因为 start_method=”fork”不兼容 CUDA。 在任何单元格中使用任何 .cuda 命令都可能会导致失败。 若要避免这些错误,请在调用 torch.multiprocessing.start_method 之前添加以下检查:

if torch.cuda.is_initialized():
    raise Exception("CUDA was initialized; distributed training will fail.") # or something similar