GitSeonjeap
日本語

ログイン

閲覧にログインは不要です。コミュニティで投稿・コメント、おすすめ・通報をするにはログインしてください。

ログインすると、下記の案内に同意したものとみなします。 ご利用案内 · プライバシーのご案内

ログインせずに閲覧する

自分のコンピューターで同じ条件で測定する方法

速度の数値は、条件が少し違うだけで大きく変わります。このガイドでは、llama.cpp・MLX・Ollama で近い条件で測定する方法と、記録する値をまとめています。すべての環境で同じ結果を保証するものではなく、数値は例です。

コマンドのオプションはバージョンによって異なる場合があります。動作しない場合は、各プログラムの --help で現在のバージョンのオプションを確認してください。コマンド本文は翻訳せずそのまま記載しており、MODEL と書かれた部分はご自身のモデルファイルまたは名前に置き換えてください。

先に記録しておく値

速度の数値と一緒に以下の値を控えておくと、投稿時にそのまま転記でき、他のデバイスとも比較しやすくなります。

条件を固定するコツ

  1. コンテキスト長を決めておくコンテキスト長を8192のように1つの値に決めて記録してください。コンテキストが長くなるほど速度が落ちることが多く、異なる値同士は比較しにくくなります。
  2. 同時リクエストは1にする一度に送るリクエストは1つにし、他のプログラムがモデルを使っていないか確認してください。同時リクエストが増えると、リクエストごとの速度と合計スループットが異なる値になります。
  3. 量子化を揃える他のデバイスと比較するには、同じモデルの同じ量子化である必要があります。名前が似ていても作成元によって構成が異なることがあるため、入手元も記録してください。
  4. 電源状態を揃えるノートPCは充電器を接続し、低電力モードやバッテリーセーバーはオフにしてください。接続の有無を記録しておくと、他の人が解釈しやすくなります。
  5. 発熱が安定してから測定する最初の1〜2回は除外し、何度か繰り返して値が安定してからの結果を使ってください。繰り返しの間の休止時間は、長すぎも短すぎもしないよう一定にしてください。
  6. 同じプロンプトで複数回プロンプトと生成長を固定して3〜5回繰り返し、中央値を使うことをおすすめします。1回だけの測定値は偶然の影響を大きく受けます。
  7. 他の作業を閉じるブラウザのタブ、動画再生、別のモデルの実行など、GPUやメモリを使う作業は閉じて測定してください。メモリが足りずディスクにあふれると、速度が大きく落ちます。

llama.cpp (llama-bench)

llama.cpp に含まれる llama-bench は、プロンプト処理と生成の速度を別々に複数回測定して平均を表示します。最初に試すのに適した方法です。

-p は読み込むプロンプトのトークン数、-n は生成するトークン数、-r は繰り返し回数、-ngl はGPUに載せる層の数です。結果表の pp512 行がプロンプト処理速度、tg128 行が生成速度で、単位は t/s(= tok/s)です。

コマンド例 · llama.cpp
llama-bench -m ./models/MODEL.gguf -p 512 -n 128 -r 5 -ngl 99

記録する値 tg128 の t/s → 生成速度、pp512 の t/s → プロンプト処理速度。表示される ± は繰り返し間のばらつきです。生成したトークン数には -n の値(128)を入力します。

既定では、コンテキストがほぼ空の状態での速度を測ります。長いコンテキストでの速度を見るには、-d オプションで既に埋まっているコンテキスト深度を指定できますが、このオプションはバージョンによって異なる場合があるため --help で確認してください。その場合、コンテキスト長には -d の値を入力します。

実際のサーバー経由で測定したいときの方法です。コンテキスト8192・スロット1でサーバーを起動し、プロンプトキャッシュを無効にして1回リクエストします。レスポンスの timings 項目から値を読み取ります。

コマンド例 · llama.cpp
llama-server -m ./models/MODEL.gguf -c 8192 -ngl 99 --parallel 1

curl http://127.0.0.1:8080/completion -d '{"prompt":"Explain how a transformer language model works.","n_predict":256,"temperature":0,"cache_prompt":false}' | jq '.timings'

記録する値 timings の predicted_per_second → 生成速度、prompt_per_second → プロンプト処理速度、predicted_n → 生成したトークン数。コンテキスト長には -c の値、同時リクエストには 1 を入力します。

MLX (mlx_lm)

Appleシリコン Mac 向けの mlx-lm パッケージです。生成コマンドが終わると、プロンプト速度・生成速度・ピークメモリをまとめて表示します。

--max-tokens で生成長を固定し、--temp 0 でランダム性を減らします。最後に表示される「Prompt: … tokens-per-sec」と「Generation: … tokens-per-sec」の行を読み取ります。

コマンド例 · MLX
pip install -U mlx-lm

python -m mlx_lm.generate --model mlx-community/MODEL --prompt "Explain how a transformer language model works." --max-tokens 256 --temp 0

記録する値 Generation 行の tokens-per-sec → 生成速度、Prompt 行の tokens-per-sec → プロンプト処理速度、Generation 行の tokens の前の数字 → 生成したトークン数、Peak memory → ピークメモリ使用量(GB)。初回はモデルの読み込みで遅くなることがあるため、2回目以降の結果を使ってください。

最近の mlx-lm には mlx_lm.benchmark があり、プロンプト長(-p)と生成長(-g)を指定して複数回(-n)測定します。ウォームアップの後、各試行の値と「Averages」行を表示します。古いバージョンにはない場合があるため、インストール済みのバージョンで使えるか確認してください。

コマンド例 · MLX
python -m mlx_lm.benchmark --model mlx-community/MODEL -p 512 -g 128 -n 5

記録する値 Averages 行の prompt_tps → プロンプト処理速度、generation_tps → 生成速度、peak_memory → ピークメモリ使用量。生成したトークン数には -g の値を入力し、使用した -p の値はコマンドと一緒にコマンド入力欄に残してください。出力形式はバージョンによって異なる場合があります。

Ollama

Ollama は --verbose オプションを付けると回答の後に速度統計を表示し、APIレスポンスにはトークン数と所要時間が含まれます。

--verbose を付けて1回実行すると、最後に「prompt eval rate」と「eval rate」が tokens/s で表示されます。手軽ですが、コンテキスト長や生成長を固定しにくいため、おおまかな確認用です。

コマンド例 · Ollama
ollama run MODEL:TAG --verbose "Explain how a transformer language model works."

記録する値 eval rate → 生成速度、prompt eval rate → プロンプト処理速度、eval count → 生成したトークン数。思考(thinking)が有効なモデルでは、そのトークンが含まれるか確認してください。

APIを使うと、コンテキスト長(num_ctx)・生成長(num_predict)・ランダム性(temperature)を固定して1回リクエストできます。レスポンスの eval_count と eval_duration(ナノ秒)から生成速度を自分で計算します。jq が必要です。

コマンド例 · Ollama
OLLAMA_NUM_PARALLEL=1 ollama serve

curl -s http://localhost:11434/api/generate -d '{"model":"MODEL:TAG","prompt":"Explain how a transformer language model works.","stream":false,"options":{"num_ctx":8192,"num_predict":256,"temperature":0}}' | jq '{gen_tps: (.eval_count / .eval_duration * 1e9), prompt_tps: (.prompt_eval_count / .prompt_eval_duration * 1e9), eval_count, prompt_eval_count}'

記録する値 出力された gen_tps → 生成速度、prompt_tps → プロンプト処理速度、eval_count → 生成したトークン数、num_ctx → コンテキスト長。prompt_eval_count が極端に小さい場合は前のリクエストのキャッシュが使われているため、プロンプト処理速度は当てになりません。

同時リクエストを1にするには、サーバー起動時に環境変数 OLLAMA_NUM_PARALLEL=1 を指定し、同時に他のリクエストが入らないようにしてください。既定値はバージョンや環境によって異なる場合があります。

よくある間違い

  1. 思考トークンを含めるか決めていない推論(思考)過程を先に出力するモデルでは、そのトークンも生成トークンに含まれることがあります。速度自体は近くても、答えが出るまでの時間は大きく変わるため、含めたかどうかをコマンド入力欄に書いてください。
  2. プロンプトキャッシュが有効だった同じプロンプトを繰り返すと、エンジンが冒頭部分を読み直さず保存済みのものを使うことがあります。すると、プロンプト処理速度が不自然に速く表示されます。キャッシュを切るか、毎回異なるプロンプトを使ってください。
  3. 最初のリクエストまで平均に含めた最初のリクエストは、モデルのメモリへの読み込みやGPUの起動で遅くなります。事前に1回実行して(ウォームアップ)、その後の値を使ってください。
  4. トークン数と文字数を混同したトークンは文字や単語とは異なります。同じ文でもモデルによってトークン数が違うため、速度は自分で数えた文字数ではなく、エンジンが表示するトークン数から計算された値を使ってください。
  5. 異なる量子化・コンテキストで比較したQ4 と Q8、コンテキスト 4096 と 32768 のように条件が異なる値を同じ列で比較することはできません。比較するには、1つだけ変えて残りは同じにしてください。
  6. 同時リクエスト数の意味を混同した同時リクエストを2以上で測定した場合は、入力した速度が1リクエストあたりなのか合計なのかを、必ずコマンド入力欄に書いてください。区別がないと比較できません。
  7. 発熱で遅くなった値を代表値にした長時間動かすと発熱で速度が下がるデバイスがあります。代表値が目的なら繰り返し測定の中央値を使い、速度が下がり続ける様子が見られたらその点も書いてください。

測定は終わりましたか?

結果画面をキャプチャし、上で控えた値と一緒に投稿してください。審査後に「ユーザー投稿 · 証拠確認済み」グレードで公開します。

測定値の投稿ページへ