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

NInferでQwen3.8をローカル実行:RTX 5090とMTP・DFlash2

11.18GBのNInfer専用モデルファイルを取得し、RTX 5090サーバーで質問に回答させます。

NInferは.ninferモデルファイルをNVIDIA GPU1で実行し、OpenAI互換API2で回答を返すCUDA3推論エンジンです。Underdog SalukiをDockerサーバーで起動して短い質問を送り、同じリクエストでMTP4とDFlash2のドラフト生成を比較できます。

実行条件と要点
  • NInferの.ninferアーティファクトは通常のGGUFとは異なり、NInfer-allビルドが必要です。
  • MTPとDFlash2は回答トークンを先行して提案します。アーティファクトに含まれる構成要素を選んでください。
  • SalukiのアーティファクトにはMTPヘッド、DFlash2アダプター、Visionタワーが含まれます。

NInferはモデルファイルからAPIで回答します

NInferはNInfer形式のモデルファイルをNVIDIA GPUで計算し、サーバーに送られたチャットリクエストへ回答する推論エンジンです。入力はモデルアーティファクトとテキストリクエスト、出力はOpenAI互換APIの回答です。ここでは低ビットQwen3.8-27B派生モデルのUnderdog Salukiを1枚のRTX GPUで動かし、短い質問を送ります。

変換ファイルは元のGGUF5テンソルブロックを保持し、MTPヘッドとDFlash2アダプターも含みます。重みあたり約2ビットの混合精度構成で、サイズは11,180,119,296バイト(10.41GiB)です。標準のNInferビルドは内部のgguf_*形式を扱えないため、統合リポジトリのビルドが必要です。

MTP(Multi-Token Prediction)は別の次トークン6ヘッドが複数候補を提案し、メインモデルが検証します。DFlash2は別のドラフトアダプターが候補を提案し、メインモデルが確認します。提案が受理されると1回の検証で多くのトークンを出せますが、速度差は入力、ドラフト数、GPUによって変わります。

1枚のグラフィックカードが見えるPC、モニターとキーボード
GPUで回答を生成するには、モデルアーティファクトとエンジンを合わせます。

Dockerでモデルを取得してサーバーを起動

LinuxでDocker、NVIDIAドライバー580以降、NVIDIA Container Toolkitを用意します。ここで使うDockerイメージはCUDA 13系です。Toolkitの公式サンプルワークロードでコンテナからGPUが見えることを確認し、Hugging Face CLI7のhfコマンドを用意してください。11.18GBのモデルとサーバーイメージの保存領域、モデルとKVキャッシュ8を載せるGPUメモリを確保します。

ダウンロードコマンドは11.18GBの.ninferファイルをmodelsフォルダーに保存します。hf downloadが見つからない場合はHugging Face HubパッケージのCLIをインストールして再実行してください。

サーバーは127.0.0.1:8080だけでリクエストを受け付けます。文脈長965,536トークン、MTPドラフト3個で起動します。現在のmodelsフォルダーをコンテナ内の/modelsにマウントします。

ターミナル1: モデルをダウンロード
mkdir -p models
hf download satoshifukimoto/Underdog-Saluki-27B-1.0-IQ2-mix-NInfer-v3 Underdog-Saluki-27B-1.0-IQ2-mix-ninfer-v3.ninfer --local-dir models
ダウンロード後、ファイルが`models/Underdog-Saluki-27B-1.0-IQ2-mix-ninfer-v3.ninfer`にあることを確認してください。
ターミナル1: MTPサーバーを起動
docker run --rm --gpus all -p 127.0.0.1:8080:8080 --ulimit memlock=-1 \
  -v "$PWD/models:/models" -v ninfer-cache:/cache \
  ghcr.io/iamwavecut/ninfer-all serve /models/Underdog-Saluki-27B-1.0-IQ2-mix-ninfer-v3.ninfer \
  --model-id underdog-saluki --max-context 65536 --kv-capacity 65536 --kv-dtype rk8v4 \
  --gdn-state-fp16 --spec mtp --draft-tokens 3 --lm-head-draft --vision
サーバーログでモデル読み込み完了とポート8080の開始を確認し、このターミナルを開いたままにします。
黒い2ファンのグラフィックカード、外付けSSDとUSBケーブル
計算を担う機器を用意し、コンテナからGPUを使えるようにします。

最初の質問を送り、応答を確認

サーバーのターミナルを動かしたまま、別のターミナルを開きます。モデル一覧にunderdog-salukiが表示されれば準備完了です。次のリクエストはOpenAI互換チャットエンドポイントへ短い英語の質問を送り、出力上限を128トークンにします。

正常な応答ではchoices[0].message.contentに回答が入ります。connection refusedはサーバー起動前またはポート未割り当てが主な原因です。モデルIDのエラーはリクエストのmodelとサーバーの--model-idが一致しない場合に起こります。

ターミナル2: モデル確認と最初の質問
curl -sS http://127.0.0.1:8080/v1/models
curl -sS http://127.0.0.1:8080/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{"model":"underdog-saluki","messages":[{"role":"user","content":"Explain why a local model server uses a context window in two sentences."}],"max_tokens":128}'
応答JSONの`choices`配列から生成された文章を読めます。

MTPとDFlash2はドラフト候補の作り方が異なります

最初のリクエストが成功したら、同じモデルと質問でドラフト方式を比較できます。MTPはモデル内の次トークンヘッドを使い、DFlash2は同じアーティファクト内の別アダプターを使います。設定を1つずつ変え、--spec mtp --draft-tokens 3 --lm-head-draftを--spec dflash2 --draft-tokens 5に置き換えてサーバーを再起動します。

ドラフト数を増やすと1回の検証でより多くのトークンを提案できますが、受理されない候補にも計算を使うことがあります。短いチャットではDFlash2の5個が向く場合があり、MTPは通常3〜5個で良好ですが、SalukiのMTP受理率はリクエストにより30〜100%と報告されています。文章、コード、言語で結果が変わるため、最速の1回ではなく同じ質問を複数回送った分布を比べてください。

生成速度を比べるときは質問と回答の長さを揃えます。同じサーバーを再起動し、同じ質問を複数回送り、出力トークン数と経過時間を記録してキャッシュやGPU温度の変化を区別してください。通常生成に戻すには--spec、--draft-tokens、--lm-head-draftを外して再起動します。

モニター、キーボード、小型PC、書類とペンのある机
ドラフト方式の比較では、実際の作業で送る質問と資料を揃えます。

RTX 5090コミュニティ測定結果

表ではSalukiのdecode10・prefill11速度とメモリ・読み込み時間を分けて示します。

Underdog Saluki NInfer v3・RTX 5090コミュニティ確認
処理項目コミュニティ測定値
512出力トークン・MTPドラフト3個223 tok/s
512出力トークン・DFlash2ドラフト5個209 tok/s
約9.7K入力トークンのprefill3,955 tok/s
65K KV・MTPドラフト3個の待機時メモリ約14.3 GB
モデル読み込み20.2秒

2026年10月9日のコミュニティ単一実行:Windows RTX 5090(sm_120aビルド)、rk8v4 KV、thinking off。decodeは512トークン出力、prefillは約9.7K入力、待機時メモリは65K KV・MTP-3の条件です。Underdog Salukiモデルカード

最初のエラーでは形式とGPU接続を確認

unsupported modelやブロック形式エラーが出たら、NInfer-allのエンジンを使っているか確認してください。このIQ2-mixアーティファクトはNInfer-all専用のgguf_*ブロックを使うため、標準NInferビルドでは開けません。コンテナからGPUを使えるかはNVIDIA Container Toolkit公式サンプルワークロードで確認し、ファイルパスと.ninfer拡張子も確認します。

no CUDA deviceやGPUアーキテクチャエラーでは、コンテナランタイム12またはビルド対象を確認します。対応対象の86、89、120aはそれぞれGPUアーキテクチャです。このガイドのWindows RTX 5090結果はsm_120aビルドで得られたため、5090で再現するにはこのアーキテクチャが必要です。WindowsネイティブビルドにはCUDA 13、CMake、Visual Studio C++ツール、vcpkg依存関係が必要で、リポジトリの最新手順に従います。

メモリ不足で読み込みや長いリクエストが止まる場合は、文脈上限を65,536未満にするか、--kv-capacityを下げてKVキャッシュ領域を減らします。GPUメモリが足りない状態で長さを増やすと、モデルが解放されたりサーバーが失敗したりします。ターミナルでCtrl+Cを押すとコンテナが停止します。モデルファイルは残るので、設定を直して再起動できます。

既存APIサーバーと並行して短く試す

現在のモデルサーバーは維持し、NInferをローカルアドレス127.0.0.1:8080で試します。モデル一覧と短い回答を確認してから、実際に使う韓国語の質問、コード、長文の順に試し、回答内容とメモリ使用量を記録してください。速度とともに、作業の正答率やツール呼び出し13も比較できます。

NInferアーティファクトと通常のGGUFでは実行形式が異なります。別のチェックポイント14を変換する場合は、NInfer-allのモデル別レシピとMTP・DFlash2・Vision構成要素への対応を確認してください。準備済みSalukiファイルは上記コマンドで実行できます。

速い設定を選んだら、よく使う質問を揃えて回答内容も比べましょう。要約で抜けた内容、コードの実行結果、ツールへの引数を記録すると、次のモデル更新でも同じ作業で確認しやすくなります。

別の推論エンジンも比べたい場合は、以下のllama.cppガイドを参考にしてください。Salukiガイドでは通常のGGUFの導入と量子化15ファイルの選び方を説明しています。

用語の注釈

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

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

    本文に戻る
  3. CUDA — NVIDIA GPUで汎用計算を行うソフトウェア基盤です。

    本文に戻る
  4. MTP — 複数の将来トークンを一度に予測する学習目標、またはそれを行うモデル構成です。投機的デコーディングでは、その予測を候補トークンとして提案できます。

    本文に戻る
  5. GGUF — モデル情報を格納するファイル形式で、llama.cpp系のツールで広く使われます。

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

    本文に戻る
  7. CLI — Command-Line Interfaceの略です。ターミナルにコマンドを入力してプログラムを操作する方式です。

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

    本文に戻る
  9. コンテキスト長 — 1回のリクエストでモデルが扱える入力と生成内容のトークン範囲です。上限や実際のメモリ使用量はモデルと実行設定によります。

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

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

    本文に戻る
  12. ランタイム — プログラムの実行時に必要な機能を提供するソフトウェア環境です。ローカルAIではモデル実行エンジンを指すこともあります。

    本文に戻る
  13. ツール呼び出し — ファイル読み取り、検索、コマンド実行などの外部機能を、名前と引数でモデルが要求する形式です。実行の有無はエージェントランタイムと権限設定が決めます。

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

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

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
NInferは`.ninfer`モデルファイルをNVIDIA GPUで実行し、OpenAI互換APIで回答を返すCUDA推論エンジンです。Underdog SalukiをDockerサーバーで起動して短い質問を送り、同じリクエストでMTPとDFlash2のドラフト生成を比較できます。
必要なメモリはどのくらいですか?
現在のモデルサーバーは維持し、NInferをローカルアドレス`127.0.0.1:8080`で試します。モデル一覧と短い回答を確認してから、実際に使う韓国語の質問、コード、長文の順に試し、回答内容とメモリ使用量を記録してください。速度とともに、作業の正答率やツール呼び出しも比較できます。