Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
freem
Search
Search
Appearance
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
Openai/692aba85-5b10-8006-817a-d5a83b020f8e
(section)
Add languages
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Appearance
move to sidebar
hide
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==== 2. トレーニングインフラ ==== ===== 2.1 prime-rl:大規模非同期RLフレームワーク ===== prime-rl は 「トレーナ」「オーケストレータ」「推論サービス」 の3役で構成されます(図2, p5)。INTELLECT_3_Technical_Report ====== 2.1.1 アーキテクチャ ====== * Trainer - 役割:ロールアウト+報酬から勾配を計算し、ポリシーを更新 - 実装:PyTorch FSDP2 ベース、torchtitan 由来のコードを使い - データ並列 - テンソル並列 - コンテキスト並列 - MoE向け grouped GEMM - HF 互換モデルをそのまま扱える * Inference サービス - vLLM をバックエンドにした OpenAI互換 API サーバ - 標準 API に加え /update_weights /reload_weights を追加して、 トレーナからの重み更新を受け取れるようにしている。 * Orchestrator(CPUプロセス) - 推論サーバからロールアウトを受け取り、バッチ化して Trainer へ送る - Trainer から新しい重みを受け取って Inference へ配布 - ロールアウト生成には verifiers 環境を使い、Environments Hub 上の任意の環境をそのまま使える この3者が疎結合で動作するため、トレーニング用GPUと推論用GPUを完全に分離しつつ、両者を非同期に回せるのがポイントです。 ====== 2.1.2 非同期オフポリシー学習 ====== * 通常の同期 on-policy RL だと、 「ロールアウト生成 → 勾配計算 → パラメータ更新」が逐次になるため、 推論側がパラメータ更新待ちで止まる。 * prime-rl では オフポリシーを許容して非同期化: - 推論側は少し古いパラメータ θₙ を使い続けてロールアウトを生成 - その間に Trainer 側は θₙ から θₙ₊₁ へ更新を進める * 図3(p6)のように、理想化すれば「常に1ステップ遅れ」くらいの off-policy で走るイメージ。 このとき生じる trainer-inference のミスマッチは後述の 重要度サンプリング+マスキング で制御します。INTELLECT_3_Technical_Report ====== 2.1.3 Continuous Batching & In-Flight Weight Updates ====== 長いチェイン・オブ・ソートやエージェントロールアウトでは、ロールアウト長の分散が大きいため、同期バッチだと一番遅いサンプル待ちでGPUが遊びがちです。 そこで、AReal や PipelineRL で広まった手法を取り入れて: * Continuous Batching - オーケストレータが常に多数のロールアウトリクエストを「プール」しておき、 - ひとつ終わるたび即座に新リクエストを投入 → 推論GPUの利用率を常に高く維持 * In-Flight Weight Updates - Trainer から新しい重みが届くと、推論サーバは一瞬生成を中断して重みをアップデート - その後のトークンは新しいポリシーで生成 - 1本の軌跡の中に複数世代のポリシーが混在し得る - ポリシーの古さが一定ステップ数(max_off_policy_steps)を超えた軌跡は破棄 図4(p7)では、タイムライン上で「ロールアウト開始・終了」と「ポリシー更新」が重なっているイメージが描かれています。INTELLECT_3_Technical_Report ====== 2.1.4 Multi-Client Orchestrator ====== vLLM 標準の multi-node data parallel では、ノード数を増やしてもスループットが頭打ちになったため、 * 各ノードを独立した推論サーバとみなし * オーケストレータが「ノードごとに1クライアント」を持ち、 * ロールアウトをラウンドロビンで振り分ける という カスタム data-parallel 方式を採用。これによりノード数にほぼ線形でスケールしたと述べています。INTELLECT_3_Technical_Report ====== 2.1.5 オンライン難易度フィルタ ====== カリキュラム学習として、 * 問題ごとに過去の解答成功率から easy / normal / hard のプールを作成 * 各ステップでプールごとのサンプリング割合を制御 * さらに「常に成功 or 常に失敗」する問題のロールアウトは破棄 といったオンラインフィルタで、常にちょうど良い難易度帯を出し続けるように調整しています。INTELLECT_3_Technical_Report ====== 2.1.6 長いシーケンス長への対応 ====== RL中に自然とシーケンス長が伸びる(長く考えるようになる)ため、48k〜72kトークン級での訓練を効率的に回す必要があります。INTELLECT_3_Technical_Report アプローチは2つ: # Context Parallelism(Ring Attention系) - Q/K/V をGPU間で回しながら注意を計算 - 256kトークンまで伸ばせたが、 - データ並列度が半減 - 精度劣化も見られた → 本番設定には不採用 # Activation Offloading - 層出力だけ保存し、中間活性はバックプロップ時に再計算(フルチェックポイント) - さらに出力アクティベーションをCPUへオフロード(torchtuneベース) - これで 48k → 72k まで伸ばしつつ、MFU低下は 0.1% 程度に抑えた ====== 2.1.7 Distributed Muon ====== GLM 系はプレトレで Muon optimizer を使っているため、ポストトレーニングでも Muon を継続使用するのがよいとされる一方、Muon は 行列単位の更新 を行うので、FSDP でシャーディングされた勾配にはそのまま適用できません。INTELLECT_3_Technical_Report 試した方法: * ラウンドロビン gather/scatter - 各 rank が一部の行列を集めて Newton-Schulz を計算し、更新済み勾配を scatter - しかしノード数が増えると gather が多すぎて InfiniBand が詰まる * All-to-all ベースの手法(最終採用) - all-to-all collective で勾配を再配置し、Mu on を分散適用 - 実装には Dion の OSS 実装を利用 ====== 2.1.8 Mixture-of-Experts の効率化 ====== MoE 層には torchtitan の実装を使い、grouped GEMM カーネルで専門家をまとめて実行。 * 実験の結果、 - シーケンス長と hidden dim が大きい今回の設定では、 既に grouped GEMM が十分に飽和しており、 - Expert Parallelism(EP)を入れてもスループットがむしろ下がることが分かった(scatter/gather オーバーヘッドのみ増える)。INTELLECT_3_Technical_Report * 図5(p9)のベンチマークでは、 シーケンス長 32k〜65k では 128 experts まではTFLOPSが飽和領域にとどまるため、EPは不要という判断。 推論側では HF の MoE 実装を使う必要があるため、トレーナ側の state dict をHF形式にオンザフライ変換して vLLM に渡す工夫もしています。 ===== 2.2 verifiers と Environments Hub:RL環境の設計 ===== verifiers は '''「RL環境=データセット+ロールアウトロジック+報酬関数」'''として切り出すライブラリです。INTELLECT_3_Technical_Report ====== 2.2.1 環境の構成要素 ====== # dataset - 各行が1問題:入力プロンプト+メタデータ(正解、テストケースなど) # rollout メソッド - 1問題+OpenAI互換クライアントを受け取り、 - ツール呼び出しやマルチターン対話を含む一連の行動を実行 - 学習に必要なログ(token ids, logprobs 等)を収集 # Rubric - 複数の reward function をまとめる抽象 - 各 reward は (プロンプト, completion, 正解, rollout state) を受けてスカラーを返す - 重み付き合成で最終報酬を作る - 投票・ランキングなど相対評価にも対応 # load_environment - 前処理やリソース確保を行い、環境インスタンスを生成するエントリポイント ロールアウトは asyncio ベースで非同期に大量並列実行。図6(p10)のクラス階層では、 * Environment(基底) * MultiTurnEnv(マルチターン) * ToolEnv / StatefulToolEnv(ツール呼び出し) * SandboxEnv(コンテナ実行) * CodeEnv(テストケース付きコード環境) と段階的に機能が拡張される様子が示されています。INTELLECT_3_Technical_Report ====== 2.2.2 prime-rl との統合 ====== * 環境は Python モジュールとして Environments Hub から pip install できる。 * prime-rl のオーケストレータは、モジュール名だけ指定すれば - 環境をロード - ロールアウト実行 - 報酬・logprobs などを Trainer に渡す * EnvGroup によって 複数環境を1つの「大環境」として束ねることができ、 task ID 列でどのサブ環境で評価するかを振り分ける。 ====== 2.2.3 Environments Hub ====== * 環境を 独立したPythonパッケージとして登録・バージョン管理するレジストリ。 * 従来の「トレーニングリポジトリ内のサブフォルダ形式」から脱却し、 - 評価専用の利用 - バージョン固定 - 外部コントリビューション をやりやすくしている。 ====== 2.2.4 評価 ====== トレーニング中のオンライン評価も verifiers 環境で行い、 * オーケストレータが訓練リクエストと評価リクエストを同じ推論プールに投げる * 評価のオーバーヘッドを「訓練の隙間」に隠しつつ、リアルタイムにスコアを監視 という形になっています。 ===== 2.3 Prime Sandboxes:コード実行基盤 ===== ====== 2.3.1 素朴な Kubernetes 実装の限界 ====== 「kubectl exec でエフェメラル Pod に入ってコードを走らせる」という素朴な設計だと、 * API Server & etcd が制御プレーンのボトルネックになり、 * 数千並列のとき 1コマンドのレイテンシが2.5秒まで悪化した、という測定結果が示されています。INTELLECT_3_Technical_Report ====== 2.3.2 Prime Sandboxes のアーキテクチャ ====== これを解決するために、 * Rust 製 Gateway - 軽量HTTP APIで実行リクエストを受付 - Kubernetes APIではなく Headless Service を通じてPod IPを直接解決 - kube-proxy を迂回し、Pod へ直接接続 * 高スループット CoreDNS - Headless Service 由来の大量のAレコード更新に耐えるよう、CoreDNS構成をカスタム * Sidecar パターンのサンドボックスPod - 特権 sidecar が nsenter でターゲットコンテナの namespace 内へ侵入してコマンド実行 - これにより ローカルプロセス並の速度とフルコンテナ隔離を両立 というかなり攻めた設計になっています。INTELLECT_3_Technical_Report ====== 2.3.3 非同期ライフサイクル管理 ====== Pod の Ready 検知も、 * Kubernetes API や Kopf controller でのイベント監視に頼ると、 - 大量Pod同時起動でバックログが溜まり、 - 実際には起動済みなのに「Ready通知が来ない」時間が長くなる ため、 * Kopf はエラーハンドリング等のメンテ専用に縮小し、 * Pod 側の sidecar からトレーニングバックエンドへ Webhook を直接送ることで 起動完了を即時通知する方式に変更。 * この結果、クラスタ負荷に関わらず 起動から Ready まで常に < 10 秒に抑えられたと報告。INTELLECT_3_Technical_Report ====== 2.3.4 イメージ配布と高密度化 ====== イメージ配布は2段構え: # 専用レジストリ+Lazy Pulling - 動的環境向け - エントリポイントに必要なレイヤだけ先読みし、残りはバックグラウンドでストリーミング # Warm Pool - 標準的なランタイムイメージ用に、常に起動済みPodをプール - 取得即実行可能 さらに、1ノードに256サンドボックスを詰め込むことを目標とした bin-packing スケジューラと、 * RLは「短時間CPUスパイク+長時間待ち」のワークロードなので、 * CPUを Burstable QoS で大幅オーバーサブスクライブ という設計でリソース効率を高めています。INTELLECT_3_Technical_Report ====== 2.3.5 セキュリティ ====== * ランタイムには gVisor (runsc) を採用して、ユーザ空間カーネルでホストを隔離 * ネットワークポリシーで外部通信を制限 * 必要に応じて GPU をマウントしたサンドボックスも支援 ===== 2.4 GPUクラスタ運用 ===== * 512枚の NVIDIA H200(64ノード) * ネットワーク:400Gbps NDR InfiniBand(ConnectX-7)、AllReduce の tail latency を監視し、160GB/s 以上を目標 * 構成管理:Ansible による IaC * ジョブ管理:Slurm + cgroup v2(ジョブ終了時に cgroup ごとプロセス凍結・破棄) * ストレージ:Lustre(高スループット)+NVMe-NFS(メタデータ多め用途) * 監視:DCGM → Prometheus、Xid エラーや熱スロットリング検知でノードを事前に drain と、かなり “HPC すぎる” レベルまでチューニングされています。INTELLECT_3_Technical_Report
Summary:
Please note that all contributions to freem are considered to be released under the Creative Commons Attribution-ShareAlike 4.0 (see
Freem:Copyrights
for details). If you do not want your writing to be edited mercilessly and redistributed at will, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource.
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)