こちらはrioyokotalab Advent Calendar 2020の10日目の記事です

本題に入る前にちょっと雑談

上にあるリンクは研究室で行われているアドベントカレンダーです。研究室でブログを書いていこう!という企画だそうです。

こちらに参加しようと思った時に、自分はブログを書いたことがなく、どのように書いていくかもわからない。。そんな感じでした。

そんな時、サーバーを持っているじゃないか。。サーバーをレンタルすることもない!そんなこともありWebサーバーを立て、ブログサイトを立ち上げてみることにしました!そうしてできたのがこのサイトです。

AmpereGPUとは

NvidiaのGPUは大きく分けてKeplar,Maxwel Pascal,Volta,Turing,Ampereに分かれています。

XX50XX60XX70XX80XX90
Keplar750760770780
Maxwel950960970980
Pascal1050106010701080
Turing206020702080
Ampere307030803090
Nvidia GPU

下に行けば行くほど新しく、右に行けば行くほど性能はいいという感じです。

TuringのGPUには2050Ti、2080Tiといった”Ti”が付くものや、20XXSUPER といった”SUPER”が付くものがあり、これらはどちらも付いていないGPUよりも少し性能が良くなっています。

今回は一番下の現在新しいGPU(Ampere)において詰まった話をご紹介します。

これ、遅くない?と思ったきっかけ

自分のサーバーにはRTX3070を積んでいるのですが、自分にはpascalの1080Tiという1080よりも少し性能が良くなったGPUと、V100という一つ100万くらいするめちゃくちゃ高いGPUを使える環境がありました。

1GPUでの実験は基本的に自分のサーバーでやっていたのですが、、、

ある時、1080Ti、V100でも動かしてみようと思い、動かした結果。。

(ちなみに動かしているサンプルコードはCIFAR10をResnet18で1epochだけ学習するものです。)

GPU時間
V100約5秒
1080Ti約8秒
3070約26秒
あるプログラムの実行にかかった時間

ん???????

V100は3070よりも古いですがお値段が相当高い、とても高価なGPUなのでまあ早いのはわかります。

しかし、1080Tiと比べて3070が3倍以上時間がかかっているのは明らかにおかしい!!!

色々調べてみる

gemmを実行してみる

そもそもGPUの性能を発揮できているのか?と思い、https://github.com/enp1s0/gpu_perf のコードを借りてGPUのパフォーマンスを出力してみた結果。

GPUパフォーマンス
1080Ti1.072296e+01 [TFlop/s]
30701.312955e+01 [TFlop/s]
GPUのパフォーマンス

しっかり3070の方が性能が出ています。

ちなみにResnet18をはじめ、畳み込み層を計算するためにはcuDNNのインストールが必要になりますが、こちらはpytorchのインストールの際に自動で入るそうです。

プロファイラをとってみる

ubuntu serverではnsysコマンドを用いてプロファイラをとることができます。

こちらを1080Tiと3070で取ってみました

3070ではcuBLAS GEMMが全体の実行時間の50%を占めている状況

1080Tiではwinogradが全体の17%を占めている状況

という感じでした。ちなみに3080を持っている方にプログラムをお渡しして実行していただいても1080Tiよりは遅いという結果でした。

結局何が原因だったの?

結論から言うとPyTorchのサンプルコードに

torch.backends.cudnn.benchmark = True

この1行を埋め込むだけで3070だけ異常に速くなりました。

GPU時間
V100約5秒
1080Ti約8秒
3070約5.5秒
あるプログラムの実行にかかった時間

しっかり、PascalGPUよりは性能が出ていますね。V100と1080Tiは大きな変化は見られなかったです。

なぜこんなことが起きたかというとはっきりした原因はわかりませんが、

torch.backends.cudnn.benchmark = True

というのは畳み込みアルゴリズムを総当たりで探索するかどうかを設定するものです。

おそらく、AmpereGPUは新しいため、まだPyTorchに100%対応しておらず、デフォルトのアルゴリズムが遅いのでは?という結論に至りました。

新しすぎてもPyTorch側が対応していないとこんなにも遅くなってしまうのですね。。。。