-
Notifications
You must be signed in to change notification settings - Fork 4
PyTorch DNNL_aarch64 build manual for FUJITSU Software Compiler Package (PyTorch v1.7.0) JP
本書は富士通Supercomputer PRIMEHPC FX1000, FX700 上に PyTorch をインストールするための手順書です。
また、サンプルとしていくつかの重要モデルを FX1000, FX700 用に最適化したものをインストール、実行するための手順も提供します。
PyTorch のビルド手順は、 インターネットに直接 (またはproxy経由で) アクセスできるシステムにも、 インターネットにアクセスできないシステム上にもインストールできるようになっています。 本書では、前者を「オンラインインストール」、後者を「オフラインインストール」と呼びます。
オフラインインストールでは、 予めインターネットに接続されているシステム(以下「ダウンロード用システム」)で必要なファイル一式をダウンロードしておき、 それをインストール対象システム(以下「インストール対象システム」)に転送してビルドします。
なお、PyTorch の構築手順では、オンラインインストール、オフラインインストールどちらの場合も、 まずすべてのファイルをダウンロードして、それからビルドを行います。 両者の違いはダウンロードしたファイル群を転送するかどうか、だけです。
本書では以下の用語・略語を使用します。
用語・略語 | 意味 |
---|---|
オンラインインストール | インターネットに直接アクセスできるシステムにPyTorchをインストールすること |
オフラインインストール | インターネットにアクセスできないシステムにPyTorchをインストールすること |
インストール対象システム | PyTorchをインストールする対象システム |
ダウンロード用システム | オフラインインストール用に、必要なファイルを予めダウンロードするシステム |
TCS | FX1000のジョブ実行スケジューラやコンパイラ・ライブラリ環境 (Technical Computing Suite) |
CP | FX700のコンパイラ・ライブラリ環境 (Compiler Package) |
-
OSはUNIXまたはLinux
-
bash, python3, wget, git, unzip, tar, curl が実行可能なこと
-
インストール対象システムへアクセス可能であること
-
ファイルシステムに十分な空容量があること ダウンロードデータ量は以下の通りです。(小数点1位で切り上げ)
ビルドには別途20GB必要ですモジュール ダウンロード量 備考 PyTorch本体(github.com) 0.6GB 各種モジュール 2.2GB ResNet --- OpenNMT 9.5GB 一時ファイル1.3GB を含む BERT 3.1GB 一時ファイル0.4GB を含む Mask RCNN 39.1GB 一時ファイル19.0GB を含む - - 合計 54.0GB 一時ファイル20.7GB を含む 一時ファイルは各モジュールのダウンロードが終わると削除されます。一時的にディスク容量を消費するのでご注意ください。
なお、ダウンロード先のディレクトリはPyTorchのソースディレクトリ配下になります。(変更できません)
- PRIMEHPC FX1000 または FX700
- FX700 の場合
- RHEL 8.x または CentOS 8.x がインストールされていること
- FCC で環境を構築するなら Compiler Package V10L20がインストールされていること
- 以下のパッケージ、コマンドがインストール済であること
make gcc cmake libffi-devel gcc-gfortran numactl git patch unzip tk tcsh tcl lsof python3 pciutils - 空き容量75GB以上のストレージがあること
なお、NFS上でのビルド、実行はNFSサーバの性能や設定により予期せぬトラブルが起こることがありますのでご注意ください。
ローカルに接続されたストレージか、十分に高速なネットワークストレージを使うことをお薦めします。
インストール後のディレクトリ構成は以下のようになります。
PREFIX
はこの位置から変更できないので、構築環境は PyTorch のソース配下に置かれることになるのでご注意ください。
PYTORCH_TOP (git clone してきた PyTorch ソースのトップディレクトリ, 注: これはenv.srcでは指定しない) +- scripts +- fujitsu = PREFIX = PYTORCH_INSTALL_PATH +- down = DOWNLOAD_PATH +- up = UPLOAD_PATH +- VENV_NAME (ディレクトリ名は env.src で指定する) +- .local (env.src では設定できない) +- bin, lib, ...
お使いの環境が、外部アクセスにproxyを通す必要がある環境の場合、以下の環境変数を設定してください。
(user, pass, proxy_url, port はお使いの環境に合ったものに置き換えてください。)
$ export http_proxy=http://user:pass@proxy_url:port
$ export https_proxy=https://user:pass@proxy_url:port
注: curl, wget, git, pip3, は上記環境変数を認識するので、rc や .gitconfig の設定は不要です。
大まかな流れは以下のようになります。
$ git clone https://github.com/fujitsu/pytorch.git
$ cd pytorch
$ git checkout -b fujitsu_v1.7.0_for_a64fx origin/fujitsu_v1.7.0_for_a64fx
$ cd scripts/fujitsu # PREFIX
以降の例では /home/user/pytorch/scripts/fujitsu を PREFIX として例示してあります。
env.src は $PREFIX
にあります。
設定するのは以下の2つです。
変数名 | 意味 | 補足 |
---|---|---|
PREFIX |
PyTorch ソース配下の scripts/fujitsu ディレクトリを絶対パスで指定します。 |
pwd は使わないでください。(いくつかの異なるディレクトリに置いてあるスクリプトが読み込むため、pwd を使うと誤動作します) |
TCSDS_PATH |
TCS, CP のベースディレクトリ名 | ベースディレクトリ: bin, lib などを含むディレクトリ |
オンラインインストール、オフラインインストールどちらの場合も、 まずすべてのファイルをダウンロードしてください。
scripts
ディレクトリにある、checkout.sh を実行してください。
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ bash checkout.sh # ダウンロード量 2.2GB
サンプルモデルは
opennmt_build_pack
, bert_build_pack
, mask_r_cnn_build_pack
配下にあります。各ディレクトリに移動して スクリプトを実行してください。
各スクリプトはダウンロード中に一時データを作成します。 一時データはスクリプトが終了すると削除されますが、 一時的にディスクを消費するので、 ダウンロードするシステムのディスク空き容量には注意してください。
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ cd opennmt_build_pack
$ bash dataset.sh # ダウンロード量 6.8GB (一時データ1.2GB含む)
$ bash checkout.sh # ダウンロード量 2.7GB (一時データ0.3GB含む)
$ cd ..
$ cd bert_build_pack
$ bash checkout.sh # ダウンロード量 1.8GB (一時データ0.3GB含む)
$ cd transformers
$ ./prepare.sh # ダウンロード量 1.3GB (一時データ0.2GB含む)
$ cd ..
$ cd mask_r_cnn_build_pack
$ bash checkout.sh # ダウンロード量 0.2GB (一時データ0.003GB含む)
$ bash dataset.sh # ダウンロード量 38.9GB (一時データ21GB含む)
$ cd ..
この節はオフラインインストールする場合の追加手順です。 インターネット接続システムにインストールする場合は、 この節は飛ばして3.3に進んでください。
PyTorch ソースのトップディレクトリ以下、すべてのファイルを転送します。
具体的な方法は各システム構成により異なるので記載しません。
scp, ftp, 共有ディレクトリ使用、など、システムに応じた方法で転送してください。
submit_build.sh
を実行してください。
注意: submit_build.sh
は環境変数の設定が入っていて、それは実際にビルドを行うスクリプトが参照します。
数字で始まるスクリプトを直接実行しても正しく構築できません。
以下の例は対話型シェルでインストールする場合の例です。コメントの後ろにおおよその所要時間を示してあります (FX700 2.0GHz 48core の実測結果)。
ジョブ制御システムを使用する場合は、お使いのジョブ制御システムの構文に従いスクリプトを修正してジョブを投入してください。
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ bash submit_build.sh # FX700で約70分
正しくビルドできたかどうかの確認に、resnet50 を実行してください。
以下に実行確認方法を示します。
実行確認は学習1ステップの実行速度で行いますが、
深層学習モデルの実行速度は10~20%のくらいの変動があるため、
本書に記載した実行速度を目安に、おおよそその範囲にあれば正しく構築できていると判断できます。
また、サンプルモデルの設定は必ずしも最速になっているわけではないことに留意してください。
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ bash submit_train.sh # 動作確認 (1ノード, 1プロセス、48コア, ダミーデータ) (2分)
$ bash submit_val.sh # 動作確認 (1ノード, 1プロセス、48コア, ダミーデータ) (4分)
$ bash submit_train_multi.sh # 動作確認 (1ノード, 1プロセス、12コア/プロセス, ダミーデータ) (4分)
$ bash submit_val_multi.sh # 動作確認 (1ノード, 4プロセス、12コア/プロセス, ダミーデータ) (3分)
submit_train.sh
, submit_val.sh
では1ステップの実行時間(それぞれ学習と推論)が出力されます。
以下は FX700 (2.0GHz) の submit_train.sh
の出力例です。1ステップ2.5秒前後なら正常です。
$ bash submit_train.sh
>> script option: Namespace(batch=256, itr=20, lr=0.001, momentum=0.9, trace=False, type='cpu_mkltensor', weight_decay=0.0)
## Start Training
[ 1] loss: 7.326 time: 2.982 s
[ 2] loss: 5.110 time: 2.547 s
[ 3] loss: 1.274 time: 2.546 s
[ 4] loss: 0.013 time: 2.556 s
[ 5] loss: 0.000 time: 2.538 s # ダミーデータで学習させているので
[ 6] loss: 0.000 time: 2.563 s # loss 値はすぐにゼロになります
[ 7] loss: 0.000 time: 2.535 s
[ 8] loss: 0.000 time: 2.555 s
[ 9] loss: 0.000 time: 2.545 s
(省略)
submit_val.sh
の出力フォーマットもこれと同様です。
submit_val.sh
は2つのパラメータを実行します。1ステップの走行時間は、
512バッチで1.5秒前後、1024バッチで3秒前後になります。
submit_train_multi.sh
, submit_val_multi.sh
は4プロセスでデータ並列学習と推論を実行します。
1プロセスのテストで使用しているモデルとは別のモデルを、異なるパラメーで実行しています。
以下は FX700 (2.0GHz) の submit_train_multi.sh
の出力例です。
4プロセス合計で100img/sec以上の値が出ていれば正しく構築できています。
(省略)
Running benchmark...
Iter #0: 26.8 img/sec per CPU # この値は、rank0 プロセスの値
Iter #1: 26.8 img/sec per CPU
Iter #2: 26.9 img/sec per CPU
Iter #3: 26.9 img/sec per CPU
Iter #4: 26.9 img/sec per CPU
Img/sec per CPU: 26.9 +-0.1
Total img/sec on 4 CPU(s): 107.4 +-0.2 # この値は4プロセスの合計値
submit_val_multi.sh
は4並列で推論を行いますが、
推論の場合、各プロセスは非同期で実行を進めていくため、
実行時間の目安は提示できません。
最後まで正常に実行できれば、PyTorch は正しくビルドできています。
サンプルモデルは
opennmt_build_pack
, bert_build_pack
, mask_r_cnn_build_pack
配下にあります。各ディレクトリに移動して スクリプトを実行してください。
以下に構築方法と実行確認方法を示します。 実行確認は学習1ステップの実行速度で行いますが、 深層学習モデルの実行速度は10~20%のくらいの変動があるため、 本書に記載した実行速度を目安に、おおよそその範囲にあれば正しく構築できていると判断できます。 また、サンプルモデルの設定は必ずしも最速になっているわけではないことに留意してください。
opennmt_build_pack
配下にあります。
https://github.com/OpenNMT/OpenNMT-py
Tag: v1.1.1 (2020/3/20)
以下の例は対話型シェルでインストールする場合の例です。コメントの後ろにおおよその所要時間を示してあります (FX700 2.0GHz 48core の実測結果)。
ジョブ制御システムを使用する場合は、お使いのジョブ制御システムの構文に従いスクリプトを修正してジョブを投入してください。
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ cd opennmt_build_pack
$ bash submit_build.sh # モデル構築 (50分)
$ cd opennmt-py
$ bash submit_prepare.sh # 学習データ準備 (30分)
FX700:
$ bash submit_opennmt_fx700.sh # モデル実行 (2分)
FX1000:
$ pjsub submit_opennmt.sh # モデル実行
実行結果例を示します。(以下FX700の結果。FX1000だと10%くらい速い) 最後の行が平均の1ステップ実行時間と1秒あたりの単語処理速度です。 速度変動10%程度を見込んで、この結果と同様の値が出ていれば正常に動作しています。
[2021-08-11 08:20:04,374 INFO] Step 6/ 10; acc: 2.74; ppl: 2.08e+05; xent: 12.24; lr: 0.03341; 3118/3934 tok/s; 11 sec
[2021-08-11 08:20:06,169 INFO] Step 7/ 10; acc: 2.35; ppl: 9.70e+05; xent: 13.79; lr: 0.03125; 3202/3968 tok/s; 13 sec
[2021-08-11 08:20:07,993 INFO] Step 8/ 10; acc: 2.06; ppl: 1.67e+06; xent: 14.33; lr: 0.02946; 3248/3996 tok/s; 15 sec
[2021-08-11 08:20:09,871 INFO] Step 9/ 10; acc: 1.86; ppl: 2.17e+06; xent: 14.59; lr: 0.02795; 3284/3997 tok/s; 17 sec
[2021-08-11 08:20:11,703 INFO] Step 10/ 10; acc: 1.69; ppl: 2.11e+06; xent: 14.56; lr: 0.02665; 3300/3977 tok/s; 19 sec
[2021-08-11 08:20:12,141 INFO] Saving checkpoint demo-model-transformer_step_10.pt
[2021-08-11 08:20:14,018 INFO] Total Data loading time (ignore first step): 794.86847 ms
[2021-08-11 08:20:14,018 INFO] Average : 1.8770 [sec/3850batch], 3977.0139 [tok/s]
bert_build_pack
配下にあります。
https://github.com/huggingface/transformers
Tag: v3.4.0 (2020/10/20)
BERTは2種類のタスクを実行します。
以下の例は対話型シェルでインストールする場合の例です。コメントの後ろにおおよその所要時間を示してあります (FX700 2.0GHz 48core の実測結果)。
ジョブ制御システムを使用する場合は、お使いのジョブ制御システムの構文に従いスクリプトを修正してジョブを投入してください。
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ cd bert_build_pack
$ bash submit_build.sh # モデル構築 (10分)
$ cd transformers
FX700:
$ bash submit_bert_lm_fx700.sh # 1つ目のタスク実行 (6分)
$ bash submit_bert_mrpc_fx700.sh # 2つ目のタスク実行 (4分)
FX1000:
$ pjsub submit_bert_lm.sh # 1つ目のタスク実行
$ pjsub submit_bert_mrpc.sh # 2つ目のタスク実行
実行結果例を示します。(以下FX700の結果。FX1000だと10%くらい速い) 最後の行が平均の1イテレーションの実行時間と1秒あたりの処理バッチ数です。 速度変動10%程度を見込んで、この結果と同様の値が出ていれば正常に動作しています。
1つ目のタスクの出力例:
08/11/2021 19:39:25 - INFO - __main__ - ***** Running training *****
08/11/2021 19:39:25 - INFO - __main__ - Num examples = 4800
08/11/2021 19:39:25 - INFO - __main__ - Num Epochs = 1
08/11/2021 19:39:25 - INFO - __main__ - Instantaneous batch size per device = 2
08/11/2021 19:39:25 - INFO - __main__ - Total train batch size (w. parallel, distributed & accumulation) = 4
08/11/2021 19:39:25 - INFO - __main__ - Gradient Accumulation steps = 1
08/11/2021 19:39:25 - INFO - __main__ - Total optimization steps = 20
08/11/2021 19:39:26 - INFO - __main__ - step = 0, loss = 2.96113
08/11/2021 19:39:27 - INFO - __main__ - step = 1, loss = 6.45433
(省略)
08/11/2021 19:39:49 - INFO - __main__ - step = 19, loss = 61.14571
08/11/2021 19:39:49 - INFO - __main__ - Averages: 1.0733 s/iter 3.7268 batch/s ★ココ
08/11/2021 19:39:49 - INFO - __main__ - Epoch Overhead: 0.0001 s
2つ目のタスクの出力例:
08/11/2021 19:43:25 - INFO - __main__ - ***** Running training *****
08/11/2021 19:43:25 - INFO - __main__ - Num examples = 3668
08/11/2021 19:43:25 - INFO - __main__ - Num Epochs = 1
08/11/2021 19:43:25 - INFO - __main__ - Instantaneous batch size per device = 16
08/11/2021 19:43:25 - INFO - __main__ - Total train batch size (w. parallel, distributed & accumulation) = 32
08/11/2021 19:43:25 - INFO - __main__ - Gradient Accumulation steps = 1
08/11/2021 19:43:25 - INFO - __main__ - Total optimization steps = 20
08/11/2021 19:43:26 - INFO - __main__ - step = 0, loss = 0.68342
08/11/2021 19:43:27 - INFO - __main__ - step = 1, loss = 1.38550
(省略)
08/11/2021 19:43:50 - INFO - __main__ - step = 19, loss = 12.96724
08/11/2021 19:43:50 - INFO - __main__ - Averages: 1.1420 s/iter 28.0216 batch/s ★ココ
08/11/2021 19:43:50 - INFO - __main__ - Epoch Overhead: 0.0001 s
08/11/2021 19:43:50 - INFO - __main__ -
https://github.com/facebookresearch/detectron2
Tag: v0.2.1 (2020/7/30)
$ pwd
/home/user/pytorch/scripts/fujitsu # $PREFIX
$ cd mask_r_cnn_build_pack
$ bash submit_build.sh # モデル構築 (8分)
$ cd detectron2
FX700:
$ bash submit_mask_r_cnn_fx700.sh # モデル実行 (3分)
FX1000:
$ pjsub submit_mask_r_cnn.sh # モデル実行
実行結果例を示します。(以下FX700の結果。FX1000だと10%くらい速い)
最後から2番目の行が平均の1イテレーションの実行時間と1秒あたりの画像処理速度です。
(最後の行は短時間の実行だと有効精度が出ないので参考程度)
速度変動10%程度を見込んで、この結果と同様の値が出ていれば正常に動作しています。
[08/11 21:40:58 d2.engine.train_loop]: Starting training from iteration 0
[08/11 21:41:02 d2.utils.events]: iter: 0 total_loss: 10.284 loss_cls: 7.868 loss_box_reg: 0.009 loss_mask: 0.686 loss_rpn_cls: 0.980 loss_rpn_loc: 0.740 data_time: 1.0702 lr: 0.000003
[08/11 21:41:05 d2.utils.events]: eta: 0:00:56 iter: 1 total_loss: 9.658 loss_cls: 7.399 loss_box_reg: 0.008 loss_mask: 0.693 loss_rpn_cls: 1.031 loss_rpn_loc: 0.528 data_time: 0.6659 lr: 0.000005
(省略)
[08/11 21:42:03 d2.utils.events]: eta: 0:00:03 iter: 19 total_loss: 2.744 loss_cls: 0.893 loss_box_reg: 0.024 loss_mask: 0.699 loss_rpn_cls: 0.690 loss_rpn_loc: 0.520 time: 3.2005 data_time: 0.3271 lr: 0.000050
[08/11 21:42:03 d2.engine.train_loop]: Averages: 3.2556 s/iter 1.2286 image/s ★ココ
[08/11 21:42:03 d2.engine.hooks]: Overall training speed: 18 iterations in 0:00:57 (3.2006 s / it)
Reading https://pypi.org/simple/
Download error on https://pypi.org/simple/: [Errno -2] Name or service not known -- Some packages may not be found!
No local packages or working download links found for matplotlib>=2.1.0
error: Could not find suitable distribution for Requirement.parse('matplotlib>=2.1.0')
インストール対象システムに git
がインストールされていないと、このエラーが出ます。
(matplotlib は checkout.sh
でダウンロード済だが、インストール時にgit
で自分のバージョンを得ようとするため)
インストール対象システムに git
をインストールしてください。
ソフトウェア名 | 版数 | ライセンス形態 | 備考 |
---|---|---|---|
Python | 3.8.2 | GPL | |
PyTorch | 1.7.0a0+af84b7e | BSD-3 | |
oneDNN | v2.1.0L01_aarch64 | ||
Horovod | 0.20.3 | Apache 2.0 |
以下のリストは、2021/8/11にインストールした結果です。 PyTorch本体とすべてのサンプルモデルをインストールし終えた時点で表示しています。 モジュール版数はインストール日時によって変わることがあるのでご注意ください。
$ pip3 list
Package Version Location
---------------------- ------------------ --------------------------------------------------------------------------------
absl-py 0.9.0
attrs 20.2.0
cachetools 4.1.0
certifi 2020.6.20
cffi 1.14.0
chardet 3.0.4
click 7.1.2
cloudpickle 1.6.0
ConfigArgParse 1.2.3
coverage 5.1
cycler 0.10.0
Cython 0.29.21
dataclasses 0.6
detectron2 0.2 /home/user/pytorch_ci_0811/scripts/fujitsu/mask_r_cnn_build_pack/detectron2
filelock 3.0.12
Flask 1.1.2
future 0.18.2
fvcore 0.1.3.post20210227
google-auth 1.14.3
google-auth-oauthlib 0.4.1
grpcio 1.28.0
h5py 2.8.0
horovod 0.20.3
hypothesis 6.0.2
idna 2.9
iniconfig 1.1.1
iopath 0.1.4
itsdangerous 1.1.0
Jinja2 2.11.2
joblib 1.0.0
kiwisolver 1.3.1
Markdown 3.2.2
MarkupSafe 1.1.1
matplotlib 3.3.4
mock 4.0.3
numpy 1.19.0
oauthlib 3.1.0
packaging 20.4
Pillow 7.2.0
pip 20.1
pkgconfig 1.5.1
pluggy 0.13.1
portalocker 2.2.1
protobuf 3.11.3
psutil 5.7.0
py 1.9.0
pyasn1 0.4.8
pyasn1-modules 0.2.8
pybind11 2.6.1
pycocotools 2.0.2
pycparser 2.20
pydot 1.4.2
pyonmttok 1.18.3
pyparsing 2.4.7
pytest 6.1.1
pytest-runner 5.2
python-dateutil 2.8.1
PyYAML 5.3.1
regex 2020.11.13
requests 2.23.0
requests-oauthlib 1.3.0
rsa 4.0
sacremoses 0.0.43
scikit-learn 0.22.1
scipy 1.5.2
semantic-version 2.8.5
sentencepiece 0.1.90
setuptools 46.2.0
setuptools-rust 0.11.6
six 1.15.0
sortedcontainers 2.3.0
tabulate 0.8.9
tensorboard 2.2.1
tensorboard-plugin-wit 1.6.0.post3
termcolor 1.1.0
tokenizers 0.9.2
toml 0.10.1
torch 1.7.0a0
torchtext 0.4.0
torchvision 0.8.0a0+a1e526b
tqdm 4.30.0
transformers 3.4.0 /home/user/pytorch_ci_0811/scripts/fujitsu/bert_build_pack/transformers/src
typing-extensions 3.7.4.3
urllib3 1.25.9
waitress 1.4.3
Werkzeug 1.0.1
wheel 0.34.2
yacs 0.1.8
Copyright RIKEN, Japan 2021
Copyright FUJITSU LIMITED 2021