ROCm3.5でPyTorchビルド
前回の続き?のような何か。
今回やったこと
- 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/
以上。
-
A Pytorch Implementation of EfficientDet Object Detection, https://github.com/toandaominh1997/EfficientDet.Pytorch, 2020/07/04閲覧↩
-
build error in ubuntu with libpng, https://github.com/pytorch/vision/issues/2392, 2020/07/04閲覧↩