AIにおけるGPUとCPU
GPU
グラフィックス・プロセッシング・ユニットの略。名前の通り、パソコンの画面を描写するための処理を行うパーツ
GPUの重要性
ゲームの映像が分かりやすいが、3D描写の技術が向上したことで、かつては考えられないほどのリアルな映像を3Dで再現することが可能となった。
某ゲームシリーズのマスコットキャラクター。上が1996年(2Dのドット絵)、下が2013年(3Dモデル)
たが、2Dの映像と比べ、3Dの映像は、
・2Dモデルはxy座標で表現されるが、3Dモデルはxyzと、1軸多い座標で表現する必要がある
・光や影の描写が必要になる
・「どこから見るか」という概念が加わる
といった特徴があるため複雑な計算が必要となる(※)
※逆に、2Dモデルで回転モーションの様な複雑な処理をするためには、あらかじめドット差分を作っておき、それをアニメーションで見せるといった方法しかない。GPUとCPUさえあれば、複雑なモーションも楽に(さらに言えば高速で)行うことができるのが3Dとも言える
3Dモデル技術の発達により、モデルを作成する技術がない人でもモデルを利用することが可能となった
(Vチューバーに用いられるアバターには2Dのものもあるが、描画技術は3D由来のものを用いている)
3D映像を描写するための計算は少数点を含むもので、浮動小数点演算という手法で演算がなされる(詳細は最後のおまけにて。一言でいうならば多様な数字を取り扱うためのコンピュータ用演算技法)。この演算を高速で並列実行するための計算機がGPU
GPUの性能の基準として、1秒間に何回浮動小数点演算を行うことができるかという指標があり、フロップスと呼ぶ。例えば、NVIDIAの最新GPU「GeForce RTX 2080 Ti」は、4352基ものコア(演算ユニット)を搭載し、浮動小数点演算性能は13.4テラ・フロップス(単精度)にも達する。
GPUをAIに
コンピュータでできることを拡大していくなかで、比較的単純な計算を同時並行で高速でできるというGPUの利点をグラフィック処理だけにしか使わないのはもったいない、という発想が出てきた。
グラフィック処理という限定された目的ではなく、幅広い用途で用いるという概念を、GPGPU(ジェネラル・パーパス・コンピューティング・オン・GPU)と呼ぶ。AIにGPUを使うという発想も、GPGPUの一例といえる。
例えば、犬と猫を見分ける画像認識AIを作る場合、画像の各部分に対してそれが犬に近いか猫に近いか判断させ、各条件をどの程度重視するかという重み付けと組み合わせ、総合的にその画像が犬か猫かを判断させる(※)。
判断材料、重み付けの程度はいずれもコンピュータ上では数字の羅列なので、膨大な数字を計算する能力が求められる。さらに、このときの計算は数学的には行列の積演算と呼ばれる処理で、これは3Dモデルの移動処理、回転処理でも用いられる。つまり、AIの判断様式とGPUはそもそも相性が非常に良い。
※例は画像認識だが、例えば将棋のAIも、盤面の形における各要素を重み付けして有利不利を判断している
AIにおけるCPU
ただし、結局のところ、GPUの利点は比較的単純な計算の処理能力である。
一方で複雑な処理も含めた多様な処理を行うことができる、データの保存領域が大きいという利点がCPUにはある(そもそもがコンピュータの核であり、汎用的なプログラムの実行やデバイスの制御を行うのがCPU)。
このため、近年のGPUを用いるAIであっても処理やデータ保存のためにCPU⇔GPUのデータ受け渡しが発生するが、いかにGPUの性能を上げても、CPUの性能がボトルネックになってしまう場合がある。元々GPUのメーカーとして有名だったNVIDIAがCPUに参入した理由の一つがCPUのボトルネック問題である。
まとめ
AIの「思考法」との相性の良さからGPUに着目する、という考え方は既に界隈の一般常識となりつつあり、現在ではCPUの性能も底上げすることによる性能向上が模索されている。そもそもAIはコンピュータの利用法の一つであるのだから、CPUに着目することはある種の回帰とも言えよう。
おまけ 浮動小数点演算とは
数字を、X × Y ^ Zの形式で表現するのが浮動小数点で、この形式で演算をするのが浮動小数点演算
普通の形式でやればいいのに、なぜこのような面倒な方法をするのか?
まず、数字1.23を、普通の書式(固定小数点)と浮動小数点で、4桁分の枠を使って表現すると、
固定:1.230
浮動:1.23*10^ 0
となる
固定小数点では整数部分で1桁、少数点部分で3桁用いている。
一方浮動少数点では、最初の1.23の部分(ここを基数という)で3桁、10^ 0の0部分(指数部)で1桁使っている
では、4桁分の枠を上の例のように用いた場合、固定小数点と浮動小数点のそれぞれで、どれだけの数を表現することができるか
固定小数点の場合は、
最小:0.000
最大:9.999
一方、浮動小数点では、
最小:0.00*10^ 0(0.00)
最大:9.99*10^ 9(9990000000)
と、同じ「桁数」でも、浮動小数点の方が圧倒的に多様な数を表現することができる
(しかも、この表現方法は非効率で、最適化させればもう少し伸びしろがある)
一方、浮動小数点演算には計算時誤差が発生し得るというデメリットがある。
極端な例を上げると、上記の4桁の浮動小数点で、
0.01*10^ 1 + 9.98*10^ 9
は、9.98*10^ 9より少し大きな数となるはずだが、桁数表示の関係で、9.98*10^ 9のままになってしまう。
他、コンピュータ計算では2進法を用いるが、これを10進法に変換する段階で誤差が生まれることもある。例えば1.1+0.1は明らかに1.2だが、2進法の表記方法によっては「限りなく1.1に近い値」+「限りなく0.1に近い値」の計算となり、解がずれる場合がある。
どちらにせよ普通に使う分には気にならない誤差だが、厳密な計算が必要な場面では致命傷となりうる。現実に起きた事例としては、湾岸戦争の際、この計算誤差のせいで、米軍のパトリオットミサイルがイラクのスカッドミサイルの迎撃に失敗したことがある。
参考
日経XTREND「[AI基礎講座]AIの進化支える「GPU」、CPUと何が違う?」
https://xtrend.nikkei.com/atcl/contents/18/00163/00007/
おとゲマZ
http://www.charatsoft.com/develop/otogema/index.htm
ITの学び「固定小数点数と浮動小数点数の違いを調べよう!」
https://www.google.com/amp/s/itmanabi.com/fixed-floating/%3famp=1
ASCII.jp「いまさら聞けないIT用語集 浮動小数点演算の単精度と倍精度って?」
https://www.google.com/amp/s/ascii.jp/elem/000/001/713/1713959/amp/
カゴヤのサーバー研究室「【図解】なぜGPUはディープラーニング・AI開発に向いているの?選び方は?NVIDIAさんに聞いてきました」
https://www.kagoya.jp/howto/rentalserver/GPU_deeplearning_AI/