IPUを使用したHugging Face Transformersの始め方と最適化について
'IPUを使用したHugging Face Transformersの始め方と最適化'
Transformerモデルは、自然言語処理、音声処理、コンピュータビジョンなど、さまざまな機械学習タスクで非常に効率的であることが証明されています。しかし、これらの大規模なモデルの予測速度は、会話型アプリケーションや検索などのレイテンシに敏感なユースケースでは実用的ではありません。さらに、実世界でのパフォーマンスを最適化するには、多くの企業や組織には到底手の届かない時間、労力、スキルが必要です。
幸いなことに、Hugging FaceはOptimumというオープンソースのライブラリを導入しました。このライブラリを使用すると、さまざまなハードウェアプラットフォーム上でTransformerモデルの予測レイテンシを大幅に削減することが容易になります。このブログ記事では、AIワークロードに最適化されたGraphcore Intelligence Processing Unit(IPU)向けにTransformerモデルを高速化する方法を学びます。
OptimumがGraphcore IPUと出会う
GraphcoreとHugging Faceのパートナーシップにより、最初のIPUに最適化されたモデルとしてBERTが導入されました。今後数ヶ月にわたり、ビジョン、音声、翻訳、テキスト生成など、さまざまなアプリケーションに対応したIPUに最適化されたモデルをさらに導入していく予定です。
Graphcoreのエンジニアは、Hugging Faceのトランスフォーマーを使用してBERTをIPUシステムに実装し、最新のモデルを簡単にトレーニング、微調整、高速化できるように最適化しました。
IPUとOptimumの始め方
OptimumとIPUの使用を始めるために、BERTを例にして説明します。
このガイドでは、Graphcoreのクラウドベースの機械学習プラットフォームであるGraphcloudのIPU-POD16システムを使用し、Getting Started with Graphcloud のPyTorchのセットアップ手順に従います。
GraphcloudサーバーにはすでにPoplar SDKがインストールされています。別のセットアップを使用している場合は、PyTorch for the IPU: User Guide でシステムに適用される手順を見つけることができます。
Poplar SDKの環境を設定する
以下のコマンドを実行して、GraphcoreのツールとPoplarライブラリを有効にするための複数の環境変数を設定する必要があります。最新のUbuntu 18.04上でPoplar SDKバージョン2.3を実行しているシステムでは、フォルダ/opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/
にあります。
PyTorchを使用するためには、PoplarとPopART(Poplar Advanced Runtime)の両方の有効化スクリプトを実行する必要があります。
$ cd /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/
$ source poplar-ubuntu_18_04-2.3.0+774-b47c577c2a/enable.sh
$ source popart-ubuntu_18_04-2.3.0+774-b47c577c2a/enable.sh
IPU用にPopTorchを設定する
PopTorchはPoplar SDKの一部です。これにより、PyTorchモデルを最小限のコード変更でIPU上で実行することができます。以下のガイドに従って、PopTorch環境を作成してアクティブにします。
$ virtualenv -p python3 ~/workspace/poptorch_env
$ source ~/workspace/poptorch_env/bin/activate
$ pip3 install -U pip
$ pip3 install /opt/gc/poplar_sdk-ubuntu_18_04-2.3.0+774-b47c577c2a/poptorch-<sdk-version>.whl
Optimum Graphcoreのインストール
環境にはすべてのGraphcore PoplarおよびPopTorchライブラリが利用可能な状態になっているため、最新の🤗 Optimum Graphcoreパッケージをこの環境にインストールする必要があります。これにより、🤗 TransformersライブラリとGraphcore IPUsの間のインターフェースが提供されます。
前の手順で作成したPopTorch仮想環境がアクティブになっていることを確認してください。ターミナルには、以下のようにpoptorch環境の名前が表示されます。
(poptorch_env) user@host:~/workspace/poptorch_env$ pip3 install optimum[graphcore] optuna
Optimum Graphcoreリポジトリのクローン
Optimum Graphcoreリポジトリには、IPUでOptimumモデルを使用するためのサンプルコードが含まれています。リポジトリをクローンし、example/question-answering
フォルダに移動してください。このフォルダには、BERTのIPU実装が含まれています。
$ git clone https://github.com/huggingface/optimum-graphcore.git
$ cd optimum-graphcore/examples/question-answering
次に、run_qa.py
を使用してSQUAD1.1データセット上のBERTのIPU実装をファインチューニングします。
SQuAD1.1でBERTをファインチューニングするためのサンプルの実行
run_qa.py
スクリプトは、高速なトークナイザ(🤗 Tokenizersライブラリによるバックアップ)を持つモデルでのみ動作します。このスクリプトでは、これらのトークナイザの特別な機能を使用します。私たちのBERTモデルもこのケースに該当し、--model_name_or_path
の入力引数としてその名前を渡す必要があります。IPUを使用するためには、Optimumは引数--ipu_config_name
に渡されたパスからipu_config.json
ファイルを探します。
$ python3 run_qa.py \
--ipu_config_name=./ \
--model_name_or_path bert-base-uncased \
--dataset_name squad \
--do_train \
--do_eval \
--output_dir output \
--overwrite_output_dir \
--per_device_train_batch_size 2 \
--per_device_eval_batch_size 2 \
--learning_rate 6e-5 \
--num_train_epochs 3 \
--max_seq_length 384 \
--doc_stride 128 \
--seed 1984 \
--lr_scheduler_type linear \
--loss_scaling 64 \
--weight_decay 0.01 \
--warmup_ratio 0.1 \
--output_dir /tmp/debug_squad/
Optimum-Graphcoreの詳細
データの取得
データセットを取得するための非常に簡単な方法は、Hugging Face Datasetsライブラリを使用することです。このライブラリは、開発者がHugging Faceハブでデータセットをダウンロードして共有することを容易にします。また、gitとgit-lfsに基づいた事前構築のデータバージョニングも備えているため、同じリポジトリを指定するだけでデータの更新バージョンでの反復が可能です。
ここでは、トレーニングとバリデーションのファイルがデータセットに含まれており、モデルの実行フェーズで使用する入力を容易にするためのデータセット設定もあります。引数--dataset_name==squad
は、Hugging Face Hub上のSQuAD v1.1を指します。また、SQuADデータセットまたはDatasetsライブラリの別の質疑応答データセットと同じ形式に従うCSV/JSON/TXTトレーニングおよび評価ファイルを提供することもできます。
事前学習済みモデルとトークナイザの読み込み
このスクリプトでは、単語をトークンに変換するために高速なトークナイザが必要です。トークナイザが指定されていない場合、エラーが表示されます。参考までに、サポートされているトークナイザのリストを以下に示します。
# トークナイザの確認: このスクリプトは高速なトークナイザが必要です。
if not isinstance(tokenizer, PreTrainedTokenizerFast):
raise ValueError("This example script only works for models that have a fast tokenizer. Checkout the big table of models
"at https://huggingface.co/transformers/index.html#supported-frameworks to find the model types that meet this "
"requirement"
)
引数“`–model_name_or_path==bert-base-uncased“`は、Hugging Face Hubで利用可能なbert-base-uncasedモデルの実装を読み込みます。
Hugging Face Hubの説明から:
“BERT baseモデル(uncased):マスクされた言語モデリング(MLM)目的を使用して英語の事前学習済みモデルです。この論文で紹介され、最初にこのリポジトリでリリースされました。このモデルはuncasedです:英語とEnglishの違いを区別しません。”
トレーニングとバリデーション
Optimumで利用可能なIPUTrainerクラスを使用することで、Graphcoreのソフトウェアとハードウェアスタックを最大限に活用し、少ないコードの変更でモデルをIPUでトレーニングすることができます。Optimumのおかげで、最先端のハードウェアを使って最先端のモデルをトレーニングすることができます。
BERTモデルのトレーニングと検証には、run_qa.py
スクリプトに--do_train
と--do_eval
の引数を渡すことができます。上記のハイパーパラメータでスクリプトを実行した後、以下のトレーニングと検証結果が表示されるはずです:
"epoch": 3.0,
"train_loss": 0.9465060763888888,
"train_runtime": 368.4015,
"train_samples": 88524,
"train_samples_per_second": 720.877,
"train_steps_per_second": 2.809
検証ステップの結果は以下の通りです:
***** eval metrics *****
epoch = 3.0
eval_exact_match = 80.6623
eval_f1 = 88.2757
eval_samples = 10784
Optimum-Graphcore: SQuAD Examplesでは、IPU BERTの実装の残りの部分を確認することができます。
IPUシステム上での最適なトランスフォーマーのためのリソース
- Optimum-Graphcore: SQuAD Examples
- Graphcore Hugging Face Models & Datasets
- GitHubチュートリアル:Hugging Face transformersを使用したIPUでのBERT Fine-tuning
- Graphcore開発者ポータル
- Graphcore GitHub
- Graphcore SDKコンテナ(Docker Hub)
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles