今回の記事はTensorFlowやKerasでモデル学習を行う際にCPUを使用する場合とGPUを使用する場合で学習速度にどの程度変化が出るかまとめて見ました。「Object Detection API」でのモデル学習で検証して見たので是非興味がある方は参考にして見て下さい。
また、同じようにYOLOの処理速度をCPUとGPU環境で比較してみたので興味がある方は下記記事を参考にして下さい。
【YOLO】GPU使用と非使用でのYOLOの処理速度の違い。
TensorFlowとObject Detection APIの各環境
GPU環境
cuda: 10.0.130.1
cudnn:7.42
mccl:2.4.7-1
その他環境
python:3.6.5
tensorflow-gpu:1.14
tensorflow:1.14
tensorflowは衝突するので必ずPythonで仮想環境なりを作ってから「pip install」してください。もちろんGPU使用時がgpuついてる方のtensorflowです。
クラウド上に環境構築
AWSの場合はインスタンスを引っ張ってこればほぼ環境は完成しているのであとは周辺のtensorflowレポジトリと「Object Detection API」レポジトリをとってきてなどの環境構築が待っております。
私は以前Docker上で環境構築を行っているのでそちらをご参照ください。
「Docker環境に「Object Detection API」環境の構築手順。」
ABCIの場合も同じなのですが、「module load」でインタラクティブノードにまずはPythonなどをインストールする必要があったり、何かと通常の操作とは違ってくるのでその辺りは割愛します。
またここが重要なのですがGPUを使用して学習を行う場合は、tensorflowをインストールせずにtensorflow-gpuをインストールしてください。Pythonでインストールする際は「pip install tensorflow-gpu」です。ソースコード 情は「import tensorflow」のままでOKです。
モデル学習の準備
こちらも下記記事の手順を参考いただければOKです。
「TensorFlowの「Object Detection API」でTFRecordを既存モデルに転移学習する手順。」
「.get 〜.sh」でデータセットをダウンロードしている箇所を変更し、学習のコマンドオプションを変更すれば、転移学習の転移元モデルは変更できます。
ではいよいよ本番です。速度比較を行っていきましょう。
GPUによる学習時間の変化検証
以前AWSの「x3.8large」インスタンスで学習を行った際に確か、TFRecordが1000枚程度で約8時間かかかりました。画像サイズはまあまあデカかったです。今回もその画像にアノテーション付を行ったTFRecordで1000枚を使用して転移学習を行っていきます。
CPUでのモデル学習
INFO:tensorflow:global_step/sec: 0.245741
INFO:tensorflow:loss = 9.039016, step = 101 (406.910 sec)
INFO:tensorflow:global_step/sec: 0.23382
INFO:tensorflow:loss = 8.182284, step = 201 (427.675 sec)
100stepで約400秒かかっております。転移学習元の学習モデルはMobilenet_v2を使用しているので10000stepを行うとしても、約12時間かかります。
GPUでのモデル学習
INFO:tensorflow:loss = 15.7188835, step = 0
INFO:tensorflow:global_step/sec: 0.713323
INFO:tensorflow:loss = 8.371616, step = 100 (140.211 sec)
INFO:tensorflow:global_step/sec: 0.727884
INFO:tensorflow:loss = 8.713049, step = 200 (137.339 sec)
INFO:tensorflow:global_step/sec: 0.734773
INFO:tensorflow:loss = 7.8016877, step = 300 (136.097 sec)
INFO:tensorflow:global_step/sec: 0.744264
INFO:tensorflow:loss = 7.9741273, step = 400 (134.358 sec)
INFO:tensorflow:global_step/sec: 0.599578
INFO:tensorflow:loss = 7.1476555, step = 500 (166.786 sec)
INFO:tensorflow:global_step/sec: 0.727468
INFO:tensorflow:loss = 6.3297086, step = 600 (137.527 sec)
同じような時間放置していたらかなり学習が進んでいました。速度差は2.5倍程度です。かなりGPUの性能が学習時間短縮に寄与していることがわかりました。
では今回の記事は以上です。他にも多数の機械学習関連の記事を記載しているので興味がある方は是非サイト内ご確認ください。
コメント