Repository navigation
Fix infx bugs and speed up matrix tooling / 修复 infx 缺陷并加速矩阵工具 - #4438
Conversation
|
Thanks for the contribution!
中文感谢你的贡献!
|
…ll rate The Dynamo-vLLM adapter fills the overall cache hit rate when vLLM prefix metrics are absent, but it wrote only the discarded flat field, so the published nested value stayed null. It also chose with `or`, which replaced a measured 0% frontend hit rate with the router gauge. Dynamo-vLLM runs without vLLM prefix-cache metrics now publish the frontend rate, including 0.0, and fall back to the router shared rate only when the frontend counters are missing. 中文:当缺少 vLLM 前缀缓存指标时,Dynamo-vLLM 适配器会补填整体缓存命中率,但它只写入了被丢弃的扁平字段,因此发布的嵌套值始终为 null。它还用 `or` 选择取值,导致实测为 0% 的前端命中率被路由器指标替换。现在,缺少 vLLM 前缀缓存指标的 Dynamo-vLLM 运行会发布前端命中率(包括 0.0),只有在前端计数器缺失时才回退到路由器共享命中率。
…mmary The workload distribution summary read every row of profile_export.jsonl, while the AgentX aggregate drops warmup rows and errored requests. A run with warmup or failed requests therefore reported a larger request count and different ISL and OSL statistics than its aggregate. The summary now uses the aggregate's loader, so only runs that contain warmup or errored rows change, and their percentile definition is unchanged. 中文:工作负载分布摘要会读取 profile_export.jsonl 中的每一行,而 AgentX 聚合结果会丢弃预热行和出错的请求。因此,包含预热或失败请求的运行所报告的请求数以及 ISL 和 OSL 统计值会与其聚合结果不一致。现在摘要改用聚合结果的加载函数,只有包含预热行或出错行的运行会发生变化,百分位数的定义保持不变。
The AgentX power window builder maps unreadable profile artifacts to `profile_artifacts_invalid`, but a top-level JSON aggregate that is not an object, or a JSONL row that is not an object, raised AttributeError instead. The `--write-multinode-window completed` command then crashed with exit 1 even when power was optional. Only those malformed artifacts change behavior, and they now return the invalid-artifacts reason like other unreadable profiles. 中文:AgentX 功耗窗口构建器会把无法读取的性能剖析产物映射为 `profile_artifacts_invalid`,但当顶层 JSON 聚合结果不是对象,或 JSONL 中某一行不是对象时,它会抛出 AttributeError。这样,即使功耗是可选项,`--write-multinode-window completed` 命令也会崩溃并以退出码 1 结束。只有这类格式错误的产物行为会改变,现在它们会像其他无法读取的剖析产物一样返回无效产物原因。
…ashing Multinode power validation catches ValueError from patching the aggregate and records `aggregate_result_unwritable` in the sidecar, but a JSON list or scalar aggregate raised TypeError or AttributeError. The traceback escaped before the validation sidecar was written, and the run failed even when power was optional. Only non-object aggregates change behavior, and they now raise ValueError, leave the file untouched and produce an invalid sidecar. The existing non-object test pinned the old TypeError and AttributeError types, so it now expects ValueError while still checking that the file is not overwritten. 中文:多节点功耗校验会捕获修补聚合结果时抛出的 ValueError,并在旁车文件中记录 `aggregate_result_unwritable`,但当聚合结果是 JSON 列表或标量时会抛出 TypeError 或 AttributeError。该回溯在写入校验旁车文件之前就已抛出,即使功耗是可选项,运行也会失败。只有非对象的聚合结果行为会改变,现在它们会抛出 ValueError,保持文件不变,并生成无效的旁车文件。原有的非对象测试固定了旧的 TypeError 和 AttributeError 类型,因此现在改为期望 ValueError,同时仍检查文件未被覆盖。
When an agentic point was rerun at a later run attempt, the earlier attempt's point file was dropped as superseded but its raw agentic_ artifact directory still downloaded. Reusable sweep validation then reported that directory as unexpected and failed. Raw directories whose point results were all superseded by a later attempt are now ignored, and every other raw directory check is unchanged. 中文:当某个 agentic 测试点在后续的 run attempt 中重跑时,较早 attempt 的结果文件会被视为已被取代而丢弃,但它的原始 agentic_ 产物目录仍会被下载。可复用 sweep 校验因此把该目录报告为意外目录并失败。现在,若某原始目录对应的测试点结果全部被后续 attempt 取代,则忽略该目录,其他原始目录的检查保持不变。
Reconciling job event records with the run's job listing parsed the event start and the job start and end timestamps again for every event and job pair. A sweep with 1500 jobs and 1500 records that lack a job id made about 3.4 million timestamp parses and now makes 6000. The matching rule is unchanged and the written records are byte-identical. 中文:在将作业事件记录与运行的作业列表进行对账时,原代码会对每一对事件与作业重复解析事件开始时间以及作业的开始和结束时间。对于包含 1500 个作业和 1500 条缺少 job id 的记录的 sweep,时间戳解析次数从约 340 万次降至 6000 次。匹配规则保持不变,写出的记录逐字节一致。
The eval collector lowercases framework and precision in aggregate rows, but the eval identity built from a raw meta_env.json kept their original case. A raw eval whose metadata said FP4 or VLLM was then reported both as missing from and unexpected in the aggregate. The identity now lowercases string framework and precision values, so only mixed-case inputs change. 中文:评测收集器会把聚合行中的 framework 和 precision 转为小写,但根据原始 meta_env.json 构建的评测标识保留了原始大小写。因此,元数据写为 FP4 或 VLLM 的原始评测会同时被报告为聚合结果中缺失和多余。现在该标识会把字符串类型的 framework 和 precision 转为小写,只有含大写字母的输入行为发生变化。
The single-node agentic identity left out spec_decoding and disagg, while the multinode identity and the fixed-sequence identity include them. Two single-node points that differ only in speculative decoding therefore collided, so a later run attempt of one dropped the other as superseded and validation could report false duplicates. Single-node agentic identities now carry both fields, which changes only points that differ in them. 中文:单节点 agentic 标识遗漏了 spec_decoding 和 disagg,而多节点标识和固定序列标识都包含这两个字段。因此,仅在推测解码上不同的两个单节点测试点会发生标识冲突,其中一个的后续 run attempt 会把另一个当作已被取代而丢弃,校验也可能报告虚假的重复项。现在单节点 agentic 标识包含这两个字段,只有在这两个字段上不同的测试点行为发生变化。
validate_scores compared each score with `val < min_score`, which is false for NaN, so a result file with a NaN score printed PASS and exited 0. Infinite and boolean values also passed. Scores that are NaN, infinite or a JSON boolean now print a FAIL line and fail the run, while finite numeric scores are thresholded as before. 中文:validate_scores 用 `val < min_score` 比较分数,而 NaN 的比较结果为假,因此分数为 NaN 的结果文件会打印 PASS 并以 0 退出。无穷大和布尔值同样会通过。现在 NaN、无穷大或 JSON 布尔值分数会打印 FAIL 行并使运行失败,有限数值分数仍按原有阈值检查。
When the thresholds file was missing, unreadable or invalid, validate_scores printed a WARN and kept going with no configured thresholds. Every task then used the 0.85 --min-score fallback instead of its stricter configured minimum, so a gsm8k score of 0.87 passed. A thresholds load failure now prints a FAIL line and exits 1. Runs with a loadable thresholds file, or with no thresholds file at all, behave as before. 中文:当阈值文件缺失、不可读或无效时,validate_scores 只打印 WARN 并在没有任何阈值配置的情况下继续执行。于是每个任务都使用 0.85 的 --min-score 兜底值,而不是更严格的配置最小值,导致 0.87 的 gsm8k 分数也能通过。现在阈值加载失败会打印 FAIL 行并以 1 退出。阈值文件可正常加载或根本不存在阈值文件的运行,行为保持不变。
…ppings A thresholds YAML with an empty `models:` or `default:` key loads that key as None, and validate_scores then crashed with a TypeError or AttributeError traceback instead of validating. An empty section is now treated as an empty mapping, so the other section still applies. A section that is neither empty nor a mapping, such as a list, is reported as a FAIL thresholds load error. 中文:阈值 YAML 中若 `models:` 或 `default:` 键为空,加载结果为 None,validate_scores 随后会抛出 TypeError 或 AttributeError 回溯而不是进行校验。现在空的配置段被视为空映射,另一个配置段仍然生效。既非空也不是映射的配置段(例如列表)会被报告为 FAIL 的阈值加载错误。
A truncated results*.json, a top-level value that is not an object, or a null "results" field made validate_scores crash with a traceback. The crash printed no FAIL line and skipped every remaining result file. Each such file now gets a FAIL line naming it, the run exits 1, and the remaining files are still thresholded. Well-formed result files are unaffected. 中文:截断的 results*.json、顶层不是对象的值,或值为 null 的 "results" 字段,都会让 validate_scores 抛出回溯而崩溃。崩溃时不会打印 FAIL 行,并跳过其余所有结果文件。现在每个此类文件都会得到一条注明文件名的 FAIL 行,运行以 1 退出,其余文件仍会进行阈值检查。格式正确的结果文件不受影响。
validate_scores counted thresholded metrics with one global counter. In a batched eval, a concurrency whose result file had no matching score metric was silently ignored as long as another file contributed one. Every result file that yields no checked metric now gets a FAIL line naming it, and the run exits 1. Runs where every file contributes at least one checked metric are unchanged. 中文:validate_scores 用一个全局计数器统计已做阈值检查的指标。在批量评测中,只要另一个文件提供了匹配指标,某个并发度的结果文件即使没有任何匹配的分数指标也会被静默忽略。现在凡是没有产生任何已检查指标的结果文件,都会得到一条注明文件名的 FAIL 行,运行以 1 退出。每个文件都至少贡献一个已检查指标的运行保持不变。
The pinned MiniMax verifier writes results.jsonl rows with ensure_ascii=False, so model text containing U+2028, U+2029 or U+0085 lands in the file unescaped. str.splitlines() treats those characters as line breaks, so a valid 102-row full run, or the one-row smoke run, was rejected as having the wrong row count. Rows are now split on "\n" only. Files without those characters produce the same rows as before. 中文:固定版本的 MiniMax 验证器以 ensure_ascii=False 写入 results.jsonl 的各行,因此包含 U+2028、U+2029 或 U+0085 的模型文本会以未转义形式写入文件。str.splitlines() 会把这些字符当作换行,导致有效的 102 行完整运行或单行冒烟运行因行数不符而被拒绝。现在只按 "\n" 拆分行。不含这些字符的文件得到的行与之前相同。
_fetch_source retried network errors, but it checked the pinned SHA256 only after leaving the retry loop. http.client returns a short body without raising when a sized read loses its connection, so a truncated download failed the run on the first attempt. The digest check now runs inside the retry loop. A mismatched download is retried like any other transient failure, and a persistent mismatch fails with the existing "after N attempts" error. 中文:_fetch_source 会对网络错误进行重试,但它只在离开重试循环之后才校验固定的 SHA256。带长度的读取在连接中断时,http.client 会返回不完整的内容而不抛异常,因此一次被截断的下载会在第一次尝试时就让运行失败。现在摘要校验在重试循环内进行。哈希不匹配的下载会像其他瞬时故障一样重试,持续不匹配则以现有的 "after N attempts" 错误失败。
The archive download loop retried HTTP and connection errors, but it compared the SHA256 only after the loop. A body that ended early without an error, which http.client allows for sized reads, failed the run on the first attempt. A chunked body that ended early raised IncompleteRead, which also skipped the retry. A digest mismatch and IncompleteRead are now retried within the existing three attempts. A mismatch on the last attempt still fails with the existing SHA256 mismatch error. 中文:归档下载循环会对 HTTP 和连接错误进行重试,但只在循环结束后才比较 SHA256。若响应体在没有报错的情况下提前结束(http.client 对带长度的读取允许这种情况),运行会在第一次尝试时就失败。提前结束的分块响应会抛出 IncompleteRead,同样跳过了重试。现在摘要不匹配和 IncompleteRead 都会在现有的三次尝试内重试。最后一次尝试仍不匹配时,依旧以现有的 SHA256 不匹配错误失败。
The archive fetcher accepts an expected SHA256 in upper or lower case, but it compared that value with the lowercase hexdigest. An uppercase pin therefore always failed as a mismatch, even for the correct archive. The expected digest is now lowercased after validation. Lowercase pins, including the current vendor pin, behave as before. 中文:归档获取脚本接受大写或小写的预期 SHA256,却把它与小写的 hexdigest 比较。因此大写的固定值即使对应正确的归档也总会被判为不匹配。现在预期摘要在校验后统一转为小写。小写固定值(包括当前的 vendor 固定值)行为不变。
load_config accepted any threshold value. A NaN minimum made `val < min_score` false for every score, so every task passed. A string minimum or an empty per-model section crashed validate_scores with a TypeError traceback. Each threshold must now be a finite number that is not a boolean, otherwise the run prints a FAIL thresholds load error and exits 1. An empty per-model section is treated as empty, so the default thresholds apply to that model. 中文:load_config 此前接受任意阈值。NaN 最小值会使 `val < min_score` 对所有分数都为假,因而所有任务都会通过。字符串最小值或空的单模型配置段会让 validate_scores 抛出 TypeError 回溯而崩溃。现在每个阈值都必须是有限且非布尔值的数字,否则运行会打印 FAIL 阈值加载错误并以 1 退出。空的单模型配置段被视为空,该模型因此使用默认阈值。
… in merge gating wait_for_checks deduplicated check runs by name only, so a failed job named like a passing job in another workflow was dropped and the merge went ahead. Check runs from GitHub Actions are now keyed on name, workflow and triggering event, matching gh pr checks, so re-runs of one workflow still supersede each other. Only commits whose check runs share a name across different workflows or events change behavior. 中文:wait_for_checks 过去只按名称对 check run 去重,因此当另一个工作流中存在同名且已通过的作业时,失败的作业会被丢弃,合并照常进行。现在来自 GitHub Actions 的 check run 按名称、工作流和触发事件区分,与 gh pr checks 一致,同一工作流的重跑仍会覆盖旧结果。只有不同工作流或事件之间存在同名 check run 的提交行为会改变。
… conflicts resolve_conflict_bytes skipped any PR entry whose content matched an entry anywhere in main, so a PR that repeats a historical entry's keys and description lost its entry or failed with "no changelog contribution remaining". It now compares PR entries only with the entries main appended after the merge base. Only PR entries that duplicate a pre-merge-base entry change behavior, and they are now kept. 中文:resolve_conflict_bytes 过去会跳过与 main 中任意条目内容相同的 PR 条目,因此当 PR 重复某个历史条目的 config-keys 和描述时,该条目会丢失,或报错 "no changelog contribution remaining"。现在只与 main 在合并基点之后追加的条目比较。只有与合并基点之前条目重复的 PR 条目行为会改变,它们现在会被保留。
APIError only recognised "(HTTP nnn)" at the very end of gh's stderr, but gh prints scope and SSO hints on the following lines, so status became None and status-based fallbacks such as the 404 handling in signoff_publish re-raised instead. The status is now taken from the end of any stderr line. Only gh failures with trailing hint lines change behavior, and their status is now set. 中文:APIError 过去只识别 gh stderr 最末尾的 "(HTTP nnn)",但 gh 会在其后的行打印权限范围或 SSO 提示,导致 status 为 None,signoff_publish 中针对 404 的回退等基于状态码的处理会直接重新抛出异常。现在从 stderr 任意一行的行尾读取状态码。只有带尾随提示行的 gh 失败行为会改变,它们的 status 现在会被正确设置。
…r checks Check polling treated every HTTP 403 as a transient rate limit, so a plain permission denial was retried until the check timeout, 900 seconds by default, instead of failing at once. A 403 is now retried only when PyGithub classifies it as a rate-limit response. Only non-rate-limit 403 errors during check polling change behavior, and they now raise immediately. 中文:检查轮询过去把所有 HTTP 403 都当作暂时性限流,因此单纯的权限拒绝会一直重试到检查超时(默认 900 秒),而不是立即失败。现在只有 PyGithub 判定为限流响应的 403 才会重试。只有检查轮询期间的非限流 403 错误行为会改变,现在会立即抛出。
…replaces Check polling ordered re-runs by started_at with a missing value sorting first, so a queued re-run that had not started yet lost to the completed run it replaced and an old failure ended the merge. Both wait_for_check and wait_for_checks now rank a run without started_at as the newest and break ties by check run id. Only checks that have a queued, unstarted re-run change behavior, and they are now awaited. 中文:检查轮询过去按 started_at 排序重跑,缺失值排在最前,因此尚未开始的排队重跑会输给它所替代的已完成运行,旧的失败结果会终止合并。现在 wait_for_check 和 wait_for_checks 都把没有 started_at 的运行视为最新,并以 check run id 作为并列时的判定依据。只有存在排队且未开始重跑的检查行为会改变,现在会等待其完成。
Every plan, generate and validation run parsed the master configs and hundreds of srt recipes with PyYAML's pure-Python loader, which was 90% of infx.matrix.plan's time. infx.yamlio parses with PyYAML's bundled libyaml loader and returns the same objects. Documents where libyaml and PyYAML disagree go to PyYAML: directives, tabs, byte order marks, line breaks other than "\n", comments glued to block scalar headers, tags, '?' inside flow plain scalars, nesting deeper than 50 collection tokens and characters PyYAML's reader refuses, as do all documents libyaml rejects, so errors and their marks are unchanged. lab/yaml_parity.py found no difference over every YAML blob in git history plus 420,525 seeded mutations, for SafeLoader and both duplicate-key loaders. INFX_PURE_YAML=1 restores the pure loader. Plan for f817514: 472.7M to about 46M bytecode instructions. 中文:plan、generate 和校验每次都用 PyYAML 的纯 Python 加载器解析主配置和数百个 srt 配方,占 infx.matrix.plan 90% 的时间。infx.yamlio 改用 PyYAML 自带的 libyaml 加载器 解析,返回相同的对象。libyaml 与 PyYAML 结果可能不同的文档(指令、制表符、字节序标记、 "\n" 以外的换行符、紧贴块标量头的注释、标签、流式普通标量中的 '?'、超过 50 层集合标记的 嵌套、PyYAML 读取器拒绝的字符)以及 libyaml 拒绝的文档都交给 PyYAML 解析,因此错误及 其位置保持不变。lab/yaml_parity.py 在 git 历史中的全部 YAML 内容和 420,525 个随机变体上, 对 SafeLoader 和两个拒绝重复键的加载器均未发现差异。设置 INFX_PURE_YAML=1 可恢复纯 Python 加载器。f817514d3 的 plan 字节码指令数从 4.727 亿降至约 4600 万。
…aset Re-running build_weka_hf_dataset in an existing --work-dir kept every session file from earlier runs in proxy/, per_trace/, per_trace_isl/ and per_trace_256k/. Those leftovers were then concatenated into traces.jsonl, counted in the stats and uploaded with the new build. Each stage now empties its own directory under the work dir before writing. Builds in a fresh work dir and runs that reuse cached stages with --skip-sample or --skip-convert are unchanged. 中文:在已有的 --work-dir 中重新运行 build_weka_hf_dataset 时,proxy/、per_trace/、per_trace_isl/ 和 per_trace_256k/ 中保留了之前运行的所有会话文件。这些残留文件随后被合并进 traces.jsonl、计入统计并随新构建一起上传。现在每个阶段在写入前会先清空它在工作目录下自己的目录。在全新工作目录中构建,以及通过 --skip-sample 或 --skip-convert 复用缓存阶段的运行,行为不变。
build_weka_hf_dataset appended --db-url to the sampler command line, and the build prints every command before running it, so the Postgres password reached stdout, CI logs and the process list. main already exports the URL as AGENTIC_PROXY_DB_URL, which the sampler reads, so the command-line copy is dropped. Only runs that pass --db-url change, and the sampler still connects to the same database. 中文:build_weka_hf_dataset 会把 --db-url 附加到采样器命令行上,而构建脚本会在运行前打印每条命令,因此 Postgres 密码会出现在标准输出、CI 日志和进程列表中。main 已经把该 URL 导出为采样器读取的 AGENTIC_PROXY_DB_URL,所以去掉了命令行中的这份副本。只有传入 --db-url 的运行受影响,采样器仍然连接同一个数据库。
build_weka_hf_dataset offered --sampling random but had no way to pass the seed that the sampler requires in that mode, so every random build exited with "--sampling random requires --seed". The build now accepts --seed and forwards it to the sampler and to the README's source command. Builds without --seed send the same sampler arguments as before. 中文:build_weka_hf_dataset 提供了 --sampling random 选项,却无法传入采样器在该模式下必需的种子,因此所有随机采样构建都会以 "--sampling random requires --seed" 退出。现在构建脚本接受 --seed,并将其转发给采样器以及 README 中的源命令。不带 --seed 的构建传给采样器的参数与之前相同。
Give every function and method in infx/workflows and infx/evals a short docstring naming its inputs, result and notable errors. Remove the remaining comments and fold the four that explained upstream behavior into the docstrings of the functions they described. Code is unchanged. 中文:为 infx/workflows 与 infx/evals 中的每个函数和方法补充简短的文档字符串, 说明其输入、返回值及重要异常。删除剩余注释,并将四处说明上游行为的注释 并入对应函数的文档字符串。代码逻辑未改变。
Delete the # comments in infx/bench and infx/bench_serving and give every function and method a short docstring that names its inputs and result. Notes a reader needs, such as TGI and MII sampling limits and the huggingface-hub pin, now live in those docstrings. SPDX license tags stay. 中文:删除 infx/bench 与 infx/bench_serving 中的 # 注释,为每个函数和方法 补充简短的文档字符串,说明输入与返回值。读者需要的信息(例如 TGI 和 MII 的采样限制、huggingface-hub 版本约束)已并入相应的文档字符串。SPDX 许可证标记保留。
Give every function and method in infx/klaud a short docstring naming its inputs, result and notable errors. Delete the # comments, folding the ones that carried needed context into the nearest docstring. Code is unchanged. 中文:为 infx/klaud 中的每个函数和方法补充简短的文档字符串,说明输入、 返回值和关键异常。删除 # 注释,必要的上下文并入最近的文档字符串。代码未变。
Use bare return in redirect handlers, contextlib.suppress for silent fallbacks, and top-level imports in merge_with_reuse. 中文:重定向处理器改用裸 return,静默回退改用 contextlib.suppress,merge_with_reuse 的导入移到文件顶部。
Drop unused parameters from private helpers and their callers, and mark the stub GithubException.headers as ClassVar. 中文:删除私有辅助函数及其调用处未使用的参数,并将桩 GithubException.headers 标注为 ClassVar。
The libyaml path needed guards and adversarial testing to match PyYAML on every input, which is a lot of code for a parser speedup. yamlio now parses with PyYAML itself and caches each text up to 128 KiB per loader, handing out deep copies. full-sweep takes 2.9 s instead of 1.9 s with libyaml (18 s uncached), plan 1.5 s instead of 0.45 s, and outputs are byte-identical. 中文:libyaml 路径需要大量守卫和对抗测试才能在所有输入上与 PyYAML 一致,为了解析加速 付出的代码量过大。yamlio 现在直接使用 PyYAML 解析,并按加载器缓存每个不超过 128 KiB 的文本,返回深拷贝。full-sweep 耗时 2.9 秒(libyaml 为 1.9 秒,无缓存为 18 秒),plan 耗时 1.5 秒(libyaml 为 0.45 秒),输出逐字节一致。
df6e692 to
f0796a5
Compare
Drop explanatory comments from GitHub Actions workflows. Keep zizmor, shellcheck and actionlint directives, action version pins and the permission comments zizmor's undocumented-permissions audit requires. 中文:删除 GitHub Actions 工作流中的说明性注释。保留 zizmor、shellcheck 和 actionlint 指令、action 版本标注,以及 zizmor undocumented-permissions 审计要求的权限注释。
profile.yml is under active development elsewhere, so this branch no longer changes it or its launch test. 中文:profile.yml 正由他人开发,本分支不再修改该文件及其启动测试。
19f1e30 to
107eeab
Compare
|
Generally most InferenceX submissions don't need to add changes to the infx package. On the off chance they do, generally the diff is small. Please prompt your agent to clean your PR to keep your diff to only necessary & minimal changes too. We have an increased code quality bar for changes to the infx package. 中文大多数 InferenceX 提交通常不需要修改 infx 包。即使确实需要,改动通常也很小。请让你的 agent 清理 PR,使改动只包含必要且最小的内容。infx 包的改动有更高的代码质量要求。 |
| page-size: 64 | ||
| enable-hierarchical-cache: true | ||
| hicache-size: 108 | ||
| hicache-size: 100 |
There was a problem hiding this comment.
🔴 These recipe edits change what AgentX points run, but no perf-changelog entry is added, so the changed points are never re-collected and published results stay stale. The DRAM edits (hicache-size 108→100, global_segment_size 119GB→105GB, TOTAL_CPU_DRAM_GB 1731→1607 and 225→241) and the removed AIPERF env keys all change what runs. AGENTS.md requires an entry for any change that alters what a benchmark runs. Fix: append one inferencex-e2e/perf-changelog.yaml block listing every affected config key, using python -m infx.matrix.changed --base origin/main to find them.
Why this was flagged
AGENTS.md says "A change that alters what any benchmark runs needs a new inferencex-e2e/perf-changelog.yaml entry covering the affected config keys; the entry triggers result collection." This PR changes runtime settings in several AgentX recipes: qwen3.5/sglang/h100-fp8/agentic.yaml:54 and qwen3.5/sglang/h100-fp8-mtp/agentic.yaml (hicache-size 108→100, TOTAL_CPU_DRAM_GB '1731'→'1607'), minimaxm3/vllm/h100-fp8-mtp/agentic.yaml (global_segment_size 119GB→105GB, TOTAL_CPU_DRAM_GB '1607'), and qwen3.8next/sglang/gb300-fp4-mtp/agentic.yaml (TOTAL_CPU_DRAM_GB '225'→'241'). It also drops AIPERF_WARMUP_REQUESTS_PER_LANE from dsv41flash/atom/mi355x-fp4-mtp/agentic.yaml and rebinds the llm-d recipes. These edits change the recipe fingerprints, so infx.matrix.changed would list the keys. But perf-changelog.yaml is not among the changed files, so no sweep is triggered for these points. The published baselines then stay on the old settings, or stay missing for recipes that could not bind before.
Verification: The trigger is merging this PR as it stands. git diff a0287f0b..HEAD --stat contains no change to inferencex-e2e/perf-changelog.yaml, but the PR does change the runtime settings of AgentX recipes that nvidia-master.yaml points at. AGENTS.md:140 requires an entry for such changes. Without a changelog entry these points are never re-collected, so published results stay stale or missing.
Resolve the perf-changelog.yaml append conflict by keeping main's entries and moving this PR's entry to the end. Picks up #4438, which fixes the single-node recipe matching that failed check-changelog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Fixes about 150 bugs across
inferencex-e2eand speeds up the matrix tooling without changing its output. Each fix is its own commit with a regression test that fails before the fix.Speed
infx.matrix.generate full-sweep: 18 s to 2.9 s. Repository YAML is parsed with PyYAML once per text and cached, and each caller gets a fresh copy. Output is byte-identical.infx.matrix.changed: old-revision generators run in forks of a preloaded process (INFX_FORK_GENERATORS=0turns it off).Fixes
--limitpicked different sessions on each run.speedbench-al.ymlwrites the real golden-curve file and can select every collector, unread env vars are removed, and the README examples run.profile.ymlis left as main has it.infx/has a docstring, comments are removed, and fewernoqasuppressions remain.Validation
AI model disclosure
Prepared with anthropic/claude-opus-5-5, including every delegated agent.
中文
修复
inferencex-e2e中约 150 个缺陷,并在不改变输出的前提下加速矩阵工具。每个修复单独提交,并附带修复前会失败的回归测试。infx.matrix.generate full-sweep从 18 秒降到 2.9 秒:仓库 YAML 由 PyYAML 解析后按文本缓存,每次返回新的副本,输出逐字节一致。旧版本生成器在预加载进程的 fork 中运行(INFX_FORK_GENERATORS=0关闭)。修复范围包括矩阵过滤与节点数、Slurm 中断与重试、退出码、请求失败统计、评测校验、基线查找、数据集日志泄露密码,以及配方 DRAM、llm-d 配方、重复配置、CI 优先级和工作流问题。
infx/中所有函数都有文档字符串,注释已移除,noqa也更少。