のページでは、画像キャプションのデータセットを使用して、マルチモーダル大規模言語モデル (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 枚の動作ステータスを確認できます。出力は以下のようになります。
必要な Python パッケージが書かれた requirements.txt ファイルを作成します。
このブログを読んでいる皆さんの 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
これで Docker イメージを作成し、このイメージをもとに Docker コンテナを構築 / 実行する準備ができました。Docker イメージを作成するには、以下のコマンドラインを実行します。
次に、対話形式でコンテナを構築 / 実行します。
コマンドラインで Docker が起動し、8 枚のインテル® Gaudi® アクセラレーター・カードが利用できる状態になっているところを、ショートクリップでご覧ください。
これで Docker コンテナに入ったコマンドプロンプトが表示されるはずです。Hugging Face トークンを入力して Llama モデルにアクセスできるようになります。Hugging Face の CLI が requirements.txt ファイルによってインストールされたので、以下のように login コマンドを実行します。
次に 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
■ファインチューニング
アーキテクチャー全体をゼロから再トレーニングする必要がなく、効率よくファインチューニングを実行するために、低ランク適応 (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
基本モデルをダウンロードした後 (所要時間は 10 分ほど)、8 枚のインテル® Gaudi® 2 アクセラレーター・カード 8 枚では学習処理に約 20 分かかります。学習処理の出力の終わり部分は以下のようになります。
■推論
これでファインチューニングした Llama-3.2 11B Vision Instruct モデルが完成しました。ファインチューニング前と後の両方のモデルをテストデータで試してみましょう。テスト用のデータセットには合計 200 サンプル、両方のモデルに同じプロンプト「回答は簡潔に。画像の中で、10倍のビタミンEを配合しているブランドは?」を使用しました。
https://huggingface.co/meta-llama/Llama-3.2-11B-Vision-Instruct
こちらがテスト画像 (val_146) と両方のモデルからの回答、そして元のキャプションです。
このケースではどちらのモデルも結果は良好でした。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