Python

lambda-tensorflow-benchmarkをWindows上で実行する

Lambda Labs, Incから公開されている、Linux用のTensorFlowベンチマーク「lambda-tensorflow-benchmark」をWindows上で動かす方法を載せておきます。

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_NAMEGPU_NAMEの設定部分を固定値に書き換え(14~21行目あたり)
  • python3pythonに書き換え(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