前言

由于之前一直玩黑苹果,老黄的显卡只能停留在 High Sierra 系统,所以我一直用的 AMD 的显卡 Vega 56,最近由于期末大作业要炼丹,不得不说 AI 届 A 卡无人权,几乎完全都是老黄 CUDA 的天下,老黄这一手提前布局,高啊。

正值双十一和双十二的时期,本来打算入手一枚 3070 或 3080,但无奈,当猴当的太称职了,抢了好久都没有买到,只能用已有的显卡炼丹了。要用 A 卡炼丹,只能用 ROCm,但 ROCm 支持的框架很少,不过幸好 Tensorflow 是有社区分支支持的。

在配置环境过程踩了不少坑,这里记录一下。

安装 ROCm

先给出官方文档地址
  1. 更新系统安装依赖

    sudo apt update
    sudo apt dist-upgrade
    sudo apt install libnuma-dev
    sudo reboot

    重启后继续执行下一步

  2. 添加 ROCm 的 ppa repo

    wget -q -O - https://repo.radeon.com/rocm/rocm.gpg.key | sudo apt-key add -
    
    echo 'deb [arch=amd64] https://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list
  3. 更新源并安装 rocm-dkms

    sudo apt update
    sudo apt install rocm-dkms

    源速度较慢,这里建议挂代理

    sudo vi /etc/apt/apt.conf.d/proxy.conf
    
    Acquire{
      HTTP::proxy "http://127.0.0.1:1080";
      HTTPS::proxy "https://127.0.0.1:1080";
    }

    装好后记得删掉

  4. 设置权限

    sudo usermod -a -G video $LOGNAME
    sudo usermod -a -G render $LOGNAME
    sudo reboot

    必须要重启!

  5. 添加 ROCm 环境变量

    echo 'export PATH=$PATH:/opt/rocm/bin:/opt/rocm/rocprofiler/bin:/opt/rocm/opencl/bin' | sudo tee -a /etc/profile.d/rocm.sh
    sudo reboot
  6. 测试

    /opt/rocm/bin/rocminfo
    /opt/rocm/opencl/bin/x86_64/clinfo

    你应该可以从结果中看到你的显卡

安装 tensorflow-rocm

同样,先给出官方文档地址
  1. 首先就是在系统上安装 python 环境,随你喜欢就行,你可以用 conda 也可以用 pyenv 当然直接用系统自带的 python3 也可以
  2. 创建符合 tensorflow 的虚拟环境,建议 python3.7
  3. 安装依赖包

    sudo apt update
    sudo apt isntall rocm-libs miopen-hip rccl
  4. 安装 tensorflow-rocm

    pip install tensorflow-rocm
  5. 测试

    import tensorflow as tf
    tf.__version__
    tf.test.is_gpu_available()

可能遇到的错误

  1. 添加 ROCm 的 ppa repo 时

    wget -q -O - http://repo.radeon.com/rocm/apt/debian/rocm.gpg.key | sudo apt-key add -
    echo 'deb [arch=amd64] http://repo.radeon.com/rocm/apt/debian/ xenial main' | sudo tee /etc/apt/sources.list.d/rocm.list

    不要自作聪明的把 xenial 改成 bionic

  2. 重启出现 HSA_STATUS_ERROR_OUT_OF_RESOURCES

    Failed to get user name to check for video group membership
    hsa api call failure at: /data/jenkins_workspace/compute-rocm-rel-2.9/rocminfo/rocminfo.cc:1102
    Call returned HSA_STATUS_ERROR_OUT_OF_RESOURCES: The runtime failed to allocate the necessary resources. This error may also occur when the core runtime library needs to spawn threads or create internal OS-specific events.

    相关 ISSUE : https://github.com/RadeonOpenCompute/ROCm/pull/1005

    血红血红的。而且第一句特别蠢,怎么连用户名也没拿到啊(实际上这句话没什么影响)?这种情况下 clinfo 也无法执行,但是 rocm-smi 仍旧完全正常。根据上面那个 ISSUE 的说法,是用户组问题。我看也是。这个 ISSUE 关联的 Pull Request 中修改了 README.md ,提供了一套解决方法: https://github.com/RadeonOpenCompute/ROCm/pull/1005/files 但我测试并没有效果。

    我是怎么解决的呢?我翻遍了 Google 前三页都没解决,然后在 CSDN 上看到了一句话: sudo 一下试试。

    sudo rocminfo (其实这样是没有环境变量的,所以一开始应该是 sudo /opt/rocm/bin/rocminfo

    ……成了。

    天知道为什么可以,我的 root 肯定不在 video 组,更不要说上面 ISSUE 认为需要的 render 组了。反正今后 sudo su 就能用。何乐而不为啊!

  3. apt install rocm-dkms 过程中出现 Error! Bad return status for module build on kernel

    Building initial module for 5.3.0-46-generic
    Error! Bad return status for module build on kernel: 5.3.0-46-generic (x86_64)
    Consult /var/lib/dkms/amdgpu/3.3-19/build/make.log for more information.

    啥事都没有,放心好了。这个 log 又长又什么都看不出来。 ROCm 也安装好了也能用。忽略就行。至少我这行。

  4. 官方 amdgpu / amdgpu-pro 驱动安装卸载相关问题
    这其实是一个根本不存在的问题,尤其是如果你从全新系统开始。 ROCm 是不需要提前手动装其他驱动的。
    不必要提前安装驱动。不是 docker 版本不需要提前屏蔽驱动。
    但是!也不能没有驱动。 ROCm 需要有一个 amdgpu 驱动在运行。屏蔽驱动的方法是:

    sudo vim /etc/modprobe.d/blacklist.conf
    #: blacklist amdgpu
    
    sudo vim /etc/modprobe.d/blacklist-radeon.conf
    #: blacklist radeon
    # 这一行也可以手动直接写在上面的文件,但是如果安装过官方驱动,就会自动创建这个文件

    告诉你这个是为了让你明白……不要屏蔽驱动。如果不知道什么情况下屏蔽了就去注释掉。

    不过如果你不知道为什么装过其中一个驱动,你就会在后面 sudo apt install rocm-dkms 的时候碰到:

    dpkg: error processing archive /var/cache/apt/archives/rock-dkms_1.8-151_all.deb (--unpack):
    trying to overwrite '/usr/share/dkms/modules_to_force_install/amdgpu', which is also in package amdgpu-dkms 18.10-572953
    dpkg-deb: error: subprocess paste was killed by signal (Broken pipe)

    去网上搜一圈这里会有教你强制 overwrite 的。但恕我对 dpkg 一窍不通,我觉得并没有什么用。还是建议直接把驱动卸载掉。

  5. 官方驱动安装方法以 Radeon VII 为例(应该都大同小异),VII 驱动下载地址 ,下载后 tar xf amdgpu-*-ubuntu-18.04.tar.xz 解压然后 cd amdgpu* 进入文件夹。

    如果你要安装普通版驱动,那么 ./amdgpu-install 。不需要提前 sudo ,后面会叫你输入密码的。如果是 Pro 驱动,那么 ./amdgpu-pro-install 就好了。就是这么简单,快捷,以及人性化。 AMD 万岁。……要是真的话就好了。

    1. 官方驱动强制卸载方法

      这个脚本有一万种情况可以出错然后喊你用 amdgpu-uninstall / amdgpu-pro-uninstall 命令或者直接在安装脚本后面加 --uninstall 命令来清理不正确的安装否则就完全不能继续,包括但不限于你挂了代理(是的,以我个人经验,建议请务必在下载 rocm 的时候打开 apt 代理,而同时务必在安装驱动(不,你根本就不应该装,除非……你是为了完整的安装以便卸载干净它……)的时候关掉代理), apt 缓存的包有问题,编译哪里掉了链子以及其他一切。虽然几率其实不高,但是一旦发生了 ……

      你会遇到这种错误:

      You might want to run 'apt --fix-broken install' to correct these.
      The following packages have unmet dependencies:
      amdgpu-dkms : Depends: amdgpu-core but it is not going to be installed
      amdgpu-lib-hwe : Depends: amdgpu-core (= 19.30-934563) but it is not going to be installed
      amdgpu-pro-core : Depends: amdgpu-core but it is not going to be installed
      gst-omx-amdgpu : Depends: amdgpu-core but it is not going to be installed
      libdrm-amdgpu-common : Depends: amdgpu-core but it is not going to be installed
      libdrm2-amdgpu:i386 : Depends: amdgpu-core:i386
      libdrm2-amdgpu : Depends: amdgpu-core but it is not going to be installed
      libegl1-amdgpu-mesa:i386 : Depends: amdgpu-core:i386
      libegl1-amdgpu-mesa : Depends: amdgpu-core but it is not going to be installed
      libgbm1-amdgpu:i386 : Depends: amdgpu-core:i386
      libgbm1-amdgpu : Depends: amdgpu-core but it is not going to be installed
      ...
      E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

      (有人会叫你 sudo dpkg -i --force-overwrite /var/cache/apt/archives/rock-dkms_2.10-14_all.deb

      还有这种错误:

      dpkg: error processing package amdgpu (--remove):
       dependency problems - not removing
      Errors were encountered while processing:
       amdgpu

      还有前面提过的 overwrite 错误:

      Preparing to unpack .../libdrm-amdgpu-common_1.0.0-633530_all.deb ...
      Unpacking libdrm-amdgpu-common (1.0.0-633530) ...
      dpkg: error processing archive /var/opt/amdgpu-pro-local/./libdrm-amdgpu-common_1.0.0-633530_all.deb (--unpack):
       trying to overwrite '/opt/amdgpu/share/libdrm/amdgpu.ids', which is also in package ids-amdgpu 1.0.0-606296
      Errors were encountered while processing:
      /var/opt/amdgpu-pro-local/./libdrm-amdgpu-common_1.0.0-633530_all.deb

      (参考 askubuntu post

      …… 还有长成各种各样的。这不重要,总而言之,最为行之有效的解决方案是 StackExchange 的 某个帖子 藏在评论区的某个角落里的方法:

      sudo apt-get install synaptic

      是的你没看错,就是传说中的 新 立 德 。GUI,打开! Edit > Fix Broken Packages !然后在 Package 列表中用 Broken 过滤器,全部 Mark Completion Removal !这还没完,去列表里定位 amdgpu 或者 amdgpu-pro ,刚才出错的是那个就右键 Mark for Installation 哪个,记得点顶上的 Apply ,安装!

      这可比 amdgpu-install 那脚本好使多了。吭哧吭哧安装上了,很好。那么,可以愉快的 amdgpu-install --uninstall 了…… (是的,这个安装不会在命令行添加 amdgpu-uninstall 命令)

      报 apt lock 冲突的话别忘记把 synaptic gui 关掉啊。

    2. elementrary 或者其他野鸡 OS 适配

      一个无足轻重的小问题。稍有常识的人都能自己想到的凑字数段落。

      如果安装脚本报告 Unsupported DEB-based OS: elementary ,那么用一个你趁手的编辑器打开脚本,搜索 ubuntu|linuxmint|debian 并改成 ubuntu|linuxmint|debian|elementary 。其他系统同理。

最后修改:2020 年 12 月 11 日
如果觉得我的文章对你有用,请随意赞赏