Translate

2021年7月28日水曜日

富岳上でTensorFlow/PyTorchを使った機械学習を実行する方法

 

富岳上でTensorFlowやPyTorchを使用する場合、各自で環境設定を行う必要がある。

計算ノードを使う


計算ノードにはGPUが搭載されていないため、CPUのみの環境でトレーニング・推論処理を行うことになる。

現時点(2021年7月28日)では、富岳計算ノードに特化した以下のバージョンTensorFlow/PyTorchが用意されている。


ライブラリ バージョン パス
TensorFlow 2.2.0 /home/apps/oss/TensorFlow-2.2.0
PyTorch 1.7.0 /home/apps/oss/PyTorch-1.7.0


TensorFlow 2.2.0

TensorFlow 2.2.0 バイナリ及びライブラリをパスに追加する。Pythonバイナリも計算ノード用にoneDNNをリンクしたものが用意されている。

TensorFlow 2.2.0 関連パスを環境変数に追加する場合:


export PATH=/home/apps/oss/TensorFlow-2.2.0/bin:$PATH
export LD_LIBRARY_PATH=/home/apps/oss/tensorFlow-2.2.0/lib:/home/apps/oss/TensorFlow-2.2.0/lib64:$LD_LIBRARY_PATH


PyTorch 1.7.0

PyTorch1.7.0も同様にパスに追加する。PyTorchもPythonバイナリから用意されているのだけど、こちらはコンパイルオプション以外に特別なconfigurationがみあたらない。

PyTorch 1.7.0 関連パスを環境変数に追加する場合:


export PATH=/home/apps/oss/PyTorch-1.7.0/bin:$PATH
export LD_LIBRARY_PATH=/home/apps/oss/PyTorch-1.7.0/lib:/home/apps/oss/PyTorch-1.7.0/lib64:$LD_LIBRARY_PATH

 

【注意】

/vol0004/apps/oss には、PyTorch1.6.0やTensorFlow2.1.0のディレクトリも存在するが、メンテナンスされていないため上記のように環境変数を変更しても使用できない。たとえばTensorFlow2.1.0の場合、pipコマンドが使用できないため、独自にpipコマンドスクリプトを変更する必要がある。


上記のバージョン以外の TensorFlow/PyTorchを使用したい場合は、spackコマンドを使うこととなる(ただし、コンパイルオプションなどの問題を個々に対処しなくてはならない)。

たとえば計算ノード上でなにも設定せず spack install py-tensorflow@2.3.1 と実行しても、正常にインストールが成功しない。これは計算ノードがARMv8.2ベースのアーキテクチャCPUを使用していることに起因する。
 

【注意】

富岳には一般ユーザが問い合わせることのできるヘルプデスクが存在するが、初動のレスポンスもあまり早くない(失礼、ご容赦)し、個別のOSS対応を断っていると入門セミナーでおっしゃっており、自分で解決しなくてはならない。

2021/08/03追記併走型利用支援 を開始したとのメール案内がありました。



そのような場合は、次の手段で実行する事が可能になる。
 

プリポストGPUノードを使う


富岳の利用ガイド入門編では紹介されていないが、富岳環境には8ノードだけGPU(V100×2)が搭載されたノードが用意されている。

富岳には踏み台ゲートウェイにあたるログインノード、計算用途に使用する計算ノード以外に、プリポストノードが用意されている。

プリポストノードは、(明確な記述がないため、あくまで私個人の私見)その名称通り『事前処理・事後処理』に使用することを目的としており、本格的NLP処理の前の大量テキストファイルの分かち書きやword2vecによる特徴量計算などの大量メモリを消費する事前処理を行ったり、計算結果を3D CGや動画などに変換しXサーバを立ち上げGUI表示し確認するようなGPUを使用するような事後処理をおこなうためのノードである。

プリポストノードの種類


プリポストノードには以下の3種類のノードが存在する。


ノード種類 ノード数 用途
管理ノード 2(正・副) GPU/大量メモリノードリソースを管理するノード。slurmジョブを適切なノード上で実行し状態を管理する。富岳一般ユーザがログインして使用することはおそらくない。
GPUノード 8 プリポスト環境における計算ノード。2CPU、192GBメモリを搭載した x86_64 アーキテクチャノード。NVIDIA Telsa V100(32GB)×2を搭載。2021年7月27日時点ではCUDA Toolkit 11.2がセットアップ済み。
大容量メモリノード 2 プリポスト環境における計算ノード。4CPU、6TBメモリを搭載した x86_64アーキテクチャノード。GPUは搭載されていない



GPUノード、大容量メモリノードは、富岳計算ノードとことなり x86_64 アーキテクチャのCPUを搭載しているため、PyPI 管理下のパッケージも豊富であるため pip3 コマンドで必要なバージョンのTensorFlow/PyTorchにインストールすることができる。また両方の環境をあわせたPython環境も構築が容易である。
 

利用入門セミナーでGPUノード活用についての説明がなく、また搭載GPUのアーキテクチャも現在では古いため、富岳管理側はこのGPUノードの機械学習用途での利用は想定外であると推察する。このため富岳ユーザがこの方法を使い始めた時、禁止される可能性は十分考えられる。

事前準備


富岳計算ノードへのログインでは pjsub コマンドの対話型ジョブ実行で行っていた。
プリポストノードのGPUノード、大容量メモリノードでは、富岳計算ノードとはことなり Slurm Workload Manager というジョブ管理ツールを使用している。

このため、srun というジョブ実行コマンドの対話型ジョブ実行モードを使ってログインすることとなる。

GPUノードへ対話型ジョブでログインする場合:

srun -p ppsq -N 1 --time=10:00:00 --pty bash -i

上記コマンドを実行すると、slurmが割り当てたどれかひとつのGPUノードへログインすることができる。
 

ppspppmq に変更すると大容量メモリノード(GPUなし)へログインできる。



GPUノード上にログインした状態で venv環境 hogehoge を作成する場合:

mkdir -p ${HOME}/.local
mkdir -p ${HOME}/.local/avx512
cd ${HOME}/.local/avx512
python3 -m venv hogehoge


venv環境 hogehoge を有効にするには source ${HOME}/.local/avx512/hogehoge/bin/activate を実行する。

GPUノード上にログインした状態では、CUDA Tookitへの環境変数設定ができていないため、CUDAを使用するライブラリを使う前に設定する必要がある:

export PATH=${PATH}:/usr/local/cuda-11.2/bin
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-11.2/lib64

 

バージョン指定したTensorFlowのインストール

spack を使って環境を整えることも可能だが、ローカルPCと同様のセットアップ手順で行いたい場合は、venvを使用することもできる(デフォルトPythonパッケージは3.6.8)。

GPUノード上にログインした状態で(CUDAへのパス追加後) TensorFlow2.5.0をインストールする場合:

pip3 install tensorflow-gpu=2.5.0
 

バージョンを指定したPyTorchのインストール


GPUノード上にログインした状態で(CUDAへのパス追加後) PyTorch1.8.1をインストールする場合:

pip3 install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/lts/1.8/torch_lts.html
 

1.8.1以外の場合のセットアップコマンドは、PyTorchサイトで確認のこと。

GPUノードへバッチジョブ実行する場合は sbatch を使ってスクリプトを slurm キューに格納する。キューの状態を確認する場合は、squeueを実行する。
 

sbatchsrunのオプションである --mail-user / --mail-type を指定すると、ジョブの開始終了などをメールで通知してくれると書かれているが、現時点では動作しない。どうもGPUノード上にメールクライアントがインストールされておらず、spackコマンドでもインストールできないため、メール経由のSlackメッセージ通知を利用するとはできない。→(追記)現在使用可能になりました。

 


デフォルトの設定ではホームディレクトリをテンポラリディレクトリとして使用する。インストール処理を実行すると大量の一時ディレクトリがホーム上に作成されるので注意(環境変数 TMPDIR を設定して変更することが可能)。



上記以上のプリポスト環境の使い方については、富岳ポータルサイト(要アクセス権限)上の「プリポスト環境 利用手引書」を参照のこと。

以上

※2021/10/19 追記

TensofFlowのインストールは可能ですがtf.config.list_physical_devices()を実行すると

CPUだけしか表示されませんでした。

nvidia-smiも同様に認識できませんでした。

考えられる理由としてドライバが古いか他のプロセスで使用中なのか

とも考えましたが、後者であればnvidia-smiは少なくとも表示してくれるはずですので

おそらく前者かな..と。

となるとドライバの再インストールですが..これは一般ユーザでは実行できません。

GPUノードはPCと同等の環境構築手段で使用は可能ですが

GPUを機械学習には現時点では使用できないと考えておいたほうが良いです。

もちろん、このあと環境が更新される可能性はありますが..


0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...