Lambda Labs, Incから公開されている、Linux用のTensorFlowベンチマーク「lambda-tensorflow-benchmark」をWindows上で動かす方法を載せておきます。
Contents [hide]
lambda-tensorflow-benchmarkとは
lambda-tensorflow-benchmarkは、サーバー機器などを販売しているLambdaによって作られたTensorFlowのベンチマークソフト(シェルとPythonスクリプトのセット)です。
画像認識などで用いられる、ResNet50、ResNet152、Inception-v3、Inception-v4、VGG16、AlexNet、SSD300に対する、単精度と半精度(FP32/FP16)の計算性能によるベンチマークなので、NVIDIAのTuringなどを使っている場合は、TensorCoreによるパフォーマンスも確認できます。
Turingを使っていれば、半精度(FP16)の演算を行えば自動でTensorCoreが利用されるようです。そのため、FP32の場合はCUDAによる性能、FP16の場合はTensorCoreによる性能になると思います。
ただし、FP16の計算全てでTensorCoreが用いられているかどうかは分かりません。また、TensorCoreを搭載していないGPUを利用している場合は、CUDAを使った計算になるはずです。
Windowsでlambda-tensorflow-bemchmarkを動かす準備
もともとLinux向けのShellセットなので、そのままではWindows上で動きません。
そのため、以下の手順でWindows上でも動作するように設定を行います。
MSYS2のセットアップ
いくつかLinuxのコマンドが用いられているため、MSYS2を導入してLinuxのコマンドをWindows上でも利用できるようにします。(MSYS2はTensorFlowをWindows上でビルドするときにも利用するツールです)
MSYS2のサイトからmsys2-x86_64-20180531.exeをダウンロードしてインストールします。インストール後はbinフォルダ(C:\msys64\usr\binなど)を環境変数PATHにも追加してください。
コマンドプロンプトで以下のコマンドを実行して、gitやLinuxのbcコマンドを追加しておきます。(Windows用にGitを入れていれば、MSYS2でGitを入れる必要はありません)
Windowsのwhereコマンドを使ってファイルへのパスが通っているかも確認できます。
- rem bc,gitコマンドの追加
- > pacman -S bc git
- rem 必要なコマンドのパスが通っているか確認
- > where bash bc git
- C:\msys64\usr\bin\bash.exe
- C:\msys64\usr\bin\bc.exe
- C:\Program Files\Git\cmd\git.exe
- C:\msys64\usr\bin\git.exe
lambda-tensorflow-benchmarkの取得と修正
GitHubからlambda-tensorflow-benchmarkを取得して、Windowsでは実行が難しい部分のシェルを一部修正します。
コマンドプロンプトでGitHubからlambda-tensorflow-benchmarkを取得します。
- rem ダウンロードするフォルダ(任意の場所)
- > mkdir c:\bench
- > cd /d c:\bench
- rem lambda-tensorflow-benchmarkの取得
- > git clone https://github.com/lambdal/lambda-tensorflow-benchmark.git --recursive
- rem この記事を書いている時点のlambda-tensorflow-benchmarkを利用
- > cd lambda-tensorflow-benchmark
- > git checkout c1ae1f5d44292faf9c9d24535ed9d5d91f942eaf
取得したlambda-tensorflow-benchmarkフォルダに含まれているbenchmark.shをテキストエディタなどで以下のように修正します。CPU名やGPU名は使っている環境に合わせて設定してください。(CPUやGPU名は実際に使っている製品の名称と一致していなくても動作には影響しません)
- 環境変数CPU_NAME、GPU_NAMEの設定部分を固定値に書き換え(14~21行目あたり)
- python3をpythonに書き換え(120行目)
- #CPU_NAME="$(lscpu | grep "Model name:" | sed -r 's/Model name:\s{1,}//g' | awk '{ print $4 }')";
- #if [ $CPU_NAME = "CPU" ]; then
- # # CPU can show up at different locations
- # CPU_NAME="$(lscpu | grep "Model name:" | sed -r 's/Model name:\s{1,}//g' | awk '{ print $3 }')";
- #fi
- #
- #GPU_NAME="$(nvidia-smi -i 0 --query-gpu=gpu_name --format=csv,noheader)"
- #GPU_NAME="${GPU_NAME// /_}"
- CPU_NAME="i7_7700K";
- GPU_NAME="TITAN_RTX"
- # python3 tf_cnn_benchmarks.py "${args[@]}" |& tee "$output"
- python tf_cnn_benchmarks.py "${args[@]}" |& tee "$output"
上記のソースは2019/3/10時点のものです。今後、lambda-tensorflow-benchmarkに修正が行われた場合は内容が変わる可能性があります。
lambda-tensorflow-benchmarkの実行
lambda-tensorflow-benchmarkはTensorFlow(GPU版)が導入されたPython環境で実行する必要があります。TensorFlowの導入方法については「Keras / TensorFlow-GPU環境の作成(Windows編)」や「TensorFlowのビルド方法(tf1.12.0)」、「TensorFlowのビルド方法(tf1.13.1)」などを参考にしてください。
ベンチマークの実行
コマンドプロンプトで、TensorFlow(GPU)を導入しているPython環境をアクティブにして、benchmark.shを実行します。
benchmark.shはbenchmark.sh <GPU番号> <実行回数>という形になります。GPU番号は0番から開始なので、最初のGPUを使って10回ベンチマークを実施する場合は、benchmark.sh 0 10となります。
- rem TensorFlow(GPU)を導入しているPython環境を有効にする
- rem 利用している環境に合わせて設定してください(Anacondaの場合はconda activate~)
- > C:\venvs\tf1120\Scripts\activate.bat
- rem ベンチマークをbash経由で実行
- > bash ./benchmark.sh 0 10
回数にもよりますが、ベンチマークが終わるまで数時間かかるのでそのまま待ちます。実行結果は、benchmark.shで指定したCPU_NAME、GPU_NAMEの名前が付いたフォルダ内(例えばi7_7700K-TITAN_RTX.logsフォルダ)に格納されます。
実行結果の集計
出力されたログファイルの集計は、report.shを使って行います。
report.shはreport.sh <logフォルダ名> <実行回数> <GPU番号>という形になります。(実行回数とGPU番号の順番がbenchmark.shと逆になっているので要注意)
上で実行した結果を集計する場合report.sh i7_7700K-TITAN_RTX.logs 10 0というような形になります。
- rem 出力されたlogファイルの集計
- > bash ./report.sh i7-7700K-GTX1080.logs 10 0
集計が完了すると、サマリがMarkdown形式(拡張子md)で作成されます。
ベンチマーク結果
参考までに、私が利用している環境のベンチマーク結果を載せておきます。
- CPU: Intel i7-7700K
- GPU: NVIDIA TITAN RTX(本格水冷)
- Python: Python 3.6.8
- TensorFlow: TensorFlow 1.13.1(CUDA 10.1、cuDNN7.5.0、/arch:AVX2)
SUMMARY
| model | input size | param mem | feat. mem | flops |
|---|---|---|---|---|
| resnet-50 | 224 x 224 | 98 MB | 103 MB | 4 BFLOPs |
| resnet-152 | 224 x 224 | 230 MB | 219 MB | 11 BFLOPs |
| inception-v3 | 299 x 299 | 91 MB | 89 MB | 6 BFLOPs |
| vgg-vd-19 | 224 x 224 | 548 MB | 63 MB | 20 BFLOPs |
| alexnet | 227 x 227 | 233 MB | 3 MB | 1.5 BFLOPs |
| ssd-300 | 300 x 300 | 100 MB | 116 MB | 31 GFLOPS |
syn-replicated-fp32-1gpus
| Config | i7_7700K-TITAN_RTX |
|---|---|
| resnet50 | 322.99 |
| resnet152 | 121.34 |
| inception3 | 219.01 |
| inception4 | 90.31 |
| vgg16 | 196.09 |
| alexnet | 4161.92 |
| ssd300 | 168.92 |
syn-parameter_server-fp32-1gpus
| Config | i7_7700K-TITAN_RTX |
|---|---|
| resnet50 | 322.28 |
| resnet152 | 120.42 |
| inception3 | 217.88 |
| inception4 | 90.98 |
| vgg16 | 195.61 |
| alexnet | 4114.43 |
| ssd300 | 167.36 |
syn-replicated-fp16-1gpus
| Config | i7_7700K-TITAN_RTX |
|---|---|
| resnet50 | 558.51 |
| resnet152 | 193.10 |
| inception3 | 382.32 |
| inception4 | 145.77 |
| vgg16 | 352.99 |
| alexnet | 6545.64 |
| ssd300 | 265.23 |
syn-parameter_server-fp16-1gpus
| Config | i7_7700K-TITAN_RTX |
|---|---|
| resnet50 | 564.67 |
| resnet152 | 199.23 |
| inception3 | 384.55 |
| inception4 | 148.44 |
| vgg16 | 360.98 |
| alexnet | 6684.07 |
| ssd300 | 267.47 |