LoginSignup
21
13

More than 3 years have passed since last update.

PyTorchのビルド方法とビルド時間

Last updated at Posted at 2018-09-24

1. はじめに

PyTorchで、Pythonのパッケージは、condaでインストールする場合が多い。しかし、今回は、pipベースでやってみた。また、Google Colabでも出来るのでそちらについても記載する。

2. パッケージの準備手順

コンパイルに使ったOSは、Ubuntu Server LTS 18.04もしくは16.04 (HVM) (EC2)である。PyTorch 1.0.0以降は、Ubuntu Server 18.04を使っている。さらに、PyTorch 1.5.0以降では、Ubuntu 20.04(x86_64/aarch64)を使っている。なお、18.04の場合、clock_gettimeのRelinkの問題があり動かない。しかし、USE_MKLDNNをdisableとすると動く。

2.1. CUDAライブラリの設定

CUDAライブラリのインストールは以下の通りである。なお、CUDAライブラリが不要な場合、スキップしてよい。なお、GPUが無いインスタンスでもCUDAインストールはできる。はじめのファイルは、NVIDIAのサイトから持ってくる。
また、CUDAを使う場合は、/tmpディレクトリを結構消費するので/ディレクトリのサイズを20GB程度にする必要がある。

sudo dpkg -i cuda-repo-ubuntu1604_9.2.148-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda
sudo apt clean cache
sudo reboot

2.2. PyTorchのコンパイル環境の設定

PyTorchのコンパイル環境の設定は、以下の手順である。

sudo apt update
sudo apt -y upgrade
sudo apt install -y python3 python3-pip cmake
sudo pip3 install -y pyyaml numpy ninja
git clone --branch v1.5.0 --recursive http://github.com/pytorch/pytorch

3. コンパイル手順

コンパイル時、developオプションは、パッケージインストールに相当する。このため、パッケージ管理者と同等以上の権限があることが必要である。

cd pytorch
sudo python3 setup.py build develop

なお、CUDA有り無しの設定は、以下のフラグで行える。CUDAなしの場合、NO_CUDA=1と環境変数を設定する。コンパイル時のsetup.py内の変数であるUSE_CUDAのフラグが変更される。

export NO_CUDA=1

4. 使い方

以下の手順で打つと、PyTorchのバージョンが表示され、動作していることが確認できる。

python3
import torch
print(torch.__version__)

5. 時間計測

5.1. ソースコード取得

(AWS)git clone --recursive http://github.com/pytorch/pytorch

real    1m48.895s
user    0m57.228s
sys     0m9.684s

5.2. コンパイル

CPU数に比例してコンパイルは早くなる。なお、xlargeは、4CPUに相当する。また、CUDAつきは意外と(6倍ぐらい)時間がかかる。そして、0.4.1(2018/7)から1.0.0(2018/12)と版数が上がって、コンパイル時間も2倍近くに延びた。また、この傾向は続いており、1.0.1でも2割程度コンパイル時間が増えている(以下参照)
また、Google Colabでも、コンパイルできなくは無いが、CPUが2つであり実用的ではない。(CUDAなし)CPUパッケージのみでも80分近い(v1.0.0の場合)。
(コード変更後の)コンパイル時間を減らす方法としては、CONTRIBUTING.mdのC++ Development tipsに書いてある方法がある。

instance version CUDA real user sys
(AWS)m5.xlarge 1.5.0a0+4ff3872 × 86m36.689s 330m37.679s 12m32.014s
(AWS)m5.xlarge (clang) 1.5.0a0+4ff3872 × 74m20.672s 286m26.484s 7m46.189s
(AWS)m6g.xlarge (clang) 1.5.0a0+4ff3872 × 45m12.303s 174m48.702s 4m50.739s
RaspberryPi4 1.4.0a+22d8420 × 281m58.694s 989m13.868s 48m34.519s
(AWS)c3.8xlarge 1.3.0 × 18m32.284s 429m31.298s 23m27.600s
(AWS)c3.8xlarge 1.2.0 × 11m24.062s 312m9.666s 16m26.919s
(AWS)c3.8xlarge 1.1.0 × 10m36.077s 282m10.403s 15m46.345s
(AWS)c3.4xlarge 1.1.0 × 17m36.077s 254m32.921s 10m23.539s
(AWS)c3.4xlarge 1.1.0 10.1 96m10.510s 1368m20.159s 73m17.280s
(AWS)c3.4xlarge 1.0.1 × 13m16.78s 186m49.56s 8m11.42s
(AWS)c3.8xlarge 1.0.1 × 7m16.62s 182m44.44s 10m7.27s
(AWS)c3.2xlarge 1.0.0 × 22m8.15s 159m7.45s 8m7.67s
(AWS)c3.4xlarge 1.0.0 × 11m22.72s 155m56.04s 8m23.67s
(AWS)c3.2xlarge 1.0.0 10.0 108m37s 865m1.99s 41m18.91s
(AWS)r3.xlarge 0.4.1 × 15m40.01s 48m30.30s 2m1.08s
(AWS)c3.2xlarge 0.4.1 × 10m8.773s 45m21.864s 2m3.844s
(AWS)z1d.xlarge 0.4.1 × 10m22.22s 27m41.46s 1m13.17s
(AWS)c4.4xlarge 0.4.1 × 6m25.989s 34m12.720s 1m32.732s
(AWS)c3.2xlarge 0.4.1 9.2 63m2.087s 417m40.824s 17m33.224s

1.2.0は、1.2.0a0+8554416

m6gは、Ubuntu 20.04 (aarch64)

6. その他のノウハウ

6.1. Google Colabでコンパイルから実行まで

コンパイルは、以下の手順で行う。

!pip3 install ninja
!git clone -b v1.0.0 --recursive http://github.com/pytorch/pytorch
!cd pytorch; export NO_CUDA=1;python3 setup.py build develop

実行は、以下の通りにすると実行できる。

!cd pytorch/test; python3 run_test.py

6.2. ソースコードだけ生成したいとき

以下のコードを実行すると、40秒程度でソースコードが生成される。ただし、Pythonコマンドが動くことが必須である。このため、python3を使っている場合は、pythonへのシンボリックリンクを張るか、スクリプトファイルをpythonからpython3へ編集する作業が必要である。

bash docs/cpp/source/check-doxygen.sh

6.3. Debugフラグをつけたい時

環境変数で、DEBUG=1とすると、torch部分がDebugモードになる。
それ以外に、cmake配下のcaffe2等のライブラリに対して、Debug追加したい場合、環境変数CFLAGSに設定する。

export DEBUG=1
export CFLAGS="-g -O0"

言うまでも無いが、gdbでデバッグ使用する場合、Docker等ではPTRACE等がデフォルトでは使えないので、設定変更が必要である。

6.4. torch/docsのビルド

Google Colabだと、以下のようにやってビルドできる

!git clone http://github.com/pytorch/pytorch
!cd pytorch/docs;pip3 install -r requirements.txt
!pip install -U sphinx
!pip3 install pytorch_sphinx_theme
!cd pytorch/docs; make html

なお、Webサーバとしては、pythonの標準サーバで動かせる。ただし、ngrokを使った場合、(無料版では)コネクション数の制限で、1ページ目しか表示できない。

!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip

get_ipython().system_raw('./ngrok http 6006 &')
! curl -s http://localhost:4040/api/tunnels | python3 -c \
    "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"

サーバ立ち上げ

!cd pytorch/docs/build/html;python -m  http.server 6006

なお、Sphnixを使っている。この為、ファイルの変更等では、pytorch/docs/source以下のrstファイルの編集等が必要になる。

6.5. tutorialsのビルド

tutorialsをGoogle Colabでビルドの際、以下のインストールが必要である。

  • pytorch-sphinx-themes等のインストール
  • sphinxがPython2になっているので、それをPython3用への更新が必要である。
  • torchaudioは、pipでインストールすると別パッケージがインストールされる。gitでの処理が必須。
  • マルチGPUやAWS対応のチュートリアルがあるのでそれを除去

また、サンプルコードが実際に動くので処理時間もかかる。(K80 8972.146秒)

!git clone http://github.com/pytorch/tutorials
!cd tutorials;pip install -r requirements.txt
!pip install -U sphinx
!git clone http://github.com/pytorch/audio
!apt install libsox-dev
!cd audio;python3 setup.py install
!cd tutorials; mv beginner_source/aws_distributed_training_tutorial.py .
!cd tutorials; mv intermediate_source/model_parallel_tutorial.py .
!cd tutorials;make docs

なお、tutorialファイルは、tutorials/advanced_source/等で、.py拡張子で作成する。.rstで作成した場合、Jupyter Notebookが作成されずWebページのみになる。

6.6. テストコマンド

指定したテストセットを動かすコマンドは以下の通りである。

!python3 pytorch/test/test_nn.py TestNN.test_affine_grid

6.7. パッケージ化

バイナリパッケージを作成する場合、dist以下にパッケージが作成される。(バイナリパッケージとソースコードのまとめを示す。)なお、wheel自体は、zipアーカイブなので、簡単に展開してチェックできる。

!python3 setup.py bdist_wheel
!python3 setup.py sdist

A. 参考資料

A.1. 障害

A.1.1. AARCH64

A.1.1.1. 回避策1(clang)

回避手順は、clang(llvm)コンパイラを使うことである。

sudo su -
export CC=/usr/bin/clang
export CXX=/usr/bin/clang++

A.1.1.2. 回避策2(パッチを当てる)

以下のパッチを当てるとGCCでもコンパイルできる。

diff --git a/aten/src/ATen/native/quantized/cpu/qnnpack/src/q8gemm/8x8-dq-aarch64-neon.S b/aten/src/ATen/native/quantized/cpu/qnnpack/src/q8gemm/8x8-dq-aarch64-neon.S
index 7dc8611101..60ad8d1d4b 100644
--- a/aten/src/ATen/native/quantized/cpu/qnnpack/src/q8gemm/8x8-dq-aarch64-neon.S
+++ b/aten/src/ATen/native/quantized/cpu/qnnpack/src/q8gemm/8x8-dq-aarch64-neon.S
@@ -659,14 +659,14 @@ BEGIN_FUNCTION pytorch_q8gemm_dq_ukernel_8x8__aarch64_neon

     SUB x1, x1, 4

-    MOV V8.4s, V9.4s
-    MOV v10.4s, v11.4s
-    MOV v12.4s, V13.4s
-    MOV V14.4s, V15.4s
-    MOV V16.4s, V17.4s
-    MOV V18.4s, V19.4s
-    MOV V20.4s, V21.4s
-    MOV V22.4s, V23.4s
+    MOV V8.16b, V9.16b
+    MOV v10.16b, v11.16b
+    MOV v12.16b, V13.16b
+    MOV V14.16b, V15.16b
+    MOV V16.16b, V17.16b
+    MOV V18.16b, V19.16b
+    MOV V20.16b, V21.16b
+    MOV V22.16b, V23.16b

 5:
     CMP x1, 2

A.1.2. ARM32

Raspberry Pi4は、以前の版と違って4GBのRAMがあり、普通の手順でコンパイルできる。ただし、protobufの版数の問題があり一コマンド余計に必要となる。

git submodule update --remote third_party/protobuf

詳細は別資料参照のこと

21
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
13