Hugging Face とインテル® Gaudi® アクセラレーターを活用した GPT-2 のファインチューニング

https://www.intel.com/content/www/us/en/developer/articles/training/fine-tuning-gpt2-with-hugging-face-and-intel-gaudi.html

＜インテル® Gaudi® AI アクセラレーターを活用した最適化＞
　• 新たなディープラーニング・モデルの作成も既存コードの移植も数分で完了
　• シンプルな開発と生産性の向上を両立しながら生成 AI のパフォーマンスを実現

詳細情報
https://www.intel.com/content/www/us/en/developer/platform/gaudi/overview.html

このチュートリアルでは、インテルが開発した Optimum Habana ライブラリーと Microsoft の DeepSpeed ライブラリーを使用して、インテル® Gaudi® AI プロセッサー上の Hugging Face でホストされる GPT-2 モデルをファインチューニングする手順を説明します。
https://github.com/huggingface/optimum-habana

＜ファインチューニングの定義＞
モデルにゼロから学習処理を実行するのは、特に最近の大規模モデルの場合、コストがかかります。モデルのサイズと規模にもよりますが、このようなモデルの学習処理に必要なハードウェアのコストを見積もると、数千ドルから数百万ドルに及ぶこともあります。ファインチューニングとは、(事前学習済みモデルと呼ばれる) すでに学習済みのニューラル・ネットワーク・モデルをアップデートして、特定のタスクで動作するモデルを作るプロセスです。元々のタスクが新しいタスクと類似していると想定すると、事前学習済みモデルを使用すれば、ニューラル・ネットワークの上位層で発生する特徴抽出をフル活用できるため、ゼロからモデルを開発して学習処理を行う必要がなくなります。

このブログでは、Transformer に的を絞りました。事前学習済みの Transformer は、数多くのダウンストリーム・タスク用に短時間でファインチューニングすることができ、高いパフォーマンスを発揮します。すでに言語を理解している、事前学習済みの Transformer モデルを考えてみましょう。ファインチューニングは、質問への応答、言語生成、名前付きエンティティーの認識、感情分析といったタスクを実行するモデルの学習に焦点を当てます。

大規模モデルの学習処理を実行するコストと複雑さを考えると、事前学習済みモデルの有効活用は魅力的なアプローチです。実際、特定のタスクを対象とする事前学習済みモデルは数多く公開されています。このブログでは、最も広く利用されているオープンソース Transformer ライブラリーである Hugging Face に注目しました。Hugging Face Hub では、ファインチューニングに利用できる幅広い種類の事前学習済み Transformer モデルが提供されています。
https://huggingface.co/

＜アーキテクチャーに依存しないファインチューニング＞
モデルを事前学習するプロセスは専用のアーキテクチャーで実行しますが、保存した事前学習済みモデルがほかのアーキテクチャーで使用されるのを妨げているわけではありません。例えば、インテル® Gaudi® AI プロセッサーを使用して事前学習されたモデルを、後で GPU を使用してファインチューニングすることも可能です。また、元々 GPU で事前学習処理済みの公開されているモデルも、ロードしてインテル® Gaudi® AI プロセッサー上で学習処理やファインチューニングを行うこともできます。言い換えれば、事前学習済みモデルはアーキテクチャーにとらわれずにファインチューニング可能ということです。

＜インテル® Gaudi® プラットフォームの入手＞
このチュートリアルでは、対応するファームウェア、ドライバー、ランタイム・ライブラリーを備えたインテル® Gaudi® AI プロセッサーの実行環境が必要です。必要であれば、適切なハードウェアをインテル® Tiber™ AI クラウドで用意してください。
https://www.intel.com/content/www/us/en/developer/tools/tiber/ai-cloud.html

インテル® Gaudi® プロセッサーに対応している PyTorch 用の最新 Docker イメージは、Habana Vault で提供されており、以下のコマンドを実行してダウンロード、起動、アクセスできます。
https://vault.habana.ai/ui/packages

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/f08f8191-b3dc-43b2-a5b2-fe1fab2ea655.png)

注: これらのコマンドを正常に実行するには、Docker サーバーに対応した Habana コンテナランタイムが適切にインストール / セットアップされていることが前提です。Habana コンテナランタイムのインストールとセットアップ方法については、インテル® Gaudi® ソフトウェアのドキュメントを参照してください。
https://docs.habana.ai/en/latest/Installation_Guide/Additional_Installation/Docker_Installation.html

＜Optimum-Habana とその他のフレームワークをインストール＞
ベースとなるインテル® Gaudi® ソフトウェアの実行環境が用意できたら、Optimum-Habana、DeepSpeed、言語モデリングに必要なモジュールをインストールします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/fdc8f74d-185c-4e1f-a888-fa2c2ffb1376.png)
 
＜モデルのファインチューニング＞
次は GPT-2 モデルをファインチューニングするために、以下の Python main.py スクリプトを作成します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/584c452d-1bdd-4228-b793-198465bbac53.png)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/21353e63-32d5-4b62-a1f1-82591ed627ce.png)

これは WikiText データセットを使用して事前学習済みの GPT-2 モデルをファインチューニングし、ファインチューニングした重みを /tmp/clmgpt2xl ディレクトリーに配置するコードです。複数のインテル® Gaudi® AI プロセッサーを使用できる環境ならば、DeepSpeed ライブラリーの分散モードで実行します。
注: 引数 model_name_or_path はファインチューニングに使用され、重みを初期化するモデルのチェックポイントをロードします。
それではコードを実行します。 

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/b23feccc-8d4c-4d5f-a9e4-cda734262d10.png)

インテル® Gaudi® 2 アクセラレーター・カード 8 枚を実装したプラットフォームの場合にプロンプトが返す出力は、以下のようになります。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/d85315a2-91fb-4900-98df-54595f0dd816.png)

これで /tmp/clmgpt2xl ディレクトリーにファインチューニングしたモデルが配置されました。

＜ファインチューニングした新しいモデルをテキスト予測に使用＞
ファインチューニングした新しいモデルをテストするには、以下の内容を書き込んだ test.py と呼ばれる新規ファイルを作成します。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/7e18422c-d7fb-470f-9ffa-c3053878c49b.png)

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/28b57b52-b474-4000-9af8-973b84d545e6.png)

注: /tmp/clmgpt2xl ディレクトリーは test.py スクリプト内で path_to_model として指定されているため、ファインチューニングしたモデルによって応答を生成できるようになります。
では test.py を実行して、ファインチューニングしたモデルをテストしてみましょう。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/5154b07b-742f-4399-91a4-f124937148cb.png)

このコマンドを実行すると、以下のような結果が出力されます。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/9c1b4f52-41d5-4749-8a0a-e4f86c419233.png)

＜次のステップ＞
ほかのプロンプトやセットアップも使ってモデルの実行を試してみることをお勧めします。詳細については、Optimum-Habana ドキュメントを参照してください。
https://github.com/huggingface/optimum-habana

製品およびパフォーマンスに関する情報
性能は、使用状況、構成、その他の要因によって異なります。詳細については、https://www.Intel.com/PerformanceIndex/ (英語) を参照してください。


関連情報：
インテル® Gaudi® 3 アクセラレーター
https://www.intel.co.jp/content/www/jp/ja/products/details/processors/ai-accelerators/gaudi.html