0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Meta のマルチモーダル LLM「Llama 3.2-Vision-Instruct」をインテルのアクセラレーターでファインチューニング

Posted at

のページでは、画像キャプションのデータセットを使用して、マルチモーダル大規模言語モデル (MLLM) の 1 つ である Meta Llama-3.2 11B Vision Instruct をファインチューニングする方法を、コード付きで紹介します。Llama 3.3 は最近リリースされたばかりですが、Vision Instruct バージョンはまだ登場していません。ここでは PDF ドキュメントから画像とキャプションを抽出する方法には触れず、代わりに実際のファインチューニングとインテル® Gaudi® 2 AI アクセラレーターを使用してプロセスを高速化する方法に焦点を当てました。学習処理を効率的に実行するために、ここでは低ランク適応 (LoRA) を使用します。Docker コンテナを用意しましたので、Llama-3.2 モデルや Hugging Face で提供されているほかのマルチモーダル・モデルもファインチューニングできるように、手法とコードを共有しようと思います。
https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct

【マルチモーダル LLM とは?】
マルチモーダル大規模言語モデル (MLLM) は、テキスト以外のメディアも取り込むことができる、OpenAI GPT-4 や Llama 3 のような大規模言語モデル (LLM) の拡張です。MLLM は、画像、音声、動画の入力と出力を含む LLM の推論を拡張します。これから説明するファインチューニングでは、視覚言語モデル (VLM) と呼ばれる、MLLM の特定サブカテゴリーに焦点を当てました。VLM は、画像とテキストから学習し、画像の内容を詳しく説明したり、画像とテキストの入力に基づいて質問へ回答する、テキスト出力を生成します。ここで取り上げる VLM は、画像に関する質問への回答に特化して学習処理された Llama-3.2 11B Vision Instruct です。例えば、「画像に描かれるプロセスを説明してください」といったプロンプトで VLM に指示することができます。
https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct

【Llama モデル】
Meta の Llama モデルを使用するには、まず Hugging Face でアクセスをリクエストする必要があります。Meta の Hugging Face org カード (組織ページ) https://huggingface.co/meta-llama/ に記載されている手順に従ってモデルにアクセス可能です。次に、自分の Hugging Face プロフィール設定からアクセストークンを発行します。画面右上のプロフィール・アバターを選択し、「Access Tokens」を選択します。「+Create new token」をクリックし、「Read access to contents of all public gated repos you can access」を選択してください。アクセス可能な公開リポジトリーにあるコンテンツへの読み取りアクセス権が付与されます。ここで発行されたトークンは、非表示ファイルに保存しておくことをお勧めします。

■Docker
次に、環境と Docker の設定を行います。ここでは Ubuntu 22.04 の Linux 環境で 8 枚のインテル® Gaudi® 2 アクセラレーター・カードを使用します。NVIDIA GPU の nvidia-smi に相当する hl-smi コマンドを実行すると、インテル® Gaudi® 2 アクセラレーター・カード 8 枚の動作ステータスを確認できます。出力は以下のようになります。

1.png

必要な Python パッケージが書かれた requirements.txt ファイルを作成します。

2.png

このブログを読んでいる皆さんの Linux システムにはすでに Docker がインストールされていると想定しているのですが、もしまだの場合は、Docker Docs の手順に従ってください。インテル® Gaudi® アクセラレーターのドキュメンテーションに記載されているガイドを見ながら Dockerfile を作成しましたので、その手順を簡単にレプリケートしてコンテナ内でファインチューニングを実行できるようになっています。Dockerfile のバージョン番号はアップデートする必要があるかもしれませんので、ご注意ください。まずイメージを作成してから、対話形式で Docker に入り、ここで実行しているスクリプトを試してみましょう。Docker コンテナに全スクリプトを実行させることも可能ですが、ここでは環境設定後に 1 つずつ対話形式で実行したいと考えました。
https://docs.docker.com/engine/install/ubuntu/
https://docs.habana.ai/en/latest/Quick_Start_Guides/Docker_Quick_Start.html

3.png

これで Docker イメージを作成し、このイメージをもとに Docker コンテナを構築 / 実行する準備ができました。Docker イメージを作成するには、以下のコマンドラインを実行します。

4.png

次に、対話形式でコンテナを構築 / 実行します。

5.png

コマンドラインで Docker が起動し、8 枚のインテル® Gaudi® アクセラレーター・カードが利用できる状態になっているところを、ショートクリップでご覧ください。

6.png

これで Docker コンテナに入ったコマンドプロンプトが表示されるはずです。Hugging Face トークンを入力して Llama モデルにアクセスできるようになります。Hugging Face の CLI が requirements.txt ファイルによってインストールされたので、以下のように login コマンドを実行します。

7.png

次に Hugging Face トークンをコピー & ペーストすると、Llama モデルへのアクセスが可能になります。

■データセット
Llama-3.2 11B Vision Instruct モデルのファインチューニングに使用するデータセットは、nielsr/docvqa_1200_examples から取得した画像とキャプションのペアです。画像とキャプションは、学習処理セット内に合計 1,000 ペア、テストセット内に 200 ペアあります。このデータセットの中身は、画像とキャプションのペアを 1 つ例に見てみると分かりやすいでしょう。こちらは学習処理セット (train_1125) 内の画像サンプルと、その下にあるのが対応するキャプションです。
https://huggingface.co/datasets/nielsr/docvqa_1200_examples

8.jpg

■ファインチューニング
アーキテクチャー全体をゼロから再トレーニングする必要がなく、効率よくファインチューニングを実行するために、低ランク適応 (LoRA) を使用しました。
https://arxiv.org/abs/2106.09685

“LoRA は、事前学習済みモデルの重みを固定し、Transformer アーキテクチャーの各レイヤーに学習処理可能なランク分解行列を注入することで、下流タスクでの学習処理パラメーター数を大幅に削減する手法”

この例を実行する Python コードは、直接インテル® Gaudi® AI アクセラレーターの image-to-text サンプル から取り込んでいます。ファインチューニングには、Docker コンテナ内で以下のスクリプトを実行しました。サンプルコードを示します。
https://github.com/huggingface/optimum-habana/tree/main/examples/image-to-text#lora-finetune

8.png

基本モデルをダウンロードした後 (所要時間は 10 分ほど)、8 枚のインテル® Gaudi® 2 アクセラレーター・カード 8 枚では学習処理に約 20 分かかります。学習処理の出力の終わり部分は以下のようになります。

9.png

■推論
これでファインチューニングした Llama-3.2 11B Vision Instruct モデルが完成しました。ファインチューニング前と後の両方のモデルをテストデータで試してみましょう。テスト用のデータセットには合計 200 サンプル、両方のモデルに同じプロンプト「回答は簡潔に。画像の中で、10倍のビタミンEを配合しているブランドは?」を使用しました。
https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct

11.png

こちらがテスト画像 (val_146) と両方のモデルからの回答、そして元のキャプションです。

10.png

このケースではどちらのモデルも結果は良好でした。Llama-3.2 モデルの方が詳細な回答を返していますが、プロンプトではモデルに対して「簡潔に」と指示しています。ファインチューニング済みのモデルは、「回答はできる限り簡潔に」とラベル付けした学習データに忠実に従い、1 語のみを返してきたと考えられます。

自分で試してみる
インテルの AI アクセラレーターを使用して Llama-3.2 11B Vision Instruct マルチモーダル LLM をファインチューニングする実践的な例を見てきました。強力なインテルのアクセラレーターを実際にインテル® Tiber™ AI クラウドで試してみてください。新規アカウントで開始する方法は、こちらのドキュメントに記載されています。インテルの AI ソフトウェアに関するドキュメントとチュートリアルは、インテルの AI 開発リソースを参照してください。
https://cloud.intel.com/
https://console.idcservice.net/docs/guides/get_started.html
https://www.intel.com/content/www/us/en/developer/topic-technology/artificial-intelligence/overview.html

ほかの開発者とのチャットには、インテルの Discord サーバー: Intel DevHub から参加できます。
https://discord.gg/kfJ3NKEw5t

また、このブログへのコメントや問い合わせは、LinkedIn からお気軽にアクセスしてください。では、コーディングを楽しみましょう。
https://www.linkedin.com/in/bconsolvo

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?