[dynamo] Add NVIDIA Dynamo project for Forge#115
Conversation
Add projects/dynamo/ — a Forge project for deploying and benchmarking NVIDIA Dynamo inference workloads on OpenShift. Follows the llm_d project pattern but targets Dynamo's own operator stack (DynamoGraphDeployment CRD, etcd/NATS, EPP-based routing) instead of RHOAI/KServe. Includes: - CI/CLI entrypoints with standard Forge phases - Config schema for Dynamo Helm deploy, deployment profiles (agg/disagg), workloads, and model cache - DynamoGraphDeployment manifest renderer (aggregated + disaggregated) - Toolbox commands: deploy_dynamo_platform, capture_dynamo_state, cleanup_dynamo_resources - Runtime config with RunSpec matrix expansion - Presets (smoke, disagg-smoke, full) - Unit tests for manifest rendering and config utilities Reuses GPU operator, NFD, model cache, guidellm benchmarks, and DSL framework from existing Forge projects. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Skipping CI for Draft Pull Request. |
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Design: Dynamo Project for ForgeWhy a Separate ProjectDynamo uses a fundamentally different deployment stack from llm_d:
Shared code accessed via cross-project imports — no duplication. ArchitectureInfrastructure Notes
Reused Code
New Components
Presets
Testing Status
Next Steps
|
Remove unused imports, fix import sorting, remove unused variable. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
6-step automated health check for the Dynamo gateway stack: 1. Gateway proxy pod running (SCC, fd exhaustion, Istio CA) 2. Gateway programmed (GatewayClass exists) 3. HTTPRoute accepted (namespace restriction, pool not found) 4. EPP running (SCC, startup probe vs worker readiness) 5. ext_proc connectivity (502, Istio sidecar interception) 6. Inference smoke test (routing headers, RoutingFailed) Each step prints the fix when it fails. Stops at first failure. Includes standalone.py (no Forge deps, just python3+oc) and main.py (Forge DSL toolbox command). Tested on psap-dra-ocp2 (all pass) and poseidon (correctly identifies missing InferencePool after DGD cleanup). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Port key capabilities from benchflow's Dynamo integration: Metrics: - Add 20 Dynamo-specific PromQL queries to caliper queries.yaml (frontend TTFT/ITL/throughput, component KV cache, operator reconcile) - Add metrics.yaml config selecting Dynamo + infra query keys Benchmarks: - Add run_aiperf_benchmark toolbox command (dataset download, aiperf CLI invocation, result parsing) - Add 3 aiperf benchmark profiles: mooncake-trace-2k, mooncake-full, mooncake-toolagent - Wire aiperf into test_phase via runtime.aiperf_benchmark_key DGD renderer: - Support router_mode: kv (standalone Frontend) vs direct (EPP) - Support KVBM: kv_transfer_config arg + DYN_KVBM_CPU_CACHE_GB env - Support DRA resources: use_dra_resources + configurable resource name - Add deployment profiles: aggregated-kv-router, aggregated-kvbm, aggregated-dra - Configurable hf_home, kv_block_size, frontend_cpu, router_args Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
render_graph_deployment.py: 342 → 214 lines (-37%) - Unified _build_worker() for all topologies (agg/disagg/prefill/decode) - Unified _build_routing_service() for EPP vs KV-router frontend - _BuildCtx carries resolved config instead of 12 kwargs per function check_gateway_health/standalone.py: deleted (-329 lines) - Was 90% duplication of main.py without Forge DSL - main.py is the canonical implementation using Forge toolbox pattern Net: -457 lines removed. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Matches the guidellm toolbox pattern: - Renders and oc-applies a K8s Job (pip installs aiperf at runtime) - Results written to forge-dynamo-results PVC (persists across runs) - Polls job completion via @Retry - Creates copy pod to extract profile_export_aiperf.json - Parses summary metrics to aiperf_summary.json in artifact dir - Cleans up job + copy pod, keeps PVC Tested end-to-end on poseidon (H100): 100 Mooncake trace entries, Qwen3-0.6B, full pipeline in 1m49s. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Wire up caliper-export for the Dynamo project: - MLflow experiment: forge-dynamo - Uses same psap-forge-mlflow-export vault as llm_d - Uploads all artifact dir contents (aiperf results, guidellm results, DGD manifests, job logs) to MLflow tracking server Caliper-export is already registered as a ci.py subcommand. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…/metrics - Extract ALL aiperf output files from PVC (7 files: json, csv, jsonl, logs, inputs, server_metrics) — was only extracting summary JSON - Build mlflow_run_metadata.json with params (model, dataset, endpoint), metrics (TTFT, ITL, throughput, latency with p95), and tags - Auto-export to MLflow via Caliper when MLFLOW_TRACKING_URI is set - Fix missing `import os` Validated on poseidon: 8 artifacts + 8 params + 12 metrics uploaded to MLflow experiment forge-dynamo. Matches benchflow artifact structure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Separate guidellm and aiperf into distinct config maps to prevent
schema cross-contamination:
runtime:
benchmark_tool: guidellm | aiperf | null
benchmark_key: short | mooncake-trace-2k | ...
workloads:
guidellm_benchmarks: # guidellm-only fields
short: { args: ... }
aiperf_benchmarks: # aiperf-only fields
mooncake-trace-2k: { dataset_url: ..., streaming: ... }
Dispatcher validates key exists in the matching map — wrong tool+key
combo fails immediately instead of silently ignoring unknown fields.
Also:
- Configurable PVC name in model_cache config + renderer
- aggregated-rr-4r-tp2 profile for Qwen3-32B reproduction
- Improved endpoint discovery (frontend → gateway → any:8000)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add projects/dynamo/ — a Forge project for deploying and benchmarking NVIDIA Dynamo inference workloads on OpenShift. Follows the llm_d project pattern but targets Dynamo's own operator stack (DynamoGraphDeployment CRD, etcd/NATS, EPP-based routing) instead of RHOAI/KServe.
Includes:
Reuses GPU operator, NFD, model cache, guidellm benchmarks, and DSL framework from existing Forge projects.