実行プログラムと拡張機能

ローカルLLMの速度を測る:sparkDashの使い方

sparkDashで単一リクエスト速度と同時throughputを分けて測り、機器・モデル・負荷条件を記録して比較します。

sparkDashはDGX SparkやNVIDIA GPU1 host、ローカルLLM2 serverを1画面で監視し、decode3、prefill4、quality benchmarkを実行するdashboardです。decode testでは同時request数とprose・code・structured・JSONを選び、prefillは1K〜300Kのcontext sizeを順に試してTTFT5とprefill tok/sを記録します。request数と入力長が違えば別の負荷を表すため、engine、model、GPU電力、prompt6、回答長をそろえて比較します。

実行条件と要点
  • decodeではrequestあたりtok/sとaggregateを分けます。
  • prefillは入力token処理量と最初のtokenまでの時間を記録します。
  • GPU電力、engine、model ID、prompt、並列数を一緒に記録します。

まず測る作業とserverを決めます

sparkDashのdecode benchmarkはserverが回答を生成するときのtoken7速度を測定します。prefill benchmarkはprompt処理throughput8と最初のtokenまでの時間を記録します。長い文書を読ませる作業ではprefillとTTFT、長い回答を生成する作業ではdecodeを優先します。

現行READMEはsparkDash 2.40.0を案内しています。remote GPU hostはSSHで登録でき、各LLM serverのaddressとportを追加するとbackendとmodelを検出します。ローカルLLMを追加する前にserver portを確認し、remote unitにはsparkDashからSSH接続できるaccountを用意します。

コードのような行が表示された大型モニター、デスクトップタワー、ノートPCのある机
benchmarkと一緒に実行条件を保存すると、後から差を追えます。

公式repositoryからdashboardを起動します

repositoryをcloneしてproduction用Docker Composeを起動します。既定ではloopbackのみでlistenするため、同じhost上でhttp://127.0.0.1:5555を開きます。dashboardはserver監視とbenchmark結果表示を行い、LLM model自体の導入やdownloadはしません。

sparkDashをloopbackで起動
git clone https://github.com/MiaAI-Lab/sparkDash.git
cd sparkDash
docker compose up --build -d

Add unitでThis hostを選ぶか、remote機器のLAN addressとSSH userを入力します。続いてTensorFoldの既定port 8888、または稼働中API9の実portを追加します。remote Linuxの収集にはSSH公開鍵がDocker container内から見える必要があります。別のPCからdashboardを見る場合、直接公開せずloopbackのSSH tunnelを使います。

remote接続はSSH tunnelを利用
ssh -N -L 5555:127.0.0.1:5555 user@sparkdash-host
画面が暗いモニター、小型デスクトップPC、複数のファンが見えるPCケース
GPUとmodel serverの準備後にdecodeとprefill testを実行します。

decode benchmarkでrequest数を変えます

LLM unitでbenchmarkを開き、prose、structured、code、JSONからrequest typeを選び、同時request数とreply長を設定します。lab protocolはtemperature 0、thinking offです。実行中はstreamからtok/sを計算して結果を保存します。同時request数を増やしたらaggregate tok/sとrequestあたり速度を両方読みます。

たとえば 4 件のリクエストがそれぞれ平均 25 tok/s なら、サーバー全体では 100 tok/s です。個々の利用者が感じる速度は、リクエストごとの token 速度と最初のトークンまでの時間(TTFT)で別に確認します。prose リクエスト同士、structured リクエスト同士で比較します。

prefillと機器条件を記録して再比較します

prefill benchmarkはcontext sizeを1Kから300Kまで変え、tok/sとTTFTを記録します。各prompt sizeでunique prefixを使うため、cache hitと初回prompt処理を区別できます。32K promptのprefill rateと一緒に最初のtokenまでの時間も確認します。

結果の横にGPU modelと電力制限、TensorFoldとmodel version、quant、context、KV cache10、parallel数を記録します。backendが対応すればhealth panelにKV使用量と実行中・待機中requestも表示されます。結果が大きく異なる場合は、同じ負荷を再実行する前にunitのGPUとAPI接続を確認します。

文書やグラフを表示したノートPCの周りに積まれた資料と開いたノート
結果を比べる際はmodelとworkload条件も照合します。

用語の注釈

  1. GPU — 多くの計算を並列に処理するプロセッサーです。AIモデルの実行ではモデル計算を担います。

    本文に戻る
  2. 大規模言語モデル — 大量のテキストデータから言語パターンを学び、文脈に沿ったテキストを処理・生成するモデルです。

    本文に戻る
  3. トークンのデコード — 入力とそれまでの回答をもとに、次の出力トークンを順に生成する段階です。

    本文に戻る
  4. プリフィル — LLMが入力プロンプトを読み、各トークンの内部表現を計算する段階です。プロンプトが長いほど処理するトークンが増えます。

    本文に戻る
  5. 最初のトークンまでの時間 — リクエスト送信から最初の出力トークンが届くまでの時間です。

    本文に戻る
  6. プロンプト — モデルに送る入力文です。生成モデルでは作りたい結果を説明する文になり、出力の構成や内容を大きく左右します。

    本文に戻る
  7. トークン — モデルが入力や出力を分けて処理する単位です。

    本文に戻る
  8. スループット — 一定時間に処理・生成した作業量です。トークン/秒やリクエスト/秒など、単位を合わせて比較します。

    本文に戻る
  9. API — 別のコードからプログラムの機能を呼び出すための決められたインターフェースです。

    本文に戻る
  10. KVキャッシュ — 過去トークンのAttention用キー・バリューを保存し、後続トークン生成で再利用するメモリです。容量はコンテキスト長やバッチサイズで変わります。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
sparkDashはDGX SparkやNVIDIA GPU host、ローカルLLM serverを1画面で監視し、decode、prefill、quality benchmarkを実行するdashboardです。decode testでは同時request数とprose・code・structured・JSONを選び、prefillは1K〜300Kのcontext sizeを順に試してTTFTとprefill tok/sを記録します。request数と入力長が違えば別の負荷を表すため、engine、model、GPU電力、prompt、回答長をそろえて比較します。