2021年4月4日 星期日

機器學習之 ROCm 驅動 Radeon RX580 GPU

買了一張 Sapphire Nitro+ Radeon RX580 的二手顯卡, 終於第一次成功在自己的電腦上跑 gpu 版的 tensorflow, 開心!

想在自己的電腦上玩機器學習, 最熱門的做法當然是買 nVidia 的顯卡。 可是我有 不愉快的 nVidia 經驗, 所以這次改買 AMD 的 radeon 系列顯卡。 先買了一張二手 RX VEGA 64, 完全不會動 :-( 最後改買這張二手 rx580 才終於成功。

把龐大的顯卡很驚險地正正好塞進電腦、 再接上顯卡的額外電源, 開機之後, 內顯自動失效, 螢幕必須接這張顯卡才看得見。 用 sudo lshw -C video 查看得到:

  *-display
       description: VGA compatible controller
       product: Ellesmere [Radeon RX 470/480/570/570X/580/580X/590]
       vendor: Advanced Micro Devices, Inc. [AMD/ATI]
       physical id: 0
       bus info: pci@0000:01:00.0
       version: e7
       width: 64 bits
       clock: 33MHz
       capabilities: vga_controller bus_master cap_list rom
       configuration: driver=amdgpu latency=0
       resources: irq:127 memory:90000000-9fffffff memory:a0000000-a01fffff ioport:3000(size=256) memory:a0400000-a043ffff memory:c0000-dffff

所以我猜本篇大概也適用於其他品牌的 rx570/rx580/rx590 。 專屬於 AMD radeon GPU 的加速函式庫是 ROCm, 類似 nvidia 的 cuda。 ROCm 知名度低很多, 但重點它是開放原始碼軟體。 根據 官方的硬體支援清單, (臺灣比較容易買到的) rx580 屬於 「也許可用但官方並不正式支援」 的型號。 以下在 linux mint 20 ulyana, xfce 版 上面, 全程以 sudo bash (root) 的身份執行。 主要參考 這篇這篇 再加上一些搜尋。

首先要確認系統裡沒有其他版本的 rocm。 基本上沒裝過 rocm 的系統都沒問題; 至於我, 雖然先前試著為 vega 安裝過 rocm, 但因為我採用神奇的 btrfs 所以只需要倒退回一個乾淨的 snapshot 即可從零開始。

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

注意: 上面的 xenial 不要改成 focal, 那個 repo 真的就只有 xenial 版。 為什麼指定 3.5.1 版? 因為在較新的 ROCm 4.x 當中, AMD 已經不再支援 rx570/rx580/rx590 系列的硬體。 [12] 下載速度超慢。 安裝過程會自動重新編譯 kernel 及重製 initrd。 我的 kernel 正好是文中所建議的 5.4.0-42-generic , 所以不需要降級, 一切順利。 完成後, 在 /lib 底下會看見兩個最新的檔案 initrd.img-5.4.0-42-generic 跟 vmlinuz-5.4.0-42-generic 。 因為我不是用 grub2 而是用 extlinux, 所以需要手動把 initrd.img-5.4.0-42-generic 複製到開機分割區底下正確的位置 (順便改名為 initrd.img-5.4.0-42-rocm) 並且修改 extlinux.conf 開機選單。

如果一切順利的話, 重開機之後即可用 /opt/rocm/bin/rocminfo/opt/rocm/opencl/bin/clinfo 確認底層的驅動程式可以顯示GPU/顯卡的硬體資訊。 再來當然不要直接安裝 tensorflow 等等, 而是要透過 docker, 既可偷懶又比較容易將不同的環境需求分開管理。

在 dockerhub 上找到 rocm/tensorflow , 挑選 版本最接近的 tag, 這樣執行: docker run -it --name rocmtf --device=/dev/kfd --device=/dev/dri --group-add video rocm/tensorflow:rocm3.5-tf2.2-dev 進入 container 以後: cd /root/benchmarks/scripts/tf_cnn_benchmarks/ 然後 time python3 tf_cnn_benchmarks.py --num_gpus=1 --batch_size=32 --model=resnet50 實測速度。 第一次執行好像花了四分多, 這次則得到: total images/sec: 43.90 花了 1 分 35 秒。

改試 rocm/tensorflow 較新的 tag, rocm4.1-tf2.4-dev 跟 rocm3.10-tf2.3-dev 進入之後用 rocminfo 查詢硬體資訊看似 OK, 但實測 tf_cnn_benchmarks.py 時則出現 hipErrorNoBinaryForGpu 的錯誤訊息, 看來新版的 rocm 就是無法搭配舊版的底層驅動程式。

另外又搜尋到 rocm/rocm-terminal 這樣執行: docker run -it --name trocm --device=/dev/kfd --device=/dev/dri --group-add video rocm/rocm-terminal 。 進入 container 以後 sudo bash 不需要密碼即可變身為 root。 一樣可用 rocminfo/opt/rocm/opencl/bin/clinfo 確認 container 跟底層的驅動程式溝通良好。 搜尋不到如何查詢目前環境下的 rocm 的版本。 找到 這個 好像是它的 Dockerfile 原始碼... 如果把其中 4.x 版的地方降級成 3.5.1 版, 是不是就可以拿來進一步安裝 tensorflow 以外的深度學習框架呢? (例如 PyTorch 或 keras/theano 等等) 算了, 以後再研究。

最近 挖礦熱潮讓顯卡價格飆漲, 希望跟這款舊版的 (甚至二手的) 沒有太大關係。 不過為保險起見, 想 ROCm 的讀者們還是趕快先去為你的電腦買一張 rx5[789]0 顯卡吧!

3 則留言:

  1. https://github.com/ROCmSoftwarePlatform/rocBLAS/issues/1172
    RX580 的計算結果可能有問題

    另外,VEGA 64 有錯誤訊息嗎

    回覆刪除
  2. 對啊, 如那個 issue 所說, ROCm 3.7 以上會有問題。 所以我參考的那兩篇才推薦 3.5.1 吧。 這個較舊的版本到目前為止沒有看到問題。

    VEGA 64 感覺完全沒通電。 還是透過內顯看螢幕。 sudo lshw -C video 也只看到內顯。 買到瑕疵品了。

    回覆刪除
  3. 我也要來買一片RX580來玩!!

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。