Translate

2022年1月12日水曜日

富岳上でTensorFlowサンプルを動かす



前記事

「富岳上に tkinter が使用可能な TensorFlow 2.2.0 をインストールする方法 」
https://fight-tsk.blogspot.com/2021/12/tkinter-tensorflow-220.html


では、TensorFlow2.2.0が動作する環境をPythonともども富士通提供のソースコードからコンパイルして構築した。

富士通提供の富岳でも動作する TensorFlow ソースコード(a64fxブランチ)
https://github.com/fujitsu/tensorflow/tree/fujitsu_v2.2.0_for_a64fx



では、ビルドした環境が正常に動作するのかを確認するにはどうすればいいか。

そのために(?)提供されているのが fcc_build_script/sample_script にあるサンプルコード群である。



ここには

  • 01_resnet
  • 02_OpenMNT
  • 03_Bert
  • 04_Mask-R-CNN

の4つのサンプルコードが用意されている。

これらのディレクトリ内にはバッチスクリプトが提供されており、順番に富岳の計算ノード上で動かせば実行できる


..と思ったのだが、なかなか動作しない。

ここでは、2022/1/12時点の環境で実行するために修正をいれた内容を紹介する。


全体共通


env.src の編集


サンプルコードのスクリプトは基本的に fcc_build_script/env.src を使用する。
このため、env.srcが富岳の環境に合致するように環境変数を変更しておく必要がある。

以下、前記事でも書いた2022/1/12時点で動作した修正箇所である。

PREFIX=${HOME}/.local/aarch64
TCSDS_PATH=/opt/FJSVxtclanga/tcsds-1.2.33
VENV_PATH=${HOME}/.local/aarch64/venv/tensorflow
PREFIXVENV_PATHは各自のホームディレクトリの使い方で異なるので、それぞれに合わせて変更しておく。

01_resnet

10_setup_resnet.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM --mpi "proc=1"
#PJM -S

11_train_resnet-single.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM --mpi "proc=1"
#PJM -S
富岳のスレッドは8でそのうち0から3の4つは使用できないので、NUMA_NODEを修正する。
NUMA_NODE=4

12_train_resnet-4process.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。
また、複数プロセスの実行となるのでmpiオプションなどが異なっていることに注意のこと。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S
#PJM -L "node=1:noncont"
#PJM --mpi "shape=1,proc=4"
#PJM -j

ステップジョブ実行

ログインノードで 01_resnet ディレクトリ上にてステップジョブ実行する。

chmod +x ./*.sh
pjsub --step 10_setup_resnet.sh
pjsub --step --sparam "jid=XXXXXXX" 11_train_resnet-single.sh
pjsub --step --sparam "jid=XXXXXXX" 12_train_resnet-4process.sh

02_OpenNMT

20_setup_OpenNMT の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM --mpi "proc=1"
#PJM -S

21_train_OpenNMT_Transformer-single.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -L "node=1"
#PJM -S
富岳のスレッドは8でそのうち0から3の4つは使用できないので、NUMA_NODEを修正する。
NUMA_NODE="4,5"

22_train_OpenNMT_Transformer-2process.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM --mpi "shape=1,proc=2"
#PJM -S
環境変数MPIには、並列プログラム実行プレフィックスが格納されている。
デフォルトではなぜか富岳上のmpirunではサポートされていないオプション --display-map 、 --display-allocation 、 --map-by が付いているのでこれらを除去する。

  MPI="mpirun -np 2"

ステップジョブの実行

ログインノードで 02_OpenNMT ディレクトリ上にてステップジョブ実行する。

chmod +x ./*.sh
pjsub --step 20_setup_OpenNMT.sh
pjsub --step --sparam "jid=XXXXX" 21_train_OpenNMT_Transformer-single.sh
pjsub --step --sparam "jid=XXXXX" 22_train_OpenNMT_Transformer-2process.sh

03_Bert

300_setup_bert.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

311_create_pretraining_data.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

312_run_pretraining.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

numactl のオプションは変更しなくても良い(使われていないので)。

313_run_pretraining-2process.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM --mpi "shape=1,proc=2"
#PJM --mpi "max-proc-per-node=4"
#PJM -S
環境変数MPIから富岳上のmpirunに実装されていないオプションを除去する。
MPI="mpirun -np 2"

321_create_finetuning.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

322_run_finetuning.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S
環境変数NUMAは使用されていないのでそのままでもよい。

323_run_finetuning-2process.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#!/bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM --mpi "shape=1,proc=2"
#PJM --mpi "max-proc-per-node=4"
#PJM -S
環境変数MPIから富岳上のmpirunに実装されていないオプションを除去する。
MPI="mpirun -np 2"

ステップジョブの実行

ログインノードで 03_bert ディレクトリ上にてステップジョブ実行する。

chmod +x ./*.sh
pjsub --step 300_setup_bert.sh
pjsub --step --sparam "jid=XXXXX" 311_create_pretraining_data.sh
pjsub --step --sparam "jid=XXXXX" 312_run_pretraining.sh
pjsub --step --sparam "jid=XXXXX" 313_run_pretraining-2process.sh
pjsub --step --sparam "jid=XXXXX" 321_create_finetuning.sh
pjsub --step --sparam "jid=XXXXX" 322_run_finetuning.sh
pjsub --step --sparam "jid=XXXXX" 323_run_finetuning-2process.sh

04_Mask-R-CNN

libxml2/libxsltのコンパイル

Mask R CNN のトレーニング処理を実行するためには、contextlib2 というPythonパッケージが必要になる。その前提としてlibxml2/libxsltライブラリが必要となるため、先にホームディレクトリ内でコンパイル・インストールする。
http://xmlsoft.org/downloads.html からlibxml2とlibxsltのソースコードをダウンロード
富岳上へソースをコピーし展開(以下では ${HOME}/.tmp 直下に2つとも展開し${HOME}/.local/aarch64へインストールする前提での記述となる)する。
 
cd ${HOME}/.tmp/libxml2
make clean
source ${PYTHONHOME}/bin/activate
./autogen.sh --prefix=${HOME}/.local/aarch64 --with-python-install-dir=${HOME}/.local/aarch64/venv/tensorflow
make
make install
cd ../libxslt
./autogen.sh --prefix=${HOME}/.local/aarch64 --with-python-install-dir=${HOME}/.local/aarch64/venv/tensorflow
make
make install

40_setup_mask-r-cnn.sh の編集

スクリプト先頭のPJMコメントを以下のように修正する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

41-0_download_traindata.sh の編集

スクリプト先頭のPJMコメントを以下のように追加する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

41-1_setup_traindata.sh の編集

スクリプト先頭のPJMコメントを以下のように編集する。
なお rscunit は各自の環境に合わせて編集すること。 

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

42_train_maskrcnn_single.sh の編集

スクリプト先頭のPJMコメントを以下のように編集する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -S

43_train_maskrcnn_multi.sh の編集

スクリプト先頭のPJMコメントを以下のように編集する。
なお rscunit は各自の環境に合わせて編集すること。

#! /bin/bash
#PJM --rsc-list "node=1"
#PJM --rsc-list "rscunit=rscunit_ft99"
#PJM --rsc-list "rscgrp=small"
#PJM --rsc-list "elapse=72:00:00"
#PJM -L "node=1:noncont"
#PJM --mpi "shape=1,proc=2"
#PJM -S
環境変数MPIRUNから富岳上のmpirunに実装されていないオプションを除去する。
MPIRUN="mpirun -np 2"

ステップジョブの実行

ログインノードで 04_Mask-R-CNN ディレクトリ上にてステップジョブ実行する。

chmod +x ./*.sh
pjsub --step 40_setup_mask-r-cnn.sh
pjsub --step --sparam "jid=XXXXX" 41-0_download_traindata.sh
pjsub --step --sparam "jid=XXXXX" 41-1_setup_traindata.sh
pjsub --step --sparam "jid=XXXXX" 42_train_maskrcnn_single.sh
pjsub --step --sparam "jid=XXXXX" 43_train_maskrcnn_multi.sh

以上

AWS Glueジョブ(Python/Spark)にPythonパッケージを追加する方法

 AWS Glueジョブには2つの種類が存在します。 ETLジョブ(Spark) PySparkコードが実行できるジョブ。 最低でも10並列で実行するので、DynamicFrame/DataFrame操作以外の処理はPython Shellジョブを使ったほうがよい。 Python...