不同 CUDA 架构的 Pytorch 安装

out*_*229 6 docker pytorch

我有一个 Dockerfile,它从源代码安装 PyTorch 库。

这是 Dockerfile 中的片段,它从 pytorch 源代码执行安装

RUN cd /tmp/ \
 && git clone https://github.com/pytorch/pytorch.git \
 && cd pytorch  \
 && git submodule sync && git submodule update --init --recursive \
 && sudo TORCH_CUDA_ARCH_LIST="6.0 6.1 7.0 7.5 8.0" python3 setup.py install

Run Code Online (Sandbox Code Playgroud)

我对这里发生的事情没有正确的理解,希望得到社区的一些意见:

  • 为什么不同的 CUDA 版本 PyTorch 需要不同的安装方式?
  • TORCH_CUDA_ARCH_LIST在这种情况下,它的作用是什么?
  • 如果我的机器有多个 CUDA 设置,这是否意味着我将在 Docker 容器中安装多个 PyTorch 版本(特定于每个 CUDA 设置)?
  • 如果我的机器没有上述 CUDA 设置(“6.0 6.1 7.0 7.5 8.0”),PyTorch 安装会失败吗?

dag*_*elf 10

TL;DR您选择的版本需要与您的硬件相关,否则代码即使编译也无法运行。例如,如果您希望它在 RTX 3090 上运行,您需要确保sm_80,sm_86或sm_87在列表中。sm_87可以做别人sm_80做不到的事情,而且它做事的速度可能比其他人能做的更快。

为什么不同的 CUDA 版本 PyTorch 需要不同的安装方式?

新的硬件一直在被制造出来,支持新架构的编译器和驱动程序通常不向后兼容,并且(不确定 CUDA 的情况,但肯定是 AMD 的情况)甚至不向前兼容 - 所以已知支持特定硬件的编译器非常重要。

TORCH_CUDA_ARCH_LIST 在这种情况下的作用是什么?

我在这里猜测,但我认为 Pytorch 将为每个架构编译库,然后如果这些架构存在于硬件中,则可以在运行时选择优化的函数。

如果我的机器有多个 CUDA 设置,这是否意味着我将在 Docker 容器中安装多个 PyTorch 版本(特定于每个 CUDA 设置)?

我再次猜测,但我认为它们都将与包含针对不同硬件的不同优化的多个库位于同一个容器中。

如果我的机器没有上述 CUDA 设置(“6.0 6.1 7.0 7.5 8.0”),PyTorch 安装会失败吗?

IIRC 即使您可以使安装正常工作,代码执行也可能会因多种原因而失败,通常是由于硬件不兼容。

您可以参考 Nvidia 编译器文档https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-feature-list来帮助您选择适合您的目标的 CUDA 版本硬件,例如。以下是硬件版本:

NVCC标签 TORCH_CUDA_ARCH_LIST GPU架构 年 例如。图形处理器
sm_50、sm_52 和 sm_53 5.0 5.1 5.3 麦克斯韦支持 2014年 GTX 9xx
sm_60、sm_61 和 sm_62 6.0 6.1 6.2 帕斯卡支持 2016年 10xx,Pxxx
sm_70 和 sm_72 7.0 7.2 沃尔特支持 2017年 泰坦五号
sm_75 7.5 图灵支持 2018年 大多数20xx
sm_80、sm_86 和 sm_87 8.0 8.6 8.7 安培支持 2020年 RTX 30xx、Axx[xx]
sm_89 8.9 艾达支持 2022年 实时传输xxxx
sm_90、sm_90a 9.0 9.0a 料斗支撑 2022年 H100

令人惊讶的是,我找不到列表,不得不自己编译。

从上面你可以得到的sm_50是5.0等等......

您如何知道nvcc要使用哪些标签?

$ locate nvcc
...
$ /usr/local/cuda-11.7/bin/nvcc --help|grep arch
...
--list-gpu-arch                                 (-arch-ls)                      
        List the virtual device architectures (compute_XX) supported by the compiler
        and exit. If both --list-gpu-code and --list-gpu-arch are set, the list is
...
$ /usr/local/cuda-11.7/bin/nvcc --list-gpu-arch
compute_35
compute_37
compute_50
compute_52
compute_53
compute_60
compute_61
compute_62
compute_70
compute_72
compute_75
compute_80
compute_86
compute_87
Run Code Online (Sandbox Code Playgroud)

同样,在这里您可以看到 CUDA 11.7 支持Tesla系列的 Nvidia GPU,该系列甚至不再在当前文档中列出。当然,这些微架构并不支持 Pytorch 公开的所有功能,因此很多东西都无法在其上运行 - 并且在大多数情况下,如果您尝试为这些版本编译它,编译器应该警告您,但现实问题是,并非所有内容都经过 Nvidia 开发人员的测试,尤其是如果您不走寻常路,那么仍然比 AMD 世界温和得多,在 AMD 世界中,开源第三方驱动程序在许多方面都领先于供应商驱动程序。

由于硬件和编译器的复杂性不断增加,未来看起来越来越不像 CUDA 和 ROCm 这样的供应商编译器,而越来越像 OpenCL 和交叉手指Mojo,这样你就不必担心那些神奇的数字了使每个版本都能发挥最佳性能。

  • 检查您希望它在什么硬件上运行。我已经为你更新了答案。 (2认同)