I had to go digging into the source to realize what it was, e.g.
github.com/NVIDIA/auto-ontology/blob/main/auto_on…
Flare, Nvidia's DGX Spark Inference Engine
2 points · 1 comment
OpenShellの権限境界を確認する:Policy Proverの合格と未検証を分ける
!AIエージェントの外側に境界を置く概念イラスト
発表:2026年9月28日/再確認:2026年11月1日。本稿は9月の発表を振り返り、現在の公式資料を確認した記事です。画像は保存済みの概念イラストと編集部作成の解説図で、製品の実画面ではありません。
AIにファイルを読ませたり、文章を下書きさせたりするとき、「ここから先は人が確認する」をどう守るでしょうか。指示文に書くだけではなく、実行する仕組みの側でも境界を持たせる。NVIDIAのOpen Agent Safety Platformは、その考え方を示しています。
1.AIの外側に、実行を制御する層を置く
!図1:NVIDIAの設計に基づく概念図
図1:アプリ、ランタイム、インフラの3層を簡略化した概念図。
NVIDIAは、モデルや道具を動かすアプリの層、隔離とアクセス制御を担うOpenShellの層、さらに独立したハードウェアで監視するSentryとBlueField-4の構成を説明しています。公開ソフトウェアのOpenShellと、追加のハードウェア監視層は分けて考える必要があります。
AIの判断が正しいかと、その操作を許可してよいかは別の問いです。たとえば問い合わせ返信なら、下書きを作る権限と、顧客へ送信する権限を分ける、という考え方につながります。これは記事側の架空例で、実際に導入して試した記録ではありません。
2.権限を広げる前に、境界を確かめる
!図2:NVIDIAの設計に基づく概念図
図2:新しいアクセスを適用する前に確認する設計の概念図。すべての環境で自動的に同じ承認が働くという保証ではありません。
OpenShellの公式資料は、アクセス方針を検証し、実行時にも制限する設計を示しています。11月1日に開いたドキュメントの既定版はv0.1.6でした。ファイルとプロセスの制約はサンドボックス作成時に定まり、ネットワーク方針は実行中の更新に対応すると説明されています。
資格情報も、AIへ本物の秘密をそのまま渡す形とは分けられています。許可された送信先に対して、外側の仕組みで必要な情報を扱う設計です。ただし、これだけで情報漏えいや誤操作が一切なくなる、と読むことはできません。
3.公開実装と、安全性の実証を分ける
!図3:NVIDIAの設計に基づく概念図
図3:一次資料で確認した事項と、この記事で検証していない事項。日本向け価格の未確認は企業向け提供条件についてです。
OpenShellはApache 2.0でソースが公開されています。一方、本記事ではインストール、実行、隔離の突破耐性の評価をしていません。Sentryなどを含む企業向け構成の日本での価格・契約条件も確認していません。公開されていることと、自社の仕事で安全に使えることは、別々に確かめる必要があります。
今日できる一歩
まずは自分の文章業務を1つ選び、「AIが下書きしてよいこと」「人が原資料と照合すること」「外部へ送る前に止める場所」を3行で書いてみてください。これは導入前の整理であり、ソフトの設定や安全性検証の代わりにはなりません。
技術メモ:Policy Proverの結果をどう扱うか
v0.1.6の公式資料では、上限の方針と候補の方針を比較するboundary checkと、新たなネットワーク規則のproposal risk checkを区別しています。一方に通ることは、もう一方の合格を意味しません。
境界確認のCLI例は次の形です。これは公式資料の構文を示す未実行例です。この記事でファイルを作成したり、コマンドを実行した結果ではありません。
openshell-prover check candidate.yaml --boundary boundary.yaml
within_boundaryは検査対象の範囲での合格です。exceeds_boundary、error、unsupported、inconclusiveは合格扱いにしません。現在のモデルはファイル、プロセス、Landlock、ネットワーク接続、REST要求を扱い、GraphQLやMCPなど対応外の規則があれば検査できないことを返すと説明されています。モデル化された範囲の保証を、システム全体の安全性保証へ広げないことが実装上の要点です。
導入前の確認メモには、使う版、境界方針、候補方針、結果とcoverage、未検証の規則を残すと、次の担当が判断を追えます。秘密のトークンを記録する必要はありません。
まとめ
NVIDIAの提案は、AIの賢さに加え、実行できる範囲を外側から管理する設計です。複数のAIや道具をつなぐほど、能力・権限・確認を分けておく意味が大きくなります。9月の発表を、11月の新発表として扱う記事ではありません。
出典(2026年11月1日確認)
NVIDIA Newsroom「Open Agent Safety Platform」2026年9月28日。
NVIDIA Technical Blog「NVIDIA Open Agent Safety Platform: A Reference for Continuous In-Silicon Agent Monitoring」2026年9月28日。
NVIDIA OpenShell公式ドキュメント:Overview/Policy Prover(既定版v0.1.6)。
NVIDIA/OpenShell公式GitHub:公開コードとライセンス。
一次資料のリンク:
- nvidianews.nvidia.com
- docs.nvidia.com
- docs.nvidia.com
- NVIDIA/OpenShell
文章業務の依頼文と確認手順を整理したい方へ
実務プロンプトと運用手順マニュアルのサービスでは、文章業務1種類の指示文と人の確認点をまとめます。OpenShell導入・API実装・セキュリティ監査を追加で請け負う案内ではありません。
1 like
vLLM・SGLang・TensorRT-LLMをクラウドGPUで動かしたら、それぞれの個性が見えてきた
この記事で分かること
Qwen3-8Bを、L4 24GB 1台の上でvLLM・SGLang・TensorRT-LLMに載せ、同じリクエストを送った。揃えたつもりの条件が、5か所で揃っていなかった。どれもベンチマークの数字に入り込む。
速さの順位は載せない(速さは自分の条件で測ってほしい)。すべてこの版・L4(sm_89)での話である。エンジンを選びたいだけなら「エンジン別の要点」と最後の「私の使い分け」へ。
エンジン別の要点
エンジン
知っておくこと
vLLM 0.31.0
L4ではQwen/Qwen3-8B-FP8が重みだけFP8(W8A16)で動く
SGLang 0.5.21
ツール定義に項目が足され、入力が増える。L4・8B bf16は--mem-fraction-staticの自動値では起動しない(0.87で動いた)
TensorRT-LLM 1.2.1
L4ではQwen/Qwen3-8B-AWQ・-FP8をそのまま読めない。KVが足りないと黙って待たせる。キャッシュを消すAPIが無い
用語
用語
意味
KVキャッシュ
生成中のリクエストが、それまでのトークンの計算結果を置いておくGPUメモリ。容量をトークン数で数え、同時に処理できる本数の上限を決める
プリフィル
入力(プロンプト)をまとめて読み込む最初の段階。入力が長いほど重い
TTFT
Time To First Token。送ってから最初の1トークンが返るまでの時間
W8A16/W8A8
重み(Weight)と計算時の値(Activation)のビット数。W8A16は重みだけ8bitで計算は16bit
追い出し(preemption/retraction)
KVが足りなくなったとき、処理中のリクエストをいったん外すこと。後でやり直す
RadixAttention
SGLangのプレフィックスキャッシュ。木構造で、任意のトークン位置まで一致を使い回す(vLLMは決まった長さのブロック単位)
sm_89/Ada/Hopper
NVIDIA GPUの世代。L4はAda(sm_89)、H100はHopper(sm_90)
ModelOpt
NVIDIAの量子化ツール。TensorRT-LLM向けの量子化モデルを作る
条件
項目
値
モデル
Qwen3-8B(bf16、AWQ 4bit、FP8)
GPU
NVIDIA L4 24GB 1台(sm_89、AWS g6.xlarge)。ドライバ 595.112.07、CUDA 13.2
エンジン
vLLM 0.31.0 / SGLang 0.5.21 / TensorRT-LLM 1.2.1(trtllm-serve、PyTorchの経路)
リクエスト
/v1/chat/completions。ツール定義10個(ケースごとに40個から選ぶ)+日本語の質問。システムプロンプトなし、thinkingオフ、質問の末尾にリクエストごとの識別子
max_tokens/最大の文脈長
512/8,192
測った並行数
AWQ・FP8は1と16。bf16は1(16は載らない:3節)。SGLang bf16は容量の確かめで8も
送ったケース
200ケースのうち20ケースを繰り返し送った(並行数1で80件)
プレフィックスキャッシュ
3エンジンとも既定で有効。区切り(エンジン×チェックポイント×並行数×測定の種類)ごとにサーバーを起動し直す
エンジン別
vLLM
SGLang
TensorRT-LLM
入力長 最大/中央値(200ケース)
2,591/2,310
2,691/2,410
2,591/2,310
ツールパーサー
hermes
qwen(Qwen25Detector)
qwen3
バッチの上限
max_num_seqs 256・max_num_batched_tokens 2048
max_running_requests 2048
max_batch_size 2048・max_num_tokens 8192
チャンク化プリフィル
有効
有効(4096)
無効
CUDA graph
FULL_AND_PIECEWISE
有効
バッチ1〜32・64・128
バッチの上限はどれも並行数16より大きい。
1. 入力:SGLangだけトークン数に差が出た
同じリクエストでusage.prompt_tokensを比べると、SGLangだけ全ケースで+100トークンだった。
// 送ったもの({…}は省略)
{"type": "function", "function": {"name": "search_master", "description": "…", "parameters": {…}}}
// テンプレートに渡るもの
{"type": "function", "function": {"description": "…", "name": "search_master", "parameters": {…}, "strict": false}, "defer_loading": null}
エンジン
toolsの扱い
prompt_tokens
vLLM
型に通すが、テンプレートに渡す長さは変わらない
送ったまま手元でテンプレートに通した長さと一致
SGLang
model_dump()で項目を足し、キーの順が変わる
+100
TensorRT-LLM
—
vLLMと一致
書き換えを再現する関数を書き、1,200件でSGLang自身のmodel_dump()と突き合わせて違いは0件だった。確かめるなら、テンプレート適用後の文字列(vLLMなら/tokenize)の差分を取る。
切り替えるオプションは無い。 揃えるならクライアントから足した形で送る(他エンジンの入力も変わる)。今回はそのまま測った。
効き方:プリフィルが重くなる/KVの見積もりがずれる(3節)/精度にも混ざる。ツールが多いほど差は大きい。パーサーも3つとも別の実装で、読み損ねは精度の差として出る。
2. 量子化:「FP8」が同じ意味ではない
エンジン
起動時の警告
vLLM
Weight-only FP8 compression will be used leveraging the Marlin kernel.
SGLang
Using default W8A8 Block FP8 kernel config. Performance might be sub-optimal!
「FP8で比べた」表は、重みだけ8bitと計算も8bitが混ざりうる。起動ログのカーネル名で確かめる。
vLLMがL4でW8A16になるのは、カーネルの候補を順に試し、最初に使えるものを選ぶため(vllm/model_executor/kernels/linear/init.pyのinit_fp8_linear_kernel)。
CUTLASSのブロックFP8のカーネルはsm_90・sm_100・sm_120向けしか無い(csrc/.../c3x/scaled_mm_blockwise_sm*_fp8.cu)。--linear-backendで変えられるはずだが試していない。
TensorRT-LLM 1.2.1・L4では、公開の次の2つを読めなかった。
チェックポイント
読めない理由
代わり(ModelOpt 0.37.0)
Qwen/Qwen3-8B-AWQ(AutoAWQ形式)
load_hf_quant_configにawqの分岐が無い
--qformat int4_awq
Qwen/Qwen3-8B-FP8(ブロック単位)
対応表で、ブロック単位FP8はAda(sm_89)が対応外(HopperとBlackwell sm100/103は対応)。モデル側の表でもQwen3は対応外なので、H100でも使えない
--qformat fp8 --kv_cache_qformat none
2つで約56分かかった。nvidia/Qwen3-8B-FP8はKVまでFP8になるため使わなかった(KVの型の上書きは試していない)。TensorRT-LLMだけチェックポイントが別物なので、量子化した構成はエンジン間で比べず、各エンジン内でbf16との精度差だけ確かめた。
3. 容量:同じGPUでも載る量が違う
名前の似たメモリ設定が、何に対する割合かが違う(L4は約22.5GiB〔23,034MiB〕、Qwen3-8B bf16の重みは15.27GiB)。
| weights | KV | act | rest |
GPU |===============|==============|=========|======|
vLLM |<---------------- 0.92 ---------------->|
SGLang |<----------- 0.87 ----------->|
TRT-LLM |<-------- 0.9 x free --------->|
act=活性化など計算中の作業領域(プリフィルの中間結果、CUDA graph)。rest=エンジンの外で使われる分の余白。模式図で、長さは比率どおりではない。
エンジン
割合の対象
割合に含むもの
値
KVの容量(トークン)
容量を直接指定するなら
vLLM
GPU全体
重み+KV+活性化
0.92(既定)
30,240
--kv-cache-memory-bytes(指定すると0.92は無視される)
SGLang
GPU全体
重み+KV(活性化は外)
0.87(手で決めた)
26,813
--max-total-tokens
TensorRT-LLM
重みと活性化を確保した後の空き
KVだけ
0.9(既定)
約32,800
kv_cache_config.max_tokens(割合と両方なら小さいほう)
揃えたいなら割合ではなくトークン数で直接指定する(オプション名は版で変わりやすい)。今回は既定に近い状態を測るため揃えていない。
KV 1トークン = 36層 × KVヘッド8 × 128次元 × K/V 2 × 2バイト = 144KiB
1本の最大 = 入力2,691(SGLang) + max_tokens 512 + 余裕1 = 3,204
並行数8 = 3,204 × 8 = 25,632(+100前は 3,104 × 8 = 24,832)
並行数16 ≒ 51,300 → bf16は3エンジンとも載らない
全リクエストが最大長まで伸びても入るかで数え、入らない組み合わせは測っていない。
SGLangは自動値(0.684)で起動しなかった。 自動値=(GPUの容量−作業領域の見積もり)÷GPUの容量(srt/arg_groups/memory_hook.py)。
作業領域の見積もり(L4)
大きさ
固定の分
512MiB
プリフィル
chunked_prefill_size 4,096トークン×1.5MiB=6GiB(係数1.5はソースで「経験的な値」)
並列化の分
128MiB(1GPU)
CUDA graph
デコードの最大バッチ48×2MiB+プリフィルの分
合計
約7.1GiB(23,034MiB×(1−0.684))
ValueError: Loaded weights leave no GPU memory for the KV cache under --mem-fraction-static=0.684.
並行数8が載る値を0.01刻みで探した(0.01あたり約1,590トークン)。
割合
KVの容量
並行数8(25,632)
KV以外の残り
追い出し
0.684(自動)
起動しない
—
—
—
0.84
22,047
載らない
1.82 GB
—
0.86
25,224
載らない
1.40 GB
—
0.87
26,813
載る
1.11 GB
0回
+100前なら0.86で足りたが、1節の+100で408トークン足りなくなり0.87にした。0.88以上は試していない。
4. 溢れたとき:追い出すか、黙って待たせるか
方式
エンジン
混んだとき遅れる場所
見える指標
追い出す
vLLM・SGLang
生成の途中(ストリーミングが止まる)
vllm:num_preemptions/sglang:num_retracted_requests_total
待たせる
TensorRT-LLM
最初の1トークン(TTFT)
無い。numActiveRequestsで見る
TensorRT-LLMは「入力長+max_tokens」ぶんを先に確保するので、max_tokensを大きく付けるほど同時に受け入れる本数が減る。並行数16で送っても中では8本しか走っていないことがある。空きに合わせて詰め込むMAX_UTILIZATIONもある(処理中のリクエストが一時停止しうる。試していない)。
今回は/metricsを2秒ごとに読み、numActiveRequestsの最大が送った本数に届いたことを確かめた。溢れる組み合わせは測っていない(3節)。
5. 観測:そのまま読むと誤判定になる
エンジン
癖
対処
SGLang
キャッシュヒットが0だとprompt_tokens_detailsごと出ない
無ければ0
SGLang
num_retracted_requests_totalは初回の追い出しまで出ない
ゲージnum_retracted_reqsがあれば0回
TensorRT-LLM
kvCacheStatsはenable_iter_perf_statsが要り、1件処理するまで空
短いリクエストを1件送ってから読む
TensorRT-LLM
その1件で、測定の最初のリクエストがcached_tokens=1になった(<|im_start|>を共有。partial reuseが既定で有効なので、32トークンのブロックの一部でも当たる)
書式を通さない/v1/completionsで送る
TensorRT-LLM
反復ごとの統計は読むたびに消える
測定中に2秒ごとに読む
「読めなければ0」にしていたら誤った結論を出していた。「読めなければ止める」作りにしていたので気づけた。
エンジン
キャッシュの消し方
vLLM
POST /reset_prefix_cache(VLLM_SERVER_DEV_MODE=1)
SGLang
POST /flush_cache
TensorRT-LLM
APIなし。再起動
キャッシュがどれだけ効くかは、送るケースの数とKVの容量で大きく変わる。今回は20ケース(入力の合計45,957トークン)を繰り返し送った。
チェックポイント
KVの容量(トークン)
20ケースぶんが
cached_tokens/入力(3エンジンとも同程度)
bf16
26,813〜32,800
収まらず、一周する前に追い出される
3.6〜4.7%(当たるのは先頭の書式 約50トークンだけ)
AWQ・FP8
76,096〜99,552
収まり、2周目からツール定義ごと当たる
並行数1で約75%、16で約82%
効いているのは並行数ではなく、量子化で空いたKVの容量である。量子化した構成の速さには、計算が軽くなった分とキャッシュに当たった分が混ざりうる。ケースの数・繰り返し方とKVの容量を並べて確かめたい。
6. 動かすまで
版がぶつかるので、仮想環境をエンジンごとに分け、クライアントはHTTPだけで話す。
エンジン
torch
transformers
vLLM
2.13.0+cu132
5.17.0
SGLang
2.13.0
5.12.1
TensorRT-LLM
2.9.1+cu130
4.57.3
問題
対処
TensorRT-LLM環境でModelOptが動かない(NumPy<2固定と最新pyarrowが衝突)
pyarrow<22
TensorRT-LLM FP8が起動中にsegfault(原因不明、再実行で通過)
—
そのとき親プロセスが残り、20分待ち続けた
ログにSegfault encountered等が出たら即失敗にして1回だけ再起動
まとめ:比較を作る・読むときのチェックリスト
確かめること
確かめ方
モデルに届く入力は同じか
usage.prompt_tokensを並べる。テンプレート適用後の文字列を比べる
ツールパーサーは何か
起動オプションを書く
量子化の計算は何か
起動ログのカーネル名・警告
量子化のチェックポイントは同じか
対応表とソースで、使うGPUで読める形式か確かめる
KVの容量はいくつか
割合ではなくトークン数で見る。揃えるなら直接指定する
溢れたら何が起きるか
追い出しカウンタと同時実行数。max_tokensも書く
指標が読めないときの扱い
読めなければ止める
キャッシュの状態
有効か、区切りごとに消すか、cached_tokensはいくつか。ケースの数・繰り返し方とKVの容量も書く
私の使い分け(推奨案)
速さではなく、導入の手間・設定の素直さ・観測しやすさで決めた。
当てはまる範囲:24GBクラスのGPU1台・8B級・同時8本程度まで。大きいGPUや70B級ではメモリ(3節)と量子化の対応(2節)が変わる。
推奨
想定するユースケース
決め手
気をつけること
vLLM
社内チャットやRAGのPoC。公開モデル(量子化版を含む)を差し替えて評価する
公開チェックポイントをそのまま読める(2)。既定の設定で起動し、追い出しがカウンタで見える(3・4)
L4のFP8はW8A16(2)
SGLang
同じツール定義・システムプロンプトを先頭に付けるエージェントやバッチ処理
RadixAttention(用語)。L4でもFP8がW8A8(2)。※今回は共有部分が短く、実測ではない(5)
入力が増える(1)。割合を手で決める(3)。指標が0で出ない(5)。共有部分の長い順に処理するlpmは既定ではない(既定fcfs)
TensorRT-LLM
モデルを固定して長く運用する本番API
処理中のリクエストが途中でやり直しにならない(4)。量子化は最初の1回で済む
量子化を作り直す(2)。混むとTTFTが伸びるので、SLAがTTFTなら自分で測る(4)。キャッシュを消すAPIなし(5)
迷ったらvLLMで基準を作り、チェックリストで条件を揃えてから他と比べる。
付録:起動コマンド
vLLM 0.31.0(bf16。AWQ・FP8はモデル名だけ替える。VLLM_SERVER_DEV_MODE=1 を付けて起動)
vllm serve Qwen/Qwen3-8B --served-model-name Qwen/Qwen3-8B \
--host 127.0.0.1 --port 8000 \
--enable-auto-tool-choice --tool-call-parser hermes \
--enable-prompt-tokens-details --max-model-len 8192
SGLang 0.5.21
python -m sglang.launch_server --model-path Qwen/Qwen3-8B --served-model-name Qwen/Qwen3-8B \
--host 127.0.0.1 --port 30000 \
--tool-call-parser qwen --enable-metrics --enable-cache-report \
--mem-fraction-static 0.87 --context-length 8192
TensorRT-LLM 1.2.1(ModelOptで作ったAWQ。bf16はQwen/Qwen3-8B)
echo "enable_iter_perf_stats: true" > trtllm-serve.yaml
trtllm-serve ~/models/Qwen3-8B-int4-awq-modelopt \
--host 127.0.0.1 --port 8001 --backend pytorch \
--tool_parser qwen3 --config trtllm-serve.yaml --max_seq_len 8192
出典
SGLang v0.5.21:github.com/sgl-project/sglang/tree/v0.5.21 (srt/entrypoints/openai/serving_chat.py・protocol.py・usage_processor.py、srt/observability/metrics_collector.py、srt/function_call/function_call_parser.py、srt/arg_groups/memory_hook.py)
TensorRT-LLM v1.2.1:github.com/NVIDIA/TensorRT-LLM/tree/v1.2.1 (tensorrt_llm/commands/serve.py、llmapi/llm_args.py、_torch/model_config.py、_torch/modules/linear.py、cpp/tensorrt_llm/executor/jsonSerialization.cpp、docs/source/features/quantization.md)
ModelOpt 0.37.0:github.com/NVIDIA/Model-Optimizer/tree/0.37.0 (examples/llm_ptq/hf_ptq.py)
vLLM v0.31.0:github.com/vllm-project/vllm/tree/v0.31.0 (vllm/config/cache.py、vllm/engine/arg_utils.py、vllm/model_executor/layers/quantization/fp8.py、vllm/model_executor/kernels/linear/init.py・scaled_mm/marlin.py・cutlass.py・flashinfer.py・deep_gemm.py・b12x.py、vllm/utils/flashinfer.py、vllm/platforms/cuda.py、vllm/model_executor/layers/quantization/utils/w8a8_utils.py、csrc/libtorch_stable/quantization/w8a8/cutlass/c3x/、vllm/entrypoints/openai/chat_completion/protocol.py、vllm/v1/metrics/loggers.py)、起動ログ
vLLM プレフィックスキャッシュの設計:docs.vllm.ai
TensorRT-LLM スケジューラの方針(GUARANTEED_NO_EVICT/MAX_UTILIZATION):nvidia.github.io
SGLang サーバー引数:docs.sglang.io 、new_token_ratioはsrt/managers/schedule_policy.py
nvidia/Qwen3-8B-FP8:huggingface.co
PagedAttention:Kwon et al., SOSP 2023。RadixAttention:Zheng et al., NeurIPS 2024
NCCL Roadmap Nov 2026 - Jan 2027 の解説
はじめに
!
NCCL 奥がふかすぎる。。。。にゃ。。。
NVIDIA が公開した NCCL Roadmap: Nov 2026 - Jan 2027 (GitHub Issue #2486) から、大規模分散学習・推論に携わるエンジニアが押さえるべきポイントを解説します。前回のロードマップの解説は「NCCL Roadmap Aug-Oct 2026 の解説」、そこで挙げた項目の現在までの実装状況は「NCCL 2.32.3 でロードマップはどう実装されたか」にあります。GIN の基本は前回の解説を前提にします。
この記事では、新しい概念の GENK と Flow、AWS EFA と GIN の現状、注目機能 2 つを扱います。調査は 2026 年 10 月 29 日に行い、まだリリースされていないコードは、staging ブランチを次のリリースの候補とみなして読んでいます。
実装状況の確かめ方
NVIDIA/nccl、aws-ofi-nccl、amazon-contributing/DeepEP、NVIDIA/nccl-extensions の公開ブランチを手元に取得し、commit の履歴とソースを読んで確かめました。PR と Issue の状態 (open か、マージされたか、閉じた日) は GitHub で確かめています。記事のソースへのリンクは、確かめたときの commit に固定しています。
NCCL は master、staging、dev の 3 本のブランチを公開していて、staging には 2.32.5-1 の版番号を付けた commit があり、その後に 2.32.6a0 に上がっています。ロードマップは「Coming Soon: NCCL 2.32 Update 1」の版番号を書いていませんが、この記事では staging のコードをその候補として読みます。
今回のロードマップの項目のうち、この記事で扱うものと、前回のロードマップの近い項目は次のとおりです。対応は筆者の読みです。
今回のロードマップの項目
前回のロードマップの近い項目
General Kernels (GENK)
Unify legacy kernels using Device API
Flow Device API
More Device API primitives
GIN Backend Improvements
GIN backend improvements
CFT を使う階層型カーネル
Compute Fabric Transport (CFT) through Device API
New Enqueue Pipeline
Legacy and symmetric-kernel host-side unification
ロードマップには、内部のメモリの削減、RAS の進み具合の監視、RMA の profiling など、この記事で扱わない項目もあります。
Device API とは何か
NCCL の API の全体像
ロードマップの項目を説明する前に、まず背景知識として NCCL の API を整理します。NCCL の API は、Host API、Device API、plugin API の 3 つに分けられます。Host API と Device API の仕様は NCCL の公式文書にあり、この記事の表はその章立てに沿っています。plugin API は公式文書の API の章には無く、リポジトリの plugins ディレクトリに plugin の種類ごとの説明があります。
API
何をするか
例
Host API
CPU から呼んで、communicator (通信に参加する GPU の集まり) の作成や集団通信を NCCL に頼みます。集団通信では、NCCL がアルゴリズムを選び、NCCL のカーネルを GPU で起動します。利用者の計算は別のカーネルです
ncclCommInitRank、ncclAllReduce
Device API
利用者が書いた CUDA カーネルの中から、ほかの GPU との通信を直接呼びます (2.28 から)。計算と通信を 1 つのカーネルに入れられます。使う前の準備には Host API を使います
GIN、LSA
plugin API
NCCL のほうから呼ぶ、下の部品の差し替え口です。ネットワークへの送受信や、アルゴリズムの選択の調整などを、NCCL の外の実装に任せます
net、GIN。説明は plugins にあります。aws-ofi-nccl は EFA 用の plugin
誰が NCCL を呼ぶか
NCCL を呼ぶのは、多くの場合アプリ自身ではなく、間に入るフレームワークやライブラリです。主な呼び手を、ソースで確かめた範囲で並べます。
呼び手
どう呼ぶか
使う API
PyTorch の torch.distributed (backend "nccl")
C++ の ProcessGroupNCCL が、ncclAllReduce などを直接呼びます
Host API
PyTorch の backend "nccl4py" (torch.distributed._nccl4py)
Python で書いた backend が、nccl4py を通して呼びます。init_process_group("nccl4py") で選びます
Host API
nccl4py
NVIDIA の公式の Python の bindings。Cython で libnccl を呼び、PyTorch の tensor や CuPy の配列をそのまま渡せます。実験的な CuTe DSL の部品もあります
主に Host API
vLLM の PyNccl
Python の ctypes で libnccl を読み込んで呼びます
Host API
PyTorch の symmetric memory の演算、DeepEP、NCCL EP
自分の CUDA カーネルの中から通信を呼びます。準備には Host API で window (次の節で説明します) を登録し、device communicator を作ります
Device API と Host API
aws-ofi-nccl など
NCCL のほうから呼ばれます。NCCL が EFA などのネットワークに送るときの下の部品です。InfiniBand には NCCL に組み込みの経路もあります
plugin API
Device API は何のためにあるか
Host API で通信を頼むと、通信は NCCL のカーネル 1 回分の単位になり、利用者の計算とは別のカーネルになります。計算の途中で決まった相手に少しずつ送りたい場合や、計算と通信を細かく重ねたい場合には、この単位が粗すぎます。たとえば MoE のトークンの振り分けでは、どのトークンをどの GPU に送るかが計算の途中で決まります。
Device API は、利用者のカーネルの中から、ほかの GPU のメモリへ直接データを動かせるようにするための API です。NCCL の Device API の例は、計算と通信を分けて順に行う従来のやり方に対して、カーネルの中で両方を細かく混ぜることで、待ち時間を減らし処理量を上げられると説明しています。
GPU のカーネルからほかの GPU に届く経路はいくつかあり、Device API は経路ごとに部品を用意しています。同じノードで NVLink や PCIe の P2P でつながった相手には、相手のメモリを普通の読み書きの命令で触れます (LSA)。NVLink のスイッチが複数の宛先への書き込みや足し合わせを引き受けられるシステムでは、Multimem を使います。ノードをまたぐ相手には、NIC を通して put (相手のメモリへの書き込み) や get (相手のメモリからの読み出し) を出します (GIN)。どちらも、相手が何も呼ばない片側通信です。CFT は、相手のメモリを番地 (ポインタ) で触る代わりに、CUDA が用意する宛先の番号 (logical endpoint) とオフセットを指定して put や get を出す部品で、Blackwell 以降の GPU で使えます。これらと組み合わせて使う、足し合わせやコピーの部品 (reduce と copy) も用意されています。
GIN の仕組みは、前回の解説の「GIN とは何か」で説明しました。LSA は後の GENK と Flow の節で、CFT は注目機能の節で扱います。Multimem と reduce と copy の部品は、この記事では詳しく扱いません。
どの部品を使う場合も、準備は利用者が CPU で Host API を呼んで行います。通信に使うバッファを、全ランクで同じ形に対応付けた領域 (symmetric memory window) として登録し、カーネルが使う資源を指定して device communicator を作り、それを渡して自分のカーネルを起動します。手順の例は NCCL の文書にあります。GIN を使うカーネルは、NCCL を更新したら作り直す必要があると文書は書いています。次の節からは、この Device API の上に加わる新しい部品とカーネルを見ていきます。
GENK と Flow とは何か
!
GENK と Flow は、まだリリースされておらず staging と dev にだけあるコードです。この節は staging の実装から読み取った内容で、リリースまでに変わる可能性があります。staging で試すには、ビルドのときに SYM_GENK=1 を指定し、実行のときに NCCL_SYM_GENK_ENABLE=1 を設定する必要があります。
概要
Flow は、前の節の LSA と GIN の上に作られた、集団通信の部品を提供する Device API です。ロードマップは Flow を「LSA と GIN の両方で動く、高水準の Device API」と説明しています。LSA は前の節で触れた、相手の GPU のメモリを普通の読み書きの命令で触る部品です。
GENK (General Kernels) は、NCCL が自分の Ring と Tree の集団通信を、この Flow の上で作り直したカーネルの一群です。Ring では AllGather、ReduceScatter、Broadcast、Reduce、AllReduce を、Tree では AllReduce を実装しています。
前回のロードマップには「Unify legacy kernels using Device API」という項目がありました。筆者は、GENK をこの項目につながる取り組みと読んでいます。今回のロードマップは、選んだプラットフォームで GENK を既定にし、古いカーネルを置き換えるとしています。あわせて性能モデルを 1 つにまとめ、どの実装を選ぶかを同じ物差しで決めるとしています。
staging では、NCCL 自身が同じ Flow で集団通信を組んでいます。Flow がリリースに入れば、利用者も NCCL の内部と同じ部品で通信カーネルを書けます。
NCCL の集団通信には、GENK の前から 2 種類のカーネルがあります。
legacy kernels: NCCL に最初からある Ring や Tree のカーネルです。経路の違いは、CPU の側が準備する transport (NVLink や PCIe の P2P、ネットワークなど) が受け持ち、ネットワークでは CPU の proxy スレッドが NIC に渡します。
symmetric カーネル: 全ランクが同じ形で登録したバッファ (symmetric memory window) を集団通信に渡したときに使える、新しいカーネルです。相手のバッファの番地が分かるので、Device API の LSA などで相手のメモリを直接読み書きします。いまあるものは、NVLink の直結を前提に、場面ごとに作り込まれています (表の「特化した symmetric カーネル」)。
GENK は、symmetric カーネルと同じ Device API の作りで、legacy kernels と同じくらい広い経路で動くものです。Ring で隣の GPU にデータを渡す場面で比べると、次のようになります。
隣の GPU との経路
legacy kernels
特化した symmetric カーネル
GENK
NVLink
動く
動く
動く (LSA)
PCIe の P2P
動く
使えない
動く (LSA)
別のノード (ネットワーク)
動く
一部の種類だけ動く (GIN)
動く (GIN)
表は、Hopper 以降の GPU で GENK を有効にした場合についてソースから読んだもので、動かして確かめたものではありません。PCIe の行は CUDA P2P が使える場合、GENK のネットワークの行は GIN Proxy (GPU の代わりに CPU のスレッドが NIC に送る GIN のバックエンド) が使える場合です。
特化した symmetric カーネルは、PCIe だけでつながったノードでは候補から外れます。GENK では、隣の GPU ごとに Flow が LSA か GIN かを実行時に選ぶので、同じカーネルのまま NVLink でも PCIe でもネットワークでも動きます。staging のカーネルの選択にも「特化したカーネルは NVLink の直結を要するが、GENK は CUDA P2P の LSA や GIN も使える」というコメントがあります。
利用者の側の例もあります。NCCL の Device API の例には、Transformer の RMSNorm の計算を ReduceScatter と AllGather の通信と 1 つのカーネルにまとめるものがあり、いまは LSA、Multimem、GIN を直接使って、受け取り、足し合わせ、送り出しを書いています。Flow は、NCCL 自身が集団通信に使うこの受け取り、足し合わせ、送り出しの部分を、部品として提供します。
NCCL の文書の Device API の章には、Flow と GENK の説明はまだありません。Flow の使い方は、ヘッダの説明にまとまっていて、Flow processor を足した commit が入口になります。GENK は、カーネルを足した commit と、NCCL の選択に組み込んだ commit が出発点です。
図で [API] のタグを付けた Flow processor、LSA connection、GIN connection は、アプリのカーネルからも呼べる Device API です。cost model、legacy kernels、specialized symmetric kernels、GENK は NCCL の中の部品です。
GIN の signal とは
GIN の put は片側通信で、受け手は何も呼ばないので、データがいつ届いたかを自分では知れません。signal は、それを知らせるための、受け手の側に置かれた数です。送り手が put に signal を付けると、データが届いたあとに受け手の数が増え (たとえば 1 増え)、受け手はその数が目標に達するまで待ってから読みます。GIN の基本は、前回の解説の「GIN とは何か」で説明しました。
signal には strong と weak の 2 種類があります。weak signal が「読んでよい」と約束するのは、その signal を付けた put のデータだけです。strong signal は、同じ相手に同じ context (GIN の通信の通り道の 1 本) で先に出した put のデータもすべて読めると約束します。そのため、最後の put にだけ signal を付ければ済みます。
EFA の送り方の SRD は、書き込みが届く順番を保ちません。そのため、最後の put に付けた signal が届いても、前の put のデータが届いたとは限りません。EFA の上の経路のうち、GPU から直接送る EFA GDA が提供するのは weak signal だけです (次の節で説明します)。一方、Flow の GIN の接続は strong signal を必要とします。
AWS EFA 関連アップデートと現在の課題
EFA の 2 つの GIN の経路と signal の種類
!
GENK と Flow の GIN の接続は strong signal を必要とします。EFA の上で strong signal を提供するのは GIN Proxy だけで、GPU から直接送る EFA GDA は weak signal しか提供しません。そのため、EFA の複数ノードで GENK を使うなら Proxy の経路になります。
EFA で GIN を使うときは、使う経路 (GIN のバックエンド) が、カーネルの必要とする種類の signal を提供するかを先に確かめます。NCCL は、カーネルが求める種類の signal を提供できないバックエンドを使わず、提供できる別のバックエンドがあればそちらに切り替え、無ければエラーにすると説明しています。EFA で使う GIN の経路として、ここでは 2 つを比べます。1 つは NCCL の GIN Proxy で、CPU のスレッドが aws-ofi-nccl の RMA の機能を通して EFA に送ります。もう 1 つは EFA GDA で、GPU のカーネルが EFA の送信キューに直接依頼を書きます。aws-ofi-nccl の文書によると、EFA GDA は NCCL_GIN_TYPE=5 で明示したときに使われます。同じ文書は、明示しなければ NCCL 2.31 は EFA で Proxy を使うと書いています。インスタンスやドライバなどの要件も同じ文書にあります。
2 つの経路は、提供する signal が違います。NCCL の Proxy は、strong signal と VA signal (登録した仮想アドレスに置く signal) を使えると報告します。EFA GDA については、aws-ofi-nccl が strong signal も VA signal も使えないと報告し、NCCL の側も番号で指す indexed signal だけを受け付けます。EFA GDA の signal は、EFA の NIC が届いた書き込みを数えるカウンタで作られています。aws-ofi-nccl の文書は、signal と counter の合計が EFA のデバイスあたり 512 個までであることも、制限に挙げています。
図の矢印は、使い手が必要とする signal をバックエンドが提供するかを示します。矢印はソースと文書から描いたもので、どの経路が選ばれるかや、動かした結果を示すものではありません。図の DeepEP の ordered は届く順番を前提にする上流のカーネル、unordered は順番を前提にしない amazon-contributing のフォークのカーネルです。
GENK はノードをまたぐ通信に使う GIN のバックエンドとして Proxy を指定しているので、staging のコードを読む限り、GENK が EFA の上で複数ノードの通信をするなら Proxy の経路を通ります。一方、aws-ofi-nccl の文書は、EFA GDA を使うときに symmetric の GIN カーネルを無効にするよう書いていて、この設定 (NCCL_SYM_GIN_KERNELS_ENABLE=0) にすると複数ノードの GENK は候補から外れます。つまり、EFA GDA を使う設定 (NCCL_GIN_TYPE=5 と NCCL_SYM_GIN_KERNELS_ENABLE=0) では複数ノードの GENK は使われず、複数ノードで GENK を試すときは、この 2 つの環境変数を設定せずに Proxy の経路で動かします。
aws-ofi-nccl v1.22.0 で、EFA GDA の Get がタグの付いた版で使えるようになった
Get は、GPU のカーネルが、ほかの GPU のメモリの中身を、持ち主に何もさせずに読み出す操作です。たとえば、手元の番号を見て、ほかの GPU が持つ表の行を取り出すような使い方ができます。Get の意義は「NCCL 2.32.3 でロードマップはどう実装されたか」で説明しました。
その記事の時点では、NCCL 2.32.3 には Get が入っていましたが、aws-ofi-nccl の側の対応はタグの無い master にしかありませんでした。2026 年 10 月 22 日 (日本時間) の v1.22.0 は、NCCL 2.32 が使うキューの形への対応と、Get の完了を数える修正を含む最初のタグです。これで、NCCL 2.32 と aws-ofi-nccl v1.22.0 という、タグの付いた版どうしに、EFA GDA の Get に要る変更がそろいました。v1.22.0 のリリースノートは Get に触れておらず、筆者は動かして確かめていません。
ただし、EFA GDA の Get には、完了を知らせる signal や counter を付けられません。読み出しが終わったかは、出した依頼をまとめて待つ Flush で確かめます。
MoE の通信ライブラリ (DeepEP と NCCL EP) の動き
MoE のトークンを担当の expert に配り (dispatch)、計算結果を集める (combine) 通信のライブラリにも動きがありました。DeepEP と NCCL EP はこの同じ役割の候補で、どちらも下で NCCL を使います。DeepEP は 2026 年 9 月 29 日の V2.5 で NVSHMEM への依存を取り除き、ノードをまたぐ通信は NCCL の GIN だけになりました。要件は NCCL 2.32.3 以降です。EFA で DeepEP を動かす取り組みは amazon-contributing/DeepEP のフォークにあり、その詳細は別の記事で整理してみます。
NVIDIA の NCCL EP は NVIDIA/nccl-extensions に移り、NCCL の staging からは、nccl_ep と nccl_m2n のディレクトリが消されました。
注目機能 2 選
CFT を使う階層型カーネル
CFT (Compute Fabric Transport) は NCCL 2.31 で Device API に加わった部品で、嬉しさは 2 つあります。1 つ目は、カーネルから直接届く相手を、LSA の範囲より広げられる見込みがあることです。LSA で届く相手は、CUDA P2P で相手のメモリを普通の読み書きの命令で触れる相手 (LSA team) に限られます。CFT は相手を番地ではなく CUDA が配る宛先の番号で指すので、届く範囲は、CUDA が「この番号で届く」と報告する範囲で決まります。前回のロードマップも、CFT を、logical endpoint で届く範囲の相手を宛先の番号で指す通信の形と説明していました。ただし、リリースされた版では、CFT で届く相手の集まり (CFT team) の大きさは既定で LSA team と同じです。
2 つ目は、受け手に届いたことを早く知らせる書き込みがあることです。CFT の普通の put や reduce で受け手に知らせるときは、データを書いたあと、書き込みの完了を確定させ (fence)、合図のフラグを書きます。これが counted な書き込みで、フラグの代わりに、NCCL_WIN_CFT_COUNTED を付けて登録した window の中のカウンタを使います。カウンタはデータより後に進むことが保証されているので、送り手は fence とフラグの書き込みを省けます。staging の文書は、これを低遅延のための操作と説明しています。受け手は、カウンタを見てからデータを読む間に fence を入れる必要があります。
仕組みは次のとおりです。CFT の宛先の番号は、CUDA 13.3 で加わった logical endpoint という仕組みです。NCCL は CPU の側で、宛先の番号を確保し、そこに各 GPU のバッファを結び付けておきます。カーネルは、送りたいデータを shared memory に置き、宛先の番号とオフセットを指定して put を出し、そのあと完了を確かめます。
dev では、CUDA 13.4 以降で CUDA が「logical endpoint で届く範囲」を報告すると、CFT team をその範囲から作ります。その範囲は LSA の範囲の倍数でなければならず、LSA より広い範囲を 1 つの CFT team にできる作りです。NCCL の文書は、CFT がどの物理的な経路を通るかを書いていません。NCCL EP の CFT を使う経路は、1 つの NVLink のドメインの中だけを対象にしています。
ロードマップは、この CFT を使って、AllGather、ReduceScatter、AlltoAll の階層型カーネルを作るとしています。階層型は、近い GPU の間と遠い GPU の間で通信を分ける作りで、LSA の範囲と、それより広い CFT team の範囲を使い分けることになると筆者は読んでいます。master、staging、dev を調べた範囲では、CFT の宛先の集まりの階層の種類は 2.32.3 のコードに定義されていますが、それを使う集団通信のカーネルは見当たりませんでした。
CFT とは
CFT が使えるのは、ハードウェア、ドライバ、CUDA が logical endpoint と fabric 用の命令に対応したシステムだけで、例の barrier のプログラムは CUDA 13.3 と SM_100 を要件に挙げています。CFT team を CUDA の報告する範囲 (clique) から作る変更は、dev の 2026 年 9 月 28 日の commit で入り、master と staging にはまだありません。
NCCL EP には、CFT の counted な書き込みで低遅延の dispatch を送る経路が、NCCL_EP_LL_CFT=1 で選んだときだけ使われる形で、2026 年 9 月 16 日の commit から main に入っています。
New Enqueue Pipeline: 呼び出しから起動までを 3 つの層に分ける
enqueue は、アプリが呼んだ集団通信や put を、カーネルやコピーの起動に変える NCCL の中の流れです。ロードマップは、これを管理 (Management)、準備 (Preparation)、スケジューリング (Scheduling) の 3 層に分け、制御の流れを簡単にし、カーネルの最適化をしやすくするとしています。
管理と準備の層を含む基本の枠組みは 2.31.2 から入っていて、その時点のスケジューリングの層は既存の経路に戻すだけでした。いまの staging と dev でも、新しい流れは既定で無効です。dev では、Preparation の tuning ですべての集団通信のアルゴリズムやプロトコルを先に選び、classification でその結果だけを使って起動の経路を振り分ける形にしました。経路ごとのスケジューラは、それぞれの仕事を stream ごとに 1 つのキューにまとめます。dev の commit では、新しい流れの symmetric のスケジューラが起動するのは特化した symmetric カーネルだけで、GENK は自分用の device communicator の準備が要るので、従来の流れの symmetric カーネルのスケジューラから起動されます。
まとめ
staging の GENK は、Hopper 以降の GPU でビルドと環境変数で有効にすると NVLink、PCIe、ネットワークのどの経路でも同じカーネルが候補になり、EFA の複数ノードでは strong signal を提供する GIN Proxy の経路を使います。CFT を使う階層型カーネルは部品だけが公開コードにあり、New Enqueue Pipeline は枠組みが既定で無効のまま dev で進んでいます。
EgoHand: Monocular 3D Hand Reconstruction from Egocentric Video
We introduce EgoHand, a monocular 3D hand reconstruction model that achieves state-of-the-art performance on egocentric video. Central to our approach is the curation of a high-quality training corpus of 14 million images, combining synthetic data, in-the-wild video, and multi-camera motion capture to balance scene diversity and supervision quality. The model adopts SOMA-Hand as its parametric representation and processes 2D hand crops with a transformer encoder, incorporating camera cues and an auxiliary 2D branch to improve geometric consistency and image alignment. Zero-shot evaluations on HOT3D, ARCTIC, and H2O demonstrate strong out-of-domain generalization, with lower joint-position, root-translation, and acceleration errors than competing baselines at an inference latency of approximately 9.01 ms. A blinded user preference study further shows that participants favor EgoHand's reconstructed hand poses over those from Apple EgoDex and Ropedia Xperience-10M. We release the EgoHand model and source code under the OpenMDW license, allowing free commercial use of the model.
Comments: Authors are listed alphabetically. Project leads are Chao-Yeh Chen, Tiffany Chen, and Umar Iqbal github.com/NVIDIA/IsaacCapture/tree/main/src/pyth…
Flora inference code is public on GitHub! 🌸
NVIDIA/Flora
Weights are on HF. Now clone the repo and label your own robot or human videos into what happened (Captioner) and how well it went (Rewarder).
20 likes · 2 reposts · 623 views
NVIDIA OpenShellのdefault-denyネットワークポリシーを実機で検証した
AIエージェントをサンドボックスで隔離実行するNVIDIA製ランタイム「OpenShell」を実際にインストールし、「ポリシーが無ければ全てのアウトバウンド通信が拒否され、読み取り専用ルールを足すとGETだけ通るようになる」という挙動を、実際のコマンドと構造化ログで確認した。
OpenShellとは何か
OpenShellは、自律AIエージェントをコンテナ/MicroVM単位のサンドボックスで隔離実行するオープンソースのランタイムである(Apache-2.0、NVIDIA)。宣言的なYAMLポリシーで、ファイルアクセス(Landlock LSM)・システムコール(seccomp)・ネットワーク接続・推論呼び出しをカーネルレベルでdeny-by-default制御し、エージェントは実際の認証情報を直接見ることなく、承認済みのエンドポイント宛の通信にのみ認証情報が付与される。
この連載では当初、クラウドの実行環境でOpenShellを導入しようとしたが、公式インストーラ・PyPI・公式Dockerイメージという3つの標準導入経路すべてが、無人実行環境固有の安全装置・ネットワークポリシーによってブロックされた。これはOpenShell自体の不具合ではなく実行環境側の制約だったため、今回は人間のローカルPC(通常のインターネット接続、WSL2 Ubuntu 24.04.3)で改めて検証した。
インストール: sudoのパスワード入力が必要だった
公式インストーラをダウンロードして実行すると、GitHub Releaseからネイティブの.debパッケージを取得し、インストールする。
curl -LsSf raw.githubusercontent.com -o /tmp/openshell-install.sh
sh /tmp/openshell-install.sh
openshell: resolving latest version...
openshell: selected openshell_0.1.5-1_amd64.deb
openshell: installing openshell_0.1.5-1_amd64.deb...
[sudo] password for matsu:
...
openshell: installed openshell package from v0.1.5
✓ Gateway 'openshell' added and set as active
Endpoint: 127.0.0.1
システムパッケージとしてインストールするためsudoの権限が必要で、パスワード入力を求められた。インストールが終わると、ローカルのゲートウェイサービスが自動で起動し、CLIから接続状態を確認できる。
$ openshell gateway status
Status: Connected
Authentication: Authenticated (mTLS transport)
つまずいた点: 公式の自動デモスクリプトが、デフォルトイメージの前提を欠いていた
OpenShellのリポジトリには、ネットワークポリシーの挙動を1分で体験できる自動デモスクリプト(examples/sandbox-policy-quickstart/demo.sh)が同梱されている。まずはこれをそのまま実行してみた。
▸ 2/7 Attempting to reach api.github.com — should be DENIED
$ curl -sS api.github.com
/bin/bash: line 1: curl: command not found
✗ Blocked by default-deny policy.
一見「ポリシーでブロックされた」ように見えるが、実際はデフォルトのサンドボックスイメージ(nvcr.io/nvidia/base/ubuntu:24.04)にcurlコマンド自体が入っていなかっただけだった。デモスクリプトはcurlの終了コードが非ゼロであれば無条件に「ブロックされた」と表示するロジックになっており、「コマンドが無い」という失敗と「ポリシーに拒否された」という失敗を区別していない。同梱のREADMEには「curlが入ったイメージを使うこと」という前提条件が明記されているが、デモスクリプト自身がその前提を満たすイメージを指定していなかった。
対処として、curlが標準で入っている軽量な公開イメージcurlimages/curl:latestを明示的に指定し、手順を手動で再現することにした。
default-deny: ポリシー無しでは何も通らない
openshell sandbox create --name demo --from curlimages/curl:latest \
--no-auto-providers --no-tty -- sleep infinity
openshell sandbox exec demo -- curl -sS --max-time 10 api.github.com
実行すると接続自体が確立できず、curlは終了コード7(接続失敗)を返した。ログを見ると、拒否の理由まで構造化された記録として残っていた。
NET:OPEN [MED] DENIED /usr/bin/curl(0) -> api.github.com:443 [reason:transparent_tcp_policy_denied]
どのバイナリ(/usr/bin/curl)が、どの宛先(api.github.com:443)への接続を試みて拒否されたかが、1行のログとして確実に残る。
ポリシーを追加: 無停止でホットリロードされる
読み取り専用のルールを1コマンドで追加する。
openshell policy update demo \
--rule-name github_api \
--binary /usr/bin/curl \
--add-endpoint api.github.com:443:read-only:rest:enforce \
--wait
✓ Policy version 2 submitted (hash: ec35d20221e1)
✓ Policy version 2 loaded (active version: 2)
サンドボックスを再起動することなく、数秒でポリシーが反映された。同じcurlコマンドを再実行すると、今度は成功する。
$ openshell sandbox exec demo -- curl -sS --max-time 10 api.github.com
Responsive is better than fast.
GETは通るが、POSTはL7で止まる
read-onlyというプリセット名の通り、書き込み系のHTTPメソッドは引き続き拒否される。同じホストに対してPOSTリクエストを送ってみる。
openshell sandbox exec demo -- curl -sS --max-time 10 -X POST \
api.github.com \
-H "Content-Type: application/json" -d '{"title":"oops"}'
{"error":"policy_denied","policy":"github_api","rule":"POST /repos/octocat/hello-world/issues",
"detail":"POST /repos/octocat/hello-world/issues not permitted by policy","layer":"l7", ...}
興味深いのは、この時curlコマンド自体の終了コードは0(成功)だったことだ。TCP接続自体は許可され、OpenShellのプロキシがHTTPレスポンスとしてpolicy_deniedというJSONボディを返している。ログを見ると、TCP接続レベルの許可とHTTPメソッドレベルの拒否が、別々のイベントとして記録されていた。
NET:OPEN [INFO] ALLOWED /usr/bin/curl(0) -> api.github.com:443 [policy:github_api engine:opa]
HTTP:GET [INFO] ALLOWED GET api.github.com [policy:github_api engine:l7]
NET:OPEN [INFO] ALLOWED /usr/bin/curl(0) -> api.github.com:443 [policy:github_api engine:opa]
HTTP:POST [MED] DENIED POST api.github.com [policy:github_api engine:l7] [reason:L7_REQUEST deny POST ...]
つまりOpenShellは、(1) TCP/ホスト単位の許可(engine:opa)と、(2) TLSを終端してHTTPメソッド・パスまで検査するL7レベルの許可(engine:l7)という2段階でネットワークアクセスを評価している。api.github.comへの接続そのものは許可されていても、read-onlyプリセットがGET/HEAD/OPTIONS以外のメソッドを弾くため、同じホストへの書き込み操作だけを選択的に止められることを実機で確認できた。
まとめ
クラウドの無人実行環境で3つの標準導入経路すべてをブロックしていた制約は、ローカルPC(通常のインターネット接続、sudo権限あり)には存在せず、OpenShellは公式手順通りにインストール・起動できた。
公式の自動デモスクリプトは、デフォルトのサンドボックスイメージにcurlが入っていないため、そのまま実行すると「ポリシーでブロックされた」という誤った結論を表示する。curl入りのイメージを明示的に指定することで正しく再現できた。
default-deny(全アウトバウンド拒否)→ 読み取り専用ルールの追加(無停止でホットリロード)→ GETは許可・POSTはL7で拒否、という一連の挙動を、実際のコマンド実行と構造化ログの両方で確認した。
ポリシーはTCP/ホスト単位の許可とHTTPメソッド単位の許可という2段階で評価されており、ホスト全体をアウトバウンド解放しなくても、書き込み系の操作だけを選択的に止められる粒度を持っている。
追加の有料APIキーは不要、GPUも不要だった。AIエージェント(OpenRouter連携等)を使ったより発展的な検証は、無料のOpenRouterモデルでも利用登録(アカウント作成・APIキー発行)が必要になるため、今回のスコープには含めていない。
出典・ライセンス
リポジトリ: NVIDIA/OpenShell (Apache-2.0)
検証コード・実行ログの全文はGitHubリポジトリのexperiments/day-026を参照。
[개발자들의 PICK] 오늘 깃허브 트렌딩 인기 오픈소스 TOP 8
오늘 깃허브 트렌딩에 오른 오픈소스 8개를 8위부터 1위까지 정리했습니다.
소개한 오픈소스 링크는 고정 댓글에 남겨 두었습니다.
00:00 오늘의 깃허브 트렌딩
00:04 8위 제미나이 CLI
00:24 7위 마이크로덕
01:08 6위 임페커블
01:42 5위 클로드 하우투
02:14 4위 홀마크
02:49 3위 AWS 에이전트 툴킷
03:26 2위 엔비디아 오픈셸
04:07 1위 클라우드플레어 시큐리티 오딧 스킬
04:49 마무리
📌 저장소 링크
8위 제미나이 CLI
google-gemini/gemini-cli
"※ 개인·무료 사용자는 Antigravity CLI로 이전됨: antigravity.google"
7위 마이크로덕
pollen-robotics/microduck
6위 임페커블
pbakaus/impeccable
5위 클로드 하우투
luongnv89/claude-howto
4위 홀마크
Nutlope/hallmark
3위 AWS 에이전트 툴킷
aws/agent-toolkit-for-aws
2위 엔비디아 오픈셸
NVIDIA/OpenShell
1위 클라우드플레어 시큐리티 오딧 스킬
cloudflare/security-audit-skill
[en-US] [Developers' PICK] Top 8 Trending Open Source Projects on GitHub Today
I have compiled a list of the 8 open source projects that trended on GitHub today, ranking them from 8th to 1st place.
I have left the links to the featured open source projects in the pinned comment.
00:00 Today's GitHub Trending
00:04 8th Gemini CLI
00:24 7th Microduck
01:08 6th Impeccable
01:42 5th Claude How-to
02:14 4th Hallmark
02:49 3rd AWS Agent Toolkit
03:26 2nd NVIDIA OpenShell
04:07 1st Cloudflare Security Audit Skills
04:49 Wrap-up
📌 Repository Links
8th Gemini CLI
google-gemini/gemini-cli
"※ Personal/Free users migrated to Antigravity CLI: antigravity.google"
7th Microduck
pollen-robotics/microduck
6th Impeccable
pbakaus/impeccable
5th Claude Howto
luongnv89/claude-howto
4th Hallmark
Nutlope/hallmark
3rd AWS Agent Toolkit
aws/agent-toolkit-for-aws
2nd NVIDIA OpenShell
NVIDIA/OpenShell
1st Cloudflare Security Audit Skill
cloudflare/security-audit-skill
[id] [Pilihan Developer] 8 Open Source Paling Trending di GitHub Hari Ini
Saya telah menyusun daftar 8 proyek sumber terbuka yang sedang tren di GitHub hari ini, dengan peringkat dari posisi ke-8 hingga ke-1.
Saya telah menyertakan tautan ke proyek sumber terbuka unggulan di komentar yang disematkan.
00:00 Tren GitHub Hari Ini
00:04 Gemini CLI ke-8
00:24 Microduck ke-7
01:08 Impeccable ke-6
01:42 Claude How-to ke-5
02:14 Hallmark ke-4
02:49 AWS Agent Toolkit ke-3
03:26 NVIDIA OpenShell ke-2
04:07 Cloudflare Security Audit Skills ke-1
04:49 Ringkasan
📌 Tautan Repositori
Gemini CLI ke-8
google-gemini/gemini-cli
"※ Pengguna pribadi/gratis dimigrasikan ke Antigravity CLI: antigravity.google"
Microduck ke-7
pollen-robotics/microduck
Ke-6 Sempurna
pbakaus/impeccable
Ke-5 Claude Howto
luongnv89/claude-howto
Ke-4 Hallmark
Nutlope/hallmark
Ke-3 AWS Agent Toolkit
aws/agent-toolkit-for-aws
Ke-2 NVIDIA OpenShell
NVIDIA/OpenShell
Ke-1 Cloudflare Security Audit Skill
cloudflare/security-audit-skill
500 likes · 11 comments · 58,040 views
OpenShell – A safe, private runtime for fleets of autonomous AI agents NVIDIA/OpenShell
comments #github.com
2 likes · 1 repost
Mentions
I had to go digging into the source to realize what it was, e.g. github.com/NVIDIA/auto-ontology/blob/main/auto_on…
Flare, Nvidia's DGX Spark Inference Engine
OpenShellの権限境界を確認する:Policy Proverの合格と未検証を分ける !AIエージェントの外側に境界を置く概念イラスト 発表:2026年9月28日/再確認:2026年11月1日。本稿は9月の発表を振り返り、現在の公式資料を確認した記事です。画像は保存済みの概念イラストと編集部作成の解説図で、製品の実画面ではありません。 AIにファイルを読ませたり、文章を下書きさせたりするとき、「ここから先は人が確認する」をどう守るでしょうか。指示文に書くだけではなく、実行する仕組みの側でも境界を持たせる。NVIDIAのOpen Agent Safety Platformは、その考え方を示しています。 1.AIの外側に、実行を制御する層を置く !図1:NVIDIAの設計に基づく概念図 図1:アプリ、ランタイム、インフラの3層を簡略化した概念図。 NVIDIAは、モデルや道具を動かすアプリの層、隔離とアクセス制御を担うOpenShellの層、さらに独立したハードウェアで監視するSentryとBlueField-4の構成を説明しています。公開ソフトウェアのOpenShellと、追加のハードウェア監視層は分けて考える必要があります。 AIの判断が正しいかと、その操作を許可してよいかは別の問いです。たとえば問い合わせ返信なら、下書きを作る権限と、顧客へ送信する権限を分ける、という考え方につながります。これは記事側の架空例で、実際に導入して試した記録ではありません。 2.権限を広げる前に、境界を確かめる !図2:NVIDIAの設計に基づく概念図 図2:新しいアクセスを適用する前に確認する設計の概念図。すべての環境で自動的に同じ承認が働くという保証ではありません。 OpenShellの公式資料は、アクセス方針を検証し、実行時にも制限する設計を示しています。11月1日に開いたドキュメントの既定版はv0.1.6でした。ファイルとプロセスの制約はサンドボックス作成時に定まり、ネットワーク方針は実行中の更新に対応すると説明されています。 資格情報も、AIへ本物の秘密をそのまま渡す形とは分けられています。許可された送信先に対して、外側の仕組みで必要な情報を扱う設計です。ただし、これだけで情報漏えいや誤操作が一切なくなる、と読むことはできません。 3.公開実装と、安全性の実証を分ける !図3:NVIDIAの設計に基づく概念図 図3:一次資料で確認した事項と、この記事で検証していない事項。日本向け価格の未確認は企業向け提供条件についてです。 OpenShellはApache 2.0でソースが公開されています。一方、本記事ではインストール、実行、隔離の突破耐性の評価をしていません。Sentryなどを含む企業向け構成の日本での価格・契約条件も確認していません。公開されていることと、自社の仕事で安全に使えることは、別々に確かめる必要があります。 今日できる一歩 まずは自分の文章業務を1つ選び、「AIが下書きしてよいこと」「人が原資料と照合すること」「外部へ送る前に止める場所」を3行で書いてみてください。これは導入前の整理であり、ソフトの設定や安全性検証の代わりにはなりません。 技術メモ:Policy Proverの結果をどう扱うか v0.1.6の公式資料では、上限の方針と候補の方針を比較するboundary checkと、新たなネットワーク規則のproposal risk checkを区別しています。一方に通ることは、もう一方の合格を意味しません。 境界確認のCLI例は次の形です。これは公式資料の構文を示す未実行例です。この記事でファイルを作成したり、コマンドを実行した結果ではありません。 openshell-prover check candidate.yaml --boundary boundary.yaml within_boundaryは検査対象の範囲での合格です。exceeds_boundary、error、unsupported、inconclusiveは合格扱いにしません。現在のモデルはファイル、プロセス、Landlock、ネットワーク接続、REST要求を扱い、GraphQLやMCPなど対応外の規則があれば検査できないことを返すと説明されています。モデル化された範囲の保証を、システム全体の安全性保証へ広げないことが実装上の要点です。 導入前の確認メモには、使う版、境界方針、候補方針、結果とcoverage、未検証の規則を残すと、次の担当が判断を追えます。秘密のトークンを記録する必要はありません。 まとめ NVIDIAの提案は、AIの賢さに加え、実行できる範囲を外側から管理する設計です。複数のAIや道具をつなぐほど、能力・権限・確認を分けておく意味が大きくなります。9月の発表を、11月の新発表として扱う記事ではありません。 出典(2026年11月1日確認) NVIDIA Newsroom「Open Agent Safety Platform」2026年9月28日。 NVIDIA Technical Blog「NVIDIA Open Agent Safety Platform: A Reference for Continuous In-Silicon Agent Monitoring」2026年9月28日。 NVIDIA OpenShell公式ドキュメント:Overview/Policy Prover(既定版v0.1.6)。 NVIDIA/OpenShell公式GitHub:公開コードとライセンス。 一次資料のリンク: - nvidianews.nvidia.com - docs.nvidia.com - docs.nvidia.com - NVIDIA/OpenShell 文章業務の依頼文と確認手順を整理したい方へ 実務プロンプトと運用手順マニュアルのサービスでは、文章業務1種類の指示文と人の確認点をまとめます。OpenShell導入・API実装・セキュリティ監査を追加で請け負う案内ではありません。
vLLM・SGLang・TensorRT-LLMをクラウドGPUで動かしたら、それぞれの個性が見えてきた この記事で分かること Qwen3-8Bを、L4 24GB 1台の上でvLLM・SGLang・TensorRT-LLMに載せ、同じリクエストを送った。揃えたつもりの条件が、5か所で揃っていなかった。どれもベンチマークの数字に入り込む。 速さの順位は載せない(速さは自分の条件で測ってほしい)。すべてこの版・L4(sm_89)での話である。エンジンを選びたいだけなら「エンジン別の要点」と最後の「私の使い分け」へ。 エンジン別の要点 エンジン 知っておくこと vLLM 0.31.0 L4ではQwen/Qwen3-8B-FP8が重みだけFP8(W8A16)で動く SGLang 0.5.21 ツール定義に項目が足され、入力が増える。L4・8B bf16は--mem-fraction-staticの自動値では起動しない(0.87で動いた) TensorRT-LLM 1.2.1 L4ではQwen/Qwen3-8B-AWQ・-FP8をそのまま読めない。KVが足りないと黙って待たせる。キャッシュを消すAPIが無い 用語 用語 意味 KVキャッシュ 生成中のリクエストが、それまでのトークンの計算結果を置いておくGPUメモリ。容量をトークン数で数え、同時に処理できる本数の上限を決める プリフィル 入力(プロンプト)をまとめて読み込む最初の段階。入力が長いほど重い TTFT Time To First Token。送ってから最初の1トークンが返るまでの時間 W8A16/W8A8 重み(Weight)と計算時の値(Activation)のビット数。W8A16は重みだけ8bitで計算は16bit 追い出し(preemption/retraction) KVが足りなくなったとき、処理中のリクエストをいったん外すこと。後でやり直す RadixAttention SGLangのプレフィックスキャッシュ。木構造で、任意のトークン位置まで一致を使い回す(vLLMは決まった長さのブロック単位) sm_89/Ada/Hopper NVIDIA GPUの世代。L4はAda(sm_89)、H100はHopper(sm_90) ModelOpt NVIDIAの量子化ツール。TensorRT-LLM向けの量子化モデルを作る 条件 項目 値 モデル Qwen3-8B(bf16、AWQ 4bit、FP8) GPU NVIDIA L4 24GB 1台(sm_89、AWS g6.xlarge)。ドライバ 595.112.07、CUDA 13.2 エンジン vLLM 0.31.0 / SGLang 0.5.21 / TensorRT-LLM 1.2.1(trtllm-serve、PyTorchの経路) リクエスト /v1/chat/completions。ツール定義10個(ケースごとに40個から選ぶ)+日本語の質問。システムプロンプトなし、thinkingオフ、質問の末尾にリクエストごとの識別子 max_tokens/最大の文脈長 512/8,192 測った並行数 AWQ・FP8は1と16。bf16は1(16は載らない:3節)。SGLang bf16は容量の確かめで8も 送ったケース 200ケースのうち20ケースを繰り返し送った(並行数1で80件) プレフィックスキャッシュ 3エンジンとも既定で有効。区切り(エンジン×チェックポイント×並行数×測定の種類)ごとにサーバーを起動し直す エンジン別 vLLM SGLang TensorRT-LLM 入力長 最大/中央値(200ケース) 2,591/2,310 2,691/2,410 2,591/2,310 ツールパーサー hermes qwen(Qwen25Detector) qwen3 バッチの上限 max_num_seqs 256・max_num_batched_tokens 2048 max_running_requests 2048 max_batch_size 2048・max_num_tokens 8192 チャンク化プリフィル 有効 有効(4096) 無効 CUDA graph FULL_AND_PIECEWISE 有効 バッチ1〜32・64・128 バッチの上限はどれも並行数16より大きい。 1. 入力:SGLangだけトークン数に差が出た 同じリクエストでusage.prompt_tokensを比べると、SGLangだけ全ケースで+100トークンだった。 // 送ったもの({…}は省略) {"type": "function", "function": {"name": "search_master", "description": "…", "parameters": {…}}} // テンプレートに渡るもの {"type": "function", "function": {"description": "…", "name": "search_master", "parameters": {…}, "strict": false}, "defer_loading": null} エンジン toolsの扱い prompt_tokens vLLM 型に通すが、テンプレートに渡す長さは変わらない 送ったまま手元でテンプレートに通した長さと一致 SGLang model_dump()で項目を足し、キーの順が変わる +100 TensorRT-LLM — vLLMと一致 書き換えを再現する関数を書き、1,200件でSGLang自身のmodel_dump()と突き合わせて違いは0件だった。確かめるなら、テンプレート適用後の文字列(vLLMなら/tokenize)の差分を取る。 切り替えるオプションは無い。 揃えるならクライアントから足した形で送る(他エンジンの入力も変わる)。今回はそのまま測った。 効き方:プリフィルが重くなる/KVの見積もりがずれる(3節)/精度にも混ざる。ツールが多いほど差は大きい。パーサーも3つとも別の実装で、読み損ねは精度の差として出る。 2. 量子化:「FP8」が同じ意味ではない エンジン 起動時の警告 vLLM Weight-only FP8 compression will be used leveraging the Marlin kernel. SGLang Using default W8A8 Block FP8 kernel config. Performance might be sub-optimal! 「FP8で比べた」表は、重みだけ8bitと計算も8bitが混ざりうる。起動ログのカーネル名で確かめる。 vLLMがL4でW8A16になるのは、カーネルの候補を順に試し、最初に使えるものを選ぶため(vllm/model_executor/kernels/linear/init.pyのinit_fp8_linear_kernel)。 CUTLASSのブロックFP8のカーネルはsm_90・sm_100・sm_120向けしか無い(csrc/.../c3x/scaled_mm_blockwise_sm*_fp8.cu)。--linear-backendで変えられるはずだが試していない。 TensorRT-LLM 1.2.1・L4では、公開の次の2つを読めなかった。 チェックポイント 読めない理由 代わり(ModelOpt 0.37.0) Qwen/Qwen3-8B-AWQ(AutoAWQ形式) load_hf_quant_configにawqの分岐が無い --qformat int4_awq Qwen/Qwen3-8B-FP8(ブロック単位) 対応表で、ブロック単位FP8はAda(sm_89)が対応外(HopperとBlackwell sm100/103は対応)。モデル側の表でもQwen3は対応外なので、H100でも使えない --qformat fp8 --kv_cache_qformat none 2つで約56分かかった。nvidia/Qwen3-8B-FP8はKVまでFP8になるため使わなかった(KVの型の上書きは試していない)。TensorRT-LLMだけチェックポイントが別物なので、量子化した構成はエンジン間で比べず、各エンジン内でbf16との精度差だけ確かめた。 3. 容量:同じGPUでも載る量が違う 名前の似たメモリ設定が、何に対する割合かが違う(L4は約22.5GiB〔23,034MiB〕、Qwen3-8B bf16の重みは15.27GiB)。 | weights | KV | act | rest | GPU |===============|==============|=========|======| vLLM |<---------------- 0.92 ---------------->| SGLang |<----------- 0.87 ----------->| TRT-LLM |<-------- 0.9 x free --------->| act=活性化など計算中の作業領域(プリフィルの中間結果、CUDA graph)。rest=エンジンの外で使われる分の余白。模式図で、長さは比率どおりではない。 エンジン 割合の対象 割合に含むもの 値 KVの容量(トークン) 容量を直接指定するなら vLLM GPU全体 重み+KV+活性化 0.92(既定) 30,240 --kv-cache-memory-bytes(指定すると0.92は無視される) SGLang GPU全体 重み+KV(活性化は外) 0.87(手で決めた) 26,813 --max-total-tokens TensorRT-LLM 重みと活性化を確保した後の空き KVだけ 0.9(既定) 約32,800 kv_cache_config.max_tokens(割合と両方なら小さいほう) 揃えたいなら割合ではなくトークン数で直接指定する(オプション名は版で変わりやすい)。今回は既定に近い状態を測るため揃えていない。 KV 1トークン = 36層 × KVヘッド8 × 128次元 × K/V 2 × 2バイト = 144KiB 1本の最大 = 入力2,691(SGLang) + max_tokens 512 + 余裕1 = 3,204 並行数8 = 3,204 × 8 = 25,632(+100前は 3,104 × 8 = 24,832) 並行数16 ≒ 51,300 → bf16は3エンジンとも載らない 全リクエストが最大長まで伸びても入るかで数え、入らない組み合わせは測っていない。 SGLangは自動値(0.684)で起動しなかった。 自動値=(GPUの容量−作業領域の見積もり)÷GPUの容量(srt/arg_groups/memory_hook.py)。 作業領域の見積もり(L4) 大きさ 固定の分 512MiB プリフィル chunked_prefill_size 4,096トークン×1.5MiB=6GiB(係数1.5はソースで「経験的な値」) 並列化の分 128MiB(1GPU) CUDA graph デコードの最大バッチ48×2MiB+プリフィルの分 合計 約7.1GiB(23,034MiB×(1−0.684)) ValueError: Loaded weights leave no GPU memory for the KV cache under --mem-fraction-static=0.684. 並行数8が載る値を0.01刻みで探した(0.01あたり約1,590トークン)。 割合 KVの容量 並行数8(25,632) KV以外の残り 追い出し 0.684(自動) 起動しない — — — 0.84 22,047 載らない 1.82 GB — 0.86 25,224 載らない 1.40 GB — 0.87 26,813 載る 1.11 GB 0回 +100前なら0.86で足りたが、1節の+100で408トークン足りなくなり0.87にした。0.88以上は試していない。 4. 溢れたとき:追い出すか、黙って待たせるか 方式 エンジン 混んだとき遅れる場所 見える指標 追い出す vLLM・SGLang 生成の途中(ストリーミングが止まる) vllm:num_preemptions/sglang:num_retracted_requests_total 待たせる TensorRT-LLM 最初の1トークン(TTFT) 無い。numActiveRequestsで見る TensorRT-LLMは「入力長+max_tokens」ぶんを先に確保するので、max_tokensを大きく付けるほど同時に受け入れる本数が減る。並行数16で送っても中では8本しか走っていないことがある。空きに合わせて詰め込むMAX_UTILIZATIONもある(処理中のリクエストが一時停止しうる。試していない)。 今回は/metricsを2秒ごとに読み、numActiveRequestsの最大が送った本数に届いたことを確かめた。溢れる組み合わせは測っていない(3節)。 5. 観測:そのまま読むと誤判定になる エンジン 癖 対処 SGLang キャッシュヒットが0だとprompt_tokens_detailsごと出ない 無ければ0 SGLang num_retracted_requests_totalは初回の追い出しまで出ない ゲージnum_retracted_reqsがあれば0回 TensorRT-LLM kvCacheStatsはenable_iter_perf_statsが要り、1件処理するまで空 短いリクエストを1件送ってから読む TensorRT-LLM その1件で、測定の最初のリクエストがcached_tokens=1になった(<|im_start|>を共有。partial reuseが既定で有効なので、32トークンのブロックの一部でも当たる) 書式を通さない/v1/completionsで送る TensorRT-LLM 反復ごとの統計は読むたびに消える 測定中に2秒ごとに読む 「読めなければ0」にしていたら誤った結論を出していた。「読めなければ止める」作りにしていたので気づけた。 エンジン キャッシュの消し方 vLLM POST /reset_prefix_cache(VLLM_SERVER_DEV_MODE=1) SGLang POST /flush_cache TensorRT-LLM APIなし。再起動 キャッシュがどれだけ効くかは、送るケースの数とKVの容量で大きく変わる。今回は20ケース(入力の合計45,957トークン)を繰り返し送った。 チェックポイント KVの容量(トークン) 20ケースぶんが cached_tokens/入力(3エンジンとも同程度) bf16 26,813〜32,800 収まらず、一周する前に追い出される 3.6〜4.7%(当たるのは先頭の書式 約50トークンだけ) AWQ・FP8 76,096〜99,552 収まり、2周目からツール定義ごと当たる 並行数1で約75%、16で約82% 効いているのは並行数ではなく、量子化で空いたKVの容量である。量子化した構成の速さには、計算が軽くなった分とキャッシュに当たった分が混ざりうる。ケースの数・繰り返し方とKVの容量を並べて確かめたい。 6. 動かすまで 版がぶつかるので、仮想環境をエンジンごとに分け、クライアントはHTTPだけで話す。 エンジン torch transformers vLLM 2.13.0+cu132 5.17.0 SGLang 2.13.0 5.12.1 TensorRT-LLM 2.9.1+cu130 4.57.3 問題 対処 TensorRT-LLM環境でModelOptが動かない(NumPy<2固定と最新pyarrowが衝突) pyarrow<22 TensorRT-LLM FP8が起動中にsegfault(原因不明、再実行で通過) — そのとき親プロセスが残り、20分待ち続けた ログにSegfault encountered等が出たら即失敗にして1回だけ再起動 まとめ:比較を作る・読むときのチェックリスト 確かめること 確かめ方 モデルに届く入力は同じか usage.prompt_tokensを並べる。テンプレート適用後の文字列を比べる ツールパーサーは何か 起動オプションを書く 量子化の計算は何か 起動ログのカーネル名・警告 量子化のチェックポイントは同じか 対応表とソースで、使うGPUで読める形式か確かめる KVの容量はいくつか 割合ではなくトークン数で見る。揃えるなら直接指定する 溢れたら何が起きるか 追い出しカウンタと同時実行数。max_tokensも書く 指標が読めないときの扱い 読めなければ止める キャッシュの状態 有効か、区切りごとに消すか、cached_tokensはいくつか。ケースの数・繰り返し方とKVの容量も書く 私の使い分け(推奨案) 速さではなく、導入の手間・設定の素直さ・観測しやすさで決めた。 当てはまる範囲:24GBクラスのGPU1台・8B級・同時8本程度まで。大きいGPUや70B級ではメモリ(3節)と量子化の対応(2節)が変わる。 推奨 想定するユースケース 決め手 気をつけること vLLM 社内チャットやRAGのPoC。公開モデル(量子化版を含む)を差し替えて評価する 公開チェックポイントをそのまま読める(2)。既定の設定で起動し、追い出しがカウンタで見える(3・4) L4のFP8はW8A16(2) SGLang 同じツール定義・システムプロンプトを先頭に付けるエージェントやバッチ処理 RadixAttention(用語)。L4でもFP8がW8A8(2)。※今回は共有部分が短く、実測ではない(5) 入力が増える(1)。割合を手で決める(3)。指標が0で出ない(5)。共有部分の長い順に処理するlpmは既定ではない(既定fcfs) TensorRT-LLM モデルを固定して長く運用する本番API 処理中のリクエストが途中でやり直しにならない(4)。量子化は最初の1回で済む 量子化を作り直す(2)。混むとTTFTが伸びるので、SLAがTTFTなら自分で測る(4)。キャッシュを消すAPIなし(5) 迷ったらvLLMで基準を作り、チェックリストで条件を揃えてから他と比べる。 付録:起動コマンド vLLM 0.31.0(bf16。AWQ・FP8はモデル名だけ替える。VLLM_SERVER_DEV_MODE=1 を付けて起動) vllm serve Qwen/Qwen3-8B --served-model-name Qwen/Qwen3-8B \ --host 127.0.0.1 --port 8000 \ --enable-auto-tool-choice --tool-call-parser hermes \ --enable-prompt-tokens-details --max-model-len 8192 SGLang 0.5.21 python -m sglang.launch_server --model-path Qwen/Qwen3-8B --served-model-name Qwen/Qwen3-8B \ --host 127.0.0.1 --port 30000 \ --tool-call-parser qwen --enable-metrics --enable-cache-report \ --mem-fraction-static 0.87 --context-length 8192 TensorRT-LLM 1.2.1(ModelOptで作ったAWQ。bf16はQwen/Qwen3-8B) echo "enable_iter_perf_stats: true" > trtllm-serve.yaml trtllm-serve ~/models/Qwen3-8B-int4-awq-modelopt \ --host 127.0.0.1 --port 8001 --backend pytorch \ --tool_parser qwen3 --config trtllm-serve.yaml --max_seq_len 8192 出典 SGLang v0.5.21:github.com/sgl-project/sglang/tree/v0.5.21 (srt/entrypoints/openai/serving_chat.py・protocol.py・usage_processor.py、srt/observability/metrics_collector.py、srt/function_call/function_call_parser.py、srt/arg_groups/memory_hook.py) TensorRT-LLM v1.2.1:github.com/NVIDIA/TensorRT-LLM/tree/v1.2.1 (tensorrt_llm/commands/serve.py、llmapi/llm_args.py、_torch/model_config.py、_torch/modules/linear.py、cpp/tensorrt_llm/executor/jsonSerialization.cpp、docs/source/features/quantization.md) ModelOpt 0.37.0:github.com/NVIDIA/Model-Optimizer/tree/0.37.0 (examples/llm_ptq/hf_ptq.py) vLLM v0.31.0:github.com/vllm-project/vllm/tree/v0.31.0 (vllm/config/cache.py、vllm/engine/arg_utils.py、vllm/model_executor/layers/quantization/fp8.py、vllm/model_executor/kernels/linear/init.py・scaled_mm/marlin.py・cutlass.py・flashinfer.py・deep_gemm.py・b12x.py、vllm/utils/flashinfer.py、vllm/platforms/cuda.py、vllm/model_executor/layers/quantization/utils/w8a8_utils.py、csrc/libtorch_stable/quantization/w8a8/cutlass/c3x/、vllm/entrypoints/openai/chat_completion/protocol.py、vllm/v1/metrics/loggers.py)、起動ログ vLLM プレフィックスキャッシュの設計:docs.vllm.ai TensorRT-LLM スケジューラの方針(GUARANTEED_NO_EVICT/MAX_UTILIZATION):nvidia.github.io SGLang サーバー引数:docs.sglang.io 、new_token_ratioはsrt/managers/schedule_policy.py nvidia/Qwen3-8B-FP8:huggingface.co PagedAttention:Kwon et al., SOSP 2023。RadixAttention:Zheng et al., NeurIPS 2024
NCCL Roadmap Nov 2026 - Jan 2027 の解説 はじめに ! NCCL 奥がふかすぎる。。。。にゃ。。。 NVIDIA が公開した NCCL Roadmap: Nov 2026 - Jan 2027 (GitHub Issue #2486) から、大規模分散学習・推論に携わるエンジニアが押さえるべきポイントを解説します。前回のロードマップの解説は「NCCL Roadmap Aug-Oct 2026 の解説」、そこで挙げた項目の現在までの実装状況は「NCCL 2.32.3 でロードマップはどう実装されたか」にあります。GIN の基本は前回の解説を前提にします。 この記事では、新しい概念の GENK と Flow、AWS EFA と GIN の現状、注目機能 2 つを扱います。調査は 2026 年 10 月 29 日に行い、まだリリースされていないコードは、staging ブランチを次のリリースの候補とみなして読んでいます。 実装状況の確かめ方 NVIDIA/nccl、aws-ofi-nccl、amazon-contributing/DeepEP、NVIDIA/nccl-extensions の公開ブランチを手元に取得し、commit の履歴とソースを読んで確かめました。PR と Issue の状態 (open か、マージされたか、閉じた日) は GitHub で確かめています。記事のソースへのリンクは、確かめたときの commit に固定しています。 NCCL は master、staging、dev の 3 本のブランチを公開していて、staging には 2.32.5-1 の版番号を付けた commit があり、その後に 2.32.6a0 に上がっています。ロードマップは「Coming Soon: NCCL 2.32 Update 1」の版番号を書いていませんが、この記事では staging のコードをその候補として読みます。 今回のロードマップの項目のうち、この記事で扱うものと、前回のロードマップの近い項目は次のとおりです。対応は筆者の読みです。 今回のロードマップの項目 前回のロードマップの近い項目 General Kernels (GENK) Unify legacy kernels using Device API Flow Device API More Device API primitives GIN Backend Improvements GIN backend improvements CFT を使う階層型カーネル Compute Fabric Transport (CFT) through Device API New Enqueue Pipeline Legacy and symmetric-kernel host-side unification ロードマップには、内部のメモリの削減、RAS の進み具合の監視、RMA の profiling など、この記事で扱わない項目もあります。 Device API とは何か NCCL の API の全体像 ロードマップの項目を説明する前に、まず背景知識として NCCL の API を整理します。NCCL の API は、Host API、Device API、plugin API の 3 つに分けられます。Host API と Device API の仕様は NCCL の公式文書にあり、この記事の表はその章立てに沿っています。plugin API は公式文書の API の章には無く、リポジトリの plugins ディレクトリに plugin の種類ごとの説明があります。 API 何をするか 例 Host API CPU から呼んで、communicator (通信に参加する GPU の集まり) の作成や集団通信を NCCL に頼みます。集団通信では、NCCL がアルゴリズムを選び、NCCL のカーネルを GPU で起動します。利用者の計算は別のカーネルです ncclCommInitRank、ncclAllReduce Device API 利用者が書いた CUDA カーネルの中から、ほかの GPU との通信を直接呼びます (2.28 から)。計算と通信を 1 つのカーネルに入れられます。使う前の準備には Host API を使います GIN、LSA plugin API NCCL のほうから呼ぶ、下の部品の差し替え口です。ネットワークへの送受信や、アルゴリズムの選択の調整などを、NCCL の外の実装に任せます net、GIN。説明は plugins にあります。aws-ofi-nccl は EFA 用の plugin 誰が NCCL を呼ぶか NCCL を呼ぶのは、多くの場合アプリ自身ではなく、間に入るフレームワークやライブラリです。主な呼び手を、ソースで確かめた範囲で並べます。 呼び手 どう呼ぶか 使う API PyTorch の torch.distributed (backend "nccl") C++ の ProcessGroupNCCL が、ncclAllReduce などを直接呼びます Host API PyTorch の backend "nccl4py" (torch.distributed._nccl4py) Python で書いた backend が、nccl4py を通して呼びます。init_process_group("nccl4py") で選びます Host API nccl4py NVIDIA の公式の Python の bindings。Cython で libnccl を呼び、PyTorch の tensor や CuPy の配列をそのまま渡せます。実験的な CuTe DSL の部品もあります 主に Host API vLLM の PyNccl Python の ctypes で libnccl を読み込んで呼びます Host API PyTorch の symmetric memory の演算、DeepEP、NCCL EP 自分の CUDA カーネルの中から通信を呼びます。準備には Host API で window (次の節で説明します) を登録し、device communicator を作ります Device API と Host API aws-ofi-nccl など NCCL のほうから呼ばれます。NCCL が EFA などのネットワークに送るときの下の部品です。InfiniBand には NCCL に組み込みの経路もあります plugin API Device API は何のためにあるか Host API で通信を頼むと、通信は NCCL のカーネル 1 回分の単位になり、利用者の計算とは別のカーネルになります。計算の途中で決まった相手に少しずつ送りたい場合や、計算と通信を細かく重ねたい場合には、この単位が粗すぎます。たとえば MoE のトークンの振り分けでは、どのトークンをどの GPU に送るかが計算の途中で決まります。 Device API は、利用者のカーネルの中から、ほかの GPU のメモリへ直接データを動かせるようにするための API です。NCCL の Device API の例は、計算と通信を分けて順に行う従来のやり方に対して、カーネルの中で両方を細かく混ぜることで、待ち時間を減らし処理量を上げられると説明しています。 GPU のカーネルからほかの GPU に届く経路はいくつかあり、Device API は経路ごとに部品を用意しています。同じノードで NVLink や PCIe の P2P でつながった相手には、相手のメモリを普通の読み書きの命令で触れます (LSA)。NVLink のスイッチが複数の宛先への書き込みや足し合わせを引き受けられるシステムでは、Multimem を使います。ノードをまたぐ相手には、NIC を通して put (相手のメモリへの書き込み) や get (相手のメモリからの読み出し) を出します (GIN)。どちらも、相手が何も呼ばない片側通信です。CFT は、相手のメモリを番地 (ポインタ) で触る代わりに、CUDA が用意する宛先の番号 (logical endpoint) とオフセットを指定して put や get を出す部品で、Blackwell 以降の GPU で使えます。これらと組み合わせて使う、足し合わせやコピーの部品 (reduce と copy) も用意されています。 GIN の仕組みは、前回の解説の「GIN とは何か」で説明しました。LSA は後の GENK と Flow の節で、CFT は注目機能の節で扱います。Multimem と reduce と copy の部品は、この記事では詳しく扱いません。 どの部品を使う場合も、準備は利用者が CPU で Host API を呼んで行います。通信に使うバッファを、全ランクで同じ形に対応付けた領域 (symmetric memory window) として登録し、カーネルが使う資源を指定して device communicator を作り、それを渡して自分のカーネルを起動します。手順の例は NCCL の文書にあります。GIN を使うカーネルは、NCCL を更新したら作り直す必要があると文書は書いています。次の節からは、この Device API の上に加わる新しい部品とカーネルを見ていきます。 GENK と Flow とは何か ! GENK と Flow は、まだリリースされておらず staging と dev にだけあるコードです。この節は staging の実装から読み取った内容で、リリースまでに変わる可能性があります。staging で試すには、ビルドのときに SYM_GENK=1 を指定し、実行のときに NCCL_SYM_GENK_ENABLE=1 を設定する必要があります。 概要 Flow は、前の節の LSA と GIN の上に作られた、集団通信の部品を提供する Device API です。ロードマップは Flow を「LSA と GIN の両方で動く、高水準の Device API」と説明しています。LSA は前の節で触れた、相手の GPU のメモリを普通の読み書きの命令で触る部品です。 GENK (General Kernels) は、NCCL が自分の Ring と Tree の集団通信を、この Flow の上で作り直したカーネルの一群です。Ring では AllGather、ReduceScatter、Broadcast、Reduce、AllReduce を、Tree では AllReduce を実装しています。 前回のロードマップには「Unify legacy kernels using Device API」という項目がありました。筆者は、GENK をこの項目につながる取り組みと読んでいます。今回のロードマップは、選んだプラットフォームで GENK を既定にし、古いカーネルを置き換えるとしています。あわせて性能モデルを 1 つにまとめ、どの実装を選ぶかを同じ物差しで決めるとしています。 staging では、NCCL 自身が同じ Flow で集団通信を組んでいます。Flow がリリースに入れば、利用者も NCCL の内部と同じ部品で通信カーネルを書けます。 NCCL の集団通信には、GENK の前から 2 種類のカーネルがあります。 legacy kernels: NCCL に最初からある Ring や Tree のカーネルです。経路の違いは、CPU の側が準備する transport (NVLink や PCIe の P2P、ネットワークなど) が受け持ち、ネットワークでは CPU の proxy スレッドが NIC に渡します。 symmetric カーネル: 全ランクが同じ形で登録したバッファ (symmetric memory window) を集団通信に渡したときに使える、新しいカーネルです。相手のバッファの番地が分かるので、Device API の LSA などで相手のメモリを直接読み書きします。いまあるものは、NVLink の直結を前提に、場面ごとに作り込まれています (表の「特化した symmetric カーネル」)。 GENK は、symmetric カーネルと同じ Device API の作りで、legacy kernels と同じくらい広い経路で動くものです。Ring で隣の GPU にデータを渡す場面で比べると、次のようになります。 隣の GPU との経路 legacy kernels 特化した symmetric カーネル GENK NVLink 動く 動く 動く (LSA) PCIe の P2P 動く 使えない 動く (LSA) 別のノード (ネットワーク) 動く 一部の種類だけ動く (GIN) 動く (GIN) 表は、Hopper 以降の GPU で GENK を有効にした場合についてソースから読んだもので、動かして確かめたものではありません。PCIe の行は CUDA P2P が使える場合、GENK のネットワークの行は GIN Proxy (GPU の代わりに CPU のスレッドが NIC に送る GIN のバックエンド) が使える場合です。 特化した symmetric カーネルは、PCIe だけでつながったノードでは候補から外れます。GENK では、隣の GPU ごとに Flow が LSA か GIN かを実行時に選ぶので、同じカーネルのまま NVLink でも PCIe でもネットワークでも動きます。staging のカーネルの選択にも「特化したカーネルは NVLink の直結を要するが、GENK は CUDA P2P の LSA や GIN も使える」というコメントがあります。 利用者の側の例もあります。NCCL の Device API の例には、Transformer の RMSNorm の計算を ReduceScatter と AllGather の通信と 1 つのカーネルにまとめるものがあり、いまは LSA、Multimem、GIN を直接使って、受け取り、足し合わせ、送り出しを書いています。Flow は、NCCL 自身が集団通信に使うこの受け取り、足し合わせ、送り出しの部分を、部品として提供します。 NCCL の文書の Device API の章には、Flow と GENK の説明はまだありません。Flow の使い方は、ヘッダの説明にまとまっていて、Flow processor を足した commit が入口になります。GENK は、カーネルを足した commit と、NCCL の選択に組み込んだ commit が出発点です。 図で [API] のタグを付けた Flow processor、LSA connection、GIN connection は、アプリのカーネルからも呼べる Device API です。cost model、legacy kernels、specialized symmetric kernels、GENK は NCCL の中の部品です。 GIN の signal とは GIN の put は片側通信で、受け手は何も呼ばないので、データがいつ届いたかを自分では知れません。signal は、それを知らせるための、受け手の側に置かれた数です。送り手が put に signal を付けると、データが届いたあとに受け手の数が増え (たとえば 1 増え)、受け手はその数が目標に達するまで待ってから読みます。GIN の基本は、前回の解説の「GIN とは何か」で説明しました。 signal には strong と weak の 2 種類があります。weak signal が「読んでよい」と約束するのは、その signal を付けた put のデータだけです。strong signal は、同じ相手に同じ context (GIN の通信の通り道の 1 本) で先に出した put のデータもすべて読めると約束します。そのため、最後の put にだけ signal を付ければ済みます。 EFA の送り方の SRD は、書き込みが届く順番を保ちません。そのため、最後の put に付けた signal が届いても、前の put のデータが届いたとは限りません。EFA の上の経路のうち、GPU から直接送る EFA GDA が提供するのは weak signal だけです (次の節で説明します)。一方、Flow の GIN の接続は strong signal を必要とします。 AWS EFA 関連アップデートと現在の課題 EFA の 2 つの GIN の経路と signal の種類 ! GENK と Flow の GIN の接続は strong signal を必要とします。EFA の上で strong signal を提供するのは GIN Proxy だけで、GPU から直接送る EFA GDA は weak signal しか提供しません。そのため、EFA の複数ノードで GENK を使うなら Proxy の経路になります。 EFA で GIN を使うときは、使う経路 (GIN のバックエンド) が、カーネルの必要とする種類の signal を提供するかを先に確かめます。NCCL は、カーネルが求める種類の signal を提供できないバックエンドを使わず、提供できる別のバックエンドがあればそちらに切り替え、無ければエラーにすると説明しています。EFA で使う GIN の経路として、ここでは 2 つを比べます。1 つは NCCL の GIN Proxy で、CPU のスレッドが aws-ofi-nccl の RMA の機能を通して EFA に送ります。もう 1 つは EFA GDA で、GPU のカーネルが EFA の送信キューに直接依頼を書きます。aws-ofi-nccl の文書によると、EFA GDA は NCCL_GIN_TYPE=5 で明示したときに使われます。同じ文書は、明示しなければ NCCL 2.31 は EFA で Proxy を使うと書いています。インスタンスやドライバなどの要件も同じ文書にあります。 2 つの経路は、提供する signal が違います。NCCL の Proxy は、strong signal と VA signal (登録した仮想アドレスに置く signal) を使えると報告します。EFA GDA については、aws-ofi-nccl が strong signal も VA signal も使えないと報告し、NCCL の側も番号で指す indexed signal だけを受け付けます。EFA GDA の signal は、EFA の NIC が届いた書き込みを数えるカウンタで作られています。aws-ofi-nccl の文書は、signal と counter の合計が EFA のデバイスあたり 512 個までであることも、制限に挙げています。 図の矢印は、使い手が必要とする signal をバックエンドが提供するかを示します。矢印はソースと文書から描いたもので、どの経路が選ばれるかや、動かした結果を示すものではありません。図の DeepEP の ordered は届く順番を前提にする上流のカーネル、unordered は順番を前提にしない amazon-contributing のフォークのカーネルです。 GENK はノードをまたぐ通信に使う GIN のバックエンドとして Proxy を指定しているので、staging のコードを読む限り、GENK が EFA の上で複数ノードの通信をするなら Proxy の経路を通ります。一方、aws-ofi-nccl の文書は、EFA GDA を使うときに symmetric の GIN カーネルを無効にするよう書いていて、この設定 (NCCL_SYM_GIN_KERNELS_ENABLE=0) にすると複数ノードの GENK は候補から外れます。つまり、EFA GDA を使う設定 (NCCL_GIN_TYPE=5 と NCCL_SYM_GIN_KERNELS_ENABLE=0) では複数ノードの GENK は使われず、複数ノードで GENK を試すときは、この 2 つの環境変数を設定せずに Proxy の経路で動かします。 aws-ofi-nccl v1.22.0 で、EFA GDA の Get がタグの付いた版で使えるようになった Get は、GPU のカーネルが、ほかの GPU のメモリの中身を、持ち主に何もさせずに読み出す操作です。たとえば、手元の番号を見て、ほかの GPU が持つ表の行を取り出すような使い方ができます。Get の意義は「NCCL 2.32.3 でロードマップはどう実装されたか」で説明しました。 その記事の時点では、NCCL 2.32.3 には Get が入っていましたが、aws-ofi-nccl の側の対応はタグの無い master にしかありませんでした。2026 年 10 月 22 日 (日本時間) の v1.22.0 は、NCCL 2.32 が使うキューの形への対応と、Get の完了を数える修正を含む最初のタグです。これで、NCCL 2.32 と aws-ofi-nccl v1.22.0 という、タグの付いた版どうしに、EFA GDA の Get に要る変更がそろいました。v1.22.0 のリリースノートは Get に触れておらず、筆者は動かして確かめていません。 ただし、EFA GDA の Get には、完了を知らせる signal や counter を付けられません。読み出しが終わったかは、出した依頼をまとめて待つ Flush で確かめます。 MoE の通信ライブラリ (DeepEP と NCCL EP) の動き MoE のトークンを担当の expert に配り (dispatch)、計算結果を集める (combine) 通信のライブラリにも動きがありました。DeepEP と NCCL EP はこの同じ役割の候補で、どちらも下で NCCL を使います。DeepEP は 2026 年 9 月 29 日の V2.5 で NVSHMEM への依存を取り除き、ノードをまたぐ通信は NCCL の GIN だけになりました。要件は NCCL 2.32.3 以降です。EFA で DeepEP を動かす取り組みは amazon-contributing/DeepEP のフォークにあり、その詳細は別の記事で整理してみます。 NVIDIA の NCCL EP は NVIDIA/nccl-extensions に移り、NCCL の staging からは、nccl_ep と nccl_m2n のディレクトリが消されました。 注目機能 2 選 CFT を使う階層型カーネル CFT (Compute Fabric Transport) は NCCL 2.31 で Device API に加わった部品で、嬉しさは 2 つあります。1 つ目は、カーネルから直接届く相手を、LSA の範囲より広げられる見込みがあることです。LSA で届く相手は、CUDA P2P で相手のメモリを普通の読み書きの命令で触れる相手 (LSA team) に限られます。CFT は相手を番地ではなく CUDA が配る宛先の番号で指すので、届く範囲は、CUDA が「この番号で届く」と報告する範囲で決まります。前回のロードマップも、CFT を、logical endpoint で届く範囲の相手を宛先の番号で指す通信の形と説明していました。ただし、リリースされた版では、CFT で届く相手の集まり (CFT team) の大きさは既定で LSA team と同じです。 2 つ目は、受け手に届いたことを早く知らせる書き込みがあることです。CFT の普通の put や reduce で受け手に知らせるときは、データを書いたあと、書き込みの完了を確定させ (fence)、合図のフラグを書きます。これが counted な書き込みで、フラグの代わりに、NCCL_WIN_CFT_COUNTED を付けて登録した window の中のカウンタを使います。カウンタはデータより後に進むことが保証されているので、送り手は fence とフラグの書き込みを省けます。staging の文書は、これを低遅延のための操作と説明しています。受け手は、カウンタを見てからデータを読む間に fence を入れる必要があります。 仕組みは次のとおりです。CFT の宛先の番号は、CUDA 13.3 で加わった logical endpoint という仕組みです。NCCL は CPU の側で、宛先の番号を確保し、そこに各 GPU のバッファを結び付けておきます。カーネルは、送りたいデータを shared memory に置き、宛先の番号とオフセットを指定して put を出し、そのあと完了を確かめます。 dev では、CUDA 13.4 以降で CUDA が「logical endpoint で届く範囲」を報告すると、CFT team をその範囲から作ります。その範囲は LSA の範囲の倍数でなければならず、LSA より広い範囲を 1 つの CFT team にできる作りです。NCCL の文書は、CFT がどの物理的な経路を通るかを書いていません。NCCL EP の CFT を使う経路は、1 つの NVLink のドメインの中だけを対象にしています。 ロードマップは、この CFT を使って、AllGather、ReduceScatter、AlltoAll の階層型カーネルを作るとしています。階層型は、近い GPU の間と遠い GPU の間で通信を分ける作りで、LSA の範囲と、それより広い CFT team の範囲を使い分けることになると筆者は読んでいます。master、staging、dev を調べた範囲では、CFT の宛先の集まりの階層の種類は 2.32.3 のコードに定義されていますが、それを使う集団通信のカーネルは見当たりませんでした。 CFT とは CFT が使えるのは、ハードウェア、ドライバ、CUDA が logical endpoint と fabric 用の命令に対応したシステムだけで、例の barrier のプログラムは CUDA 13.3 と SM_100 を要件に挙げています。CFT team を CUDA の報告する範囲 (clique) から作る変更は、dev の 2026 年 9 月 28 日の commit で入り、master と staging にはまだありません。 NCCL EP には、CFT の counted な書き込みで低遅延の dispatch を送る経路が、NCCL_EP_LL_CFT=1 で選んだときだけ使われる形で、2026 年 9 月 16 日の commit から main に入っています。 New Enqueue Pipeline: 呼び出しから起動までを 3 つの層に分ける enqueue は、アプリが呼んだ集団通信や put を、カーネルやコピーの起動に変える NCCL の中の流れです。ロードマップは、これを管理 (Management)、準備 (Preparation)、スケジューリング (Scheduling) の 3 層に分け、制御の流れを簡単にし、カーネルの最適化をしやすくするとしています。 管理と準備の層を含む基本の枠組みは 2.31.2 から入っていて、その時点のスケジューリングの層は既存の経路に戻すだけでした。いまの staging と dev でも、新しい流れは既定で無効です。dev では、Preparation の tuning ですべての集団通信のアルゴリズムやプロトコルを先に選び、classification でその結果だけを使って起動の経路を振り分ける形にしました。経路ごとのスケジューラは、それぞれの仕事を stream ごとに 1 つのキューにまとめます。dev の commit では、新しい流れの symmetric のスケジューラが起動するのは特化した symmetric カーネルだけで、GENK は自分用の device communicator の準備が要るので、従来の流れの symmetric カーネルのスケジューラから起動されます。 まとめ staging の GENK は、Hopper 以降の GPU でビルドと環境変数で有効にすると NVLink、PCIe、ネットワークのどの経路でも同じカーネルが候補になり、EFA の複数ノードでは strong signal を提供する GIN Proxy の経路を使います。CFT を使う階層型カーネルは部品だけが公開コードにあり、New Enqueue Pipeline は枠組みが既定で無効のまま dev で進んでいます。
EgoHand: Monocular 3D Hand Reconstruction from Egocentric Video We introduce EgoHand, a monocular 3D hand reconstruction model that achieves state-of-the-art performance on egocentric video. Central to our approach is the curation of a high-quality training corpus of 14 million images, combining synthetic data, in-the-wild video, and multi-camera motion capture to balance scene diversity and supervision quality. The model adopts SOMA-Hand as its parametric representation and processes 2D hand crops with a transformer encoder, incorporating camera cues and an auxiliary 2D branch to improve geometric consistency and image alignment. Zero-shot evaluations on HOT3D, ARCTIC, and H2O demonstrate strong out-of-domain generalization, with lower joint-position, root-translation, and acceleration errors than competing baselines at an inference latency of approximately 9.01 ms. A blinded user preference study further shows that participants favor EgoHand's reconstructed hand poses over those from Apple EgoDex and Ropedia Xperience-10M. We release the EgoHand model and source code under the OpenMDW license, allowing free commercial use of the model. Comments: Authors are listed alphabetically. Project leads are Chao-Yeh Chen, Tiffany Chen, and Umar Iqbal github.com/NVIDIA/IsaacCapture/tree/main/src/pyth…
Flora inference code is public on GitHub! 🌸 NVIDIA/Flora Weights are on HF. Now clone the repo and label your own robot or human videos into what happened (Captioner) and how well it went (Rewarder).
NVIDIA OpenShellのdefault-denyネットワークポリシーを実機で検証した AIエージェントをサンドボックスで隔離実行するNVIDIA製ランタイム「OpenShell」を実際にインストールし、「ポリシーが無ければ全てのアウトバウンド通信が拒否され、読み取り専用ルールを足すとGETだけ通るようになる」という挙動を、実際のコマンドと構造化ログで確認した。 OpenShellとは何か OpenShellは、自律AIエージェントをコンテナ/MicroVM単位のサンドボックスで隔離実行するオープンソースのランタイムである(Apache-2.0、NVIDIA)。宣言的なYAMLポリシーで、ファイルアクセス(Landlock LSM)・システムコール(seccomp)・ネットワーク接続・推論呼び出しをカーネルレベルでdeny-by-default制御し、エージェントは実際の認証情報を直接見ることなく、承認済みのエンドポイント宛の通信にのみ認証情報が付与される。 この連載では当初、クラウドの実行環境でOpenShellを導入しようとしたが、公式インストーラ・PyPI・公式Dockerイメージという3つの標準導入経路すべてが、無人実行環境固有の安全装置・ネットワークポリシーによってブロックされた。これはOpenShell自体の不具合ではなく実行環境側の制約だったため、今回は人間のローカルPC(通常のインターネット接続、WSL2 Ubuntu 24.04.3)で改めて検証した。 インストール: sudoのパスワード入力が必要だった 公式インストーラをダウンロードして実行すると、GitHub Releaseからネイティブの.debパッケージを取得し、インストールする。 curl -LsSf raw.githubusercontent.com -o /tmp/openshell-install.sh sh /tmp/openshell-install.sh openshell: resolving latest version... openshell: selected openshell_0.1.5-1_amd64.deb openshell: installing openshell_0.1.5-1_amd64.deb... [sudo] password for matsu: ... openshell: installed openshell package from v0.1.5 ✓ Gateway 'openshell' added and set as active Endpoint: 127.0.0.1 システムパッケージとしてインストールするためsudoの権限が必要で、パスワード入力を求められた。インストールが終わると、ローカルのゲートウェイサービスが自動で起動し、CLIから接続状態を確認できる。 $ openshell gateway status Status: Connected Authentication: Authenticated (mTLS transport) つまずいた点: 公式の自動デモスクリプトが、デフォルトイメージの前提を欠いていた OpenShellのリポジトリには、ネットワークポリシーの挙動を1分で体験できる自動デモスクリプト(examples/sandbox-policy-quickstart/demo.sh)が同梱されている。まずはこれをそのまま実行してみた。 ▸ 2/7 Attempting to reach api.github.com — should be DENIED $ curl -sS api.github.com /bin/bash: line 1: curl: command not found ✗ Blocked by default-deny policy. 一見「ポリシーでブロックされた」ように見えるが、実際はデフォルトのサンドボックスイメージ(nvcr.io/nvidia/base/ubuntu:24.04)にcurlコマンド自体が入っていなかっただけだった。デモスクリプトはcurlの終了コードが非ゼロであれば無条件に「ブロックされた」と表示するロジックになっており、「コマンドが無い」という失敗と「ポリシーに拒否された」という失敗を区別していない。同梱のREADMEには「curlが入ったイメージを使うこと」という前提条件が明記されているが、デモスクリプト自身がその前提を満たすイメージを指定していなかった。 対処として、curlが標準で入っている軽量な公開イメージcurlimages/curl:latestを明示的に指定し、手順を手動で再現することにした。 default-deny: ポリシー無しでは何も通らない openshell sandbox create --name demo --from curlimages/curl:latest \ --no-auto-providers --no-tty -- sleep infinity openshell sandbox exec demo -- curl -sS --max-time 10 api.github.com 実行すると接続自体が確立できず、curlは終了コード7(接続失敗)を返した。ログを見ると、拒否の理由まで構造化された記録として残っていた。 NET:OPEN [MED] DENIED /usr/bin/curl(0) -> api.github.com:443 [reason:transparent_tcp_policy_denied] どのバイナリ(/usr/bin/curl)が、どの宛先(api.github.com:443)への接続を試みて拒否されたかが、1行のログとして確実に残る。 ポリシーを追加: 無停止でホットリロードされる 読み取り専用のルールを1コマンドで追加する。 openshell policy update demo \ --rule-name github_api \ --binary /usr/bin/curl \ --add-endpoint api.github.com:443:read-only:rest:enforce \ --wait ✓ Policy version 2 submitted (hash: ec35d20221e1) ✓ Policy version 2 loaded (active version: 2) サンドボックスを再起動することなく、数秒でポリシーが反映された。同じcurlコマンドを再実行すると、今度は成功する。 $ openshell sandbox exec demo -- curl -sS --max-time 10 api.github.com Responsive is better than fast. GETは通るが、POSTはL7で止まる read-onlyというプリセット名の通り、書き込み系のHTTPメソッドは引き続き拒否される。同じホストに対してPOSTリクエストを送ってみる。 openshell sandbox exec demo -- curl -sS --max-time 10 -X POST \ api.github.com \ -H "Content-Type: application/json" -d '{"title":"oops"}' {"error":"policy_denied","policy":"github_api","rule":"POST /repos/octocat/hello-world/issues", "detail":"POST /repos/octocat/hello-world/issues not permitted by policy","layer":"l7", ...} 興味深いのは、この時curlコマンド自体の終了コードは0(成功)だったことだ。TCP接続自体は許可され、OpenShellのプロキシがHTTPレスポンスとしてpolicy_deniedというJSONボディを返している。ログを見ると、TCP接続レベルの許可とHTTPメソッドレベルの拒否が、別々のイベントとして記録されていた。 NET:OPEN [INFO] ALLOWED /usr/bin/curl(0) -> api.github.com:443 [policy:github_api engine:opa] HTTP:GET [INFO] ALLOWED GET api.github.com [policy:github_api engine:l7] NET:OPEN [INFO] ALLOWED /usr/bin/curl(0) -> api.github.com:443 [policy:github_api engine:opa] HTTP:POST [MED] DENIED POST api.github.com [policy:github_api engine:l7] [reason:L7_REQUEST deny POST ...] つまりOpenShellは、(1) TCP/ホスト単位の許可(engine:opa)と、(2) TLSを終端してHTTPメソッド・パスまで検査するL7レベルの許可(engine:l7)という2段階でネットワークアクセスを評価している。api.github.comへの接続そのものは許可されていても、read-onlyプリセットがGET/HEAD/OPTIONS以外のメソッドを弾くため、同じホストへの書き込み操作だけを選択的に止められることを実機で確認できた。 まとめ クラウドの無人実行環境で3つの標準導入経路すべてをブロックしていた制約は、ローカルPC(通常のインターネット接続、sudo権限あり)には存在せず、OpenShellは公式手順通りにインストール・起動できた。 公式の自動デモスクリプトは、デフォルトのサンドボックスイメージにcurlが入っていないため、そのまま実行すると「ポリシーでブロックされた」という誤った結論を表示する。curl入りのイメージを明示的に指定することで正しく再現できた。 default-deny(全アウトバウンド拒否)→ 読み取り専用ルールの追加(無停止でホットリロード)→ GETは許可・POSTはL7で拒否、という一連の挙動を、実際のコマンド実行と構造化ログの両方で確認した。 ポリシーはTCP/ホスト単位の許可とHTTPメソッド単位の許可という2段階で評価されており、ホスト全体をアウトバウンド解放しなくても、書き込み系の操作だけを選択的に止められる粒度を持っている。 追加の有料APIキーは不要、GPUも不要だった。AIエージェント(OpenRouter連携等)を使ったより発展的な検証は、無料のOpenRouterモデルでも利用登録(アカウント作成・APIキー発行)が必要になるため、今回のスコープには含めていない。 出典・ライセンス リポジトリ: NVIDIA/OpenShell (Apache-2.0) 検証コード・実行ログの全文はGitHubリポジトリのexperiments/day-026を参照。
[개발자들의 PICK] 오늘 깃허브 트렌딩 인기 오픈소스 TOP 8 오늘 깃허브 트렌딩에 오른 오픈소스 8개를 8위부터 1위까지 정리했습니다. 소개한 오픈소스 링크는 고정 댓글에 남겨 두었습니다. 00:00 오늘의 깃허브 트렌딩 00:04 8위 제미나이 CLI 00:24 7위 마이크로덕 01:08 6위 임페커블 01:42 5위 클로드 하우투 02:14 4위 홀마크 02:49 3위 AWS 에이전트 툴킷 03:26 2위 엔비디아 오픈셸 04:07 1위 클라우드플레어 시큐리티 오딧 스킬 04:49 마무리 📌 저장소 링크 8위 제미나이 CLI google-gemini/gemini-cli "※ 개인·무료 사용자는 Antigravity CLI로 이전됨: antigravity.google" 7위 마이크로덕 pollen-robotics/microduck 6위 임페커블 pbakaus/impeccable 5위 클로드 하우투 luongnv89/claude-howto 4위 홀마크 Nutlope/hallmark 3위 AWS 에이전트 툴킷 aws/agent-toolkit-for-aws 2위 엔비디아 오픈셸 NVIDIA/OpenShell 1위 클라우드플레어 시큐리티 오딧 스킬 cloudflare/security-audit-skill [en-US] [Developers' PICK] Top 8 Trending Open Source Projects on GitHub Today I have compiled a list of the 8 open source projects that trended on GitHub today, ranking them from 8th to 1st place. I have left the links to the featured open source projects in the pinned comment. 00:00 Today's GitHub Trending 00:04 8th Gemini CLI 00:24 7th Microduck 01:08 6th Impeccable 01:42 5th Claude How-to 02:14 4th Hallmark 02:49 3rd AWS Agent Toolkit 03:26 2nd NVIDIA OpenShell 04:07 1st Cloudflare Security Audit Skills 04:49 Wrap-up 📌 Repository Links 8th Gemini CLI google-gemini/gemini-cli "※ Personal/Free users migrated to Antigravity CLI: antigravity.google" 7th Microduck pollen-robotics/microduck 6th Impeccable pbakaus/impeccable 5th Claude Howto luongnv89/claude-howto 4th Hallmark Nutlope/hallmark 3rd AWS Agent Toolkit aws/agent-toolkit-for-aws 2nd NVIDIA OpenShell NVIDIA/OpenShell 1st Cloudflare Security Audit Skill cloudflare/security-audit-skill [id] [Pilihan Developer] 8 Open Source Paling Trending di GitHub Hari Ini Saya telah menyusun daftar 8 proyek sumber terbuka yang sedang tren di GitHub hari ini, dengan peringkat dari posisi ke-8 hingga ke-1. Saya telah menyertakan tautan ke proyek sumber terbuka unggulan di komentar yang disematkan. 00:00 Tren GitHub Hari Ini 00:04 Gemini CLI ke-8 00:24 Microduck ke-7 01:08 Impeccable ke-6 01:42 Claude How-to ke-5 02:14 Hallmark ke-4 02:49 AWS Agent Toolkit ke-3 03:26 NVIDIA OpenShell ke-2 04:07 Cloudflare Security Audit Skills ke-1 04:49 Ringkasan 📌 Tautan Repositori Gemini CLI ke-8 google-gemini/gemini-cli "※ Pengguna pribadi/gratis dimigrasikan ke Antigravity CLI: antigravity.google" Microduck ke-7 pollen-robotics/microduck Ke-6 Sempurna pbakaus/impeccable Ke-5 Claude Howto luongnv89/claude-howto Ke-4 Hallmark Nutlope/hallmark Ke-3 AWS Agent Toolkit aws/agent-toolkit-for-aws Ke-2 NVIDIA OpenShell NVIDIA/OpenShell Ke-1 Cloudflare Security Audit Skill cloudflare/security-audit-skill
OpenShell – A safe, private runtime for fleets of autonomous AI agents NVIDIA/OpenShell comments #github.com