Pages

Sunday, May 24, 2020

精度が重要な「学習」と速度が求められる「推論」 AIプロセッサーの昨今 (1/3) - ASCII.jp

 前回NVIDIAのGPUロードマップを解説したので、AIの講義が一回空いてしまったが、前々回の連載562回までで「そもそもAI(正確にはConvolutional Neural Network)はどんな計算処理をしているのか」は理解いただけたと思う。

 もちろん連載562回は2013年ごろのネットワークの話なので古典であり、そこから急速にネットワークそのものも進化しているし、新しいネットワーク構造も登場している。

 さらに言えば昨今は教師なし学習の分野もずいぶん盛んである。こうした新しい分野では多少要求されるニーズは変わってくると言えば変わってくるのだが、それでも大きく要求されるものが変化する、ということは現在のところはなく、基本的には積和演算(MAC:Multiply-ACcumulate operation)が山盛りという形になっている。

 ただし、研究が進むにつれて学習(Training)と推論(Inference)では、求められる要件に違いが出てき始めた。

学習には大量の演算が必要
これにはGPUが有利

 学習に関して言えば、もちろん計算量も半端ではないし、かつ計算精度もあまり極端には落とせないので、ひたすら計算機をブン廻す必要がある。

 こうなってくると、大量のMAC演算を行なうことに特化した構造になっているGPUは非常に有利である。

 またNVIDIAは早い時期からDNN(Deep Neural Network:深層学習)に取り組んでおり、CUDAでDNNを実行するためのさまざまな環境やライブラリーを提供していたこともあって、必然的に学習=NVIDIAのGPUを並べてCUDAで記述、という図式が出来上がることになった。

速度が求められる推論は
どこまで精度を落とすかがカギ

 その一方で推論は「精度より速度」という傾向になった。計算精度を引き上げてもそれほど推論の精度は上がらず、逆に計算精度を落としても推論の精度が落ちにくいことが見えてきたからだ。

 学習の時にはFP32(単精度浮動小数点演算)を利用して計算しても、そこで学習したネットワークを利用して推論する場合は、FP16(半精度浮動小数点演算)や、場合によってはINT8(8bit整数)でも結構いけることになった。

 もちろん浮動小数点演算を前提にしたネットワークにそのまま整数演算を通せるわけではないのでやや手直しは必要だが、整数演算にすることでより小規模な演算回路で済むし、データも8bit幅で済むため、SIMD形式で処理すれば同時に処理できる数が増えることになる。

 そして推論に関しては、計算精度を上げるよりも層数を増やした方が有利という傾向が見え始めた。

 例えるなら、16bitで演算する5層のネットワークより、8bitで演算する10層の方が高い精度を出せる感じだ。

 ネットワークの層数を増やすと必要になる計算量やメモリー利用量が増えるので、これを計算精度を落とすことで帳尻を合わせる方が有利なのが明確に見え始めた。

 加えて言うと、実際のアプリケーションの利用の仕方を考えると、認識精度が高いけど遅いよりも、認識精度が少し低くても高速な方が使いやすいという要望も上がってきた。

 例えば顔認識。通常ならカメラを組み合わせて、撮影した画像をリアルタイムで処理して「これは誰か」、あるいは「これはなにか」を判断するわけだが、その際に例えば毎秒10回判断して、その結果を統計を取るようにした方が確度が高い、というアプリケーション側からの要件である。

 どんなに精度を上げても、100%というのはなかなか到達しない。通常は70%から80%の確度になるわけで、そうであれば顔の向きを少しづつ変えながら撮影して、その結果を判断することで、より確実性を増せるという話になる。

 こうなると、推論側に関しては「どこまで精度を落とせるか」という新たなチャレンジが発生することになった。通常CPUにしてもGPUにしてもDSPにしても、2013年の時点で扱えるのは下表のあたりだった。

整数 INT 8/16/32/64
浮動小数点 FP32/64

 ところが、まずFP32では大きすぎるということで、より精度を落としたFP16をサポートするハードウェアが出始めた。FP32というのは連載468回で言うところのBinary32、FP16というのは同じくBinary16に相当する。

 これでデータの幅が半分になったので、同じ演算器を使っても理論上は倍の性能が出ることになる。ただFP16では仮数部が大きすぎ、逆に指数部が小さすぎるという要求が出てくるようになった。

 これはネットワーク内で利用する係数の問題だが、一部のネットワークは桁数が異様に多い関係で、FP16では処理ができないケースが発生した。

 これに向けて登場したのが、BFloat16である。BFloat16は塩田氏の記事で解説があるが、仮数部を7bit(有効桁数2桁)に減らし、その分指数部を8桁に増やしたフォーマットである。

 これはIEEE-754には定義されていない、いわば業界標準フォーマットであるが、まずインテルで採用され、次いでGoogle TPU、Arm、NVIDIA、AMDなどで相次いで採用されるようになった。

Let's block ads! (Why?)



"重要な" - Google ニュース
May 25, 2020 at 10:00AM
https://ift.tt/3c1xGq6

精度が重要な「学習」と速度が求められる「推論」 AIプロセッサーの昨今 (1/3) - ASCII.jp
"重要な" - Google ニュース
https://ift.tt/37j3R1J
Shoes Man Tutorial
Pos News Update
Meme Update
Korean Entertainment News
Japan News Update

No comments:

Post a Comment