ROCm3.5でPyTorchビルド

前回の続き?のような何か。

maminus.hatenadiary.org

今回やったこと

  • ROCm3.5 Docker環境
  • PyTorchをmasterブランチでビルド
  • torchvisionをmasterブランチでビルド
    • 上記に伴い公式にバグ報告
  • 前回同様PyTorch版EfficientDet1で動作確認

前回からの変化点を中心にメモ。

ホスト

$ xhost +local:
$ docker pull rocm/pytorch:rocm3.5_ubuntu18.04_py3.6
$ docker run -it --name rocm35_pytorch -v ~/:/data -v /tmp/.X11-unix/:/tmp/.X11-unix/ --shm-size=4g --privileged --device /dev/video0 --device=/dev/kfd --device=/dev/dri --group-add video -e DISPLAY=$DISPLAY -e QT_X11_NO_MITSHM=1 rocm/pytorch:rocm3.5_ubuntu18.04_py3.6

Dockerのshmを4GB指定するオプションを追加。

コンテナ(PyTorch、torchvisionのインストール)

今回使ったROCmのdockerイメージは最初からAnaconda環境になっていて、virtualenvを使おうとするとビルドしたPyTorchがimportでエラーになったりするので、Anaconda環境にインストールするようにした。

あと、地味にユーザがjenkins(ID 1014)になっているので、ホストをマウントしてアクセスするのが面倒になった・・・

$ sudo apt-get update && sudo apt-get install kmod x11-apps

$ git clone https://github.com/pytorch/pytorch.git
$ cd pytorch/
$ git submodule sync
$ git submodule update --init --recursive
$ cd pytorch
$ .jenkins/pytorch/build.sh

$ git clone https://github.com/pytorch/vision.git
$ cd vision
$ vi setup.py
$ python setup.py install

ここは今回手順をごっそり入れ替えてソースコードからのビルド。前回はdockerにPyTorchが入っていたが、今回のバージョンは入っていないように見えた。

今回指定しなかったけど、export HCC_AMDGPU_TARGET=gfxXXXを指定したほうが良いと思う。

あと、torchvisionはpip installしようとするとPyTorch1.5.1が上書きインストールされるし、PyTorchだけビルド版を使うとtorchvision.nmsを呼び出すとエラーになるので、torchvisionもビルドする形にした。(ビルドしたらhipifyもやってくれてびっくり)

torchvisionの編集内容

libpng-configのオプションがUbuntuではdisableされているのでsetup.pyを書き換え。

diff --git a/setup.py b/setup.py
index 01276f1..e95137f 100644
--- a/setup.py
+++ b/setup.py
@@ -262,14 +262,21 @@ def get_extensions():
             png_version = parse_version(png_version)
             if png_version >= parse_version("1.6.0"):
                 print('Building torchvision with PNG image support')
-                png_lib = subprocess.run([libpng, '--libdir'],
+                help_result = subprocess.run([libpng, '--help'],
+                                         stdout=subprocess.PIPE)
+                lib_opt = '--libdir'
+                if '--L_opts' in help_result.stdout.decode('utf-8'):
+                    lib_opt = '--L_opts'
+                png_lib = subprocess.run([libpng, lib_opt],
                                          stdout=subprocess.PIPE)
                 png_include = subprocess.run([libpng, '--I_opts'],
                                              stdout=subprocess.PIPE)
                 png_include = png_include.stdout.strip().decode('utf-8')
                 _, png_include = png_include.split('-I')
                 print('libpng include path: {0}'.format(png_include))
-                image_library += [png_lib.stdout.strip().decode('utf-8')]
+                png_lib = png_lib.stdout.strip().decode('utf-8')
+                if png_lib:
+                    image_library += [png_lib]
                 image_include += [png_include]
                 image_link_flags.append('png')
             else:

本件、公式にIssue1立てておきました。 2020/07/07追記 masterに修正が入りました。

ここまでで、PyTorch・torchvisionはなんとなく動くはず。

コンテナ(EfficientDetの環境準備)

$ pip install opencv-python
$ cd EfficientDet.Pytorch
$ pip install -r requirements.txt
$ pip install git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI

$ mkdir -p ~/.cache/torch/hub/checkpoints
$ cp efficientnet-b0-355c32eb.pth ~/.cache/torch/hub/checkpoints/

以上。


  1. A Pytorch Implementation of EfficientDet Object Detection, https://github.com/toandaominh1997/EfficientDet.Pytorch, 2020/07/04閲覧

  2. build error in ubuntu with libpng, https://github.com/pytorch/vision/issues/2392, 2020/07/04閲覧