ChrisKim
Do not go gentle into that good night.
颢天

使用容器在国产超算平台安装 PyTorch CUDA

近期知道了我校新建了高性能计算平台,于是找老师申请了个账号。上去一看发现居然三台 GPU 节点,每台都有两块 A100 40G,遂打算开始炼丹。结果发现学校为了国产化,服务器 CPU 居然是 arm64 指令集的鲲鹏 920,导致 PyTorch 无法安装。折腾许久,总结了本篇文章,用容器解决这个问题,希望能帮助到大家。

[2024/03/24 UPD]: 真尼玛难用,别折腾国产平台了,快跑!

1 问题表现

上服务器后发现无论是 pip 还是 conda,怎么都没法安装上 PyTorch CUDA 版本,即使安上了调用测试代码也报错无 CUDA 设备。这让我非常纳闷,明明复制的官网安装指令,nvidia-smi 也能回显两块显卡,怎么就跑不了代码?

经过研究发现,原来是 PyTorch 官方压根没有为 aarch64 平台编译带 CUDA 的二进制 whl,在 https://download.pytorch.org/whl/torch/ 可以发现,带 CUDA 的版本只有 x86_64 平台的:

https://assets.zouht.com/img/blog/3724-01.webp

这就麻烦了,如果想安装那就得从源码开始编译,遂开始 clone 源码,准备工具链。但是由于学校没有给用户 sudo 权限,编译环境很难准备。更令人窒息的是,有些 PyTorch 编译前置环境竟然也没有提供 aarch64 平台的二进制,为了编译 PyTorch 居然还得先编译前置环境!这谁受得了啊。

和运维拉扯了半天,最后决定用容器化解决该问题。

2 容器平台

众所周知,Docker 容器的管理均需要 root 权限。对于共享 HPC 平台这种应用场景,肯定不能把 root 权限给用户,因此运维选择安装 singularity 这个容器平台。

这个容器平台兼容 Docker 镜像,可以直接从 Docker Registry 拉取镜像。它的最大特点就是不需要 root 权限,普通用户就能启容器,并且 singularity 的不会像 Docker 完全隔离宿主机和容器,启动容器后甚至能直接访问到宿主家目录,省了 bind 绑定的事。

当然,如果你有 Docker 环境,那就不需要用这个了,直接参阅官方文档用 Docker 启容器就行了:https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/running.html

3 安装 PyTorch

之所以能用容器化解决这个问题,是因为 PyTorch 提供了 arm64 平台的 NGC 镜像,该镜像打包好了 CUDA, cuBLAS, cuDNN, TensorRT, Torch-TensorRT,环境已经是即开即用的级别了。

3.1 选择镜像

前往 NGC 储存库查看镜像列表:https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags

每个版本打包的内容版本也有表格:https://docs.nvidia.com/deeplearning/frameworks/pytorch-release-notes/rel-24-02.html

需要注意的是要选择带 igpu 结尾,另外镜像都有 amd64 和 arm64 两个版本,不需要手动指定,会自动拉取正确平台的镜像。

下面以撰文时最新版举例:nvcr.io/nvidia/pytorch:24.02-py3

3.2 拉取镜像

使用以下命令拉取 Docker 镜像:

singularity pull docker://nvcr.io/nvidia/pytorch:24.02-py3

docker:// 开头代表着该镜像是 Docker 镜像,后面可以接任意 Docker 镜像。拉取完成后,会获得一个 sif 文件,例如 pytorch_24.02-py3.sif.

3.3 运行镜像

接下来使用以下命令运行镜像:

singularity run --nv pytorch_24.02-py3.sif

需要注意的是,--nv 参数至关重要,加上它后 singularity 运行容器时才会初始化 NVIDIA 相关驱动和设备。

https://assets.zouht.com/img/blog/3724-02.webp

运行后关注回显,检查是否有 ERROR 字眼,如果有的话大概率是宿主机显卡相关环境有问题。我校平台宿主机并没有安装 cuda-tool-kits,只安装了 NVIDIA 驱动,但是实测下来是可以正常启动容器并使用的。

此时可以发现,目前的 Shell Prompt 是 Singularity>,不过实际上现在已经是 Bash 在做终端了。如果你不习惯这个 Prompt,可以输入 /bin/bash 切到原版 Bash 里。

3.4 测试环境

首先确保启动容器时没有 ERROR 字眼,因为有些时候下面两个测试回显正常,但是实际上是不能调用到显卡的。

1. 测试显卡驱动:nvidia-smi

https://assets.zouht.com/img/blog/3724-03.webp

2. 测试 CUDA 工具包:nvcc -V

https://assets.zouht.com/img/blog/3724-04.webp

3. 实际运行 PyTorch 进行测试

进入 Python 交互式界面,运行以下代码对环境进行测试,如果回显正确大概率就没问题了。

Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.version.cuda
'12.3'
>>> torch.cuda.is_available()
True
>>> torch.cuda.device_count()
2
>>> torch.cuda.current_device()
0
>>> torch.cuda.device(0)
<torch.cuda.device object at 0x40024a84cf70>
>>> torch.cuda.get_device_name(0)
'NVIDIA A100-PCIE-40GB'

4 一些感想

这几天为了解决这个问题,折腾了许久,最后还是靠让运维装了个容器平台来解决的,我想如果显卡也换成国产平台,大概率是真的没法解决了。在找资料的过程发现,国产平台的资料实在是少之又少,源头开发者基本上都没有关注国产平台的兼容性,甚至 PyTorch 官方发 aarch64 二进制是为了 macOS 平台的。

源头开发者不关注,那国内开发者是否关注呢?实际上也不算关注。因为目前国产平台还没有推广开,国内相关资料也少之又少。看到 CSDN 一篇博客和我遇到相同问题,但是也只表明了问题在这但解决不了。华为这个平台,基本上只有华为官网有少许资料,其他都是一些灌水吹嘘的新闻报道,毫无价值。

因此,我也切身体会到了国产化道阻且长,不仅是技术,而且是资料积累均还有一定差距。希望我这篇博客也能为国产平台的应用提供微小的助力吧。

本文链接:https://www.zouht.com/3724.html
本文使用:CC BY-NC-SA 4.0 许可
# # # # #
首页      随笔      使用容器在国产超算平台安装 PyTorch CUDA

发表回复

textsms
account_circle
email

颢天

使用容器在国产超算平台安装 PyTorch CUDA
近期知道了我校新建了高性能计算平台,于是找老师申请了个账号。上去一看发现居然三台 GPU 节点,每台都有两块 A100 40G,遂打算开始炼丹。结果发现学校为了国产化,服务器 CPU 居然是 ar…
扫描二维码继续阅读
2024-03-11