在ARM架构下CentOS9部署CUDA与pytorch

前言

在ARM架构下部署CUDA与pytorch有许多坑,要多研究多想,找官方文档。本人在课程中需要服务器进行训练,由于学校给的所里服务器为单卡V100,课程300人共用,时常抢不到算力。为了能独占一个显卡,自己搭设了一台单卡A100服务器,用于训练。但是搭设的设备为ARM架构,并不是x86架构,并没有现成的pytorch可以用,(其实有,但是不能使用CUDA计算),以下使用官方镜像,最后成功部署。

系统终端输入uname --all,可以看到系统架构。本人使用的是aarch64,发行版为CentOS9。

1. 安装CUDA

在安装CUDA之前要先安装NVIDIA Driver,请读者自行安装,下面直接安装CUDA。

使用nvidia-smi命令,有正确的输出代表NVIDIA Driver已安装好,右上角CUDA Version代表本版本支持的CUDA最高版本。

https://developer.nvidia.com/cuda-toolkit-archiveicon-default.png?t=O83Ahttps://developer.nvidia.com/cuda-toolkit-archive进入CUDA官方界面,选择要下载的CUDA版本,我选择的是CUDA11.7,此处选择与后文选择pytorch版本对应,不必太多纠结。选择如图。

得到官方下载安装命令,依次执行即可。第二步执行不了遇到无权限问题,需要使用命令给文件添加权限。使用--silent表示静默安装,避免繁琐的输出;--installpath指定安装路径,也可不指定。

sudo chmod +x cuda_11.7.1_515.65.01_linux_sbsa.run
sudo sh cuda_11.7.1_515.65.01_linux_sbsa.run --silent --toolkit --installpath=/usr/local/cuda-11.7

安装后需要配置环境变量,要不使用下面的测试命令找不到。

export PATH=/usr/local/cuda-11.7/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64:$LD_LIBRARY_PATH

更新环境变量

source ~/.bashrc

设置好后可以使用nvcc -V命令检查是否安装好,输出如下。

2. 直接安装Pytorch(失败)

一开始选择与x86一样的步骤安装Pytorch,遇到问题。在Previous PyTorch Versions | PyTorchpytorch官方下载处有命令行,我下载了anaconda之后新建虚拟环境,安装pytorch,但是由于系统架构下面找不到1.12.0+cu116,也就是cudatoolkit安装不了。此时我转换了conda安装,爆出torchaudio==0.12.0找不到,我将其删去再次运行,此时下载的pytorch在下载过程中显示cpu版本。

pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116
或
conda install pytorch==1.12.0 torchvision==0.13.0 torchaudio==0.12.0 cudatoolkit=11.6 -c pytorch -c conda-forge

此时我转换了conda安装,爆出torchaudio==0.12.0和torchvision==0.13.0找不到,我将其删去再次运行,此时下载的pytorch在下载过程中显示cpu版本。

因此发现系统架构影响很大问题,但遇到问题不能轻易退缩,必须勇往直前。我询问了ChatGPT,的确用这个架构会遇到问题,GPT给出了两种解决方案,一从源码编译pytorch,二使用 Docker镜像。

3. 拉取镜像

但实际上我使用的不是docker,而是podman镜像,因为podman在我的系统里已经预装,我在安装docker时提示已经安装了docker,为了系统的稳定性和兼容性,我选择继续选择使用podman。

拉取所需要的镜像,需要在官方文档里找(此处有坑要选择对应CUDA版的,同时系统架构正确的)。Frameworks Support Matrix - NVIDIA Docs

需要横竖交叉着看,横着对应pytorch等框架,竖着是系统要求和CUDA要求,我选择了22.05版的pytorch,系统时Ubuntu20.04,如果需要别的框架如Tensorflow也可以在向下找。如图,我的框架满足Arm SBSA架构,可以使用。

podman pull nvcr.io/nvidia/pytorch:22.05-py3

使用命令拉取镜像,此处有坑,遇到拉取不了的需要设置国内源。Podman 使用 /etc/containers/registries.conf 文件来配置镜像源。可以在这个文件中添加阿里云的镜像源地址。在 [registries.search] 部分中,添加阿里云镜像源的地址。将文件内容更新为如下所示:

[registries.search]
registries = ['docker.io', 'quay.io', 'registry.fedoraproject.org', 'registry.aliyuncs.com']

重启Podman服务

sudo systemctl restart podman

再重新拉取,如果下载中断了,多尝试几次能够成功,会继续下载,下载好的不会重复下载。

如果下面的命令能够运行并且没有警告找不到nvidia driver,可能直接就成功了。

podman run --gpus all -it nvcr.io/nvidia/pytorch:22.05-py3
或
podman run --device nvidia.com/gpu=all -it nvcr.io/nvidia/pytorch:22.05-py3
或
podman run --runtime=nvidia --gpus all -it nvcr.io/nvidia/pytorch:22.05-py3 /bin/bash

我到这里没有成功,还需继续努力。报错:

Error: setting up CDI devices: unresolvable CDI devices nvidia.com/gpu=all
或
Error: default OCI runtime "nvidia" not found: invalid argument

4. 安装NVIDIA Container Toolkit

yum install nvidia-container-toolkit
或
dnf install nvidia-container-toolkit

这样安装完NVIDIA Container Toolkit后,还是不行,我接下来检查Podman的配置文件以确认NVIDIA运行时是否被添加。在 /etc/containers/containers.conf~/.config/containers/containers.conf 中,添加如下配置:

[engine]
runtime = "nvidia"
runtime_flags = []

再次尝试命令

podman run --runtime=nvidia --rm nvidia/cuda:11.0-base nvidia-smi

依然不行。查看服务是否有问题(可选,个人认为不是这个问题),确认 /etc/systemd/system/nvidia-container-runtime.service 文件是否存在。如果不存在,可能需要手动创建。在其中输入:

[Unit]
Description=NVIDIA Container Runtime
Documentation=https://github.com/NVIDIA/nvidia-container-runtime
After=network.target

[Service]
ExecStartPre=/sbin/modprobe nvidia
ExecStart=/usr/bin/nvidia-container-runtime
ExecStopPost=/sbin/modprobe -r nvidia

[Install]
WantedBy=multi-user.target

使用下列命令测试

sudo systemctl daemon-reload
sudo systemctl start nvidia-container-runtime.service
sudo systemctl status nvidia-container-runtime.service

需要确保输出如下,显示enabled,如不然则这个服务设置错了。

可以之后,使用下列命令进入镜像测试成功与否。

podman run --runtime=/usr/bin/nvidia-container-runtime --rm -it nvcr.io/nvidia/pytorch:22.05-py3

这样就成功进入了镜像,但输出最下面显示警告未能检测到NVIDIA Driver,从输出进入网址查看。

选择中间的Containers and NVIDIA GPUs,进入Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit 1.16.2 documentation,点击左侧的Installing the Toolkit,在文档最下面提示,Podman配置相关需要建立CDI。

点击进入Support for Container Device Interface — NVIDIA Container Toolkit 1.16.2 documentation

阅读文章要求咱们建立容器设备接口 (CDI) 规范,输入命令:

sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml

之后再次运行podman,并把前面的命令都加上:

podman run --rm --runtime=/usr/bin/nvidia-container-runtime --device nvidia.com/gpu=all --security-opt=label=disable -it nvcr.io/nvidia/pytorch:22.05-py3

显示如图,至此pytorch镜像配置完成!

5. 运行代码

对于我们需要运行代码来说,还需要简单设置。首先在命令中去掉 -rm 命令,该命令代表仅生成一次,用过就删除镜像。之后要把主机的文件与镜像相链接,使用 -v /root/workspace:/workspace 指令,将主机目录和镜像目录相链接,主机的修改能够即时反应到镜像中。同时要编写代码需要设置一个常用的镜像要添加名字,使用 --name workspace 指令新建一个命名为workspace的镜像。

我使用的时vscode,vscode中podmanager扩展,可以检测到新建的镜像,将其打开后可以进行命令行指令。

最终命令为:

podman run --security-opt label=disable -v /root/workspace:/workspace --runtime=/usr/bin/nvidia-container-runtime --device nvidia.com/gpu=all -it --name workspace nvcr.io/nvidia/pytorch:22.05-py3

至此大功告成!

ps:第一次写文章,有任何问题烦请指教,谢谢各位读者!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值