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

https://huggingface.co/blog/bconsolvo/llama3-vision-instruct-fine-tuning

のページでは、画像キャプションのデータセットを使用して、マルチモーダル大規模言語モデル (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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/7ebacb18-0e1a-443b-89cd-c221a51c29b1.png)

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

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/b4e2f6a9-e6da-4cd8-8011-bb4e8f9c1c46.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/1af44df7-68ea-46bb-ac9b-cb47c809dc7a.png)

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

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/e924f955-b6d3-4490-aee4-afb49a2d817a.png)

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

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/14cee74c-10c3-4951-921d-db0be8ea67aa.png)

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

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/b8044501-6598-43bb-8c79-d83adc7b8df7.png)

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

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/1a5ea9c3-2520-4799-8856-0ae0511b1272.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/39678cf3-383b-4b73-984d-0ddc9485fcc5.jpeg)

■ファインチューニング
アーキテクチャー全体をゼロから再トレーニングする必要がなく、効率よくファインチューニングを実行するために、低ランク適応 (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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/64e2d74a-2ace-471a-88b7-501c62a1232d.png)

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

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/8e23a722-e214-4e70-8f8d-58e7b59e5057.png)

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

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/0b19e6a4-8490-42a2-8eae-c6d42e35970a.png)

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

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490396/909b3745-7d05-4f32-8b33-90e33b57364e.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