はじめに
GMO NIKKOの吉岡です。
前回の記事ではPhi-3-MediumをGPUで動かしてみましたが、今回はもう一つの気になるモデル、Phi-3-visionを紹介します。
新しいバージョン3.5が公開されているので、こちらを試してみます。
Phi-3.5-visionは画像を読み取り、質問から結果を返すLLMとなっています。
サーバー構成・準備
前回の記事でサーバー構成や準備を紹介したので、こちらを参照ください。
LLM
LLM:https://huggingface.co/microsoft/Phi-3.5-vision-instruct 4.15B
今回は画像を読み取り結果を返してくれるPhi-3.5-visionを使います。
git clone
フォルダを作成し、huggingfaceからcloneします。
大きなファイルがあるため、git lfsが必要です。
1 2 3 4 |
mkdir llm cd llm git lfs install git clone https://huggingface.co/microsoft/Phi-3.5-vision-instruct |
パッケージインストール
venvでPython環境を分けてインストールします。
1 2 3 |
python -m venv venv source venv/bin/activate pip install torch torchvision torchaudio accelerate transformers <span class="s1">flash_attn</span> |
サンプルコード実行
サンプルコードを実行します。
vi vision_3.5.py
として以下を保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
from PIL import Image import requests from transformers import AutoModelForCausalLM from transformers import AutoProcessor model_id = "microsoft/Phi-3.5-vision-instruct" # Note: set _attn_implementation='eager' if you don't have flash_attn installed model = AutoModelForCausalLM.from_pretrained( model_id, device_map="auto", trust_remote_code=True, torch_dtype="auto", _attn_implementation='eager' ) # for best performance, use num_crops=4 for multi-frame, num_crops=16 for single-frame. processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True, num_crops=4 ) images = [] placeholder = "" # Note: if OOM, you might consider reduce number of frames in this example. for i in range(1,5): url = f"https://image.slidesharecdn.com/azureintroduction-191206101932/75/Introduction-to-Microsoft-Azure-Cloud-{i}-2048.jpg" images.append(Image.open(requests.get(url, stream=True).raw)) placeholder += f"<|image_{i}|>\n" messages = [ {"role": "user", "content": placeholder+"Summarize the deck of slides."}, ] prompt = processor.tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) inputs = processor(prompt, images, return_tensors="pt").to("cuda") generation_args = { "max_new_tokens": 500, "temperature": 0.0, "do_sample": False, } generate_ids = model.generate(**inputs, eos_token_id=processor.tokenizer.eos_token_id, **generation_args ) # remove input tokens generate_ids = generate_ids[:, inputs['input_ids'].shape[1]:] response = processor.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0] print(response) |
公式サンプルでは20枚の画像を読み込んでいますが、以下5枚の画像に変更して試してみます。
枚数が増えるほど使用するVRAMが増えるようです。
以下コマンドで実行します。
1 |
python <span class="s1">vision_3.5.py</span> |
英語で回答が返ってきましたが、各スライドに対応してそうです。
1 2 3 4 5 6 7 8 9 10 11 |
- Azure の概要: このプレゼンテーションでは、クラウド コンピューティング プラットフォームである Microsoft Azure について紹介します。ここでは、プラットフォームの 3 つの主要なタイプ (ハイパースケール、エンタープライズ、ハイブリッド) に焦点を当てています。プレゼンターは、スリランカの CMS Private Limited のシニア ソフトウェア エンジニアである Dinesh Kumar Wickramasinghe です。 - Azureの概要: Azure は Microsoft のクラウド コンピューティング プラットフォームと言われており、現在および将来のビジネス課題に対応するためにクラウド サービス セットを継続的に拡張しています。お気に入りのツールやフレームワークを使用して、大規模なグローバル ネットワーク上でアプリケーションを自由に構築、管理、展開できます。 - クラウド コンピューティング サービス: このプレゼンテーションでは、Azure が提供する 3 種類のクラウド コンピューティング サービス、つまりサービスとしてのインフラストラクチャ (IaaS)、サービスとしてのプラットフォーム (PaaS)、およびサービスとしてのソフトウェア (SaaS) について概要を説明します。各サービスは、固有のアイコンと簡単な説明で表されます。 - クラウド サービス モデル: このプレゼンテーションでは、オンプレミス、インフラストラクチャ、プラットフォーム、ソフトウェアの 4 つのクラウド サービス モデルを比較します。各モデルは、その下にさまざまなサービスがリストされた列で表され、管理と所有権のレベルを示します。 |
まとめ
複数の画像から文字を読み取り、質問された内容について回答してくれました。
今回の例では似ている図形の上にある文字は種類として認識されてそうです。
精度次第で様々なサービスに応用できそうですが、プロンプトを変更しても日本語での回答はできなそうなので、サービスで使う場合は結果を翻訳するか、別のLLMで要約すると良さそうです。
フリーでここまでできるのは本当に驚きですが、マルチモーダル対応のモデルもどんどん増えてきてるので、今後の発展が楽しみです。