Conversation
更新到 nightly_202609231248,启用 FlyDSL paged decode 和 dense work planner,修复 ROCR/HIP 重复筛选。保留 19 个吞吐点,按 #3189 仅单独调度一个 TP4 C48 offload eval。
|
Thanks for the contribution!
中文感谢你的贡献!
|
回填 MiniMax-M3 FlyDSL 更新的 upstream PR 链接。
|
View unofficial run (performance): https://inferencex.semianalysis.com/inference?unofficialRun=36233199454 View unofficial run (accuracy): https://inferencex.semianalysis.com/evaluation?unofficialRun=36233199454 |
将 MiniMax-M3 的 19 个吞吐点和唯一的 TP4 C48 eval 合并到同一次 PR sweep。新增 eval-concs 过滤,仅限制 eval,不裁剪吞吐点。旧运行已取消,暂不重新启动 GPU 测试。
| - "Update MiniMax-M3 ATOM AgentX from rocm/atom-dev:nightly_202609171455 to nightly_202609231248 (digest sha256:80f2c66579704aba933a9ff2a6e22e1dc61917c0fe6a2b0a0166816cd6d0100a), containing ROCm/ATOM#2366. Enable ATOM_PA_FLYDSL=1 and ATOM_PA_FLYDSL_PLAN=1 for FlyDSL paged decode and context-length-aware dense-decode work planning." | ||
| - "Use only ROCR_VISIBLE_DEVICES for automatically selected NUMA-spread GPUs and remove the inherited ROCR-to-HIP double mask. Preserve explicit ROCR allocations and HIP-only allocations; retain all 19 TP2/TP4 resident/offload points, EAGLE3 K3, golden AL 2.78, indexer CP and CPU memory budgets." | ||
| - "As in PR #3189, run a throughput-only PR sweep and dispatch exactly one representative TP4 C48 LMCache-offload eval separately against the same head, using the full MiniMax vendor suite and real draft acceptance." | ||
| pr-link: TBD |
There was a problem hiding this comment.
🔴 The new changelog entry ships pr-link: TBD even though this PR is already open, so the merge-prep tooling rejects it instead of finalizing the link automatically. validate_added_pr_link in infx/workflows/validate_perf_changelog.py only accepts "XXX" or the canonical https://github.com/SemiAnalysisAI/InferenceX/pull/ as placeholders (PR_LINK_PLACEHOLDERS, line 21-24); "TBD" matches neither. docs/configuration-procedures.md:584 says TBD is only for use before the PR exists and must be replaced right after creation, which this entry was not. Fix: replace pr-link: TBD with either the real https://github.com/SemiAnalysisAI/InferenceX/pull/ URL for this PR or the XXX placeholder that the validator/canonicalizer actually recognizes.
Why this was flagged
perf-changelog.yaml:8771 sets pr-link: TBD on the newly appended minimaxm3 entry. infx/workflows/prepare_perf_changelog_merge.py's canonicalize_appended_links (used to finalize pr-links for reuse-assisted merges) calls compare_entries -> validate_added_pr_link with the real pr_number; since "TBD" is not in PR_LINK_PLACEHOLDERS ({"XXX", ".../pull/XXX"}) and not the expected canonical link, it raises ChangelogValidationError("new PR entry must use ... or an XXX placeholder; found 'TBD'"), and canonicalize_appended_links's own check at prepare_perf_changelog_merge.py:106-109 raises "appended entry N has unexpected pr-link 'TBD'" too. On base branch, entries use the recognized "XXX" placeholder, so this step succeeds; here whoever runs the merge-prep/canonicalize step for this PR gets a hard failure instead of the link being auto-filled, blocking merge until manually fixed.
Verification: normal. The new entry at perf-changelog.yaml:8771 ships pr-link: TBD. This value is not an accepted placeholder: validate_perf_changelog.py:21-24 defines PR_LINK_PLACEHOLDERS = {"XXX", "https://github.com/SemiAnalysisAI/InferenceX/pull/XXX"}, and validate_added_pr_link (lines 142-145) raises ChangelogValidationError("new PR entry must use ... or an XXX placeholder; found 'TBD'") for any…
There was a problem hiding this comment.
As a PR reviewer and CODEOWNER, I have reviewed this and have:
- Verified that as of the moment of typing this, this is the latest version of PR_REVIEW_CHECKLIST.md
- Verified that the general code quality meets the InferenceX standard and does not make the code quality any worse.
- Verified that this PR has passed PR validation. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/35873197630
- Verified that this PR passes evals. Please link to GitHub Action workflow that shows this. https://github.com/SemiAnalysisAI/InferenceX/actions/runs/35873197630
- Verified that speculative decoding PRs uses chat templates to align the AL distribution to real world
- Verified that every draft model and draft head is served as it ships: the draft that ships with the served checkpoint, at its stored precision, through the pinned upstream image's default handling, with the shipped and effective draft precision recorded in the additional detail section. No submission-side quantization, dtype override, checkpoint substitution, or patch may lower draft precision below that default, regardless of eval results or AL. Explicitly verified that
SGLANG_NVFP4_CKPT_FP8_NEXTN_MOEis not enabled in the effective recipe, including inherited settings; enabling it is prohibited going forward, and historical runs do not grant an exception. See Draft-model precision for what counts as the default and the MLPerf comparison. - For agentic workloads: verified that speculative-decoding configs (EAGLE / MTP / draft models) run with simulated synthetic acceptance, with the acceptance-length value taken from the committed golden AL curve in golden_al_distribution/ for that model, thinking mode, and draft length. A submission may choose any supported draft length, but it may not substitute a different acceptance target.
- Verified against the current MODELS.md that this PR does not submit a deprecated model, scenario, or model-scenario combination.
- Verified that the model architecture isn't changed with benchmark hacks like using --hf-overrides to skipping indexer for every x layers on models that don't natively support this. As a general rule, we won't accept optimizations that reduces the number of model architecture FLOPs. Anything that makes that same computation run faster is fair game; target/verifier FLOPs at lower precisions is fine, given that the config passes private evals, but this does not permit lowering draft-model or draft-head precision below what ships. As an general north star princple, we should only use optimizations which is used in production by customers that care about accuracy
- If an company claims that they support vLLM/SGLang as first class LLM inference engines on their hardware, I have verified that the respective vLLM submission made using upstream https://hub.docker.com/u/vllm docker repo, upstream SGLang https://hub.docker.com/u/lmsysorg docker repo. The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet as supported by vLLM/SGLang community maintainers
- If an company claims that they support vLLM/SGLang as first class upstream in-tree LLM inference engines on their hardware, I have have verified that the respective vLLM/SGLang submission has been made before additional frameworks (TRT-LLM, ATOM, etc.). The only exceptions are for new hardware, such as MI455X UALoE72, Vera Rubin NVL72, Rubin NVL8, etc., and for new model architectures where there is an actual reason why vLLM/SGLang does not fundamentally support them yet.
- Verified that every single-node vLLM/SGLang recipe in this PR is documented in the official vLLM recipes and/or the SGLang cookbook:
- I linked the corresponding upstream PR in the vLLM recipe repo or SGLang repo and verified that it is MERGED before this InferenceX PR merges. An opened, draft, or closed-without-merge upstream PR does not satisfy this requirement. If the matching recipe was already published, I linked the published recipe/cookbook page in the additional detail section below.
- Verified that this PR does not patch the inference engine or serving stack — the pinned image must run as shipped. This covers .patch files / git apply / patch, inline patches embedded in benchmark scripts (e.g. a python3/sed heredoc that rewrites installed engine sources before serving), in-place edits of site-packages, monkey-patching, overwriting container files, and installing forked/rebuilt engine wheels on top of the pinned image. The only exception is a patch covered by a filled-out waiver at docs/waiver/
<PR_NUMBER>.md— named after the PR that introduces the patch and filed in that same PR, stating what is patched, why the unmodified upstream image cannot run this benchmark, the upstream PR/issue link, and the removal plan — which I have linked below in the additional detail section. - If this PR uses
append-only: true, verified that it only adds generated points or recipe variants inside a selected existing config/scenario and existing same-image visual curve: every previously generated point remains present with the same recipe, no prior point is removed or rerun, and every benchmark-affecting change in the complete diff can affect only the corresponding newly appended points (never an existing point), regardless of which file contains it. - If any of the above criteria cannot reasonably be satisfied, I have provided additional reasoning below.
- Reported measured throughput/E2EL Pareto counts and evidence per affected curve (≥5 points strongly recommended). Below 5 or unverifiable: tag a core maintainer for review; recorded admin bypass required before merge. N/A if no curves are affected. Details.
Additional detail section:
- Upstream recipe (
framework: atom, so the vLLM-recipes / SGLang-cookbook requirement is N/A): https://github.com/ROCm/ATOM/blob/main/recipes/MiniMax-M3-Agentic-InferenceX.md, which gainedATOM_PA_FLYDSL=1in ROCm/ATOM#2366 (MERGED 2026-09-23). Major args match the TP4 arm:amd/MiniMax-M3-MXFP4,--kv_cache_dtype fp8,--block-size 128,--max-num-batched-tokens 32768,--max-num-seqs 2*CONC, the identicalptpc_fp8--online_quant_config,thinking_mode: enabled, EAGLE3Inferact/MiniMax-M3-EAGLE3-GQAwith 3 draft tokens (acceptance rate 0.5933 = AL 2.78),ATOM_FORCE_ATTN_TRITON=1,AITER_QUICK_REDUCE_QUANTIZATION=INT4,ATOM_PA_FLYDSL=1, and the LMCache /ATOM_SLRU/ all-rank lookup tier at C40+. InferenceX-only settings: the TP2 arms, cudagraph sizes,ATOM_M3_INDEXER_CPbands, NUMA-spreadROCR_VISIBLE_DEVICES, andAITER_SITUV2_A4W4/AITER_FLYDSL_STAGE2_FP8(target MoE kernels).
Draft-model precision record: MiniMax-M3 EAGLE3-GQA (Check 13)
- Draft and revision. The standalone PoR draft
Inferact/MiniMax-M3-EAGLE3-GQA, HF revision96692486b5fd38ebf8fd2a5f6bb53427d30819a8, loaded with--method eagle3 --draft-model Inferact/MiniMax-M3-EAGLE3-GQA --num-speculative-tokens 3. The draft is the same one used before this PR. - Shipped precision: BF16.
config.jsonisLlamaForCausalLMEagle3with 1 decoder layer, hidden size 6144,torch_dtype: bfloat16, and noquantization_config. Its singlemodel.safetensorsholds 17 tensors (3.07B parameters), all BF16. - Pinned-image default handling. The image is
rocm/atom-dev:nightly_202609231248(sha256:80f2c66579704aba933a9ff2a6e22e1dc61917c0fe6a2b0a0166816cd6d0100a), ATOM0.1.7.dev16+g10ab5e8c1(10ab5e8c1995c3e8d9e0674534f093d1e33a04ff, also printed in the eval job log).atom/models/eagle3_llama.pybuilds every draft linear (midlayer.self_attn.qkv_proj/o_proj,midlayer.mlp.gate_up_proj/down_proj,fc), pluslm_headand the embedding, without aquant_config.LinearBasethen resolvesLayerQuantConfig(), i.e.QuantType.No/ BF16, andprocess_weights_after_loadingonline-quantizes only whenself.quant_config is not None and self.quant_config.online_quant(atom/model_ops/linear.py). Theptpc_fp8--online_quant_configtherefore reaches only the target, and itsexclude_layerlist never applies to the draft. - Effective precision: BF16 weights, same as shipped. The run 35873197630 server logs (TP2 C1 benchmark and TP4 C48 LMCache eval) show three steps. The target logs
Post-load online quantization ... 126 layers online-quantized. The draft then logsweight load phases: ... (17 tensors)followed byWeight post-processing done: 0.00 seconds, with no online-quant pass. Finally it logsEagle3 draft model loaded from Inferact/MiniMax-M3-EAGLE3-GQA (independent embed/lm_head), and the printed draft config reportsdtype: bfloat16. The recipe passes no draft quantization or dtype flag. - Draft KV cache: FP8, inherited from the target's
--kv_cache_dtype fp8. The draft attention takesatom_config.kv_cache_dtype, so target and draft use the same upstream-supported KV dtype. The log lineAllocated draft KV pool: 26949 blocks, 1821321216 Bworks out to 528 B/token at TP2, which is 2 KV heads × 128 × (K+V) × 1 B plus scales. ATOM_PA_FLYDSL=1/ATOM_PA_FLYDSL_PLAN=1(new in this PR) do not change precision.run_pa_decode(atom/model_ops/base_attention.py, ROCm/ATOM#2366) passes the samecompute_type,q,k_scale/v_scaleand FP8 cache to either kernel. It routes to FlyDSL only when the call is alreadycompute_type == fp8with an FP8 cache, and otherwise keeps gluon.compute_typecomes fromkv_cache_dtypeinattention_mha.py, which #2366 left unchanged. The planner only changes how the KV is partitioned. The logs showpa_decode -> flydsl[...] (... head_dim=128 torch.float8_e4m3fn).- Other recipe knobs.
AITER_SITUV2_A4W4=1andAITER_FLYDSL_STAGE2_FP8=1are read only by aiter's MoE kernels (fused_moe.py,aot/flydsl/mxfp4_moe.py,ops/flydsl/moe_kernels.py), so they affect the target's MXFP4 MoE and not the dense draft.--index-cache-dtype fp8applies to the target's sparse-attention indexer.AITER_QUICK_REDUCE_QUANTIZATION=INT4has been in the recipe since #2816 and is also in the ATOM recipe; ATOM would set it automatically only for allamatarget. It turns on aiter's INT4 quick all-reduce for the whole process, so TP all-reduces that exceed the fused custom-all-reduce limit are INT4-compressed in transit. That includes the draft's step-0 pass over a target prefill chunk. Decode-size draft all-reduces stay on the full-precision fused custom all-reduce. The setting does not change draft weights, GEMMs or attention. SGLANG_NVFP4_CKPT_FP8_NEXTN_MOEis not enabled. It is an SGLang variable that ATOM does not read. It is not set by the recipe script,benchmark_lib.sh,runtime_settings.shor the MI355X launcher, nor in the launched environments of the benchmark and eval jobs.
Other checks
- Sweep and evals. Run 35873197630 ran on in-PR commit
7bbb0ec7; attempt 2 re-ran the two cells cancelled in attempt 1. All 19agentic /cells succeeded onrocm/atom-dev:nightly_202609231248: TP4 C1-C32 and TP2 C1/C2 resident, plus TP2 C20/C25/C30 and TP4 C40/C48 with LMCache. So did the singleagentic eval /cell (TP4 C48 LMCache, selected byeval-concs: [48]).minimax_m3_fullem_strict is 0.97 (n=102,infrastructure_success: true) ineval_results_all/agg_eval_all.json. That is above theminimax_m3_fullfloor, sinceinfx/evals/thresholds.yamlhas nominimaxm3override. The eval used real draft acceptance: its launch has no--spec-decode-acceptance-length. Reuse is set with/reuse-sweep-run 35873197630. - PR head
2e4e7174. The head only merges main. The recipe script and the config block are byte-identical to7bbb0ec7. The merged harness changes touch only the fixed-sequence and multi-node srt-slurm launch paths, GPU-telemetry CSV filtering, and a byte-identical move ofwait_for_amd_gpu_clean. The head'sTestsfailures are the same 14utils/test_srt_single_node.py::test_pool_launcher_stages_artifacts_and_propagates_failure[...]cases that fail on main4f94801a; this PR's own tests pass. - Golden AL. Throughput cells launch with
--spec-decode-acceptance-length 2.78 --num-speculative-tokens 3andthinking_mode: enabled; the server log showsForced speculative acceptance ON: mean acceptance length 2.7800 over 3 draft positions. This matchesgolden_al_distribution/minimaxm3_eagle3_gqa.yamlminimax-m3.thinking_on[3] = 2.78. - Pareto coverage. There is one affected curve: minimaxm3 / agentic-coding / MI355X / fp4 / ATOM / run 35873197630 /
rocm/atom-dev:nightly_202609231248. It has 19 measuredbmk_agentic_minimaxm3_*points, 0 invalid, and 8 on thetput_per_gpuvsp90_e2elfrontier (TP4 C5, C15, C20, C24, C28, C32; TP2 LMCache C20, C25). The P75 frontier is 7/19. Reproduced withinfx.workflows.pareto_coverage. - Everything else.
framework: atom, so the upstream vLLM/SGLang image rule does not apply; engine-first ordering holds throughminimaxm3-fp4-mi355x-vllm-agentic-mtpon the same SKU. MiniMax-M3 agentic coding (EAGLE3) is active in MODELS.md, andInferact/MiniMax-M3-EAGLE3-GQAis a PoR draft. There is no--hf-overrides. The target-onlyptpc_fp8online quant is target/verifier precision and is covered by the eval, andATOM_M3_INDEXER_CPkeeps selection bit-identical. AIPerf replays through--endpoint /v1/chat/completions --endpoint-type chat --apply-chat-template. There are no engine patches; the only install is apip install --targetof thesentencepiece/tiktokentokenizer deps. The GPU-visibility change only removes the duplicate HIP mask. The neweval-concschangelog field (infx/matrix/plan.py,infx/matrix/validation.py) only filters evals that are already selected, and it rejects empty, invalid or conflicting selections. It is covered by new tests and EN/ZH docs. There is noappend-only: true.
Signed: @chunfangamd
✅✅✅ Verdict: PASS ✅✅✅Passed and not applicable checks✅ Check 0 (CODEOWNER): PASS — ✅ Check 1 (Passing sweep on in-PR commit): PASS — in-PR commit ✅ Check 2 (Evals pass): PASS — ➖ Check 3 (Recipe linked/merged): N/A — ✅ Check 4 (Reuse command): PASS — ✅ Check 5 (Latest checklist template): PASS — every item in the current ✅ Check 6 (Upstream images / engine-first): PASS — this is an ATOM entry, so the upstream-image rule is N/A. Engine-first ordering is satisfied by the existing ✅ Check 7 (No deprecated models/scenarios): PASS — ✅ Check 8 (No architecture hacks): PASS — no ✅ Check 9 (Spec-decode uses chat template): PASS — the replay adds ✅ Check 10 (No engine patches): PASS — no patches, heredoc rewrites or engine wheels. The only install is a ✅ Check 11 (Agentic golden AL): PASS — throughput cells pass ➖ Check 12 (Append-only): N/A — the new changelog entry has no ✅ Check 13 (Draft runs as shipped): PASS — the draft ✅ Check 14 (Pareto coverage): PASS — there is one curve: minimaxm3 / agentic-coding / MI355X ATOM fp4 / Assessed commit: |
Revert the eval-concs changelog field (infx/matrix/plan.py, infx/matrix/validation.py, its tests and eval-agentx docs) so this recipe PR no longer touches core matrix generation. The MiniMax-M3 ATOM entry now sets no-evals: true; accuracy evidence is the TP4 C48 LMCache-offload minimax_m3_full eval from run 35873197630. 中文:撤回 eval-concs 字段及相关核心 matrix 逻辑、测试与文档,本 PR 不再修改 核心代码。changelog 改用 no-evals: true,准确性证据沿用 run 35873197630 的 TP4 C48 LMCache-offload minimax_m3_full eval。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Drop the highest conc-list entries on TP4/TP2 offload arms and remove the no-evals modifier so the sweep carries model-eval evidence. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
InferenceX has switched away from unmaintainable bash scripts to YAML files that don't repeat the same stuff over and over again. Please merge the latest |
Main migrated single-node AgentX to native srt-slurm (#3428) and deleted benchmarks/single_node/agentic (#3461). Accept the script deletion and move this PR's change into the declarative recipe: bump the engine image to rocm/atom-dev:nightly_202609231248 (ROCm/ATOM#2366) and set ATOM_PA_FLYDSL=1 and ATOM_PA_FLYDSL_PLAN=1. The bash-only GPU-mask fix no longer applies. The changelog entry follows the default eval policy. 中文:main 已将单节点 AgentX 迁移到 srt-slurm 并删除旧 bash 脚本。本 PR 改为在 YAML 配方中更新镜像至 nightly_202609231248 并启用 ATOM_PA_FLYDSL / ATOM_PA_FLYDSL_PLAN;GPU mask 修复随旧脚本一起移除,changelog 采用默认 eval 策略。 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adopt seungrokj's 25bce60 intent on the migrated layout: drop TP4 concurrency 32 (and its recipe override) and keep default evals. The LMCache offload arm cannot be expressed in the srt-slurm recipe and stays removed. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
|
@functionstackx Merged latest @seungrokj I merged your Fresh sweep on head |
Summary
Enable the MiniMax-M3 paged-decode optimization from ROCm/ATOM#2366 in the existing MI355X AgentX recipe, following #3189 and the upstream recipe.
rocm/atom-dev:nightly_202609171455torocm/atom-dev:nightly_202609231248. EnableATOM_PA_FLYDSL=1andATOM_PA_FLYDSL_PLAN=1; changing the image alone would leave FlyDSL disabled.0,4for TP2;0,1,4,5for TP4). Preserve caller-supplied ROCR and HIP-only allocations.Inferact/MiniMax-M3-EAGLE3-GQAdraft and precision settings are unchanged; no engine patches are applied.Registry manifest:
sha256:80f2c66579704aba933a9ff2a6e22e1dc61917c0fe6a2b0a0166816cd6d0100a. Image labels identify ATOM0.1.7.dev16+g10ab5e8c1, source revision10ab5e8c1995c3e8d9e0674534f093d1e33a04ff, and ROCm 7.2.4. That ATOM revision contains #2366. Actual kernel routing and performance remain to be verified in GPU CI.CI scope
One PR sweep contains all 19 throughput jobs and exactly one eval job: TP4 C48 with LMCache offload, using
minimax-vendor/minimax_m3_full(102 provider cases) and real draft acceptance.The changelog sets
eval-concs: [48]. The planner filters only already-selected eval concurrencies, leaves throughput intact, and rejects a selection with no matching evals. The field also narrows multi-node all-concurrency eval rows and is incompatible withno-evals/append-only.Combined GPU CI started: Run Sweep #35873197630, on commit
7bbb0ec775dd86b8f6ebb3c4e345cdfe283b1c1a, includes throughput and the single eval in one workflow. The two previous separate runs were cancelled.Validation
git diff --check, and the real changelog validator passed; historical changelog bytes are preserved.infx/Python files.AI model disclosure
Prepared with OpenAI GPT-6 via Codex for implementation, source inspection, and local validation. The exact runtime model/version identifier was not exposed and could not be verified. No delegated agents were used.
中文
概要
参考 #3189 和 ATOM 上游配方,将 ROCm/ATOM#2366 的 MiniMax-M3 paged-decode 优化接入现有 MI355X AgentX 配置。
rocm/atom-dev:nightly_202609171455更新为rocm/atom-dev:nightly_202609231248,显式启用ATOM_PA_FLYDSL=1和ATOM_PA_FLYDSL_PLAN=1,避免只换镜像却未打开新 kernel。0,4,TP4 为0,1,4,5;保留调用方的 ROCR 分配及 HIP-only 分配。Inferact/MiniMax-M3-EAGLE3-GQAdraft 及精度设置保持不变,不修改 engine。Registry manifest 为
sha256:80f2c66579704aba933a9ff2a6e22e1dc61917c0fe6a2b0a0166816cd6d0100a。镜像标签记录 ATOM0.1.7.dev16+g10ab5e8c1、源码 revision10ab5e8c1995c3e8d9e0674534f093d1e33a04ff和 ROCm 7.2.4,该 ATOM revision 已包含 #2366。实际 kernel 路由和性能仍待 GPU CI 确认。CI 范围
同一次 PR sweep 包含全部 19 个吞吐 job 和唯一一个 eval job:TP4 C48、LMCache offload,使用
minimax-vendor/minimax_m3_full(102 个 provider case)和真实 draft acceptance。changelog 设置
eval-concs: [48]。planner 只过滤常规策略已选中的 eval 并发,保留全部吞吐点;没有匹配 eval 时拒绝生成。该字段也支持缩减多节点的全并发 eval 行,不能与no-evals/append-only同时使用。合并后的 GPU CI 已启动: Run Sweep #35873197630,运行提交为
7bbb0ec775dd86b8f6ebb3c4e345cdfe283b1c1a,在同一条工作流中包含吞吐和唯一的 eval。此前两条分开的运行已取消。验证
git diff --check和正式 changelog validator 均通过,历史 changelog 字节保持不变。infx/Python 文件通过 Ruff lint 和格式检查。AI 模型披露
由 OpenAI GPT-6 通过 Codex 完成实现、源码检查和本地验证。运行环境未暴露确切模型/版本标识,因此无法核实。未使用委派代理。