【Phi 3.5】スマホで動くMicrosoftの最新LLMの性能をGPT-4oと徹底比較してみた
Phi 3.5の概要
Phi3.5はこれまでMicrosoftからリリースされていたPhi-3で使用されたデータセットを基に構築された、オープンモデルです。
Phi3.5はPhi 3.5 mini instruct、Phi 3.5 MoE、Phi 3.5 Vision instructの3つが用意されており、パラメータ数だと、Phi 3.5 MoE>Phi 3.5 Vision instruct>Phi 3.5 mini instructの順です。
Phi 3.5 Vision instructはVLMに分類されます。
VLMとは「Vision-Language Model」の略で、視覚情報(画像や映像)とテキスト情報(自然言語)を統合して処理するために設計された機械学習モデルを指します。VLMは、画像キャプション生成、視覚質問応答、画像検索など、視覚と言語の両方を理解して処理するタスクで利用されます。
VLMは、視覚とテキストの関係を学習することで、画像とテキストの複雑なタスクに対応できるようになり、AIがより人間に近い理解力や応答能力を持つための重要な技術です。これにより、例えば、画像の説明を自然言語で提供したり、画像に関連する質問に答えたりすることが可能になります。
そもそもPhi-3とは?
Phi-3は、Microsoftによって開発された、大規模言語モデルです。Phi-3には、スマートフォン上でのローカルな推論を可能にするほど小型でありながら、Mixtral 8x7BやGPT-3.5などのモデルに匹敵する全体的なパフォーマンスを実現するPhi-3-miniが含まれています。
Phi-3-miniのパワーの秘訣は、トレーニングに使用されるデータセットにあります。これは、Phi-2で使用されたデータセットをスケールアップしたバージョンであり、厳格にフィルタリングされた公開Webデータと合成データで構成されています。
Phi-3モデルには、Phi-3-miniに加えて、70億パラメータのPhi-3-smallと140億パラメータのPhi-3-mediumも含まれています。これらのモデルはどちらも、Phi-3-miniよりも大幅に高性能。Phi-3-smallは、多言語トークン化を改善するために、より大きな語彙サイズを持つtiktokenトークナイザーを活用しています。
Phi-3モデルはすべて、教師ありファインチューニング (SFT) と直接選好最適化 (DPO) の2段階の後トレーニングプロセスを経ています。SFTでは、数学、コーディング、推論、会話、モデルのアイデンティティ、安全性など、さまざまな分野の厳選された高品質なデータを使用しています。
教師ありファインチューニングは、既に訓練されたモデルに対して、特定のタスクに関連するデータセットを使ってさらに訓練を行うプロセス。この手法は、モデルが特定の用途やドメインにより適したパフォーマンスを発揮できるようにするために使われます。
さらに、Phi-3-miniをベースにした42億パラメータのモデルであるPhi-3-visionも導入されました。Phi-3-visionは、画像とテキストのプロンプトに対する強力な推論機能を備えています。
Phi3.5は上記のPhi-3をベースに開発されており、推論能力が向上しています。
Phi3.5 mini instruct
Phi3.5 mini instructは、軽量でありながら最先端のオープンモデルであり、特に高品質で推論密度が高いデータに重点を置いて、Phi-3で使用されたデータセット上に構築されています。
Phi3.5 mini instructは、128Kトークンのコンテキスト長をサポート。特にQasperで優れた性能を発揮します。
Phi3.5 mini instructは、3.8Bという限られたアクティブパラメータ数でありながら、多言語タスクにおいて、より多くのアクティブパラメータ数を持つ他のモデルと比較して優れた性能があります。
Phi-3.5-mini-instructは、これまでに合計3.4兆トークンのさまざまなソースを含むトレーニングデータでトレーニングされました。
近傍方策最適化:Proximal Policy Optimization (PPO) は、強化学習の一種で、特にロボティクスやゲームAIのトレーニングにおいて広く使われている手法。PPOは、エージェントが環境との相互作用を通じて最適な行動方針を学習するプロセスを改善するために設計されています。
直接優先最適化:Direct Preference Optimization (DPO) は、AIや機械学習の分野で利用される手法の一つで、特に生成モデルや強化学習において、ユーザーの好みや意思を直接的に最適化するためのアプローチ。
従来の強化学習や生成モデルの訓練では、報酬関数や損失関数を通じて、間接的にモデルの出力を制御します。しかし、DPOでは、ユーザーや人間の好みに基づくフィードバックを直接的に活用してモデルを訓練します。これにより、モデルは人間が望む出力に対してより迅速かつ正確に適応できるようになります。
Phi 3.5 MoE
Phi3.5 MoEは、最大32064トークンの語彙サイズをサポートする、オープンモデル。
トレーニングデータは合計4.9兆トークンで、そのうち10%が多言語です。
Phi3.5 MoEは、公開されているドキュメントから、モデルの推論能力を高める可能性のある質の高いデータに焦点を当て、特定の日のプレミアリーグの試合結果など、フロンティアモデルのトレーニングデータとしては適していますが、小規模モデルの推論能力を高めるために削除する必要がある情報を含むようにフィルタリングされています。
特にReasoningやMath、長いコンテキストでのコード理解で優れた性能を発揮します。
Phi 3.5 Vision instruct
Phi 3.5 Vision instructはPhi-3.5モデルの軽量かつ最先端のオープンマルチモーダルモデルです。このモデルは、テキストと画像の両方において、非常に高品質で推論に優れたデータセットを用いて構築されています。
特にArt StyleとForensic Detectionで優れた性能を発揮。Forensic DetectioはAIモデルが画像やビデオの改ざんを検出する能力であり、Art Styleは芸術に関するタスクのスコアです。
主な特徴は多言語対応であることや128Kトークンのコンテキスト長、画像理解と推論などが挙げられます。
画像の理解、光学式文字認識、チャートや表の理解、複数画像の比較、複数画像またはビデオクリップの要約など、幅広い視覚機能を備えています。
また、下の画像から分かるように、処理時間が長くなるにつれて、Phi 3.5 Vision instructの性能が低下することがわかります。
Phi 3.5のライセンス
Phi 3.5はいずれのモデルにおいても、MITライセンスです。基本的には商用利用や改変、私的利用など全て可能です。
利用用途 | 可否 |
---|---|
商用利用 | ⭕️ |
改変 | ⭕️ |
配布 | ⭕️ |
特許使用 | ⭕️ |
私的使用 | ⭕️ |
なお、GPT-4o超えの日本語レベルを持つ1000億パラメータLLMについて詳しく知りたい方は、下記の記事を合わせてご確認ください。
Phi 3.5の使い方
Phi 3.5のモデルは3つあるので、それぞれをgoogle colaboratoryで実装していきたいと思います。
いずれのモデルでも有料課金してGPUを使う必要があります。無料のGPUではリソースが足りなくなってしまいます。
Phi 3.5モデルを動かすのに必要な動作環境
Phi 3.5モデルを実行した時の環境は以下です。
■Pythonのバージョン
Python 3.8以上
■使用ディスク量
44.8GB
■システムRAMの使用量
5.2GB
■GPU RAMの使用量
16.3GB
Phi3.5 vision instruct
まずはPhi3.5 vision instructを動かします。Phi3.5 vision instructでは、画像の内容を読み取ることができるため、デモではMicrosoftのスライドを読み取り、どういった内容が書かれているかを出力してもらいます。
ライブラリのインポート
!pip install flash_attn==2.5.8 numpy==1.24.4 Pillow==10.3.0 Requests==2.31.0 torch==2.3.0 torchvision==0.18.0 transformers==4.43.0 accelerate==0.30.0
HuggingFaceにライブラリのバージョン指定があるので、そちらに則りましょう。
ライブラリのインポート後にセッションの再起動を求められるので、再起動をしておきましょう。
Microsoftのモデルを動かす際には、ほぼほぼエラーなく動かせます。
デモコードはこちら
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="cuda",
trust_remote_code=True,
torch_dtype="auto",
_attn_implementation='flash_attention_2'
)
# 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,20):
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:0")
generation_args = {
"max_new_tokens": 1000,
"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)
Phi3.5 MoE instruct
続いてPhi3.5 MoE instructの実装ですが、こちらはモデル容量が大きすぎてA100のGPUでもリソースが足りなくなってしまいます。
そのため、デモコードの紹介のみになります。
こちらもライブラリのバージョンがHuggingFaceで指定されているので、それに則ります。
ライブラリのインポートはこちら
!pip install flash_attn==2.5.8 torch==2.3.1 accelerate==0.31.0 transformers==4.43.0
デモコードはこちら
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
torch.random.manual_seed(0)
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3.5-MoE-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3.5-MoE-instruct")
messages = [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "What about solving an 2x + 3 = 7 equation?"},
]
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
)
generation_args = {
"max_new_tokens": 100,
"return_full_text": False,
"temperature": 0.0,
"do_sample": False,
}
output = pipe(messages, **generation_args)
print(output[0]['generated_text'])
Phi3.5 mini instruct
最後にPhi3.5 mini instructです。こちらはgoogle colaboratoryでもリソース不足にならず動かせます。
ライブラリのインストールはこちら
!pip install flash_attn==2.5.8 torch==2.3.1 accelerate==0.31.0 transformers==4.43.0
デモコードはこちら
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
torch.random.manual_seed(0)
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3.5-mini-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=True,
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3.5-mini-instruct")
messages = [
{"role": "system", "content": "You are a helpful AI assistant."},
{"role": "user", "content": "Can you provide ways to eat combinations of bananas and dragonfruits?"},
{"role": "assistant", "content": "Sure! Here are some ways to eat bananas and dragonfruits together: 1. Banana and dragonfruit smoothie: Blend bananas and dragonfruits together with some milk and honey. 2. Banana and dragonfruit salad: Mix sliced bananas and dragonfruits together with some lemon juice and honey."},
{"role": "user", "content": "What about solving an 2x + 3 = 7 equation?"},
]
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
)
generation_args = {
"max_new_tokens": 500,
"return_full_text": False,
"temperature": 0.0,
"do_sample": False,
}
output = pipe(messages, **generation_args)
print(output[0]['generated_text'])
これで一通りデモコードは動かせます。エラーが起きるとしたらGPUのリソース不足だと思いますので、google colaboratoryで実行するときにはリソースを確認しておくのがいいでしょう。
Phi3.5の凄さを実際に検証してみる
では、ここからはPhi3.5の凄さを実際に検証してみたいと思います。検証できるのは、Phi3.5 mini instructとPhi 3.5 vision instructの2つです。
Phi3.5 mini instructは日本語にも対応しているので、日本語のタスクを試します。
日本語タスクはこちら
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "microsoft/Phi-3.5-vision-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
trust_remote_code=True,
torch_dtype="auto",
_attn_implementation='flash_attention_2'
)
messages = [
{"role": "system", "content": "あなたは優秀なアシスタントです。"},
{"role": "user", "content": "取引先に対して、アポイントメントのメールを作成してください。"}
]
prompt = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
inputs = tokenizer(prompt, return_tensors="pt").to("cuda:0")
generation_args = {
"max_new_tokens": 500,
"temperature": 0.7,
"do_sample": True,
}
generate_ids = model.generate(**inputs,
eos_token_id=tokenizer.eos_token_id,
**generation_args
)
response = tokenizer.batch_decode(generate_ids,
skip_special_tokens=True,
clean_up_tokenization_spaces=False)[0]
print(response)
日本語タスクの出力結果はこちら
取引先に対して、アポイントメントのメールを作成してください。
件名:迅速な対応をお願いする - [取引先の名前]
親愛なる[取引先の名前],
こんにちは、[あなたの名前]と申します。取引先の皆様の取引において、私たちとの関係の重要性に加えて、私たちのビジネスにおいても重要な役割を果たしているという理解を持っており、今回はあなたの支援を必要としていることを知っています。
この取引の進行中に、あなたに対して進行中の問題が発生したことを知らせていただき、ご責任でご心配いただき、この取引の成功を担っていただき、あなたの支援が必要な場合があることを知らせてください。
今後も迅速な対応をお願い申し上げることができます。あなたの取引における私たちのサポートについてのご連絡をお知らせください。
敬具
[あなたの名前]
[あなたの住所]
[あなたの電話番号]
[あなたのアドレスメール]
[あなたの経済会社名]
親愛なるや関係の重要性という単語は、あまり一般的には使わないで日本語での生成は少し怪しい感じがします。
ちなみにChatGPT-4oに生成させた場合はこちら
ChatGPT-4oの結果はこちら
件名: 【御社名】様とのアポイントメントのご依頼
【担当者名】様
お世話になっております。
【あなたの会社名】の【あなたの名前】でございます。
この度は、御社の【商談内容やプロジェクト名】に関して、直接お話しさせていただく機会を頂ければと思い、ご連絡差し上げました。
貴社のご都合の良い日時をご教示いただけますと幸いです。
私どもとしては、下記の日程が候補としてございます。
【候補日1】(例:8月25日(木)午後2時〜)
【候補日2】(例:8月26日(金)午前10時〜)
【候補日3】(例:8月29日(月)午後1時〜)
上記の日程以外でも、柔軟に調整可能ですので、お手数をおかけいたしますが、ご都合の良い時間帯をお知らせください。
お忙しいところ恐縮ですが、何卒よろしくお願い申し上げます。
敬具
【あなたの名前】
【あなたの会社名】
【連絡先情報(電話番号、メールアドレスなど)】
次にPhi3.5 vision instructでは、説明が難しそうな画像を説明してもらう・英語の画像の内容を説明してもらうというタスクを実装してみます。あとは日本語に対応しているのかも確認しておきましょう。
説明してもらう画像はこちらです。
画像タスクのコードはこちら
from PIL import Image
from transformers import AutoModelForCausalLM, AutoProcessor
import torch
model_id = "microsoft/Phi-3.5-vision-instruct"
# モデルのロード
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
trust_remote_code=True,
torch_dtype="auto",
_attn_implementation='flash_attention_2'
)
# プロセッサのロード(シングルフレームの場合はnum_crops=16に設定)
processor = AutoProcessor.from_pretrained(
model_id,
trust_remote_code=True,
num_crops=16
)
# 画像の読み込み
image = Image.open("/content/スクリーンショット 2024-08-22 21.00.49.png")
# メッセージの作成
messages = [
{"role": "user", "content": "<|image_1|>\n画像を要約してください."},
]
# チャットテンプレートの適用
prompt = processor.tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
# 入力の処理
inputs = processor(text=prompt, images=image, return_tensors="pt").to("cuda:0")
# 生成パラメータ
generation_args = {
"max_new_tokens": 1000,
"temperature": 0.0,
"do_sample": False,
}
# 生成
with torch.no_grad():
generate_ids = model.generate(
**inputs,
eos_token_id=processor.tokenizer.eos_token_id,
**generation_args
)
# 入力トークンを削除
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)
画像タスクの結果はこちら
1枚目の画像
The image captures a large, curved rock formation with a series of horizontal stripes in shades of brown and black. The formation is set against a clear blue sky with a few clouds. The rock appears to be part of a larger landscape, possibly a desert or arid region.
和訳:画像は、茶色と黒の濃淡の横縞が連なる、大きく湾曲した岩層をとらえている。この地層は、雲も少しある澄み切った青空を背景にしている。この岩は、おそらく砂漠か乾燥地帯と思われる大きな風景の一部に見える。
2枚目の画像
The image contains two sections. The top section is titled 'ENVIRONMENTAL ISSUES' and lists various environmental concerns associated with LLMs and generative AI, such as cost, CPU/GPU requirements, use of rare metals, carbon emissions, and the need for natural resources. The bottom section is titled 'How to provide Enterprise grade answers' and outlines a process flow for creating and verifying answers using AI, including steps like creating an index, getting context, building an answer, and verifying sub-answers. The process flow is depicted in a flowchart with arrows indicating the sequence of steps
和訳:画像には2つのセクションがある。上のセクションは「ENVIRONMENTAL ISSUES(環境問題)」と題され、コスト、CPU/GPU要件、希少金属の使用、炭素排出、天然資源の必要性など、LLMや生成AIに関連するさまざまな環境問題を挙げている。一番下のセクションは「How to provide Enterprise grade answers(エンタープライズグレードの回答を提供する方法)」と題され、インデックスを作成し、コンテキストを取得し、回答を構築し、サブ回答を検証するといったステップを含む、AIを使用して回答を作成し、検証するためのプロセスフローを概説している。プロセスの流れは、ステップの順序を矢印で示したフローチャートで描かれている。
日本語での生成は英語よりもかなり時間がかかります。
最後に
いかがだったでしょうか?
弊社では
・マーケティングやエンジニアリングなどの専門知識を学習させたAI社員の開発
・要件定義・業務フロー作成を80%自動化できる自律型AIエージェントの開発
・生成AIとRPAを組み合わせた業務自動化ツールの開発
・社内人事業務を99%自動化できるAIツールの開発
・ハルシネーション対策AIツールの開発
・自社専用のAIチャットボットの開発
などの開発実績がございます。
まずは、「無料相談」にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。
➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。
「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。
セミナー内容や料金については、ご相談ください。
また、サービス紹介資料もご用意しておりますので、併せてご確認ください。