はじめに
Singularity で GPU を試す必要があり試してみるっという目的です。
ゴールとしては、TensorFlow のベンチマークが動くというところにおきたいと思います。
環境構築
前提
以下についてはすでに完了している前提です。
- OCI のアカウントはすでにある
- VCN は作成済み
- GPUインスタンス(VM.GPU3.x)が利用できること (サービスリミットを緩和済みであること)
- インスタンスの作成から SSH アクセスまでを理解されていること
インスタンスの作成
作成時のポイントは以下です。
- Image は Oracle Linux (RHEL互換)で Image Guild が Gen2-GPU-xxxx.xx.xx-x が選択されていることを確認します。Gen2-GPU というイメージは NVIDIA のドライバーや CUDA がインストール済みになります。
- Shape は VM.GPU3.x (xは搭載GPU数)を選択。今回は 1GPU で十分なので、VM.GPU3.1 を選択しています。
インスタンスの作成が完了したら SSH でログインします。
Singularity のインストール
この時点で最新だった v3.7 を利用することとします。
インストールは以下の公式手順に書かれている通りでコンパイルできるので、詳細は省きます。
https://sylabs.io/guides/3.7/admin-guide/installation.html#installation-on-linux
インストール後、nvidia-smi を実行すると以下のようになってしまうので一旦 reboot します。
$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
Benchmark の準備
TensorFlow のベンチマークをダウンロードします。
git clone https://github.com/tensorflow/benchmarks.git
TensorFlow を動かす Docker イメージはこちらを利用しようと思います。
singularity pull docker://tensorflow/tensorflow:latest-gpu
実行
$ singularity exec --nv ./tensorflow_latest-gpu.sif python ./benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --num_gpus=1 --batch_size=64 --model=inception3 --variable_update=parameter_server
結果
数値は大人の事情で伏せますが、正常に動作し、妥当な images/sec の結果となりました。
GPU を利用するコンテナを Rootless で動かす必要があり、Singularity と Enroot を試したのですが、Singularity はあっさりと動いてくれました。
Enroot は設定の問題かうまく動かせず、また別の機会にチャレンジかなというところです。
今回は Singularity をソースからコンパイルしましたが、Oracle Linux の EPEL は Singularity も含まれているので、そちらを使うのもありです。