実験用 GPU 環境をどう準備したらいい?(非情報系が機械学習を使う研究をしたいとき)

深層学習が著しく発展し、今まで人間にしかできないと思われていたことができるようになってきました。そのおかげで、今まで機械学習と縁が薄かった分野でも、機械学習を使った研究がしたいという声が上がるようになっています。
前々回は、それを裏付けるように非情報系の学生さんが機械学習を使った研究をしたいという応募がサイボウズ・ラボユースに増えているという話、前回はいままで機械学習や深層学習に縁のなかった人が何から勉強したらいいかという話を書きました。
今回はその続き、研究に必要な実験用 PC 環境をどのように準備したらいいかというお話です。

深層学習の実験をするには、十分な性能の GPU を積んだ PC が必要です。
今どきの機械学習関連の研究室では、院生有志がメンテナンスしている GPUクラスタがあって、それを使わせてもらえることが期待できます。自分用の PC を手配する場合も、研究テーマに適したマシンの選択について教授や先輩が相談に乗ってくれるでしょうし、環境構築&運用のノウハウもバッチリです。
しかし非情報系だと、そんな環境も相談相手もおそらくないでしょう。予算だけ出すから自分でマシンを選定するように、ってところでしょうか。環境構築も自分でググって手探りでやってみるしか。
ということで、前回の記事と同じくあくまで私見ですが、あまり後悔しなくて済むだろう深層学習用の PC 選びと環境構築の第一歩を書いてみます。

まず結論を言うと(TL;DR ってやつ)、

  • GPUNVIDIA(CUDA) 一択。予算の範囲で一番 GPU のメモリが多いものを選ぶ
  • OS は Linux がベスト。好きなディストリビューションでいいが、困ったときのググりやすさなら Ubuntu がおすすめ
  • CUDA の環境構築は nvidia-docker2(NVIDIA Container Toolkit) の導入を強くおすすめ

GPU

深層学習では GPU が必須です。CPU オンリーでも動きはしますが、大きいモデルの学習が現実的な時間で終わりません。

今購入が可能な GPUNVIDIA(GeForce, Quadro 等) と AMD (Radeon) です。他には、まもなく Intelディスクリート GPU (CPU と分離している、GPU 専用チップ)である Arc が出ますし、Apple の M1/M2 も AI 演算性能を喧伝しています。
ただ、深層学習の研究で使うなら、現状は NVIDIA 一択です。
他の選択肢を選んでもいいのは、機械学習とコンピュータ全般にとてもとても詳しくて、困難に出くわしたときに嬉々として自力で解決したがる人か、人柱になってもいいから特定のメーカーを応援したい人だけです。

NVIDIA は、GPU 上での基本的な演算をサポートした CUDA Toolkit と、 cuDNN という深層学習に頻出する計算を最適化したライブラリを提供しており、tensorflow や pytorch などの深層学習ライブラリは CUDA/cuDNN をサポートしています。
特に cuDNN は深層学習の推論速度に大きな影響があります。cuDNN がなくても tensorflow などは一応動きますが、推論速度に大きな差が出ます。
一方の AMD は、CUDA に相当する機能は OpenCL などで代替できますし、Intel も oneDNN という自社製ライブラリで頑張ってますが、いずれも cuDNN に相当する部分が強くないです。そのため、スペック上では同等の AMDGPU を持ってきても、深層学習の推論性能では NVIDIA に負けてしまいます。
Apple M1/M2 はメモリを CPU と GPU で共用できるなど、将来のポテンシャルには期待できます*1。何年かしたら「深層学習を始めるなら、コスト対性能で Mac に決まり!」なんて時代がもしかしたら来ちゃったりするかもしれません。が、それは今ではありません。

さて、NVIDIA 一択と言っても、「NVIDIAGPU」はいっぱいあります。GPU のスペック比較で注目されがちな CUDA コア数が多い製品をつい選んでしまうかもしれませんが、こと機械学習で使うとなると、最優先するべきスペックは GPU のメモリ量です。
CUDA コア数は GPU の並列計算能力を表し、それが多いほど計算が速いというのは間違っていません。しかし速い遅い以前に、実は深層学習のモデルは GPU のメモリに乗らなかったら計算ができません。「遅いけど計算できる」と「速いけど計算できない」なら、どちらを選ぶべきかは言うまでもないですよね。

深層学習の訓練では、その推論(予測)の何倍ものメモリが必要になります。その倍率に直結するのがミニバッチサイズ(1回のモデルパラメータ更新に用いる訓練データ数)です。GPU のメモリが足りないと、推奨されているミニバッチサイズで訓練ができなくて、しかたなくミニバッチサイズを減らすという貧乏ハック(涙)がよくあります。*2
ミニバッチサイズは学習したモデルの性能に結構影響があり、最適なバッチサイズを試行錯誤するのが深層学習チューニングの第一歩なところがありますが、メモリが少ないとその手も使えません。*3

よって、(低予算での) GPU 選びはメモリが最重要! これが鉄則です。*4
2022年現在、一部の低ランク NVIDIA GPU は、上位製品より搭載メモリが多いという逆転現象が起きていて、12GB のメモリを積んだ GeForce RTX 3060 が狙い目です。RTX 2060 にも 12GB 版がありますが、価格差は小さいので、より高性能な 3060 がいいでしょう。
12GB の次にメモリが多いのは RTX 3090(24GB) ですが、暗号通貨ブームによる高騰が収まった今でも20万円以上しますので、予算に収めるのは難しいでしょう(苦笑)。*5

CPU とメモリ

CPU は、IntelAMD で動かせるプログラムに差が出ることはありませんので、どちらでも大丈夫です*6。予算が許す範囲で高速なものを選びましょう。
深層学習では CPU より GPU の速度のほうが重要なので、グレードは高くなくても大丈夫。とはいえ Intel で言えば、Core i5 以上を選んでおきたいところです。
ARM 系(Apple M1/M2 含む)はもう何年かしたら主流に上がってくる可能性は秘めてますが、今はまだ苦労の元なのでやめましょう。

メインメモリは 16GB が最低ラインです。32GB あると嬉しい。予算が厳しいなら、CPU のグレードを下げてでもメインメモリを積んでください。
深層学習を主に使った研究でも、従来の機械学習の手法や線形代数の演算(SVD など)が前処理などに組み合わせて使われることも多く、それらは大量のメモリを消費することがあります。また深層学習においても、訓練データをオンメモリで保持できたら訓練時間を短縮できる可能性があります。
また後述の docker においても、メモリが多ければ多いほどコンテナをたくさん立てることができて嬉しいです。

OS

OS は Linux を割と強めにおすすめします。
tensorflow や pytorch といった深層学習のライブラリ自体は WindowsMac にも対応していますが、配布されているモデルを動かすには、それ以外のプログラムをビルド(プログラムのソースファイルから実行ファイルを作成する作業)する必要があって、それが Linux にしか対応していない(あるいは Windows/Mac で動かすのが面倒)ということが少なくありません。
また深層学習を使った研究における第一級の必需品と断言したい nvidia-docker2(後で説明) を動かすのは Linux が一番楽です。
Linuxディストリビューションは、CUDA が対応しているものならどれでもいいです。困ったときにググると情報が多く見つかるのは UbuntuCentOS*7 でしょう。

どうしても Windows がいいという場合、nvidia-docker2 を Windows で動かすのは大変なので、docker を使わずに深層学習するほうが楽でしょう。逆に言えば、docker を使わないなら Windows でもなんとかなります。nvidia-docker2 を使わないのはまあまあ大きなハンデになりますが。
どうしても Mac がいいという場合、以前なら Intel Mac + NVIDIA GPU という選択肢もありました。でも NVIDIAMac OS での CUDA サポートを 2021年に終了してしまいました……。「Mac でする苦労は大歓迎」という人以外は、M1 や M2 で安心して深層学習ができると定評が得られるまで待ったほうがいいでしょう。

docker

例えば tensorflow を使って深層学習の研究をするなら、調達したマシンに以下のパッケージをインストールする必要があります。

  • CUDA Toolkit と cuDNN の適したバージョン
  • python の適したバージョン
  • tensorflow の適したバージョン

この「適したバージョン」というのが厄介です。うまく動くバージョンの組み合わせが限られていて、適していない組み合わせだと簡単に動かなくなります。
深層学習の速すぎる発展に合わせてなのか、tensorflow や pytorch といった深層学習ライブラリでは、通常のソフトウェアのようなバージョン間の互換性が期待できません。今まで動いていたモデルの実装が、tensorflow をバージョンアップしたら動かなくなった、ということが普通に頻繁によくあります。特に tensorflow v1(バージョン1系) と v2(バージョン2系) は、名前変えた方がいいくらい別物です。

さて話は変わりますが、これから深層学習を使った研究を始めますという人が、最近の複雑なモデルを自力でいきなり実装することはやっぱり難しいです。幸い、機械学習の研究では github などで実装を共有するのが一般的であり*8、公開されているモデル実装を自身の研究に応用するというアプローチを多くの人が取るでしょう。

ここで先ほどのバージョン問題が立ちはだかります。モデルの実装は tensorflow (あるいは pytorch)の特定のバージョンでしか動きません。それに対応する python や CUDA/cuDNN のバージョンも限られます。
うまくいくモデルを探すためには、また論文にモデル性能比較を書くためには、深層学習の研究では複数のモデルを実験する必要もあります。それらが要求する複数バージョンの CUDA/tensorflow/pytorch を自分の実験環境に混在させようとすると、環境は簡単に壊れて、今まで動いていたモデルも動かなくなります……。

そこで是非使ってほしいのが docker と nvidia-docker2(NVIDIA Container Toolkit) です。
docker はコンテナと呼ばれる仮想環境を親マシン(ホストと言います)の中に簡単に作って、動かして、消すことができます。コンテナはホストから独立しており、コンテナ内での変更がホストや他のコンテナに影響を及ぼすには特別に許可する必要があります。nvidia-docker2 は、docker コンテナが GPU を使えるようにするためのランタイム(コンテナの実行機能)です。docker と nvidia-docker2 があれば、CUDA や tensorflow などのバージョンごとにコンテナを立ててしまえば、安全に環境混在できます。
以前はバージョン不整合を起こした CUDA 環境の復旧を年に数回とかしなくちゃいけなくて、とてもとても面倒でしたが、nvidia-docker2 を導入してからは一切なくなりました。天国です。

とはいえ、docker を導入するということは docker を勉強するコストがかかってしまいます。Linux に慣れていなかったら、さらに困難でしょう。docker 勉強のコストくらい上記のメリットだけで簡単にペイしてお釣りが来ると思いますが、未経験でそれを実感しろって言うのも無理な話……。
最初は普通に CUDA 環境構築しておいて、複数の環境が必要になる頃には Linux や深層学習にちょっとは慣れてくるでしょうから、そのときに docker のことを思い出してあげてください。

(番外編) GPU クラウド

GPU サーバをスポットで借りて使う GPU クラウドサービスという選択肢もあります。Google Colab が最もポピュラーで手軽ですね。他に、AmazonAWSマイクロソフトの Azure、GoogleGCP なども GPU を使えるクラウドサービスです。これらの GPU クラウドは、費用対効果を考えればとても安価に GPU を使った深層学習を行うことができます。
上述した通り、深層学習で一番ネックになる GPU のメモリ量についても、Google Colab の無料版でも 11GB 以上、月1000円の Google Colab Pro だと 16GB もあり(2022年現在)、頑張って導入した自分用の GPU サーバと匹敵するか、それ以上の容量があります。
では、自分用の GPU マシンなんか用意せずに、最初から GPU クラウドを使えばいいのでは? という発想もあるかもしれません。しかし深層学習を使った研究に挑戦するなら、最悪 GPU のメモリが少なくてもいいので、手元に1台マシンがあったほうが良いと思います。

実は深層学習は、うまく学習させることが結構難しいのです。機械学習用に整備されたデータセットではなく、自前のデータを比較的新しめの(つまり複雑な)深層学習のモデルに食わせて学習させたら、十中八九失敗します。なんなら賭けてもいいくらいです。
学習失敗には、学習の目安となるloss(損失)が全然下がらない、loss が下がらないどころか inf(無限大) や nan(非数値エラー) に飛ぶ、性能がランダム分類より悪いなど、いろいろパターンがあり、これを解決するには手探りで試行錯誤を繰り返すことになります。最も有効な解決策は、この非情報系向けシリーズの初回の記事に書いたように、機械学習に詳しい人にアドバイスをもらうことですが、まあそれはおいときましょう(苦笑)。

そうした試行錯誤を GPU クラウドでできるかというと、正直厳しいでしょう。Google Colab の無料版はセッションがいつ切れても文句言えませんし、内部で割り当てられたリソース使用量の上限*9を超えたらしばらく使えなくなります。AWS などの GPU クラウドは従量制で、失敗を繰り返す可能性の高い学習に使うのは強い抵抗を感じてしまうのではないでしょうか。
深層学習の試行錯誤は何度も繰り返す必要があるので、まずはデータを減らしたりモデルを小さくしたりして、1回の学習サイクルは短くするのが効果的です。そのため、メモリがちょっと少なくてもちゃんと役に立ってくれます。
ある程度うまく動くことを確信できるようになって、もう少しメモリがあったら……というとき、GPU クラウドの利用を検討してみてください。

参考リンク

nvidia-docker2(NVIDIA Container Toolkit) について最も参考になった NVIDIA 公式ブログの記事です。
短い記事ではないですが、nvidia-docker2 とは何か? インストールと使い方は? が端的に書かれています。足りない分は後からリファレンスで補うので事足ります。
medium.com

CUDA や tensorflow などのバージョン非互換性の話題に触れています。
ほかのソフトウェアではあまり問題にならないような機械学習特有の諸問題についても簡単にまとまっていますので、一読して警戒レベルを上げておくのもいいかも(苦笑)。
euske.github.io

 

 

蛇足の追記

この記事の本来のターゲットである「深層学習を使った研究を始めたいけど、周りも含めて機械学習の経験が少ない人」はここから先を読む必要は特にありません。

実験用 GPU 環境をどう準備したらいい?(非情報系が機械学習を使う研究をしたいとき) - 木曜不足

個人的には非情報系ならなおさらColab等の環境が良い気が。より安定するPro+(月$50)にしても自前でPC持つコスト(PC代、電気代、メンテ時間)考えるとペイするかな。NotebookをGitHubにpushして共有すればアドバイスももらいやすい

2022/07/26 13:26

9割同意ですが、そう書かなかった理由がいくつかあります。

GPU クラウドは高い」と言われる

Google Colab Pro は破格の安さ、めっちゃお得、むしろしない理由がない、くらい猛プッシュしてるんです。
ただ、それでも「月 1000円は高いですよね」と言われてしまう。
クラウドの安さを実感・納得してもらうには、理屈と正論は無力で、知識と経験が必要なんですよね。

また、従量制のクラウド料金は天井知らずなので、予算を立てづらいという問題もあります(研究室だけじゃなく企業でも)。
それを説得するにはやっぱり実績が物を言うわけで、ここにもニワトリタマゴ問題が。

PC 購入の予算なら研究室から出してもらえる

見えている範囲からの勝手な推測なので間違っているかもしれませんが、非情報系の研究室の方々も深層学習は大きな鍵になる予感を持っていて、でもノウハウが無いから自発的に声を上げた学生さんに期待を寄せているという雰囲気を感じます。
その期待の表れでしょうか、深層学習研究用の PC を購入する予算が、論文執筆用のノート PC レベルではなく、それなりの GPU を積んだゲーミング PC レベルでちゃんと支給されている、という認識。
つまり、PC を買うか買わないかという問題はすでにクリアして、何を買うかという問題に移っているわけです。

ただそこで RTX 3070(8GB) を買いました~、みたいになることも多くて、もちろん全然ダメじゃないけど、事前に相談してくれたら RTX 3060(12GB) を勧められたのになあ、というのがまさにこの記事を書いた動機です。

Google Colab 用の運用ノウハウが必要

Linux や docker は身につけたことが他でも役立つ、いわゆる「つぶしがきく」ので、そこでの苦労は報われるチャンスが多いです。
一方 Google Colab をホームグラウンドとして真面目に深層学習研究しようと思ったら、セッション切れ対策など Google Colab 固有のノウハウが必要になり、これは他の場所では基本的に役立ちません。
Google Colab は共有には手軽で便利ですが、初手の選択肢としては難点も多いかなあ、というのが個人的な感想。


冒頭に書いたように「あくまで私見」なので、他の意見にも耳を傾けることは全然いいことだと思います。

*1:CPU と GPU のメモリが共有で十分な容量があると、後述の GPU メモリ量の問題が大きく軽減されますし、推論コストの無視できない割合を占める CPU から GPU へのデータ転送もなくなるので、環境さえ整えば一番手に躍り出る可能性は十分あります。それにはまず cuDNN 相当品を Apple が作ってくれないと……。

*2:モデルやデータによって適したミニバッチサイズは違いますが、だいたい 16~100 くらいの数になると考えてください。それを、メモリエラーが出なくなるまで減らしたら、ミニバッチサイズが 2 になった、なんて悲しい出来事も本当によくあるんです……。

*3:ミニバッチサイズが大きいほどいい/小さいほどいい、という単純な話ではなく、収束の速さと性能のバランスを見た適切な値を選ぶ必要があります。

*4:予算が潤沢なら、マルチ GPU のための NVLink を備えているか等、メモリ以外にも必須要件が出てきます。

*5:RTX 3070 に 16GB 版が出る計画があったらしいのですが、キャンセルになったそうな。残念。

*6:厳密には違いはありますが、深層学習の研究をする上でその違いが問題になることはまずありません。

*7:CentOS はサポート終了しているので、今だと RHEL 互換の RockyLinux とかでしょうか。使ったことがないからわからない……。

*8:近年の機械学習の学会では、実装を共有して検証可能にすることが論文をアクセプトする条件になっていることも珍しくありません。

*9:Google Colab のリソース上限の正確な値はわかりません。