AllenNLP 1.1 : Part1 クイックスタート : Next steps (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/10/2020 (1.1.0)
* 本ページは、AllenNLP ドキュメントの以下のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
- Windows PC のブラウザからご参加が可能です。スマートデバイスもご利用可能です。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
| 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション |
| E-Mail:sales-info@classcat.com ; WebSite: https://www.classcat.com/ |
| Facebook: https://www.facebook.com/ClassCatJP/ |
Part1 クイックスタート : Next steps
動作するモデルを持った今、ここに AllenNLP で試すことができる幾つかのことがあります!前の 2 章で、AllenNLP を使用して動作する NLP モデルを素早く構築することができました、ここまではライブラリが供給しなければならないものの表面を単に引っ掻いただけですが。AllenNLP はより多くのモデル、モジュールと特徴を供給します、これらは広範囲の NLP アプリケーションを開発することを容易にします。この章では、AllenNLP で試すことができる幾つかのより多くのことのプレビューを個々のトピックのより詳細を与える後の章への幾つかの指針とともに与えます。
1. 事前訓練された contextualizer に切り替える
私達のテキスト分類モデルの定義を再度見ましょう。
class SimpleClassifier(Model):
def __init__(self,
vocab: Vocabulary,
embedder: TextFieldEmbedder,
encoder: Seq2VecEncoder):
super().__init__(vocab)
self.embedder = embedder
self.encoder = encoder
num_labels = vocab.get_vocab_size("labels")
self.classifier = torch.nn.Linear(encoder.get_output_dim(), num_labels)
self.accuracy = CategoricalAccuracy()
次の図はモデル (その forward メソッド) がどのように入力を処理してラベルを提示するかを図示します。

要約すれば、モデルは最初にテキストを埋め込みに変換するために (型 TextFieldEmbedder の) embedder を使用してから、それをベクトル (or バッチ化されたときにはベクトルのセット) に変換するために (型 Seq2VecEncoder の) エンコーダを使用します。モデルが AllenNLP でどのように設計されるかの美しさは、殆どそれらがそれが「どのように」成されるかについて明示的であることなく抽象とデータ型の視点から「何が」成されるべきかを定義することです。TextFieldEmbedder と Seq2VecEncoder の両者は抽象クラスとして定義されます、これはそれらが実装でなく、インターフェイスだけを提供することを意味します。
このデザインは貴方に柔軟に任意のコンポーネントをそれらが同じインターフェイスに従う限り置き換え可能にします。例えば、Seq2VecEncoder は bag of embeddings (最後の章でこれを行ないました), CNN, RNN, Transformer エンコーダ等々のどれでもあり得ます、モジュールがベクトルのシークエンスを取り単一ベクトルを生成する限りは。貴方自身のエンコーダを実装することさえできます。
素早いサンプルとして、テキスト分類モデルのための事前訓練された contextualizer として BERT を利用できます。configuration ファイルに行なわれる必要があるであろう変更を示します ; モデルとデータセット・リーダーを指定するために python コード (e.g., build_* メソッド) を使用しているのであれば、変更は同様です。
下で示されるように、モデルやデータコード自身のために必要な変更はありませんが、config ファイル (or build_* メソッド) に 4 つの変更をする必要があります。
local bert_model = "bert-base-uncased";
{
"dataset_reader" : {
"type": "classification-tsv",
"tokenizer": {
"type": "pretrained_transformer",
"model_name": bert_model,
},
"token_indexers": {
"bert": {
"type": "pretrained_transformer",
"model_name": bert_model,
}
},
"max_tokens": 512
},
"train_data_path": "quick_start/data/movie_review/train.tsv",
"validation_data_path": "quick_start/data/movie_review/dev.tsv",
"model": {
"type": "simple_classifier",
"embedder": {
"token_embedders": {
"bert": {
"type": "pretrained_transformer",
"model_name": bert_model
}
}
},
"encoder": {
"type": "bert_pooler",
"pretrained_model": bert_model
}
},
"data_loader": {
"batch_size": 8,
"shuffle": true
},
"trainer": {
"optimizer": {
"type": "huggingface_adamw",
"lr": 1.0e-5
},
"num_epochs": 5
}
}
ここではこれらの変更の詳細には入りませんが、要するに、以下が必要です :
- PretrainedTransformerTokenizer (“pretrained_transformer”) を使用します、これは文字列を wordpiece にトークン化して [CLS] と [SEP] のような特殊なトークンを追加します。
- PretrainedTransformerIndexer (“pretrained_transformer”) を使用します、これはBERT の語彙を利用してそれらの wordpiece を id に変換します。
- embedder 層を PretrainedTransformerEmbedder (“pretrained_transformer”) と置き換えます、これはトークンを埋め込むために事前訓練された BERT を利用して、BERT からの top 層を返します。
- エンコーダを BertPooler (“bert_pooler”) で置き換えます、これはもう一つの (事前訓練された) 線形層を [CLS] トークンの上に追加して結果を返します
optimizer を HuggingFace の Transformers ライブラリからの AdamW に切り替えたことにも注意してください。
tokenizer と embedder は HuggingFace の Transformers ライブラリ 周りの薄いラッパーですから、異なるトランスフォーマー・アーキテクチャ (BERT, RoBERTa, XLNet 等) 間の切り替えは config ファイルで model_name パラメータを変更するように単純です。
example repo で full config ファイルを見つけることができます。モデルを訓練するためには、次のコマンドが利用できます :
$ allennlp train \
my_text_classifier.jsonnet \
--serialization-dir model-bert \
--include-package my_text_classifier
0.900 あたりの検証精度を見るはずです、これは前の章で構築した bag-of-embeddings モデルを大きく超える改良です。モデルやデータコードの単一行を変更することなくこの総てを獲得しています。AllenNLP を使用すれば、貴方の NLP モデルのコンポーネントを swap in / out するのは簡単です。
2. デモを実行する
NLP モデルを訓練した後、貴方はそれを web アプリケーションとして配備したり同僚にデモを見せることを望むかもしれません。これは configuration ファイルの使用が物事を非常に容易にする一つの場所です、何故ならばモデルとその状態をモデル・アーカイブにパッケージ化できるからです、これは web アプリケーションで分配したりサーブすることが容易です。AllenNLP はデモサーバを備え、これは貴方のモデルを単純な web インターフェイスでサービス提供します。
単純なデモサーバはまた別個のパッケージ内にあります、これは次によりインストールできます :
pip install allennlp-server
それから次を実行することでサーバをスピンアップできます :
python allennlp-server/server_simple.py \
--archive-path model/model.tar.gz \
--predictor sentence_classifier \
--field-name sentence
--include-package my_text_classifier
入力を受け取る field(s) の名前を指定する必要があることに注意してください。単純なデモを見るためにブラウザで localhost:8000 にアクセスできます :

基本的な HTML, CSS と JavaScript を知っていればこのデモをカスタマイズすることも比較的容易です。デフォルトでは、総てのアセット (HTML, JavasScript code と CSS) はデモを launch するための Python スクリプト、server_simple.py にハードコードされています。スクリプトを実行するとき –static-dir オプションを指定してこれらのアセットがどこからサービス提供されるかを変更することができます。貴方が特に意欲的であれば、demo.allennlp.org をバックアップする レポジトリ を checkout して、そしてより多くの full-featured UI を得るために、貴方自身のモデルをローカルで利用するためにそれを変更できます。
3. GPU を使用する
最後に、標準的な AllenNLP コンポーネント (モデル、モジュール等) を使用している限り、モデルパラメータと tensor をデバイス間で手動で移動することにより貴方のモデルを GPU 互換にすることについて滅多に心配する必要はありません。殆どの場合、行なう必要がある総ては、利用したい GPU の ID を指定してえ、トレーナーに cuda_device オプションを追加することです :
"trainer": {
...
"cuda_device": 0
...
}
マルチ GPU を持つ場合、”distributed” セクションで GPU ID のリストを指定することにより分散訓練を行なうことができます :
"trainer": {
...
},
"distributed": {
"cuda_devices": [0, 1, 2, 3]
}
これはマルチ GPU に渡り損失を集めてパラメータ更新を同期するために PyTorch の DistributedDataParallel を使用します。けれども、貴方が得られるスピードアップは同期とオーバーヘッドのために GPU の数に正確には比例しないかもしれません。
評価して貴方のモデルで予測を行なっているとき、モデルを GPU 上で実行させるためにコマンドラインから –cuda-device オプションを指定できます。
以上