Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
6e691cd
feat: integrate H3 workflows with the current infx planner
edwingao28 Sep 26, 2026
eba49c7
test: preserve the parent H3 report assertion cleanup
edwingao28 Sep 26, 2026
8247212
fix: use canonical infx entrypoints for H3
edwingao28 Sep 27, 2026
8492e47
merge: reconcile H3 cross-hardware with current main
edwingao28 Sep 28, 2026
1e648b1
fix: point H3 paths at inferencex-e2e after repo reorg
edwingao28 Sep 28, 2026
5cbc665
docs: add Cam/Alec H3 interface handoff after main reconcile
edwingao28 Sep 28, 2026
77f2080
feat: add Wan serving and deployment evidence
edwingao28 Oct 5, 2026
460fffa
feat: add Wan vLLM-Omni transport and shared spec
edwingao28 Oct 17, 2026
90f9c57
chore: synchronize Wan with H3 parent
edwingao28 Oct 17, 2026
c0eaf33
docs: include Wan spec dependencies in CPU checks
edwingao28 Oct 17, 2026
7cbb82e
test: remove redundant Wan test narration
edwingao28 Oct 17, 2026
7eb6747
test: add the PR #2916 H3 serving spec as a fixture
edwingao28 Oct 17, 2026
cda654a
feat: add a shared MiniMax-H3 workload spec with plan hashing
edwingao28 Oct 17, 2026
12d064b
ci: test and lint the H3 workload spec
edwingao28 Oct 17, 2026
6589814
docs: add vLLM-Omni serving notes for MiniMax-H3
edwingao28 Oct 17, 2026
221cd0f
feat: bind H3 engine comparison to native video sweep
edwingao28 Oct 18, 2026
19991ae
chore: reconcile H3 native engine foundation for Wan
edwingao28 Oct 18, 2026
1bd5e98
fix: connect native video sweeps and validate complete artifacts
edwingao28 Oct 18, 2026
85bfbbb
test: add the PR #2916 H3 serving spec as a fixture
edwingao28 Oct 17, 2026
5b02863
feat: add a shared MiniMax-H3 workload spec with plan hashing
edwingao28 Oct 17, 2026
ae4ee4b
ci: test and lint the H3 workload spec
edwingao28 Oct 17, 2026
41579ea
docs: add vLLM-Omni serving notes for MiniMax-H3
edwingao28 Oct 17, 2026
fcc5f08
feat: bind H3 engine comparison to native video sweep
edwingao28 Oct 18, 2026
2936089
feat: add Wan native comparison recipes for both engines
edwingao28 Oct 18, 2026
a205147
chore: align Wan comparison with native video sealing
edwingao28 Oct 18, 2026
964df42
fix: pin vLLM video rows to the tested image digest
edwingao28 Oct 18, 2026
f115373
chore: reconcile Wan comparison with final native sweep gate
edwingao28 Oct 18, 2026
0d7ce1d
chore: align Wan comparison with H3 public branch history
edwingao28 Oct 18, 2026
7b60a2b
docs: keep video serving notes factual and links valid
edwingao28 Oct 18, 2026
b441779
chore: inherit H3 full sweep selection for Wan comparison
edwingao28 Oct 18, 2026
c07b403
chore: declare Wan engine rows for native full sweep
edwingao28 Oct 18, 2026
f0428b7
fix: align Wan service with native power validation
edwingao28 Oct 18, 2026
4bfb66c
chore: inherit selected native execution spec
edwingao28 Oct 18, 2026
334004b
docs: remove private video notes and dead links
edwingao28 Oct 18, 2026
4e8f161
chore: inherit H3 binder formatting for CI
edwingao28 Oct 18, 2026
4475151
fix: export only retained video result guides
edwingao28 Oct 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/test-h3-video.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,6 @@ concurrency:
jobs:
test:
name: H3 CPU harness and workflow checks
if: ${{ github.event.pull_request.draft != true }}
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
Expand All @@ -58,7 +57,9 @@ jobs:
check_env_vars PYTHONPATH
uv run --no-project --python 3.12 \
--with 'av==16.1.0' --with 'numpy==2.3.5' \
--with 'pytest>=8,<9' --with 'jsonschema>=4,<5' python -m pytest -q
--with 'pyyaml==6.0.3' \
--with 'pytest>=8,<9' --with 'jsonschema>=4,<5' \
--with 'rfc3339-validator==0.1.4' python -m pytest -q
- name: Check entry shell syntax
run: |
bash -n experimental/video-generation/runtime-entry.example.sh
Expand All @@ -76,7 +77,6 @@ jobs:

staged-power-python310:
name: H3 staged power on Python 3.10
if: ${{ github.event.pull_request.draft != true }}
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
Expand Down
68 changes: 67 additions & 1 deletion experimental/video-generation/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,71 @@

**English** | [中文](README_zh.md)

## Wan2.2 local runner integration

The client accepts `Wan-AI/Wan2.2-T2V-A14B-Diffusers` on SGLang and vLLM-Omni;
the supervised `serving-smoke` path starts SGLang. A pinned eight-H100
vLLM-Omni server completed one Wan request. The full workload, matched performance,
quality, and production delivery remain unverified.

The [Wan plan](mvp/wan22-serving.plan.json) freezes checkpoint
`5be7df9619b54f4e2667b2755bc6a756675b5cd7`, four video-only prompts, one warmup,
832×480, 81 frames at 16 FPS (5.0625 seconds), 40 steps, high/low expert guidance
4/3, flow shift 12, and an explicitly empty negative prompt. This is a new workload,
not a matched H3 comparison or the upstream default negative prompt. The protocol
was inspected at SGLang `71de97b264b04dcd514cf904003028aefe9775c8`. That runtime
ignores per-request Wan flow-shift overrides, so only 12 is admitted; high-stage
guidance must exceed 1 for the runtime to apply both expert guidance values.
The [shared Wan spec](specs/wan.yaml) retains that four-case plan as `frozen-3733`
and defines `shared-v1` with two seeds per prompt. The [serving note](specs/wan-vllm-omni-serving.md)
records the pinned vLLM-Omni setup and single-request evidence. The spec loader
is shared with H3 and keeps the plan hash separate from source citations.

Preview requests without a server or GPU, from `experimental/video-generation`:

```bash
python -m evaluator.cli run mvp/wan22-serving.plan.json --runtime sglang
```

The [GPU template](mvp/wan22-gpu-job.template.json) retains unapproved authorization,
unresolved paths and an empty file manifest. Before separately authorized execution,
bind it to task-owned SemiAnalysis resources and the compatible prepared runtime,
verify all checkpoint files, and set the actual budget. The local supervised entry is
`python -m evaluator.cli serving-smoke --spec <prepared-spec.json> --output <new-evidence-dir> --concurrencies 1`.
Its first cell has four measured requests plus one warmup. The template does not
establish one-GPU memory fit.

Initial support is NVIDIA, TP1 and pure Ulysses over 1/2/4/8 GPUs, with explicit
DiT/text-encoder/VAE offload booleans and layerwise offload disabled. The launcher
disables runtime warmup, CFG parallelism and Ring, and uses a job-owned persistent
output directory so the polled `/v1/videos/{id}/content` route can deliver the MP4.
The harness records its own warmup. H3-only launch flags/timing patches, AMD,
and paired quality qualification are rejected for this Wan launcher. The runner
also accepts an operator-managed vLLM-Omni endpoint using the audited multipart transport.
The policy records only an uncalibrated identity; it contains no audio thresholds.

Media validation requires exact geometry, cadence, frame count and no audio stream.
Audio generation and quality qualification are unsupported; no audio/A-V score is
invented. Missing quality and quality/SLO goodput stay null in the dashboard.
Timeouts retain unknown remote completion and stop further submissions; deleting a
job in this pinned server does not prove cancellation.

The local supervised entry writes a `video_serving_smoke_matrix` and retains failed
and unstarted request counts. The operator-managed `run --execute` entry writes a
separate run receipt. The parent H3 CI now launches fresh jobs through native
srt-slurm video matrix rows. Wan has no native recipe or config row, so these local
entries do not submit or qualify a Wan CI job. A native Wan row needs its own
reviewed recipe and artifact wiring. The paired H3 `result.json` exporter is not
used for Wan. The app accepts the canonical Diffusers ID and the earlier short
display ID, and rejects conflicting model declarations.

CPU checks cover both HTTP transports with encoded fixtures, full video-only
decoding, launch previews, failure seals and dashboard parsing. The retained H100
record proves one request completed; it does not qualify the shared workload or a
production path. Fixtures are never included as measured results.

## Existing H3 lane

This experimental lane runs the existing H3 supervisor inside InferenceX CI on
prepared SemiAnalysis NVIDIA resources. Its first target is a bounded same-build smoke:
original generated MP4s, full video/audio validation, measured requests, and
Expand Down Expand Up @@ -250,7 +315,8 @@ Regression mode additionally requires the existing calibrated acceptance gate.
cd experimental/video-generation
PYTHONPATH=../../inferencex-e2e uv run --no-project --python 3.12 \
--with 'av==16.1.0' --with 'numpy==2.3.5' \
--with 'pytest>=8,<9' --with 'jsonschema>=4,<5' python -m pytest -q
--with 'pyyaml==6.0.3' --with 'pytest>=8,<9' --with 'jsonschema>=4,<5' \
--with 'rfc3339-validator==0.1.4' python -m pytest -q
bash -n runtime-entry.example.sh
```

Expand Down
64 changes: 60 additions & 4 deletions experimental/video-generation/README_zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,61 @@

[English](README.md) | **中文**

## Wan2.2 本地 runner 接入

现有 client 可通过 SGLang 或 vLLM-Omni 运行
`Wan-AI/Wan2.2-T2V-A14B-Diffusers`;受控 `serving-smoke` 路径启动 SGLang。
一台固定版本的八卡 H100 vLLM-Omni
服务完成了一次 Wan 请求。完整工作负载、匹配的性能对比、质量及生产交付仍未验证。

[Wan plan](mvp/wan22-serving.plan.json) 固定 checkpoint
`5be7df9619b54f4e2667b2755bc6a756675b5cd7`,四条纯视频提示词、一次独立 warmup,
832×480、81 帧、16 FPS(5.0625 秒)、40 步、两阶段 guidance 4/3、flow shift 12,
并显式使用空 negative prompt。这是新工作负载,不是与 H3 匹配的对照,也不是上游
默认 negative prompt。协议按 SGLang `71de97b264b04dcd514cf904003028aefe9775c8`
核对。该版本忽略请求级 Wan flow-shift 覆盖,因此仅接受 12;第一阶段 guidance 必须
大于 1,运行时才会应用两个 expert 的 guidance 值。
[共享 Wan spec](specs/wan.yaml) 用 `frozen-3733` 保留原来的四个 case,并在
`shared-v1` 中为每条提示词加入第二个 seed。[服务记录](specs/wan-vllm-omni-serving.md)
保留固定版本的 vLLM-Omni 配置和单次请求证据。spec loader 与 H3 共用,plan hash
不包含来源引用。

在 `experimental/video-generation` 下无 GPU、无服务地预览请求:

```bash
python -m evaluator.cli run mvp/wan22-serving.plan.json --runtime sglang
```

[GPU 模板](mvp/wan22-gpu-job.template.json) 保持未批准授权、未填写路径和空文件清单。
另行授权实际运行前,需要绑定任务拥有的 SemiAnalysis 资源及兼容的已有 runtime,
核实全部 checkpoint 文件,并设置实际预算。本地受控入口是
`python -m evaluator.cli serving-smoke --spec <prepared-spec.json> --output <new-evidence-dir> --concurrencies 1`。
第一格为四条测量请求加一次 warmup;模板不能证明单卡显存足够。

初始支持 NVIDIA、TP1、1/2/4/8 卡纯 Ulysses,显式设置 DiT/text-encoder/VAE
offload,禁用 layerwise offload。launcher 关闭运行时 warmup、CFG 并行和 Ring,
使用本次任务拥有的持久输出目录,确保轮询后的 `/v1/videos/{id}/content` 能下载 MP4。
harness 单独记录 warmup。该 Wan launcher 拒绝 H3 专用启动参数/计时补丁、AMD
及配对质量准入。runner 也可通过已核对的 multipart 协议连接由操作员管理的
vLLM-Omni 服务。policy 仅记录未校准身份,不含音频阈值。

媒体验证要求分辨率、时间间隔、帧数符合计划,且无音频流。音频生成和质量准入为
unsupported,不生成音频或 A/V 分数。Dashboard 缺失质量及质量/SLO goodput 仍为 null。
超时后保留远端是否完成的未知状态并停止后续提交;该版本删除 job 不代表真正取消。

本地受控入口写入 `video_serving_smoke_matrix`,保留失败及未启动的请求数。
由操作员管理的 `run --execute` 入口另写一份运行收据。父分支的 H3 CI 现在通过原生
srt-slurm video matrix 行启动新作业。Wan 尚无对应的原生 recipe 或 config 行,
因此这些本地入口不会提交或验收 Wan CI 作业。原生 Wan 行仍需经审核的 recipe
及产物接线。Wan 不使用 H3 配对 `result.json` exporter。App 接受规范 Diffusers ID
与此前短显示 ID,并拒绝冲突的模型声明。

CPU 检查覆盖两种使用编码 fixture 的 HTTP transport、纯视频完整解码、启动预览、
失败封存及 Dashboard 解析。保留的 H100 记录只证明一次请求已完成,不能代表共享
工作负载或生产路径通过验收。fixture 不进入实测结果。

## 既有 H3 路径

此实验任务在 InferenceX CI 内使用 SemiAnalysis H200 资源运行现有 H3
supervisor。首个目标是有时间上限的同版本冒烟测试:保留实际生成的 MP4,
完整验证视频和音频,记录请求耗时,并验证清理结果。此任务不写入原生
Expand Down Expand Up @@ -135,9 +190,9 @@ H200 硬件盘点、CPU 导出)与 `h3-fidelity.yml`(保留媒体比较)

## 结果与本地检查

成功执行还会发布[前端结果契约](RESULTS_zh.md):版本化的 `result.json`、
成功执行还会发布[前端结果契约(英文)](RESULTS.md):版本化的 `result.json`、
逐卡功率序列、分阶段能量与覆盖率,以及可离线打开的 `power-report.html`。
`h3-results-<run-id>-<attempt>` 包含索引、JSON Schema、双语指标说明,以及每次
`h3-results-<run-id>-<attempt>` 包含索引、JSON Schema、指标说明,以及每次
原始执行的媒体、测量、日志和报告。原始执行身份与校验文件和本次导出身份分开保留。
遥测无效时功率和能量为空;导出失败会保留错误日志并返回失败状态。

Expand Down Expand Up @@ -170,7 +225,7 @@ gh workflow run h3-video.yml --repo SemiAnalysisAI/InferenceX \
配置、实际执行、默认及最大功率上限均为 700 W;历史生成时的设置仍未知。
原始盘点记录中的 unknown 分类保持不变;导出器使用新 producer 提交解析原始
XML,同时支持带或不带 `0x` 的 PCI 编号,不重新查询硬件。
[已保留的 A/A 测量及限制](RESULTS_zh.md#已观测的-aa-证据)提供具体数据。
[已保留的 A/A 测量及限制(英文)](RESULTS.md#observed-aa-evidence)提供具体数据。

原始工作负载失败时仍上传失败证据,但不会启动成功结果导出。

Expand All @@ -189,7 +244,8 @@ serving 运行由其基准测试作业上传 `h3-results-<run-id>-<attempt>`;
cd experimental/video-generation
PYTHONPATH=../../inferencex-e2e uv run --no-project --python 3.12 \
--with 'av==16.1.0' --with 'numpy==2.3.5' \
--with 'pytest>=8,<9' --with 'jsonschema>=4,<5' python -m pytest -q
--with 'pyyaml==6.0.3' --with 'pytest>=8,<9' --with 'jsonschema>=4,<5' \
--with 'rfc3339-validator==0.1.4' python -m pytest -q
bash -n runtime-entry.example.sh
```

Expand Down
82 changes: 80 additions & 2 deletions experimental/video-generation/RESULTS.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
# H3 backend result contract

**English** | [中文](./RESULTS_zh.md)

`result.json` is the frontend entry point for a downloaded H3 CI artifact. Its
`schema_version` is **1.0.0**; [result.schema.json](./result.schema.json) describes
its external shape. Reject unknown versions. This contract does not ingest a
Expand Down Expand Up @@ -200,3 +198,83 @@ Each duration is a separate frozen workload. Do not pool these durations or
interpret their latency difference as a regression. One measured clip per role
provides point estimates only; workload execution passed while regression
remains uncalibrated and inconclusive.

## Offline deployment-frontier replay

`evaluator.mvp_deployment_frontier` selects retained, normalized dashboard
observations for a local comparison; it does not collect new measurements or
qualify an artifact. This is the backend counterpart of the video-only wrapper in
[App #1193](https://github.com/SemiAnalysisAI/InferenceX-app/pull/1193), delivered
with [Backend #2916](https://github.com/SemiAnalysisAI/InferenceX/pull/2916).
The shared LLM/calculator Pareto implementation is unchanged.

Pass a JSON object with `points`. Each point supplies `id`, finite numeric `x` and
`y`, `hardwareKey`, canonical `cohortKey` (workload plus generation settings),
canonical `deploymentKey` (including replicas, parallel layout, offload, batching
and engine/runtime), and the producer's `queueingStatus` (`unqueued`, `queueing`,
or `unknown`). Optional `hardwareHealth.status: "fail"` excludes a point even
when dominated deployments are requested. Missing canonical cohorts remain
isolated points. Unknown request capacity and missing axes cannot rank. Exact
coordinate ties retain distinct measured identities; a repeated observation of
one deployment does not create a connecting deployment line. No interpolation
or extrapolation is performed.

With `--quality-required`, the reader checks the source-bound `quality` assessment;
an opaque `qualifiedQualityCohort` string cannot grant admission. The assessment
must declare `scale: "ordinal_0_to_4"` and preserve all seven original rubric IDs:
`prompt_adherence`, `visual_fidelity`, `temporal_consistency`, `motion_plausibility`,
`audio_quality`, `audio_content`, and `av_sync`. Zero is a real score, not missing
information. Legacy 1–5 scores or renamed dimensions are not silently converted.
The registry remains `human.absolute_dimension_rating`, version `0.2.0-draft`.

Every critical dimension must have a passing decision, complete target-clip
coverage, identified evaluator, and a calibrated frozen rule with provenance.
`--quality-metric` selects the displayed dimension (default `prompt_adherence`);
`--quality-threshold` can only tighten that dimension's frozen threshold. Other
dimensions still require their own frozen rules. The derived quality cohort includes
all seven evaluator and calibration identities, not only the selected dimension.
Different workload/generation or quality cohorts never dominate each other or share
a connecting line. These checks validate recorded contract fields; they do not
establish that human judgments or calibration are scientifically valid, or turn
media integrity/fidelity into perceptual quality.

```bash
cd experimental/video-generation
python -m evaluator.mvp_deployment_frontier normalized-observations.json \
--output frontier.json --x-better lower --y-better higher
```

The JSON output retains input identities, selected observations, each separate
frontier and exclusion reasons. `--include-dominated` matches the chart's Optimal
Only off state; `--quality-required` applies the qualification filter first.
`tests/fixtures/deployment-frontier.json` contains shared synthetic direction/tie
cases for the backend and App tests, never measured benchmark evidence.

## Optional source-bound dashboard observations

[`dashboard-observations.schema.json`](./dashboard-observations.schema.json)
defines an additive `dashboard-observations.json` sidecar, independent of
`result.json` version 1.0.0. Its root contains `schemaVersion: 1`, `sourceRunId`,
`sourceSha`, and a nonempty `cells` map. Each known cell binds `runSha256` and
`specSha256` to that cell's existing measured run and specification; optional
`deployment`, `hardwareHealth`, and `quality` objects preserve unknowns as null.
The sidecar's SHA256 must appear in both `SHA256SUMS` and
`manifest.evidence["dashboard-observations.json"]`. Ingestion verifies the raw
bytes, source run/commit, cell existence and run/spec hashes before exposing any
of its fields. Schema validation alone cannot establish those relationships.

Deployment fields distinguish observed `batchSize` from configured
`maxBatchSize`, and retain Ring/CFG, individual offload flags, precision scope,
engine and generation identity. A `hardwareHealth` record carries its status,
reason and evidence; incomplete monitoring remains unknown. Quality stores
the required `ordinal_0_to_4` scale and separate original rubric dimensions with
contract/rubric/evaluator identities and hashes, sample coverage and a frozen
calibration record. Nullable unjudged data is valid
contract data, but cannot qualify a frontier. A syntactically valid `pass` is
also insufficient without all seven calibrated protocol checks in the App and
backend frontier reader.

The existing exporter does not create this optional sidecar automatically.
Original archives and source seals remain immutable. Explicit local curator
enrichment can exercise these fields for a preview, but must be labelled as
unsealed replay data; it is not equivalent to this sealed ingestion contract.
Loading
Loading