はじめに
前回は llama-server の使い方を整理しました。
今回は同じローカル環境で複数モデルを実行し、生成能力の評価をします。
「どのモデルが速いか」だけでなく、
「指示どおりに答えるか」「内容が正しいか」も確認します。
対象者
GPUなし・クラウドなしのローカル環境でLLMを試したい人。
今回も10年ほど前のデスクトップのWSLで動かしています。
関連記事
環境
OS : Ubuntu 24.04.1 LTS
CPU : Intel(R) Core(TM) i7-4790 CPU @ 3.60GHz
メモリ : 16GB
llama.cpp: version 8146 (418dea39c)
評価方針
今回はHello Worldタスクの評価を行いました。
-
Hello Worldのサンプルコードを出力させ、日本語で説明してもらいました。
プロンプト
私は、C言語のビギナーです。
あなたは、C言語の先生です。
Hello Worldのサンプル例を出してください。
簡単な説明を日本語でお願いします。
評価対象モデル
そもそもモデルってなに?
llama.cppはLLMの動作環境なので、モデルがないと動作しません。
車で例えると
シャーシ :llama.cpp
エンジン :モデル
の関係です。
モデルは様々なプロバイダーからリリースされており、私が評価しているモデルは
以下よりダウンロードしました。
興味のある方はこちらからダウンロードしてください。
| モデル | リリース元 | パラメーター数 | ファイル容量 |
|---|---|---|---|
| Meta-Llama-3-8B-Instruct-Q4_K_M | Meta | 8B | 約4.9 GB |
| Mistral-7B-Instruct-v0.3-Q4_K_M | Mistral AI | 7B | 約4.1 GB |
| Qwen2.5-7B-Instruct-Q4_K_M | Alibaba | 7B | 約4.7 GB |
| gemma-2-9b-it-Q4_K_M | 9B | 約5.4 GB | |
| qwen2.5-3b-instruct-q4_k_m | Alibaba | 3B | 約2.0 GB |
補足: モデル名の見方
モデルは名称ルールがあり、以下の要素がモデル名に含まれています。
私の主観ですが簡単に説明をいれてみました。
詳細が知りたい人は、ウェブで検索してみてください。
- パラメーター数(3B / 7B / 8B / 9B):かしこさの単位で大きいほうが賢い。小さいと暴走しがちで、7B以上でないとつかいものにならない印象。
-
量子化数(Q4): 量子化の指定。一般的に
Q4が採用されるいるみたい。 -
KとM(Q4_K_M の末尾): よくわかっていません。おすすめがQx_K_Mみたいなので、気にしてない。
モデルのダウンロードコマンド
# Meta-Llama-3-8B-Instruct-Q4_K_M
wget https://huggingface.co/bartowski/Meta-Llama-3-8B-Instruct-GGUF/resolve/main/Meta-Llama-3-8B-Instruct-Q4_K_M.gguf
# Mistral-7B-Instruct-v0.3-Q4_K_M
wget https://huggingface.co/bartowski/Mistral-7B-Instruct-v0.3-GGUF/resolve/main/Mistral-7B-Instruct-v0.3-Q4_K_M.gguf
# Qwen2.5-7B-Instruct-Q4_K_M
wget https://huggingface.co/bartowski/Qwen2.5-7B-Instruct-GGUF/resolve/main/Qwen2.5-7B-Instruct-Q4_K_M.gguf
# gemma-2-9b-it-Q4_K_M
wget https://huggingface.co/bartowski/gemma-2-9b-it-GGUF/resolve/main/gemma-2-9b-it-Q4_K_M.gguf
# qwen2.5-3b-instruct-q4_k_m
wget https://huggingface.co/Qwen/Qwen2.5-3B-Instruct-GGUF/resolve/main/qwen2.5-3b-instruct-q4_k_m.gguf
結果
プロンプト
私は、C言語ビギナーです。
あなたは、C言語の先生です。
Hello Worldのサンプル例を出してください。
簡単な説明を日本語でお願いします
結果サマリー
| モデル名 | 生成物の特徴 | 結果の信頼性 | 生成時間 |
|---|---|---|---|
| Meta-Llama-3-8B-Instruct-Q4_K_M | コードは正しい形式だが、説明に一部誤りがある | 中 | 3.3 t/s |
| Mistral-7B-Instruct-v0.3-Q4_K_M | 丁寧な日本語で基本構文を説明。 | 高 | 3.7 t/s |
| Qwen2.5-7B-Instruct-Q4_K_M | 構造化されていて読みやすい。 | 高 | 3.9 t/s |
| gemma-2-9b-it-Q4_K_M | 端的で理解しやすい。 | 高 | 2.8 t/s |
| qwen2.5-3b-instruct-q4_k_m | 手順は明確だが、不要な作業(デスクトップへコピー?)がある | 中 | 8.5 t/s |
出力例(Qwen2.5-7B-Instruct-Q4_K_M)
精度が一番良いと思ったQwwn2.5の7Bの出力です。
思った以上に詳細な説明がでてきたので、びっくりです。
もちろんです!C言語での「Hello, World!」プログラムを紹介いたします。
### プログラムコード
#include <stdio.h>
int main() {
printf("Hello, World!\n");
return 0;
}
### 説明
1. **`#include <stdio.h>`**: この行は、標準入出力機能を使用するためのヘッダファイルを含めるものです。`stdio.h`は「standard input/output」(標準入力・出力)の略です。
2. **`int main()`**: プログラムの始まりから表す関数名です。`main`関数が最初に実行されますし、プログラム全体の終了もこの関数で行われます。`int`はこの関数が整数を返すことを示しています。
3. **`{}`**: このブロックは`main`関数の開始と終了を表します。このブロックの中で記述されるすべての部分が`main`関数の実行内容となります。
4. **`printf("Hello, World!\n");`**: `printf`は「print formatted」(書式付き出力)の略です。ここでは、`"Hello, World!"`という文字列をコンソールに出力します。`\n`は改行コードで、新しいラインに進むことを意味します。
5. **`return 0;`**: この文はプログラムの終了時に返す値を指定します。`0`は通常、成功を表し、非ゼロの数値はエラーを示します。この例では、プログラムが正しく実行されたことを示しています。
### 実行方法
- プログラムをファイル名として保存します(たとえば `hello_world.c`)。
- コンパイルするために次のコマンドを使用します:
gcc hello_world.c -o hello_world
- 実行するために以下のコマンドを使います:
./hello_world
以上が「Hello, World!」プログラムの基本的な説明です。これでC言語を始められたことと思います!何か質問がありましたら、遠慮なくお聞きください。
[ Prompt: 12.5 t/s | Generation: 3.9 t/s ]
まとめ
Hello Worldタスクだけを見ると、速度重視なら qwen2.5-3b-instruct-q4_k_m が有力でした。
一方で、説明品質と安定性まで含めると、Qwen2.5-7B-Instruct と Mistral-7B-Instruct が扱いやすい印象です。
日本語だとQwenが強そうな印象で、精度に応じて7Bか3Bを選ぶのがよさそうです。
今回は、簡単な質問でしたが、次回は文章の要約に挑戦します。