機械学習でCPUとGPUを比較!サポートと処理速度を比べてみた

本サイトはアフィリエイト広告を利用しています。
AI

簡単な機械学習をして、CPUとGPUの差を比較してみました。

CPUをサポートされているものも多数ありますが、やはりGPUの方が圧倒的に楽です。

処理速度もですが、サポートの差がCPUとGPUで違う一例を紹介します。

 

スポンサーリンク

機械学習でCPUとGPUを比較!サポートと処理速度を比べてみた

機械学習でCPUとGPUの差は大きいです。処理速度が全く違います。

また実践する上で重要なことがあります。サポート具合です。

基本的にGPU前提のライブラリとなっていて、CPUがサポートされていない場合があります。

 

「手持ちのPC環境にGPUが無く、CPUで時間が掛かってもいいからテストしたい」

という方は少なからずいると思います。(昔の筆者がそうでした…)

画像の領域分割(segmentation)で「CPU」と「GPU」の両方でテストしてみました。

 

今回のテストは、基本的にGPUがサポートされたライブラリの一例ということご了承ください。

世の中にはしっかりCPUまでサポートされている機械学習のライブラリも沢山あります。

 

実行環境

テストしたPC環境は下記となります。

CPUもGPUもよくある市販のデスクトップに搭載されているスペックです。

  • CPU…Core i5 6400
  • GPU…NVIDIA GeForce GTX 1650(メモリ4GB)
  • メモリ…16GB
  • SSD…500GB

 

またテストしたdocker環境はVitis AIのVer2.5を使用しています。

(Vitis AI…Xilinx(AMD)のFPGAのAI開発環境)

CPU版とGPU版の環境構築などに関しては下記記事で紹介しています。

VItis AI 2.5やPetaLinuxなどインストールしてみたメモ

VItis AI 2.5やPetaLinuxなどインストールしてみたメモ
Vitis AIの最新版2.5やPetaLinuxインストールしてみました。 ダウンロードからの一連の流れを簡単に紹介します。

Vitis AI GPU dockerの環境構築をしたメモ

Vitis AI GPU dockerの環境構築をしたメモ
XilinxのFPGAのAI開発環境である、Vitis-AI 2.5のGPU版を立ち上げてみました。 dockerやCUDAなど多くのものを事前にインストールする必要があります。 実際にGPU dockerの環境構築をした手順を紹介します。

 

CPUとGPUの処理速度の比較例

nuScenesのnuImagesという自動車走行の画像データセットを使用しています。

下記イメージのように写真を領域分割(segmentation)した内容です。

人・車・自転車…と各クラスに分類(Semantic Segmentation)までしています。

 

あくまで一例ですが、CPUとGPUの処理速度の差です。(テストの詳細は後述)

Segmentationのデモの実行だけでなく、モデルの評価・学習でも比較しています。

  • デモの実行では、GPUの方が約2倍程度速い。
  • モデルの評価・学習では、GPUの方が10数倍と圧倒的に速い。
  CPU GPU 処理速度差
2000枚のSegmentationデモ(demo) 53:47 27:54 1.92倍
Segmentationモデル評価(eval) 3:56:43 15:57 14.84倍
Segmentationモデル学習(train) 6:33:04 22:33 17.43倍

 

CPUとGPUのサポートの比較例

docker環境で実行したコマンドはCPU、CPU共に基本的には同じです。

GPUの方が楽で、CPUの方が圧倒的に面倒でした。

  • GPUが基本のライブラリなので、CPUでエラー出た場合はプログラム見て自力で修正。
  • GPUでは用意されたスクリプトを(Readmeを見て)実行していくだけで簡単。
  • 今回は簡単な部類の機械学習。複雑なライブラリだとCPU版に修正できるか分からない…。

 

CPU版のdocker環境で実行したコマンドは下記です。詳細は後述しています

 

GPU版のdocker環境で実行したコマンドは下記です。コマンド自体は変わっていないです

 

AIのコンテストで最初に確認した内容

この記事の内容は、(筆者が)AIのコンテストで一番最初にテスト・確認した内容です。

当時の最初の頃はGPU環境が無かったので、「CPUでも対応できる…?」と一度は考えました。

テストしてみると、やはりCPUだとエラー出て凄く面倒であることを再確認しました。

 

結局AIのコンテストに参加した際にはGPUで対応していました。

コンテストも終わりましたので、CPU版のエラーを修正してみた内容を記事にしてみました。

下記記事でコンテストの内容まとめを紹介しています。(リンク先はこちら)

第6回AIエッジコンテストが凄く難しいけど勉強になった感想

第6回AIエッジコンテストが凄く難しいけど勉強になった感想
第6回AIエッジコンテストに参加していました。 RISC-Vを使って、画像とLIDAR点群からの3D物体検出が課題でした。 ただ貴重な勉強の機会になりましたし、自身への忘備録としても内容を紹介します。

 

SegmentationでCPUとGPUを比較したテスト内容

データセット・前処理の準備を行い、CPUとGPUでのデモ・評価・学習を比較していきます。

 

データセットの準備

XilinxのVitis AI 2.5のサンプルライブラリをダウンロードします。

今回はPointPaintingという3D物体検出の前処理の一部を流用しています.

下記のyamlにダウンロード先が記載されています

 https://github.com/Xilinx/Vitis-AI/tree/2.5/model_zoo/model-list/pt_pointpainting_nuscenes_2.5

 

下記のようにダウンロード・解凍しました。

解凍したフォルダにReadmeがありますので、目を通しておきます。

主に使うのはsemanticfpn(物体検出)のフォルダです。

 

またnuScenesのHPから予め、データセットをダウンロードしておきます。

 https://www.nuscenes.org/download

様々なデータセットがありますが、今回は画像のnuImagesを使います。

Metadata 0.59GB、Samples 15.27GBの2つです。

 

ダウンロードが終わりましたら、dataにnuimagesのフォルダを作り、解凍しておきます。

Readmeに従った、下記形になるはずです。

 

デモ、モデル評価・学習前の前処理

デモ、モデル評価・学習前の処理として、画像データのsegmentation(区分け)をします。

CPUでもGPUの処理でも、ここまでは同じです。

bash create_seg_mask.sh

 

実行して2時間ほどで終了します。

「samples_10cls_bg_masks」のフォルダが新に出来ています。

 

GPUのテスト

最初に簡単な方であるGPU版をテストしていきます。

GPU版のdockerを起動して「デモ-モデル評価-モデル学習」の時間を計測しました。

 

2000枚の画像のSemantic Segmentationデモ

約2000枚の写真で領域分割のデモするのにで「27:54」でした。途中で止めています。

bash run_demo.sh

 

デモ実行後はdata\demoのファイルが出来ています。

 

出力画像を確認すると、色分けされて分類された結果が良く分かります。

 

モデルの評価(eval)

既にサンプルで用意されていたモデルの評価ですが「15:57」かかりました。

 

モデルの学習(train)

Readmeに従い、プレ学習しているモデルを「resnet18-5c106cde.pth」を使います

ダウンロードしてcode/imagenet_pretrainedのフォルダ内に入れておきます。

エポック(Epoch)1回分の学習時間は「22:33」でした。1epoch後は途中で止めています。

 

GPU環境で実行したコマンド・内容

GPU版のdocker環境で実行したコマンドは下記です。

 

CPUのテスト

CPU版のdockerを起動して「デモ-モデル評価-モデル学習」の時間を計測しました。

 

2000枚の画像のSemantic Segmentationデモ

GPU版と同様にデモのスクリプト(bash run_demo.sh)を実行するとエラーが出ます。

cudaを使う設定になっており、初期化が出来ないよという内容でした。

File "/opt/vitis_ai/conda/envs/vitis-ai-pytorch/lib/python3.7/site-packages/torch/cuda/__init__.py", line 208, in _lazy_init

 

実行プログラムのtest.pyを確認すると、オプションでcudaかcpuを選べるようでした。

スクリプトを修正して、--device cpu を最後に追加して実行できました。

結果は「53:47」でした。

python code/test/test.py --dataset nuimages --num-classes ${NUM_CLASSES} --model fpn --backbone resnet18 --data-folder ${DATASET} --weight ${WEIGHTS} --quant_mode float --test-folder ${DEMO_SRC} --save-dir ${DEMO_DST} --test-size ${INPUT_SIZE} --device cpu

 

モデルの評価(eval)

評価のスクリプト(bash run_eval.sh)でも、デモと同じプログラム(test.py)が使われていました。

同様にスクリプトを修正して、--device cpu を最後に追加して実行できました。

CPUだと遅すぎるので、換算時間で確認しています。「3:56:43」でした。

 

モデルの学習(train)

学習のスクリプト(bash run_train.sh)の中身を見て、実行プログラム(train.py)を確認しました。

--device cpuなどのオプション設定は用意されていませんでした。

そのまま実行するとエラーが発生しました。CUDA環境が設定されていない旨でした。

AssertionError: Torch not compiled with CUDA enabled

 

学習の実行プログラム(train.py)を確認して、エラー出ていたCUDA箇所をCPUに修正しました。

image = image.cuda() → image = image.cpu()

target = target.cuda()  → target = target.cpu()

 

上記修正後は学習のスクリプト実行できました。

CPUだと遅すぎるので、換算時間で確認しています。「6:33:04」でした。

 

CPU環境で実行したコマンド・内容

CPU版のdocker環境で実行したコマンドは下記です。

 

まとめ

簡単な機械学習をして、CPUとGPUの差を比較してみました。

やはりGPUの方が圧倒的に楽です。CPUだと処理速度・サポートが厳しい場合が多いです。

もし機械学習を始める方がいれば、GPU環境を整えることをおススメします。

 

市販のデスクトップPCにGPUを搭載した内容を下記記事で紹介しています。

グラボの補助電源なしのメリット!玄人志向のGTX1650編

グラボの補助電源なしのメリット!玄人志向のGTX1650編
玄人志向のGTX1650を購入して、市販のデスクトップPCに取り付けてみました。 補助電源無しのタイプですので、グラフィックボードを挿し込むだけで動作可能です。 購入から取り付け、ドライバのインストールまでの流れを紹介します。

 

また機械学習用にGPUメモリが多いグラボで、PC自作した内容も紹介しています。

機械学習のPCを自作してみた!(パーツ予算15~20万円編)

機械学習のPCを自作してみた!(パーツ予算15~20万円編)
機械学習・ディープラーニング用のPCを自作してみました。 パーツの予算総額は約15~20万円のミドルスペックです。 機械学習で重要なGPUメモリを重視して、デスクトップPCを組んだ内容を紹介します。

コメント