ニューラルネットを作るにあたって,experimentationとproductionには要件のギャップがある.Define by Runのフレームワーク(PyTorch,TensorFlow Eager,Chainer)とかは動的グラフが作れて開発やデバッグが行いやすいが,推論時のオーバーヘッドが大きく,production時には課題となる.静的グラフを構築するDefine and Run形式のCaffe2やTensorflowでは,使うのが大変であり,実験期間は長くなる.NLPのモデルは動的であることが多く,静的グラフではなかなか難しい.
上記ステップに沿って,アイデアからProductionへと移行できる.大まかな流れとして,まずPyTextでモデルを実装し,オフラインのテストデータで様子を見る.そして,PyTorchベースの推論サービスをpublishし,小規模でライブトラフィックのデータで評価.次に自動でそのモデルをCaffe2のネットに出力.操作フローが複雑だったり,カスタムなデータ構造によってPyTorch 1.0経由による変換はサポートされていない場合がある.そういったときはPyTorch C++ APIを利用し,torch.nn.Moduleというクラスを書き直し,Caffe2オペレーターにラップできるようにする.そして,モデルをCaffe2のprediction serviceとして,publishし,ライブトラフィックを捌くようにする
ベンチマーク
PythonとC++モデル(Caffe2エキスポート済みモデル or PyTorch C++ APIで書き直されたもの)を比べた.実験は,CPUのみのマシンで行った.JointBiLSTMにおいては,劇的に改善.RNNGにおいては,わずかに改善.しかしproductionの環境においてPythonがサポートされていないことも多いので,十分に有用.
PyText: A Seamless Path from NLP research to production Ahmed Aly, Kushal Lakhotia, Shicong Zhao, Mrinal Mohit, Barlas Oguz, Abhinav Arora, Sonal Gupta, Christopher Dewan, Stef Nelson-Lindall, Rushin Shah
https://arxiv.org/abs/1812.08729 Blog: https://code.fb.com/ai-research/pytext-open-source-nlp-framework/ Github: https://github.com/facebookresearch/pytext Doc: https://pytext-pytext.readthedocs-hosted.com/en/latest/
概要
DNNベースのNLPをモデル化するためのPyTorchベースのフレームワークPyTextの紹介.experimentationとproductionの両場面に対して,モデルコンポーネントのシンプルで拡張できるインタフェースと,最適化されたCaffe2の実行エンジンを通してモデルのエキスポートができる.PyTextによってexperimentationとproductionのワークフローをPyTextを通して行うことにより,優れたモデルアイデアをすばやく作り,productionフェーズにシームレスに持っていくことができる.
イントロ
ニューラルネットを作るにあたって,experimentationとproductionには要件のギャップがある.Define by Runのフレームワーク(PyTorch,TensorFlow Eager,Chainer)とかは動的グラフが作れて開発やデバッグが行いやすいが,推論時のオーバーヘッドが大きく,production時には課題となる.静的グラフを構築するDefine and Run形式のCaffe2やTensorflowでは,使うのが大変であり,実験期間は長くなる.NLPのモデルは動的であることが多く,静的グラフではなかなか難しい.
そこでPyTextはPyTorch 1.0を使って,下記の達成を狙っている.
他のフレームワークもあるが,欠点がある.
フレームワークデザイン
PyTextでは,データハンドリング,メトリクスのレポート,学習方法,など自由にカスタムできる.またコンポーネントを自由に追加してもよいし,人気のタスクにおいてはそのまま使えるパイプラインがいくつか用意されている
コンポーネント
PyTextのすべてはコンポーネントからなる.コンポーネントはパラメタによって定義される.
現在は下記のコンポーネントがある.
Task 学習あるいは推論のために必要な様々なコンポーネントからなる.下記が文書分類タスクにおけるコンフィグファイル(json).すべての子コンポーネントに対するパラメタを定義している.
Data Handler 生データを処理し,テンソルのバッチデータを準備してモデルにフィードする.
Model モデル構造の定義
Optimizer ロスからのモデル最適化を行う
Metric Reporter メトリクス計算(precisionとか)を実装し,レポートを行う
Trainer Data Handler,Modelを利用し,学習を行う.またホールドアウトのセットに対してバリデーションを行い,モデル選択も行う
Predictor Data HandlerとModelを利用して,与えられたテストデータに対する推論を行う
Exporter PyTorchで学習したモデルを,ONNX(Open Neural Network Exchange)を利用して,Caffe2グラフへエキスポートする
データオーバービュー
TrainとPredictの2モードがある.Trainでは,Data Handlerを通してバッチを生成し,学習と評価を行える.その後,学習モデルはPyTorchフォーマットでシリアライズされ,静的なCaffe2グラフにも変換できる.Predictでは学習済みモデルを読み込み,与えられたテストデータに対する予測を行う.
モデリングサポート
用語
モデル概要
モデルを,Token Embedding,Represenatation,Decoder,Output layersに分割した.各Moduleは保存可能で,Module毎に他モデルから再利用できたりする.それぞれ説明していく
Token Embedding 各トークンに対して,ベクトル埋め込みのバッチを獲得する.いくつかのスタイルの埋め込みを利用でき,設定できる.学習済み単語埋め込み,やCNNとhighway networksを使ったものだったり(Kim 2016),学習済みcontextual character-based (ELMo),地理情報,形態素情報など.
Representation 埋め込みトークンを入力として,タスクに合わせた表現を獲得する.BiLSTMやCNNを利用したものがある
Decoder Representationを入力として受け取りlogitを生成.
Output Layer 生成した予測とロスを考慮する
これらのmodulesはベースの実装から構成されており,簡単に拡張できる
マルチタスクモデル学習
マルチタスク学習もサポートする(Joint Learning).Modules間でパラメタ共有ができる.マルチタスクにおいて下記を想定している.
マルチタスクモデルの例
Figure 3には文を入力して,文書のクラス予測と文に対するタギングする例.
Figure 4には,query-documentの関係性を学習するタスク.個別にqueryとdocumentの分類タスクを行うことで,学習表現のロバスト性を向上させることができる.
Model Zoo
PyTextはNLPに特化.サポートしているモデルの種類を以下の通り.
Production Workflow
From Idea to Production
上記ステップに沿って,アイデアからProductionへと移行できる.大まかな流れとして,まずPyTextでモデルを実装し,オフラインのテストデータで様子を見る.そして,PyTorchベースの推論サービスをpublishし,小規模でライブトラフィックのデータで評価.次に自動でそのモデルをCaffe2のネットに出力.操作フローが複雑だったり,カスタムなデータ構造によってPyTorch 1.0経由による変換はサポートされていない場合がある.そういったときはPyTorch C++ APIを利用し,torch.nn.Moduleというクラスを書き直し,Caffe2オペレーターにラップできるようにする.そして,モデルをCaffe2のprediction serviceとして,publishし,ライブトラフィックを捌くようにする
ベンチマーク
PythonとC++モデル(Caffe2エキスポート済みモデル or PyTorch C++ APIで書き直されたもの)を比べた.実験は,CPUのみのマシンで行った.JointBiLSTMにおいては,劇的に改善.RNNGにおいては,わずかに改善.しかしproductionの環境においてPythonがサポートされていないことも多いので,十分に有用.
Production Challenges
データの前処理
PyTorchの1つの制約に,文字テンソルをサポートしていないことがある,つまり,文字操作やindexingは,モデルの外で行う必要がある.そこでC++の特徴化ライブラリ(現在はPyTextのオープンソースリポジトリには含まれていない)を書いた.これはPybindでアクセス可能であり,Figure 6に示すように,ランタイムのサービスの一部として,推論時にも利用できる.このライブラリは生データを下記のように前処理する.
下記のように特徴化ライブラリはTraining/Inferenceで共有される
語彙管理
モデル内で語彙の管理を行っていないという制約もある.下記の2つのソリューションを考えてみた
我々は,2つ目の手法に最適化した.というのも,異なるユースケース及び言語において,学習時と推論時の語彙間における同期とバージョニングを維持するのは簡単ではないためである.// 🤔ここはこれしか書いていないのでよく分からない
Future Work
来るフィーチャーは多岐にわたる
結論
DNNベースのNLPのモデリングのためのPyTextを紹介.PyTextはPyTorch上で動作し,開発時とデプロイ時のギャップを埋めることを目的としている.アイデアをいち早く解決し,そこからシームレスに実サービスへのデプロイを静的グラフであるCaffe2モデルにexportできる.またカスタムも可能で,拡張性もある
コメント
参考