はじめに
llmfit からアイデアをもらい、Jetson 向けに作ってみました。llmfit は汎用の LLM 選定ツールですが、jetfit は Jetson シリーズの統合メモリ・帯域幅スペックに特化したスコアリングになっています。まだ荒削りな部分も多いので、使ってみた感想・バグ報告・改善提案など、なんでもフィードバックをもらえると嬉しいです。
この記事で伝えたいこと
- Jetsonシリーズ上でLLMを動かす際の「モデル選び・量子化選び」はツールで一発解決できる
-
jetfitはハードウェアを自動検出し、約70モデル × 6段階の量子化をスコアリングして最適解を提示してくれる - インストールは
pip install jetfitの1行。TUIもCLIも両方使える
解決したい課題
Jetson Orin NX 16GB でロボットのオンデバイス推論を試みていたとき、毎回こんな作業をしていました。
- HuggingFace でモデルを探す
-
llama.cppで Q4_K_M をダウンロード(数GB) - 実行 → OOM
- Q3_K に落としてリトライ
- 今度は遅すぎて使い物にならない
- 別モデルを探して①に戻る
この「ダウンロード → 試す → 失敗 → やり直し」のループがかなり非効率でした。
「このJetsonで、このモデルの、どの量子化なら動くか」を事前に計算できれば、ダウンロード前に答えがわかるはずです。
課題の原因
Jetson のような統合メモリデバイスでは、以下の合計値が利用可能な RAM を超えるとOOMになります。
- モデルの重み(量子化レベルによって変動)
- KV キャッシュ(fp16)
- ランタイムオーバーヘッド(約 0.5 GB)
さらにトークン生成速度はメモリ帯域幅がボトルネックになるため、各 Jetson デバイスの帯域幅スペックも考慮しないと「動くけど遅すぎる」という結果になります。
これを毎回手動で計算するのは手間がかかりすぎます。
解決手段
デモ
フィルタ・検索・SIM・Plan・Detail・Compare・Calibrate など、主要な操作を一通り収めています。
インストール
pip install jetfit
uv を使う場合:
uv tool install jetfit # グローバルインストール
uvx jetfit # インストールなしで即実行
TUI 起動
jetfit
起動すると以下のような画面が表示されます。
- 上部バー:検出されたデバイス名・RAM・帯域幅・JetPack バージョン
- モデル一覧:総合スコア順。各行に推定 tok/s・最適量子化・メモリ使用率・適合グレードが表示される
主要なキーバインドは以下の通りです。
| キー | 動作 |
|---|---|
j / k
|
モデルの移動 |
Enter |
詳細ビュー(全量子化ラダーを表示) |
p |
プランモード(コンテキスト・量子化・目標 TPS を設定) |
S |
ハードウェアシミュレーション(別デバイスのプレビュー) |
C |
キャリブレーション(実機で tok/s を実測) |
d |
HuggingFace から GGUF を直接ダウンロード |
/ |
検索バー |
c |
マークしたモデルを並べて比較 |
CLI モード
スクリプトや自動化に活用できます。
# ハードウェア情報を確認
jetfit system
# 現在のデバイス向けにモデルを提案
jetfit recommend
# モデル名で絞り込み
jetfit recommend --model llama
# 量子化レベルを固定して検索
jetfit recommend --quant Q4_K_M
# 使用可能なメモリを手動で指定
jetfit recommend --available-gb 12.0
# 別のハードウェアをシミュレーション
jetfit recommend --profile jetson_agx_orin_64gb
# JSON 形式で出力(他ツールとの連携に)
jetfit recommend --json
仕組みの解説
メモリ使用量の見積もり
必要メモリ = モデルの重み + KV キャッシュ(fp16) + 0.5 GB(オーバーヘッド)
FP4 対応デバイス(Jetson AGX Thor・DGX Spark)では、モデルの重みが実質半分になります。
適合グレード
| グレード | メモリ使用率 |
|---|---|
| Perfect | ≤ 70% |
| Good | 71〜90% |
| Marginal | 91〜100% |
| TooTight | > 100% |
TooTight はロードできません。Marginal は動作することもありますが、他プロセスとのメモリ競合で OOM になるリスクがあります。
速度推定
tok/s = (帯域幅 GB/s ÷ 実効モデルサイズ GB) × 効率係数 × 量子化速度係数
-
効率係数:デフォルトは 0.50〜0.55(デバイスプロファイルごとに異なる)。
Aキーで手動調整できます - 量子化速度係数:Q8_0 が 1.00×、Q2_K が 1.80×
総合スコア(0〜100)
| 要素 | 重み |
|---|---|
| 正規化速度 | 45% |
| 適合レベル | 35% |
| 量子化品質 | 20% |
スコアが高いほど「速く、メモリに余裕があり、品質も高い」モデルです。
キャリブレーション(推定精度を上げたい場合)
llama-bench で実機の tok/s を計測し、効率係数を逆算します。一度実行すれば、以降すべてのモデルの推定精度が向上します。
# llama.cpp(CUDA 有効)のビルド
git clone https://github.com/ggml-org/llama.cpp
cmake -B build -DGGML_CUDA=ON && cmake --build build -j$(nproc)
# キャリブレーション実行
jetfit calibrate ~/models/Llama-3.1-8B-Q4_K_M.gguf
結果は ~/.config/jetfit/calibration.json に保存されます。
Tip:7B 以上のモデルを使うと精度が高くなります。1B 以下はメモリ帯域幅ではなく演算性能がボトルネックになるため、帯域幅効率を低く見積もりすぎてしまいます。
サポートハードウェア(22 デバイス)
Jetson Nano(4 GB / 25.6 GB/s)から DGX Spark GB10(128 GB / 273 GB/s)まで対応しています。
非 Jetson 環境(macOS・Linux)では自動でシミュレーションモードに切り替わり、S キーで任意のデバイスプロファイルを選択できます。手元の MacBook で Orin NX の結果をプレビューする、といった使い方も可能です。
留意点・デメリット
- 速度推定はあくまで目安です。 実環境では他プロセスのメモリ使用量、サーマルスロットリング、バッチサイズなどが影響します。正確な値が必要な場合はキャリブレーションを実施してください。
- モデルカタログは現在約 70 モデルを内蔵しています。カタログにないモデルは
--available-gbオプションやプランモードで手動計算できます。 -
llama.cpp(GGUF 形式)専用です。PyTorch モデルの直接評価には対応していません。
まとめ
jetfit を使えば、「Jetson でこのモデルは動くか?」という問いにダウンロード前に答えが出ます。
無駄なダウンロードと試行錯誤のサイクルから解放されます。
👉 https://github.com/mannsub/jetfit
まだ未熟なツールですが、Jetson で LLM を触っている方にとって少しでも役立てば嬉しいです。「動かない」「こんな機能がほしい」「ここがおかしい」など、どんな小さなことでも Issue や PR、コメントでフィードバックをもらえると励みになります。よろしくお願いします!
