在 Ubuntu 18.04 上安裝 ROCm 3.3.0 和 Pytorch

目標

現在我有一個可以跑 TensorFlow 的 RX 580 了。可是我還是不滿足,於是買了一個 VEGA 56。10.54 TFLOPS 的 FP32 運算能力現在好像也只要 266 美刀。

和之前一樣,在 Ubuntu Server 18.04 上安裝 ROCm 3.3.0 (參見之前的操作和系統要求)。

RX 580 不能用 Pytorch 了,Pytorch 說它太舊了

我基本上是按照 ROCm 的官方教學 不過有些地方可能出問題,這邊提供了指引去避免這些坑。

你至少要 16 GB 記憶體,不然編譯會很慢而且測試的時候會出錯,我試過了

準備編譯

安裝 Docker

我們使用 Docker 來編譯,避免污染系統的設置,這樣之後編譯其他版本的時候不會需要卸載和重新安裝。Docker 其實就類似是一個虛擬機,可以去官網瞭解更多 我現在都基本上不用虛擬機,全都用 Docker 了。

參考官方文檔安裝 Docker 或者你可以學我直接用一鍵安裝的腳本。官方說 千萬千萬要先自己檢查一下我們的腳本再運行,不然剛好有人惡意黑了我們改了腳本你就糟了。很貼心的說明。

1
2
3
$ curl -fsSL https://get.docker.com -o get-docker.sh
# 跑下面這句運行它之前,先打開來看看腳本裏面寫了什麼哦~
$ sudo sh get-docker.sh

安裝 ROCm-Dev 開發軟件包

編譯 Pytorch 之前要先安裝 rocm-dev提供 ROCm 的 API 接口

1
2
3
4
5
$ sudo apt-get update

$ sudo apt-get upgrade

$ sudo apt-get install rocm-dev

Docker 鏡像和下載代碼

下載編譯環境

現在我要編譯配合 ROCm 3.3.0 的 Pytorch了。官方文檔認爲你不可能是白癡,沒有告訴你記得檢查 docker pull rocm/pytorch:rocm3.0_ubuntu16.04_py3.6_pytorch 這句是不是對應你的 ROCm 版本。到 DockerHub 尋找你的 ROCm 版本的標籤來換掉文檔中的 rocm3.0_ubuntu16.04_py3.6_pytorch。我的 ROCm 3.3.0 是rocm3.3_ubuntu16.04_py3.6_pytorch

1
$ sudo docker pull rocm/pytorch:rocm3.3_ubuntu16.04_py3.6_pytorch

下載 Pytorch 源代碼

我們用 Git 來下載代碼,沒有的話請自行安裝:sudo apt-get install git

1
2
3
$ cd ~

$ git clone https://github.com/pytorch/pytorch.git

然後讓 Git 把其他依賴的代碼一鍵自動下載

1
2
3
4
5
$ cd pytorch

$ git submodule init

$ git submodule update

可是編譯的時候還是報錯,有部分的依賴好像還有自己的依賴,所以要跑 git submodule update --init --recursive 而不是 git submodule update。用 --recursive 將依賴的依賴的依賴的依賴什麼的都統統下載下來。

1
$ git submodule update --init --recursive

編譯!

先跑一下 rocminfo 並且記下你的 GPU 型號(例如我是 gfx 900)

進入編譯環境

這裏,再一次確認你的鏡像標籤,我的標籤是 rocm3.3_ubuntu16.04_py3.6_pytorch 對應 ROCm 3.3.0。你可能是其他版本需要修改再跑。

如果你想保留這個編譯的容器而不是完成之後自動移除,你可以移除 --rm 參數。

1
$ sudo docker run -it -v $HOME:/data --privileged --rm --device=/dev/kfd --device=/dev/dri --group-add video rocm/pytorch:rocm3.3_ubuntu16.04_py3.6_pytorch

之後應該會看到一個類似這樣的環境。

1
root@f78375b1c487:/#

切換到代碼的位置

1
root@f78375b1c487:/# cd /data/pytorch

開始編譯

你需要先指出你的 GPU 型號。如果你忘記事先用 rocminfo 查看的話,可以去查表 我是 VEGA 56 是 gfx900,用這行指令指定。

1
root@f78375b1c487:/# export HCC_AMDGPU_TARGET=gfx900

然後就用這個自動建構的指令

1
root@f78375b1c487:/# .jenkins/pytorch/build.sh

如果你沒有足夠的記憶體,將會花費你很長時間……

測試

運行自動測試腳本

1
root@f78375b1c487:/# PYTORCH_TEST_WITH_ROCM=1 python test/run_test.py --verbose

然後大概你會出現 Import Error : no module named torch 的問題。

那樣的話,你需要確認你的 Python 版本。我的情況是這樣的:

1
2
3
4
5
6
root@f78375b1c487:/# python -V
Python 2.7.18
root@f78375b1c487:/# python3 -V
Python 3.5.8
root@f78375b1c487:/# python3.6 -V
Python 3.6.10

這個 Pytorch 應該是編譯並且安裝給了 Python 3.6,所以要用 Python 3.6 來測試才對。

1
root@f78375b1c487:/# PYTORCH_TEST_WITH_ROCM=1 python3.6 test/run_test.py --verbose

出錯?

如果沒有 16 GB RAM 就會出現 malloc 無法賦予位置的錯誤

Install torchvision

試試安裝 torchvision,應該是在編譯過程中已經一起安裝了的。

1
root@f78375b1c487:/# pip install torchvision

保存這個 Docker 容器

用容器 ID 來保存它,ID 一直都在上面有顯示,例如我的就是 f78375b1c487

1
$ sudo docker commit f78375b1c487 -m 'pytorch installed'

如果退出這個容器的話就什麼也沒有了(前面執行 docker run 的時候使用的 --rm 參數發揮效用),所以需要在另一個指令行裡執行 commit。你可以另外開一個命令行(Terminal)窗口,或者用 Ctrl+Alt+F3 進入另一個黑底白字的命令行介面,或者如果你是和我一樣在用 tmux,就 Ctrl+B 然後再輸入 C 再開一個窗口來執行 commit

DONE

學學如何用 Docker 吧,它與你來日方長。

Pytorch time! (>w<)b