米Googleや米Microsoftが、AI(人工知能)クラウドのバックエンドで使用するディープラーニング専用プロセッサの開発でしのぎを削っている。先行するGoogleに対抗すべくMicrosoftが採用した「奥の手」は、「謎の浮動小数点精度」だった。2017年8月末の「Hot Chips 29」では、GoogleやMicrosoftといったクラウドの巨人が、ディープラーニング専用プロセッサを独自開発し、AIクラウドの世界で壮絶な「コンピュータの処理能力の物量戦」を繰り広げている実態が、改めて明らかになった。
大手クラウド事業者は近年、クラウドのAIサービスの提供に力を入れている。これらのサービスは、画像認識や音声認識などユーザーがアップロードしたデータに含まれる「被写体」や「意味」を認識する「推論(inference)」のサービスと、ユーザーが個別のモデルを開発できる「学習(training)」のサービスとに大別できる(表)。
画像認識 | 動画認識 | 音声認識 | 自然言語分析 | 翻訳 | 汎用サービス | |
---|---|---|---|---|---|---|
米Amazon Web Services | Amazon Relognition | Amazon Lex | Amazon Lex | Amazon Machine Learning | ||
米Google | Cloud Vision API | Cloud Video Intelligence API | Cloud Speech API | Cloud Natural Language API | Cloud Translation API | Cloud Machine Learning Engine |
米Microsoft | Computer Vision API | Video API | Bing Speech API | Text Analytics API | Translator Text API | Azure Machine Learning |
処理内容 | 推論 | 推論 | 推論 | 推論 | 推論 | 学習/推論 |
機械学習における学習(training)とは、モデルの特徴や重みをランダムに決めて推論を実行し、そうした推論の試行を何百万回と繰り返すことで、最適な特徴や重みを探し出す作業のことを言う。
何億人ものユーザーが利用する推論、その処理は膨大
学習と推論を比較すると、推論を何百万回と繰り返す学習の方が処理の負荷が重いと考えがちだ。しかしクラウドのAIサービスという視点で見ると、推論の負荷は決して小さくない。なぜなら学習はモデルを完成させればそれでお終いだが、推論ではユーザーが画像認識や音声認識を利用するたびに処理が発生し続けるためだ。
特にGoogleのように数億人のAndroidユーザーにAIサービスを提供するとなると、その負荷は膨大になる。本特集の第1回で紹介したように、Googleは2013年に「スマートフォンのユーザーが1日当たり3分間、音声認識を利用する」というシナリオに基づいて、推論に必要となるITインフラストラクチャーの規模を見積もっている。その結果、CPUだけで全ての音声認識の推論を実行しようとすると、当時のGoogleが保有する全データセンターの2~3倍に相当する処理能力が必要になることが分かった。
6万5536個の行列演算ユニットを実装したGoogle
このような膨大な推論の処理に対応するため、Googleは2015年に推論に特化したAI専用チップである「TPU」を開発した。TPUのポイントは、ディープラーニングの処理の実態である「行列のかけ算と足し算(積和演算)」に特化した行列演算ユニットを、1個のプロセッサに6万5536個も搭載したことにあった。TPUが1サイクル当たりに実行できる行列演算の回数は、CPUの数千倍以上にも達する。
TPUが1個のプロセッサに6万5536個もの行列演算ユニットを搭載できたのは、行列演算に使用する数値の精度を抑えることによって、行列演算ユニットに必要となるトランジスタ数を減らしたからだ。CPUやGPUが搭載する行列演算ユニットは、倍精度(FP64、64ビット)や単精度(FP32、32ビット)、半精度(FP16、16ビット)の浮動小数点演算を実行する。それに対してTPUの行列演算ユニットは、8ビット整数で演算する。
Googleは、従来は32ビットや16ビットの浮動小数点で処理していたニューラルネットワークの演算を、8ビット整数で処理するために「量子化」という手法を採用した。ここでの量子化とは、モデルの中の特定の値領域ではわずかに異なる値が並んでいることに着目し、その領域の最大値と最小値の間の数値を256段階に振り分けることを言う。32ビット(4バイト)で表現される非常に広い値の範囲を、8ビット(1バイト)で表現できる256段階に押し込めることで、データ量を大幅に圧縮するわけだ。