如何用AMD显卡部署模型/进行推理

如何用AMD显卡部署模型/进行推理

引言

为什么要用AMD显卡进行部署或者推理呢?也许有很多理由比如N卡太贵了、或者公司要求之类的。但不管怎么样,我们的目标就是在linux上用A卡进行推理(本文不涉及windows)。

本文将从两方面进行介绍

  • 如何在A卡上是用pytorch
  • 如何使用C++调用模型

前置知识

众所周知,使用N卡进行训练或推理的话,首先要有驱动,然后要有cuda。那么A卡同理,驱动是什么应该不用多说,那么A卡下对标cuda的是身儿么东西呢?这个东西AMD官方称之为ROCm。只要装了这个东西,就可以愉快地进行A卡的模型部署以及推理了。

下面,我们首先讲一下如何安装ROCm。
注意,本文是用的环境为7900xtx, ubuntu 22.04.3桌面版,rocm5.7.1。下面将不再赘述,另外由于A卡目前兼容性过差,若读者遵循本文教程无法成功,请去官网查询三者版本是否兼容。本文所提到的内容均已在上述环境下跑通。

如何安装A卡驱动与ROCm

驱动

由于A卡开源的特性,linux的发行版中,基本上都已经集成了A卡驱动。那么这是否意味着我们可以不用做任何操作就可以直接用了呢?答案是否定的。

试想一下,ubuntu一个长期发行版会有五年的官方支持。假设说ubuntu 22.04.3是2022年发布的,硬件厂家在2024年推出了新的驱动。那么2022年的ubuntu 22.04.3该怎么支持这个新的驱动呢?至少在这里,答案是HWE(Hardware Enablement,即硬件支持)。通过升级内核来完成对新的硬件的支持。当然,如果您使用的是较老版本的显卡,请忽略此条。

通过HWE堆栈,Ubuntu LTS用户可以在不升级到新的Ubuntu发行版的情况下获得对新硬件的支持。这对于企业和其他组织来说特别有用,因为它允许它们在不改变系统稳定性的情况下使用新硬件。

上面简述完了原理,那我们来看一下具体怎么操作:

sudo apt install linux-generic-hwe-22.04

说起来很复杂,其实只要上面一行代码即可实现,然后重启一下即可。
在上面这行代码执行之后,应该通过执行 uname -r看到类似下面的输出:
在这里插入图片描述
这得注意的是,在执行sudo apt install linux-generic-hwe-22.04这条命令前后,uname -r的输出结果是不一样的,如果不一样,那就说明HWE升级完成。

ROCm

ROCm对标cuda。那么自然会有类似nvcc之类的东西。但我们并不需要了解这是什么。毕竟能用就行了。住需要按照下述步骤执行:
下载ROCm安装程序(如果您要安装其他版本的ROCm,请自行编辑):

curl -O https://repo.radeon.com/amdgpu-install/5.7.1/ubuntu/jammy/amdgpu-install_5.7.50701-1_all.deb
sudo dpkg -i amdgpu-install_5.7.50701-1_all.deb

进行安装:

sudo amdgpu-install --usecase=hiplibsdk,rocm

将用户组添加到video与render组(这一条不知道为什么,如果您有足够的精力,也许可以试一试不执行这个步骤会发生什么,欢迎您的留言):

sudo usermod -aG video $USER
sudo usermod -aG render $USER

最后重启,即可完成rocm的安装。如果一切顺利的话,执行rocminfo将会出现如下界面:

由于我手上的服务器cpu也是amd的,也许上图中是核显,请忽略。或者您也可以输入dpkg -l | grep rocm,通过查看rocm版本检查是否安装成功:
如何用AMD显卡部署模型/进行推理_第1张图片

驱动与rocm安装完成

如果一切顺利的话,现在您执行rocm-smi会出现类似nvidia-smi的界面,如下图:
如何用AMD显卡部署模型/进行推理_第2张图片

如何使用pytorch

首先我们要知道,pytorch 是用 python 其实只是一个兼容层,底层还是用 C(或者说 cuda,反正是对硬件的调用,怎么理解都可以)来写的。因此,我们只需要安装兼容 ROCm 版本的 pytorch 即可。

下面我们将简单介绍如何安装兼容 ROCm 版本的 pytorch、如何检查是否能够调用 A 卡。

如何安装兼容 ROCm 版本的 pytorch

前置的如何安装 python、conda 等,此处已默认您有相应的基础知识,此处不再赘述。假设您已经有了python 环境,那么只需要一行代码即可安装:

pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm5.7

当然,假设您的服务器无法联网,也可以自行将文件下载后本地安装,可以参考下面的代码:

wget https://repo.radeon.com/rocm/manylinux/rocm-rel-5.7/torch-2.0.1%2Brocm5.7-cp310-cp310-linux_x86_64.whl
wget https://repo.radeon.com/rocm/manylinux/rocm-rel-5.7/torchvision-0.15.2%2Brocm5.7-cp310-cp310-linux_x86_64.whl
pip3 install --force-reinstall torch-2.0.1+rocm5.7-cp310-cp310-linux_x86_64.whl torchvision-0.15.2+rocm5.7-cp310-cp310-linux_x86_64.whl

再次温馨提示,由于 A 卡兼容性较差,请随时确认 ROCm 版本与您使用的显卡是否兼容,假设不兼容的话请去官网翻阅文档进一步确认。作者暂时没有发现那种兼容性表格,因此这一步实在是爱莫能助,还请见谅。

如何检查是否能够调用 A 卡

还记得本节开头说过的话吗,torch 是用 python 只是为了提供一个兼容层。因此,您可以使用下面的代码检查能否调用 A 卡:

torch.cuda.is_available()

如果没问题的话,这一步应当返回 True。也许您会奇怪,不是 ROCm 吗,为什么调用的是 cuda?我个人猜测是因为 pytroch 为了保证对老程序的兼容性而做的改变,反正底层具体调用的什么代码,我们也不知道,完全可以把底层调用的 cuda 换成 rocm 嘛。总之,我个人还是比较喜欢这种风格的写法,毕竟目前的 ROCm 并没有展现出什么不同于 cuda 的能力。

非常重要但是不知道怎么取名字的一段

如果您完成了前述的所有内容,并且torch.cuda.is_available()返回为 True 的情况下,依旧无法进行推理/训练,那么请将下面的代码设置为环境变量:

export PYTORCH_ROCM_ARCH="gfx1100"
export HIP_DEVICE=0

你可能感兴趣的:(杂谈,人工智能)