最終更新日:
同氏らが開発したBERTを使った質疑応答システムは、優れた精度(正答率)を実現しながらも応答までの推論時間が9秒を超えるものでした。こうした推論時間では製品としては使いものにならないので、推論時間が短縮するように設計を見直しました。再設計は、以下のような4つの観点から実行されました。
- 回答を絞り込む処理をマルチスレッド化。
- BERTモデルのトークンシーケンス長を短縮。
- BERTモデルを量子化して、モデルサイズを縮小。
- より小さいサイズのBERTモデルの実装。
以上のような再設計を実施すると推論時間は短縮しますが、再設計後の動作環境によっては精度の許容しがたい低下も認められました。推論時間と精度はトレードオフの関係にあるのです。
こうしたトレードオフのなかから最適な動作環境を選択するために行ったのが、さまざまな動作環境下での推論時間と精度を散布図にプロットして、パレート効率性を表す曲線であるパレートフロンティアを発見することでした。この曲線上にプロットされた動作環境のなかで許容できる推論時間の範囲内にあるモデルが、製品版としてリリースできる最適なモデルとなります。
精度と推論時間のトレードオフは、多くのAIシステムで生じる問題です。この問題の解決策として、この記事で解説されたパレートフロントを用いる方法は汎用的かつ有益と言えるでしょう。
なお、以下の記事本文はLester Solbakken氏に直接コンタクトをとり、翻訳許可を頂いたうえで翻訳したものです。また、翻訳記事の内容は同氏の見解であり、特定の国や地域ならび組織や団体を代表するものではなく、翻訳者およびAINOW編集部の主義主張を表明したものでもありません。
目次
いかにして製品化を目指した質疑応答アプリケーションを作り、回答時間を2桁以上短縮したのか
あるタスクで最先端の性能を上回る機械学習システムを作成したとしよう。そのシステムを分類正答率、F1スコア、AUC(※訳註1)のような目的指標に合わせて最適化したとする。次に、それを使ってWebサービスを作成したいとしよう。この時にはユーザに結果を届けるまでの時間やコストなど、他の目的がより重要になってくる。
軸に使う評価指標によって、ROC曲線とPR曲線の2種類がある。ROC曲線は横軸に偽陽性率(false positive rate:FPR)を、縦軸に再現率(Recall, true positive rate:TPR)を使う。PR曲線は縦軸に適合率(Precision)を、横軸に再現率(Recall,true positive rate:TPR)を使う。PR曲線は、機械の故障検知のような偏りが大きいデータの予測に強い。
AUCの詳細は、オンライン機械学習講座codexaの記事『機械学習の評価指標 分類編:適合率や再現率、AUC(ROC曲線、PR曲線)を解説』を参照。
精度とパフォーマンスという2つの目的は、相反するのが常である。より精度の高いモデルは大規模で、演算に計算コストがかかることがよくある。そのようなモデルを製品として使用するために、モデルの精度や複雑さを低減するなどのさまざまな最適化がしばしば導入される。こうした最適化は計算上のコストとエネルギー消費量の削減には有益だが、残念ながら精度に悪影響を及ぼしてしまう。
精度が重要でない場合、推論時間を大幅に短縮できるのは明らかだ。同様に、非常に精確な応答は高いコストで得られる。最終的にどのソリューションを選択するかは、これらの両極端の間のどこかにある。最良のソリューションを選択するために役立つテクニックは、精度とコストの観点から考えられ得るソリューションを列挙することだ。もはやそれを凌駕するものがないソリューションの集合はパレートフロンティアと呼ばれ、精度とコストの間の最良のトレードオフを特定する。
以前のブログ記事では、オープンドメインの質疑応答で最先端の精度を再現するサービングシステムを紹介した。このシステムはPythonベースの研究システムであるFacebookのDense Passage Retrieval (DPR)をベースにして、Vespa.aiを使って構築した。Vespa.aiとはオープンソースのビッグデータサービスエンジンで、検索とランキングに関する高速な類似性検索と機械学習モデルをネイティブにサポートしているため、質疑応答のようなタスクに対して使うのに最適だ。こうした結果、ひとつの質問を受けて正確な答えを返すウェブサービスが完成した。
このシステムはDPRの結果を再現し、優れた精度指標を実現していたが、レスポンスタイムはエンドツーエンドのレイテンシで測定してみると、最初は貧弱なものだった。この記事では、製品化するシステムのパフォーマンスを許容できるレベルにするために行ったさまざまな最適化について説明する。
Vespa.aiはアプリ開発向けに作られているので、サービス時間の最適化のためにかなりの数のオプションを持っている。私たちは特に、クエリごとに複数のワーカースレッドを使用してドキュメントを検索してランク付けするVespa.aiの能力を重要な効果を得るために使った。しかし、この質疑応答アプリケーションの主な計算コストは、2つのBERTモデルが行う評価にあった。私たちが答えたい疑問のひとつは、完全な精度を持つ小さなモデルが、量子化されたパラメータ(※訳註2)を持つ大きなモデルよりも好ましいかどうかである。さまざまな最適化のメリットを評価するために、パレートフロンティアを用いてソリューションを展開してみよう。
まずはサービングシステムの概要を把握し、どの部分が演算コストを要するのかを見極めていく。実装の詳細については、このブログ記事シリーズの以前の記事を参照してほしい。
質疑応答システムの仕組み
システムのタスクは、自然言語で与えられた質問に応答して、テキストの回答を生成することである。こうしたタスクには、主として3つの処理段階がある。
- エンコーダが質問の表現ベクトルを生成する。
- リトリーバは、2,100万件の索引付けされた(回答の候補となる)事典項目(※訳註3)の中から最近傍探索を行う。
- リーダは、最も関連性の高い事典項目を見つけ、最終的な答えを抽出する。
以下の図は以上の処理過程を図解したものだ。
エンコーダはまず、質問からトークン化された表現を作成する。このトークン ID が付与されたベクトルは、エンコーダのBERTモデルへの入力として送信される。このBERTモデルは、12のレイヤーと768の隠れレイヤーサイズを持つ標準的なBERTをベースにしたものだ。最後の隠れレイヤーの状態が、質問の表現ベクトルとして使用される。上の図に見られるように、こうした処理は主としてVespaのステートレスコンテナ層で起こる。トークンと表現ベクトルは、クエリを実行するためにすべてのコンテンツノードに(「散発的に」)渡される。
コンテンツノード上では、事典項目はそれ自身の表現ベクトルによってインデックス化されている。事典項目のベクトルは、質問と事典項目自体のベクトルの間のユークリッド距離が示す類似性を算出するために使われる。さらに最近傍探索を実行するためにHNSWアルゴリズムが適用される。ユークリッド距離が最も小さい10個の事典項目が次の処理段階に送られる。
各コンテンツノードに対して実行される第2段階のランキング処理では、リーダBERTモデルが評価する。このモデルは、エンコーダモデルと同様に12層、隠れレイヤーが768のBERTベースのものである。クエリと事典項目から生成されたトークン表現が組み合わさって、リーダBERTモデルの入力となる。リーダモデルは、回答となる確率に関わる3つの値を生成する:その3つとは、関連性スコアと事典項目のトークン配列から得られる回答の最初と最後のインデックスである。関連性スコアが最も高かった事典項目が勝者に選ばれ、そのトークン表現がステートレスレイヤーに返される。そこでは、カスタムコードが開始インデックスと終了インデックスを使用して最良の文字長を抽出し、トークン化を解除して、結果としてテキストの回答を返す。
- 入力された質問が、エンコーダによってトークン表現に変換される。
- 質問のトークン表現はエンコーダのBERTモデルに渡され、ベクトル表現に変換される。
- 質問のベクトル表現と事典項目のベクトル表現を使ってユークリッド距離に基づいた類似性が算出され、最近傍探索が実行される。
- ユークリッド距離が小さい10個の事典項目が、リーダBERTモデルに渡される。
- リーダBERTモデルは、渡された事典項目に関して関連性スコアと回答となるテキストの最初と最後のインデックスを生成する。
- 関連性スコアがもっとも高い事典項目が回答に選ばれ、その事典項目のトークン表現が返される。
- 返された事典項目のトークン表現はトークン化から解除された後、テキストとして回答が生成される。
後述するように、レイテンシが生じる主要な処理はリーダBERTモデルが関わる④~⑥である。これらの処理におけるレイテンシ短縮方法については後述の解説を参照。
以上のように、回答を出力するまでに大変な作業がある。以下では、「2015年にツール・ド・フランスを制したのは誰か」という質問に対して、最も関連性の高い事典項目を検索し、正解の「Chris Froome」を抽出した回答例を紹介する。
“relevant”:1 | 関連性スコアを表す。「1」とは関連性スコアが1位を意味し、回答となるデータとなる。 |
“prediction”:”Chris Froome” | 回答となるテキスト情報。このデータの場合は、2015年ツール・ド・フランスの優勝者の氏名である「Chris Froome」。 |
“context” | 事典項目の内容となるテキスト情報。このデータの場合は、2015年ツール・ド・フランスの解説となっている。 |
“content_title” | 事典項目のタイトル。このデータの場合は、「2015年ツール・ド・フランス」。 |
性能を測定するために、Intel Xeon Gold 6240プロセッサと200GBのRAMとSSDディスクを搭載した1台のマシンにシステムを導入した。3,610問の問題に対してシステムを評価し、平均待ち時間と完全一致スコアを記録した。当初、システムは40.64の完全一致スコアを達成した。パフォーマンスを最適化するための検討が行われる前に、上記の3つの処理段階で費やされた時間を以下に記す。
- エンコーディングモデル:300ミリ秒
- 最近傍探索:13ミリ秒
- リーダによる回答のTOP10ランキング:9085ミリ秒
明らかに、エンドツーエンドのトータルレイテンシが9.4秒というのは、サービスとしては決して許容できない。以下では、レイテンシを100ミリ秒以下に下げていく。
マルチスレッド検索ランキング
手始めに手を加えるのは、以上に解説した処理で最も演算コストが高いステップであるリーダの処理段階だ。デフォルトでは、Vespaは単一のスレッド上でクエリのすべてのランキングを行う。こうしたデフォルト設定は、計算コストが低い場合にはスループットを最大化するので合理的である。今回の場合では、リーダモデルが単一のスレッド上でトップ10の各事典項目を順に評価することを意味する。この結果、クエリのレイテンシが長くなるのだ。
しかし、Vespaには検索ごとに複数のスレッドを使用するオプションがある。複数スレッドを使用するように値を設定すると、エンドツーエンドの平均レイテンシが2.04秒に下がり、完全一致スコアに影響を与えることなく4倍以上の改善が見られる。
リーダモデルがバッチ単位で評価していないことを明確にする価値があるだろう。その理由は、Vespaのランキングフレームワークにおいては、ランキングされる表現が事典項目とクエリのペアから算出されるからだ。対してBERTモデルの場合、評価時間はバッチサイズに比例するため(※訳註7)、事典項目とクエリをペアにする処理は評価時間に関して重要ではない。BERTモデルの評価時間がバッチサイズに比例する理由のひとつとして挙げられるのは、BERTでは3次元以上のテンソルを持つテンソル乗算が実行されており、こうした乗算ではハードウェアに最適化された行列と行列の乗算が繰り返されるからだ。
一般的に、Vespaには追加のコンテンツノードに作業負荷を簡単に分散させるなどして、パフォーマンスを調整するための多くのオプションがある。私たちはこの記事で負荷分散を追求しないが、その詳細についてはVespaサービングスケーリングガイドを参照すること。
トークンシーケンス長
BERTモデルの最も決定的かつ顕著な特徴のひとつは、フルattetionレイヤーであることだ。この特徴は言語理解における重要なブレークスルーであったが、評価にO(n²)の処理時間を要してしまうという不幸な結果を生む。
それゆえ、BERTモデルに入力されるトークンシーケンス長は、推論時間に大きく影響する。当初、エンコーダのBERTモデルの入力長は128であったが30に短縮することで、精度を損なうことなく推論時間を300ミリ秒から125ミリ秒に短縮できた。
同様に、リーダモデルの入力長も当初は380だった。これを128に減らすことで、平均レイテンシを1.9秒から741ミリ秒に短縮し、大幅な削減を実現した。しかし、質問と事典項目の組み合わせによっては128よりも長いトークン配列になることがあるため、精度は低下する。その結果、完全一致スコアは39.61に減少した。
エンコーダとリーダの両方のモデルは動的なトークン長の入力をサポートしているが、Vespaは現在固定長の入力しかサポートしていない。しかし、これは近い将来に修正される予定だ。要約すると、エンコーダモデルとリーダモデルのトークン入力の長さを短くすると、3倍のスピードアップになる。
モデルの量子化
ニューラルネットワークモデルは、単精度の浮動小数点数を用いて学習するのが一般的だ。しかし、質疑応答システムの製品版の推論に関して、このレベルの精度が必ずしも必要ではないことが示されている。パラメータは、精度を大きく落とすことなく、はるかに小さな整数表現に変換できる。パラメータを32ビットの浮動小数点から8ビットの整数に変換することで、モデルサイズを75%削減できる。さらに重要なのは、量子化によって整数演算の実行速度が大幅に向上するのだ。AVX512ベクトルニューラルネットワーク命令(VNNI)をサポートする最新のCPUは、INT8の推論性能を高速化するように設計されている。さらにこのような量子化モデルの演算では、消費電力がより少なくて済む。
リーダモデルを量子化すると、そのサイズは435Mbから109Mbに減少する。システムのレイテンシは平均して374ミリ秒に低下する。量子化は精度に少し残念な影響を与え、完全一致スコアが37.98に低下する。エンコーダモデルを量子化した場合も同様にサイズが小さくなり、システムの評価時間は284ミリ秒に低下する。この時、完全一致スコアは37.87に低下する。
まとめると、リーダモデルとエンコーダモデルの両方を量子化することで、さらに3倍の高速化を実現する。
ミニチュアモデル
この時点まで、エンコーダとリーダのモデルは両方とも事前に訓練されたBERTベースのモデルに基づいており、そのモデルは12のレイヤーを含み、768の隠れレイヤーの次元サイズを持ち、したがって約1億1,000万個のパラメータを持っている。これらのモデルは、特に時間的制約のある環境で使用される場合には、かなり大きなモデルである。しかし、論文「Well-Reading Students Learn Better.The Importance of Pre-training Compact Models(よく読む生徒はより良く学ぶ:コンパクトなモデルの事前学習の重要性において)」では、著者らはより小さなモデルでも実際に非常にうまく機能することを示している。この論文で言及されている「ミニチュア」モデルは、Transformersモデルレポジトリで見つけられる。
DPRリポジトリに記載されている以下のような事前学習済みのBERTミニチュアモデルに基づいて、私たちは新しいリーダモデルを訓練した。
- 中モデル(8層、隠れサイズ512)
- 小モデル(4層、隠れサイズ512)
- ミニモデル(4層、隠れサイズ256)
- 極小モデル(2層、隠れサイズ128)
また、各モデルを量子化した。(5つのリーダモデル、量子化の有無、量子化されたエンコーダモデルの有無の組み合わせから構成される)全20モデルの完全一致スコアと平均レイテンシに関する完全な概要は、以下の表のように示せる。
以上の結果をプロットしたグラフが以下。
上の図では、赤い線がパレートフロンティアを表している。この曲線に沿ったポイントは、上の表では太字で示されている。これらの点は完全一致スコアとレイテンシの間の最良のトレードオフを表しており、この曲線に沿った各点について、両方の測定値に関して優れている点は他にないことを意味している(※訳註8)。
ここで見られる興味深い結果のひとつは、一般的に、量子化モデルはより高い精度の他のモデルを凌駕していることだ。例えば、量子化された中サイズのモデルは、精度の高い小サイズのモデルよりも完全一致スコアとレイテンシで優れている。つまり、この場合、量子化によって精度が低下しても、量子化されていないサイズの小さいモデルよりも、量子化されている大きいモデルを選択する方が有益なのだ。
パレートフロンティアは、客観的に最適なソリューションを視覚化し、私たちの主観的な選好によってそれを見つけるための指針となる。上記のテストは、1台のIntel Xeon Gold 6240マシンで実行された。より強力なプロセッサは全体的にレイテンシを下げるが、パレートフロンティアの全体的な形状は変わらない。そして、選択すべき的確なソリューションは、レイテンシとハードウェアの予算に基づいている。例えば、演算能力の十分なスケールアップが可能な程度にリソースを持つ組織は、パレートフロンティアに沿って右に移動することが正当化される(※訳註9)。規模の経済は、サービスを実行可能なものにするためのハードウェア投資とエネルギー消費のコストを軽減できる。このようなソリューションは、十分なリソースがない他の企業にとっては手の届かないものかも知れない。
許容できるレイテンシが200ミリ秒と仮定すると、演算能力強化前において製品化できるのは極小モデル、ミニモデル、小モデル、中モデルの4つである(以下の画像上部のグラフ参照)。対して演算能力を強化した場合、この4つに加えてベースモデルも製品化できる。この記事における「パレートフロンティアに沿って右に移動することが正当化される」とは、レイテンシが短縮した結果、パレートフロンティアの右側にプロットされたモデルも製品化できることを述べている。
質疑応答システムにおけるパレートフロンティアの比較
質疑応答システムにおけるパレートフロンティアの比較(画像は翻訳者作成)
以上をまとめると
質疑応答システムの詳細と読者自身で実行する方法については、GitHubにあるサンプルアプリケーションの手引きを参照してください。
結論
要約すると、以上ではパフォーマンスの低い研究用アプリケーションを製品化に適したレベルにまで引き上げた。推論時間がフルモデルの9.4秒から極小モデルでは70ミリ秒まで短縮し、130倍のスピードアップを実現した。残念ながら、こうした処理スピードのレベルに到達するには、完全一致スコアも大幅に低下することがわかった。最良の選択は、フルモデルと極小モデルという両極端の間のどこかにある。このアプリケーションを本番環境で使用する場合、より強力なハードウェアを使用して、許容可能な完全一致スコアを保ちながらレイテンシを100ミリ秒以下にできる。
この記事で解説した範囲を超えてしまっているがために、試していない最適化がまだいくつかある。例えば、論文「FastFormers: Highly Efficient Transformer Models for Natural Language Understanding(FastFormers:自然言語理解のための高効率なTransformerモデル)」では、モデル・プルーニングなど、より効率的な推論のための追加の最適化が論じられている。また、新世代のBERTモデルは、フルattentionのメカニズムに関連するパフォーマンス問題を緩和しようとしている。例えば、Big Birdアーキテクチャは有望と思われる。
なお、ミニチュアエンコーダモデルの訓練は省略した。レイテンシの観点からは、質問のエンコーディングにミニチュアBERTモデルを使用すると、質問と事典項目のベクトル表現が短くなる追加的な利点がある。そのため、近似最近傍探索がより効率的になる。しかし、このソリューションは精度の大幅な低下をもたらす可能性が高く、また(最近傍探索を行う)ニューラルネットワークで費やされる時間はレイテンシが生じる重要な要因ではない。
コンテンツノードを追加することで、作業負荷を分散できる。このソリューションはレイテンシを減らすことにはならないだろうが、リーダモデルで評価できる事典項目の数を増やすことになるだろう。このソリューションについては、次回のブログ記事で解説する。
原文
『From research to production: scaling a state-of-the-art machine learning system』
著者
Lester Solbakken
翻訳
吉本幸記(フリーライター、JDLA Deep Learning for GENERAL 2019 #1取得)
編集
おざけん