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

DGX Spark 1台と2台でQwen3.8 Flash Nextはどう変わる?

1台構成は単一リクエスト64.4 tok/s、8件同時で合計200.9 tok/s、2台のNVFP4構成は単一67.4、16件同時で合計390.1でした。

1台レシピはTensorFoldのZigエンジンとINT4-AutoRoundチェックポイント1を使います。既定の262,144トークン2ウィンドウでは単一64.4 tok/s、8件同時で合計200.9でした。2台レシピはConnectX-7で2つのrankを接続し、NVFP43またはINT4-AutoRoundと1,048,576トークンウィンドウを使います。NVFP4では単一67.4 tok/s、16件同時で合計390.1でした。台数に加えてチェックポイント、コンテキスト、並列数も異なるため、各レシピの条件下で比較します。

DGX SparkでQwen3.8 Flash-Nextに質問し回答を得る2構成を比較します。1台はINT4-AutoRound、2台はConnectX-7で接続してNVFP4かINT4-AutoRoundを選びます。単一要求の速度と合計処理量を分けて表を読み、サーバーの設定へ進みます。

実行条件と要点
  • 1台:INT4-AR、262K、単一64.4 tok/s、8件同時で合計200.9 tok/s。
  • 2台のNVFP4:1M、単一67.4 tok/s、16件同時で合計390.1 tok/s。
  • 2台のINT4-AutoRoundは単一89.3 tok/sでしたが、チェックポイントと量子化が異なります。

1台と2台では異なる実行構成を使います

1台レシピはTensorFoldのZigエンジンでQwen3.8 Flash Nextを提供します。既定値はINT4-AutoRoundチェックポイント、FP84 KV cache5、画像入力、context 262,144、parallel 8です。2台レシピは各rankにSparkを1台ずつ割り当て、ConnectX-7で接続し、より大きなコンテキストウィンドウと2種類のチェックポイントを選べます。

Sparkの数値はMIAが公開したrecipe別のTensorFold Zig buildと設定によるものです。TensorFold 0.6.xをpatchして使うMIAの他recipeと同様に、この結果を標準TensorFold 1.0.8の適格表へ移して読まないでください。model、branch、patchが変われば同じGPU6でも条件が変わります。

2つは別々のレシピです。1台の結果を、同じチェックポイントとコンテキストを使った2台の試験として読まず、追加機器の効果と量子化7の違いを分けて考えます。

画面が暗いモニター、小型デスクトップPC、複数のファンが見えるPCケース
まずサーバーの1台構成と2台構成の違いを見ます。

リクエスト数によって単一速度と合計が変わります

表のdecode8はprose生成の測定です。単一リクエストと同時リクエスト全体の合計を分けています。同時リクエストが増えると合計throughput9は上がることがありますが、各リクエストの速度は下がり、最初のトークンまでの時間は長くなります。

左右にスクロールして各項目を比較できます。

既定prose decodeの比較
構成1件同時リクエスト合計測定時parallel数
1 Spark · INT4-AR64.4 tok/s200.9 tok/s8
2 Sparks · NVFP467.4 tok/s390.1 tok/s16
2 Sparks · INT4-AR89.3 tok/s483.6 tok/s16

一人で使う場合は1件の列を比較します。共有サーバーでは合計処理量と測定時の要求数も確認します。2台のNVFP4とINT4-AutoRoundは異なるチェックポイントなので、その条件を保って構成を選びます。

接続された2台の小型デスクトップPCと粒子の流れを表示するモニター
2つのSpark rankは専用リンクとネットワーク設定を使います。

1台レシピを導入して最初の応答を確認します

1台構成では、NVIDIA GPUドライバーを備えたDGX Spark、DockerとNVIDIA Container Toolkit、約160GBの空きディスクが必要です。READMEのstart.shがコンテナとチェックポイントを取得し、既定設定でサーバーを準備します。

1台構成のrecipeを取得して起動
git clone https://github.com/MiaAI-Lab/Qwen3.8-Flash-Next-Single-DGX-Spark-TensorFold.git
cd Qwen3.8-Flash-Next-Single-DGX-Spark-TensorFold
./start.sh

リポジトリの現行Quick start手順に従います。セットアップが完了するとサーバーはport 8888でLIVEと表示します。API10 baseはhead機のアドレスに/v1を付け、モデルIDはQwen3.8-Flash-Nextです。curlに応答が返ったら、クライアントにも同じアドレスとモデル名を入力します。

headでAPIと最初のrequestを確認
curl -s http://127.0.0.1:8888/v1/models
curl -s http://127.0.0.1:8888/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"Qwen3.8-Flash-Next","messages":[{"role":"user","content":"Write a Python fibonacci function."}],"max_tokens":1000}'

2台recipeでは最初に下のcommandでscripts/local.shを作ります。次の設定blockはterminalで実行せず、file editorでそのfileのWORKER・FABRIC_PEERを変更して保存してください。WORKERは管理LANのSSH接続先、FABRIC_PEERは必要な場合のworker CX7 addressです。予約address192.0.2.xを実際の値へ変更します。両方にDockerとNVIDIA Container Toolkitを準備し、headから鍵認証SSHを確認します。既定copy方式は両方にcheckpointを保存するため、各deviceに空き容量が必要です.

2台構成のworkerを設定して起動
git clone https://github.com/MiaAI-Lab/Qwen3.8-Flash-Dual-DGX-Sparks-TensorFold.git
cd Qwen3.8-Flash-Dual-DGX-Sparks-TensorFold
cp scripts/local.sh.example scripts/local.sh
file editorでscripts/local.shに保存する内容
# Replace both reserved documentation addresses with your actual values.
WORKER=user@192.0.2.2       # worker SSH target on the management LAN
FABRIC_PEER=192.0.2.12      # worker CX7 address when needed
headで保存済みの設定を確認
grep -nE 'WORKER=|FABRIC_PEER=' scripts/local.sh
headからworkerへのSSHを確認
ssh-copy-id user@192.0.2.2
ssh -o BatchMode=yes user@192.0.2.2 true
2台serverを起動
./start.sh
LIVE後にmodel一覧と最初の応答を確認
curl -fsS http://127.0.0.1:8888/v1/models
curl -fsS http://127.0.0.1:8888/v1/chat/completions -H 'Content-Type: application/json' -d '{"model":"Qwen3.8-Flash-Next","messages":[{"role":"user","content":"Write a Python fibonacci function."}],"max_tokens":1000}'

prefillとコンテキストも合わせて選びます

2台レシピは最大1Mコンテキスト、既定parallel 16ですが、すべてのリクエストで両方の上限を同時に使えるという意味ではありません。各Sparkに約102GiBの空きメモリが必要で、同時リクエストはKV poolを共有します。1Mコンテキストと16件同時の両方が必要か、短いコンテキストで1〜2件を処理することが多いかで構成を選びます。

prefill11は最初のトークンを出す前にprompt12を読み込む段階です。1台では32K promptで2,630 tok/s、2台では近い長さでNVFP4が約2,575、INT4-ARが約3,285 tok/sでした。最初のトークンまでの時間はprompt長にも左右されるため、decode速度とは分けて確認します。

文書やグラフを表示したノートPCの周りに積まれた資料と開いたノート
同時リクエスト数とprompt長を実作業に合わせて確認します。

用語の注釈

  1. チェックポイント — 学習済みモデルの重みなどを保存したファイルです。同じモデル系列でも、版や用途によって異なるチェックポイントを使うことがあります。

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

    本文に戻る
  3. NVFP4 — NVIDIAが定義した4ビット浮動小数点データ形式です。対応状況はGPU世代、モデル、ソフトウェア実装によって異なります。

    本文に戻る
  4. FP8 — 一つの値を8ビットで表す浮動小数点形式です。

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

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

    本文に戻る
  7. 量子化 — モデルの重みや計算値を少ないビット数で表し、保存容量やメモリ使用量を減らす方法です。表現が粗くなるため、精度にも影響することがあります。

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

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

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

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

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

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
1台レシピはTensorFoldのZigエンジンとINT4-AutoRoundチェックポイントを使います。既定の262,144トークンウィンドウでは単一64.4 tok/s、8件同時で合計200.9でした。2台レシピはConnectX-7で2つのrankを接続し、NVFP4またはINT4-AutoRoundと1,048,576トークンウィンドウを使います。NVFP4では単一67.4 tok/s、16件同時で合計390.1でした。台数に加えてチェックポイント、コンテキスト、並列数も異なるため、各レシピの条件下で比較します。
必要なメモリはどのくらいですか?
2台レシピは最大1Mコンテキスト、既定parallel 16ですが、すべてのリクエストで両方の上限を同時に使えるという意味ではありません。各Sparkに約102GiBの空きメモリが必要で、同時リクエストはKV poolを共有します。1Mコンテキストと16件同時の両方が必要か、短いコンテキストで1〜2件を処理することが多いかで構成を選びます。