はじめに
今回はローカルLLMの推論が自分のゲーム用PCでどれだけ動くのかと、その精度について確認したので、まとめます。
今回の検証にはllama-cpp-pythonを用いてモデルを動作させます。
検証方法
導入環境について
今回の環境は以下になります。
- os: windows11
- wsl: Ubuntu-24.04
- pythonのver: 3.12
- llama-cpp-pythonのver: 0.3.16
また、CPUのスペックとRAMの容量は以下です。
今回は、NVIDIAのGPUが搭載されていますが、計算リソースとしては利用していません。
- CPU :Intel(R) Core(TM) i7-10700F CPU @ 2.90GHz
- RAM :16GB
- GPU :NVIDIA GeForce RTX 3060 Ti
利用するモデル
LM StudioのHuggingFaceリポジトリから量子化されたモデルが提供されているので、ダウンロードして利用します。
LM Studioの公式サイトのモデル一覧から動作させたいモデルぺージに公開されているHuggingFaceのページリンクがあるので、ここからたどってモデルをダウンロードしました。
llama-cpp-pythonの導入
llama-cpp-pythonはC++のllama.cppと呼ばれるTransformerをベースとした言語モデルを動作させるエンジンをpython環境でも利用できるようにラッピングしてくれているライブラリです。
導入の方法は他のpythonライブラリと同様にpipでインストール可能です。
pip install llama-cpp-python
こんなエラーが出るときは
導入後コードを実行する際に以下のようなエラーに遭遇した場合は、llama-cppのビルド環境が異なるためエラーが起きるようです。
自分は以下を実行して、正しくビルドできるようになりました。
apt install musl-dev
ln -s /usr/lib/x86_64-linux-musl/libc.so /lib/libc.musl-x86_64.so.1
参考:https://github.com/abetlen/llama-cpp-python/issues/1628
今回の実行コード
今回は簡単な画像を添付し、モデルに説明をしてもらいます。コードの要点としては2つです。
- VLMのモデルは「CLIP」という画像エンコーダが必要
- 画像はBase64でデコードしてから添付する
VLMの構造上、言語モデルの部分だけでは画像を認識し、処理することはできません。
なので、CLIPと呼ばれる画像エンコーダを読み込む処理が必要です。
コードとしては以下のように読み込んで利用しました。
from llama_cpp import Llama
from llama_cpp.llama_chat_format import Llava15ChatHandler
chat_handler = Llava15ChatHandler(
clip_model_path=f"./model/{model_category}/{clip_model_name}"
)
llm = Llama(
model_path=f"./model/{model_category}/{model_name}",
chat_handler=chat_handler,
chat_format="gemma",
n_ctx=1024,
)
以下はプロンプト類も含めて作成した、今回利用したコードになります。
from llama_cpp import Llama
import base64
from llama_cpp.llama_chat_format import Llava15ChatHandler
def image_file_to_base64(file_path):
with open(file_path, "rb") as image_file:
data = base64.b64encode(image_file.read())
return data.decode('utf-8')
model_category = "gemma-3-4b"
model_name = "gemma-3-4B-it-QAT-Q4_0.gguf"
clip_model_name = "mmproj-model-f16.gguf"
# LLaVAなどのモデルには「CLIP」という画像エンコーダが必要
chat_handler = Llava15ChatHandler(
clip_model_path=f"./model/{model_category}/{clip_model_name}"
)
llm = Llama(
model_path=f"./model/{model_category}/{model_name}",
chat_handler=chat_handler,
chat_format="gemma",
n_ctx=1024,
)
system_input = "あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。"
user_input = "この画像について詳しく説明して。"
base64_image = image_file_to_base64("./sample_img/animal1.png")
response = llm.create_chat_completion(
messages=[
{
"role": "system",
"content": f"{system_input}",
},
{
"role": "user",
"content": [
{"type": "text", "text": f"{user_input}"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{base64_image}",
}
},
],
},
],
max_tokens=1024,
)
print("============================================================")
print(response["choices"][0]["message"]["content"])
モデルの比較
今回実行したモデルもGemma3をベースにし、量子化されたモデルでの差を確認しました。
Clipモデルはmmproj-model-f16.ggufを利用しました。
-
gemma-3-4b:
- gemma-3-4B-it-QAT-Q4_0.gguf
- gemma-3-4b-it-Q3_K_L.gguf
- gemma-3-4b-it-Q4_K_M.gguf
- gemma-3-4b-it-Q6_K.gguf
- gemma-3-4b-it-Q8_0.gguf
-
gemma-3-12b,
- gemma-3-12b-it-Q4_K_M.gguf
- gemma-3-12b-it-Q6_K.gguf
- gemma-3-12b-it-Q8_0.gguf
参考までにGeminiに量子化によるサイズの違いによる一般的な変化をまとめてもらいました。
Geminiによるgemma-3-4bの特徴
| ファイル名 (量子化) | 推定サイズ | 賢さ | 特徴・おすすめ度 |
|---|---|---|---|
| gemma-3-4b-it-Q3_K_L.gguf | 約 2.24 GB | △ | 日本語の崩れが出やすいです。VRAMが4GBしかない環境用。 |
| gemma-3-4b-it-Q4_K_M.gguf | 約 2.29 GB | ○ | サイズと性能のバランスが良い標準版。迷ったらこれ。 |
| gemma-3-4B-it-QAT-Q4_0.gguf | 約 2.30 GB | ◎ | QAT(量子化考慮学習)済みのモデル。Q4_K_Mと同じサイズでも、より賢い可能性があります。 |
| gemma-3-4b-it-Q6_K.gguf | 約 3.10 GB | ◎ | 劣化がほぼ感じられません。VRAM 6GB以上あるならQ4よりこちらがおすすめ。 |
| gemma-3-4b-it-Q8_0.gguf | 約 4.13 GB | ★ | ほぼオリジナル性能。ただしサイズが大きく、それなら12BのQ4を使った方が賢い場合も。 |
Geminiによるgemma-3-12bの特徴
| ファイル名 (量子化) | 推定サイズ | 賢さ | 特徴・おすすめ度 |
|---|---|---|---|
| gemma-3-12b-it-Q4_K_M.gguf | 約 7.3 GB | ○ | RTX 3060/4060 (12GB版) などで快適に動くギリギリのライン。最も一般的。 |
| gemma-3-12b-it-Q6_K.gguf | 約 9.66 GB | ◎ | VRAM 12GBだとコンテキスト(会話履歴)を詰め込むと溢れるかも。VRAM 16GB向け。 |
| gemma-3-12b-it-Q8_0.gguf | 約 12.5 GB | ★ | 非常に重い。RTX 3090/4090 (24GB) などのハイエンドGPU専用。 |
入力するプロンプト
今回、入力するプロンプトは以下です。
添付画像はwikipediaに掲載されているタヌキの画像をお借りしました。
入力した画像サイズは250×180です。
system_prompt: あなたは誠実で優秀な日本人のアシスタントです。特に指示が無い場合は、常に日本語で回答してください。
user:この画像について詳しく説明して。
画像は以下のものを入力します。
内容としてはたぬきのwikiに掲載されている、タヌキの画像です。
note info
wikiでは、このタヌキは以下のように説明されています。
「タヌキ(狸)は、哺乳綱食肉目イヌ科タヌキ属Nyctereutesに分類される現生種の総称。現生種は1種のみとされていたが、遺伝子解析の結果により大陸産のN. procyonoidesと日本産のN. viverrinusの2種に分けるという説が出されている。以下の説明は、広義のタヌキ(大陸部と日本列島(北海道から九州)産を含む)について扱う。」
https://ja.wikipedia.org/wiki/タヌキより抜粋
評価内容
評価方法としては、以下の観点で正しく出力ができているかを確認します。
また、参考として推論時間がどれくらいかかったかの計測も行います。
-
タヌキの判別可否: 分類した結果がタヌキと明言されているかを判定します。
- 〇:タヌキと正しく明言されている。
- ✕:タヌキ以外のものが明言されている。
-
説明内容の妥当性: 以下の観点から判断。
- 観点
- タヌキの分類が正しく説明されているか
- 矛盾なく説明されているか
- 観点
実行結果
gemma-3-4b
gemma-3-4b-it-Q3_K_L.gguf
gemma-3-4b-it-Q3_K_L.gguf:
この画像には、マタギという動物が写っています。
マタギは、北海道に生息する哺乳類で、オタマジャクシのようなくんぐりした姿が特徴的です。冬眠の準備をするために、体全体を厚い毛で覆い、地面に丸まって過ごします。
マタギは、主に魚を食べており、特にニジナメコイを好むようです。彼らは、水中で魚を捕らえるために、水面を飛び出して魚を驚かせたり、水中に潜って魚を追いかけたりします。
マタギは、2006年に絶滅危惧種に指定されましたが、現在では保護活動によって個体数が回復傾向にあります。
画像からわかるように、このマタギは、冬眠の準備をしていたのでしょうか? 冬眠の準備をしているように見えますが、正確な状況は画像だけではわかりません。
もし、マタギについてもっと知りたいことがあれば、お気軽にご質問ください。
処理時間:68.189秒
gemma-3-4b-it-Q4_K_M.gguf
gemma-3-4b-it-Q4_K_M.gguf: 承知いたしました。この画像は、マムシ(鼬)の姿を捉えた写真ですね。
マムシは、哺乳綱鼬目マムシ科に属する動物で、主に日本、朝鮮半島、中国北部などに生息しています。
この写真に写っているマムシは、特徴的な毛並みと顔つきを持っています。
* **毛並み:** 非常に長く、ふさふさとした毛並みが特徴です。この毛は、寒さから身を守るだけでなく、獲物を捕らえる際に役立つと考えられています。
* **顔つき:** 比較的小さく、丸い顔と大きな耳が特徴です。大きな耳は、獲物の音を捉えるのに役立ちます。
* **体色:** 褐色や茶色など、周囲の環境に合わせた体色をしています。
マムシは、主に夜行性で、主に小動物や魚類などを捕食します。また、その独特な鳴き声で知られています。
このマムシは、自然の中で静かに佇んでいる様子が伺えますね。
何か他に知りたいことや、このマムシについて掘り下げてみたいことがあれば、お気軽にお尋ねください。
処理時間:70.717秒
gemma-3-4B-it-QAT-Q4_0.gguf
gemma-3-4B-it-QAT-Q4_0.gguf:
はい、承知いたしました。この画像は、マムシ(鼬)の写真ですね。
マムシは、日本に生息する哺乳類の一種で、その特徴的な外見から「日本のミッキーマウス」とも呼ばれています。
**主な特徴:**
* **体型:** 体は小型で、体長は約40~60cm、体重は約3~7kgです。
* **毛並み:** 非常に密な毛並みで覆われており、色は茶色や赤茶色など様々です。特に、頭部や背中の毛は、まるで帽子のようにふっくらとしています。
* **顔:** 鼻先が丸く、顔は短く、目は大きく、耳は小さく、ひげが特徴的です。
* **生息地:** 主に森林や草原などの生息地で、単独または少数の仲間で生活しています。
* **食性:** 雑食性で、昆虫、果物、小動物などを食べます。
* **行動:** 夜行性で、昼間は巣穴などで休息し、夜になると活動します。
**マムシに関する豆知識:**
* マムシは、その愛らしい外見からペットとして飼育されることもありますが、野生動物であるため、飼育には注意が必要です。
* マムシは、その優れた嗅覚と聴覚で獲物を探します。
* マムシは、冬眠する動物です。
この画像は、マムシが自然の中でリラックスしている様子を捉えています。
何か他に知りたいことはありますでしょうか?
処理時間:75.354秒
gemma-3-4b-it-Q6_K.gguf
gemma-3-4b-it-Q6_K.gguf: 承知いたしました。
この画像には、マムシ(マムシ科マムシ属)が写っています。
**特徴:**
* **毛皮:** マムシの最も特徴的な点は、その独特な毛皮です。この画像のように、毛は長く、ふさふさしており、茶色や黄褐色をしています。特に頭部や背中には、毛がボリュームを増し、まるで「帽子」のように見えます。
* **顔:** 顔は丸く、鼻は黒く、目は大きく、警戒心が強い印象を与えます。
* **体格:** 体は中型で、筋肉質です。
* **生息地:** マムシは、主に日本の山間部や森林地帯に生息しています。
* **生態:** 夜行性で、主に昆虫、小動物、果実などを食べます。
**その他:**
* マムシは、その毒性から注意が必要です。
* 近年、マムシの個体数は減少傾向にあり、保護活動が行われています。
この画像は、マムシの美しい毛並みと、警戒心の強い表情を捉えたものですね。何か他に知りたいことはありますか?
処理時間:76.140秒
gemma-3-4b-it-Q8_0.gguf
gemma-3-4b-it-Q8_0.gguf:
はい、承知いたしました。画像に写っている動物は、マムシ(帽馬鹿)ですね。
以下に詳細な説明をいたします。
**マムシ(帽馬鹿)について**
* **特徴:**
* 日本に生息するイタチ科の動物で、その独特な外見から「帽馬鹿」という愛称で親しまれています。
* 頭に生えている長い毛が、まるで帽子をかぶっているかのように見えることから名付けられました。
* 体長は60~80cm、体重は8~12kg程度です。
* 体色は、茶色や赤茶色で、腹部は白っぽいのが一般的です。
* 耳は大きく、顔の周りには黒い模様があります。
* **生息地:**
* 主に山地の森林や草原に生息しており、北海道から九州まで広く分布しています。
* 水辺を好んで利用し、魚や昆虫などを食べます。
* **生態:**
* 夜行性で、昼間は洞窟や茂みの中に隠れて過ごします。
* 単独で行動することが多く、繁殖期にはオスがメスを巡って縄張り争いをします。
* 近年、生息地の減少や密猟などにより、個体数が減少しているため、保護の対象となっています。
* **その他:**
* マムシは、その独特な外見から、多くの観光客に人気があります。
* 近年では、マムシをモチーフにしたグッズなども販売されています。
この画像は、マムシが自然の中でリラックスしている様子を捉えたものですね。
何か他に知りたいことはありますか? 例えば、マムシの行動や生態、保護活動など、より詳しく説明することも可能です。
処理時間:102.473秒
gemma-3-12b
gemma-3-12b-it-Q3_K_L.gguf
gemma-3-12b-it-Q3_K_L.gguf:
はい、承知いたしました。
画像には、たなご(キタタヌキ)と思われます。
**特徴:**
* **体格:** 比較的丸みを帯びた体型をしており、冬毛が非常にふさわしいです。
* **毛色:** 全体的に茶色っぽい毛色ですが、頭部や背中に黒っぽい部分が見られます。
* **顔:** キツネのような特徴的な顔をしており、特に目の周りの毛並みが印象的です。
* **生息地:** 画像の背景から、草原や森林地帯に生息していることが推測できます。
たなごは、北海道や東北地方に生息するキツネの一種です。冬毛は非常に暖かく、寒冷な環境に適応しています。
何か他に知りたいことはありますか?
処理時間:572.619秒
gemma-3-12b-it-Q4_K_M.gguf
gemma-3-12b-it-Q4_K_M.gguf:
はい、承知いたしました。画像について詳しく説明いたします。
この画像には、日本の野生動物であるキタキツネ(Ezo Kitsune)が写っています。
**特徴:**
* **毛色:** 全体的に赤茶色で、首周りや背中にはより濃い茶色や黒色の毛が混じっています。冬毛で、ふさふさとした毛並みです。
* **体格:** 比較的丸みを帯びた体型で、短く太い足を持っています。
* **表情:** 警戒心を持ちながらも、こちらをじっと見つめているような表情です。
* **背景:** 草地のような自然環境の中にいます。
**キタキツネについて:**
キタキツネは、北海道や東北地方などの寒冷な地域に生息するキツネの一種です。冬には毛がふさふさになり、寒さから身を守ります。
何か他に知りたいことはありますか?
処理時間:325.477秒
gemma-3-12b-it-Q6_K.gguf
gemma-3-12b-it-Q6_K.gguf:
はい、承知いたしました。
画像には、日本の野生動物であるタヌキ(本州のイタチ)が写っています。
**特徴:**
* **毛並み:** 全体的に茶色っぽい毛で覆われており、頭部にはふさふさとした毛が生えています。季節によって毛の色が変化し、冬毛はより厚く、赤みがかった色をしています。
* **体型:** ずんぐりとした体型で、短い足と丸い顔が特徴です。
* **表情:** 警戒しているような、少し不安げな表情をしています。
* **背景:** 草地のような場所で、自然の中で生活している様子が伺えます。
タヌキは、夜行性で、主に雑食性です。農作物を食べることもありますが、昆虫や小動物なども食べます。日本の伝承では、タヌキは化ける力を持つ動物として知られています。
何か他に知りたいことはありますか?
処理時間:906.642秒
gemma-3-12b-it-Q8_0.gguf
gemma-3-12b-it-Q8_0.gguf:
はい、承知いたしました。
画像には、キタキツネのようですが、頭部に特徴的な毛が生えている動物が写っています。
* **動物:** この動物は、タヌキ(Japense raccoon dog)である可能性が高いです。頭部の毛並みが非常に豊かで、まるで帽子を被っているように見えます。
* **毛色:** 全体的に茶色と黒色の混ざった毛色で、季節によって変化します。冬毛はより厚く、茶色味が強くなります。
* **背景:** 草地のような場所で、自然な環境の中にいます。
* **姿勢:** 警戒しているか、何かを見ているような姿勢です。
タヌキは日本に生息するイヌ科の動物で、農耕地や森林の周辺に生息しています。夜行性で、雑食性です。
何か他に知りたいことはありますか?
処理時間:983.657秒
結果まとめ
結論を簡単にまとめると以下のようになりました。
gemma-3-4bの出力結果の評価
| ファイル名 (量子化) | ファイルサイズ | 推論時間(秒) | たぬきの判別可否 | 説明内容の妥当性 | コメント |
|---|---|---|---|---|---|
| gemma-3-4b-it-Q3_K_L.gguf | 約 2.24 GB | 68.189秒 | × | × | 何か別の生物と認識していそう。 |
| gemma-3-4b-it-Q4_K_M.gguf | 約 2.29 GB | 70.717秒 | × | × | マムシは毒蛇なので、哺乳対ですらない。ただし、画像の特徴は認識していそう。 |
| gemma-3-4B-it-QAT-Q4_0.gguf | 約 2.30 GB | 75.354秒 | × | × | マムシは日本のミッキーマウスではないです。 |
| gemma-3-4b-it-Q6_K.gguf | 約 3.10 GB | 76.140秒 | × | × | マムシだが哺乳類っぽい説明ではあるし説明はタヌキっぽい。 |
| gemma-3-4b-it-Q8_0.gguf | 約 4.13 GB | 102.473秒 | × | × | マムシとかなり知識が混在していそう。 |
gemma-3-12bの出力結果の評価
| ファイル名 (量子化) | ファイルサイズ | 推論時間(秒) | たぬきの判別可否 | 説明内容の妥当性 | コメント |
|---|---|---|---|---|---|
| gemma-3-12b-it-Q3_K_L.gguf | 約 6.48 GB | 572.619秒 | × | × | タナゴは魚類かつ、説明の内容はキツネの要素がおおい。 |
| gemma-3-12b-it-Q4_K_M.gguf | 約 7.3 GB | 325.477秒 | △? | 〇? | 似たような生き物であるキツネと認識されている模様。説明の内容も一貫しているので間違え方としては、一番もっともらしい。 |
| gemma-3-12b-it-Q6_K.gguf | 約 9.66 GB | 906.642秒 | 〇 | 〇 | 本州のイタチという少し怪しい表現が含まれているが、概ね正しい表現になっている。 |
| gemma-3-12b-it-Q8_0.gguf | 約 12.5 GB | 983.657秒 | 〇 | 〇 | タヌキの可能性が高いことが言及できているので、判別可否は〇にしました。 |
モデルサイズが4B、12Bともに画像中のタヌキの特徴である「毛がふさふさ」、「毛色、体色が茶色」のような説明がされているので、モノの特徴は認識できているようでした。
ただし、写っているモノそのものまでは4B、12Bともに正しく認識はできておらず、モデルの知識量として画像とタヌキ紐づいていない可能性が高い。
モデルサイズが12Bのフルサイズの場合は、キツネに間違えているところからタヌキにまで類推することができるぐらいまでにはなることがわかった。
加えて、CPUのパワーがある程度強いものを使うとメモリの仮想化を駆使しつつ推論しきることができるのが収穫でした。
おわりに
今回はCPU環境を使ってGemma-3を動作させ、量子化されたモデル毎に性能を比較してみました。やはりモデルパラメータが少ないモデルに関してはもう少し応答性能が欲しいと感じました。
今後は既存モデルの量子化方法やVLMの学習方法などについても詳しく調べてたいと思います。
