From 49c49b0355591ac8b7497ca0e6a04a2e925f1915 Mon Sep 17 00:00:00 2001 From: Wenyao Gao Date: Sat, 12 Sep 2026 17:08:53 -0700 Subject: [PATCH 1/4] feat: enable Kimi-K3 GB300 aggregate power MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 基于 main 独立启用 GB300 聚合部署实测功耗;仅复用已合入的共享采集代码,保留配方和端口修复。 --- ...dcp8-dspark7-maxseq2-mooncake-agentic.yaml | 17 ++++ ...gg-gb300-dcp8-nospec-mooncake-agentic.yaml | 17 ++++ perf-changelog.yaml | 20 ++++ runners/launch_gb300-nv.sh | 92 +++++++++++++------ utils/test_gb300_power_official_contract.py | 55 ++++++++--- 5 files changed, 159 insertions(+), 42 deletions(-) diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-dspark7-maxseq2-mooncake-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-dspark7-maxseq2-mooncake-agentic.yaml index dafc046abe..34943fda52 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-dspark7-maxseq2-mooncake-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-dspark7-maxseq2-mooncake-agentic.yaml @@ -114,10 +114,27 @@ srun_options: mem: "0" container-remap-root: "" +telemetry: + enabled: true + provider: dcgm-power + default_frequency: 1.0 + storage_subdir: power + required: true + startup_timeout_seconds: 120 + request_timeout_seconds: 2 + collector_join_timeout_seconds: 12 + dcgm_exporter: + container_image: dcgm-exporter + port: 19401 + benchmark: type: custom + client_placement: head + concurrencies: [1, 4] command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh env: + ENABLE_AGENTX_POWER: "1" + REQUIRE_POWER: "1" INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" RESULT_DIR: "/logs/agentic" PORT: "8000" diff --git a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-nospec-mooncake-agentic.yaml b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-nospec-mooncake-agentic.yaml index 9b61dd4922..5720019946 100644 --- a/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-nospec-mooncake-agentic.yaml +++ b/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic/agg-gb300-dcp8-nospec-mooncake-agentic.yaml @@ -115,10 +115,27 @@ srun_options: mem: "0" container-remap-root: "" +telemetry: + enabled: true + provider: dcgm-power + default_frequency: 1.0 + storage_subdir: power + required: true + startup_timeout_seconds: 120 + request_timeout_seconds: 2 + collector_join_timeout_seconds: 12 + dcgm_exporter: + container_image: dcgm-exporter + port: 19401 + benchmark: type: custom + client_placement: head + concurrencies: [48, 70] command: bash /infmax-workspace/benchmarks/multi_node/agentic_srt.sh env: + ENABLE_AGENTX_POWER: "1" + REQUIRE_POWER: "1" INFMAX_CONTAINER_WORKSPACE: "/infmax-workspace" AIPERF_TRACE_IDLE_GAP_CAP_SECONDS: "300" AIPERF_LIVE_FAILED_REQUEST_THRESHOLD: "0.25" diff --git a/perf-changelog.yaml b/perf-changelog.yaml index 75b77afe1d..30ec71d6f9 100644 --- a/perf-changelog.yaml +++ b/perf-changelog.yaml @@ -7428,3 +7428,23 @@ - "Add representative AMD coverage for fixed-sequence request diagnostics and multinode concurrency filename processing; shared processor changes also affect unlisted fixed-sequence recipes." - "增加固定序列请求诊断与多节点并发文件名处理的代表性 AMD 覆盖;共享处理器变更也影响未列出的固定序列配置。" pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3026 + +- config-keys: + - kimik3-fp4-gb300-dynamo-vllm-agentic-dspark-mooncake-dcp8-agg + - kimik3-fp4-gb300-dynamo-vllm-agentic-mooncake-dcp8-agg + scenario-type: + - agentic-coding + description: + - "Enable the two GB300 aggregate recipes and their common launcher power route, with the pinned producer, strict result collection and retained diagnostics." + - "为 GB300 Kimi-K3 聚合部署启用必需实测功耗。" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3046 + +- config-keys: + - kimik3-fp4-gb300-dynamo-vllm-agentic-dspark-mooncake-dcp8-agg + - kimik3-fp4-gb300-dynamo-vllm-agentic-mooncake-dcp8-agg + scenario-type: + - agentic-coding + description: + - "Use port 19401 for the GB300 aggregate exporter; the two-node shared lifecycle check verified ownership, all eight GPU telemetry streams, and preservation of the system service on port 9401. Full Kimi-K3 qualification remains pending." + - "GB300 聚合部署改用已验证的 19401 功耗端口;完整 Kimi-K3 基准验证仍待完成。" + pr-link: https://github.com/SemiAnalysisAI/InferenceX/pull/3046 diff --git a/runners/launch_gb300-nv.sh b/runners/launch_gb300-nv.sh index 9249e91f27..ff3a70035c 100644 --- a/runners/launch_gb300-nv.sh +++ b/runners/launch_gb300-nv.sh @@ -193,12 +193,15 @@ if [[ -n "$CONFIG_FILE" && -f "$_RECIPE_SRC" ]] && awk ' USES_DCGM_POWER=1 fi -# Note (wenyao): the producer pin follows the srt-slurm main lineage that the -# dynamo-sglang lanes run on (fp8 validated end-to-end, fp4 recipes -# parse-verified against the pin); other frameworks clone diverging refs -# (aflowers branch, sa-submission), so fail fast for them instead. -if [[ "$USES_DCGM_POWER" == "1" && "$FRAMEWORK" != "dynamo-sglang" ]]; then - echo "Error: dcgm-power lanes are only validated for FRAMEWORK=dynamo-sglang, got: $FRAMEWORK" >&2 +USES_AGENTX_POWER=0 +if [[ "$USES_DCGM_POWER" == "1" && "$IS_AGENTIC" == "1" && + "$MODEL_PREFIX" == "kimik3" && "$PRECISION" == "fp4" && + "$FRAMEWORK" == "dynamo-vllm" && + "$_RECIPE_REL" == recipes/vllm/kimi-k3/agentic/* ]]; then + USES_AGENTX_POWER=1 +fi +if [[ "$USES_DCGM_POWER" == "1" && "$FRAMEWORK" != "dynamo-sglang" && "$USES_AGENTX_POWER" != "1" ]]; then + echo "Error: dcgm-power requires dynamo-sglang or the supported Kimi-K3 AgentX route" >&2 exit 1 fi @@ -207,6 +210,7 @@ fi # srt-slurm merge lands. POWER_SRT_SLURM_URL="https://github.com/edwingao28/srt-slurm.git" POWER_SRT_SLURM_PIN="6fc1bed01a0b82dae0088a105c03ce0cfb353443" +AGENTX_POWER_SRT_SLURM_PIN="80d7203e424f903c9017de4608ee2044afce9574" if [[ "$USES_DCGM_POWER" == "1" ]]; then DCGM_EXPORTER_IMAGE="nvcr.io/nvidia/k8s/dcgm-exporter:4.6.0-4.8.3-distroless" @@ -238,7 +242,16 @@ SRT_REPO_DIR="${GITHUB_WORKSPACE}/srt-slurm-${GITHUB_RUN_ID:-manual}-${GITHUB_RU SRTCTL_SETUP_SCRIPT="" rm -rf "$SRT_REPO_DIR" -if [[ "$IS_AGENTIC" == "1" && $FRAMEWORK == "dynamo-trt" && $MODEL_PREFIX == "qwen3.5" ]]; then +if [[ "$USES_AGENTX_POWER" == "1" ]]; then + git clone "$POWER_SRT_SLURM_URL" "$SRT_REPO_DIR" || exit 1 + cd "$SRT_REPO_DIR" || exit 1 + git checkout "$AGENTX_POWER_SRT_SLURM_PIN" || exit 1 + test "$(git rev-parse HEAD)" = "$AGENTX_POWER_SRT_SLURM_PIN" || exit 1 + git rev-parse HEAD > "$GITHUB_WORKSPACE/power-producer-sha.txt" + mkdir -p recipes/vllm/kimi-k3/agentic + cp -rT "$GITHUB_WORKSPACE/benchmarks/multi_node/srt-slurm-recipes/vllm/kimi-k3/agentic" \ + recipes/vllm/kimi-k3/agentic +elif [[ "$IS_AGENTIC" == "1" && $FRAMEWORK == "dynamo-trt" && $MODEL_PREFIX == "qwen3.5" ]]; then git clone https://github.com/NVIDIA/srt-slurm.git "$SRT_REPO_DIR" cd "$SRT_REPO_DIR" git checkout v1.0.50 @@ -570,6 +583,12 @@ sed -i "s/^name:.*/name: \"${RUNNER_NAME}\"/" "$CONFIG_PATH" # verification. inject_synthetic_acceptance "$CONFIG_PATH" "$FRAMEWORK" || exit 1 +if [[ "$USES_AGENTX_POWER" == "1" ]]; then + read -r -a POWER_CONCURRENCIES <<< "$CONC_LIST" + python3 "$GITHUB_WORKSPACE/runners/inject_srt_power_concurrencies.py" \ + "$CONFIG_PATH" "${POWER_CONCURRENCIES[@]}" || exit 1 +fi + # --no-preflight skips srtctl's pre-submit model-path stat, which runs on # the GHA runner host (im-gb300-login-02, an x86 login node). It's required # whenever model.path resolves to the node-local /scratch NVMe that the login @@ -644,37 +663,49 @@ _snapshot_server_logs() { } trap _snapshot_server_logs EXIT -# Wait for log file to appear (also check job is still alive) -while ! ls "$LOG_FILE" &>/dev/null; do - if ! squeue -j "$JOB_ID" --noheader 2>/dev/null | grep -q "$JOB_ID"; then - echo "ERROR: Job $JOB_ID failed before creating log file" - scontrol show job "$JOB_ID" - exit 1 - fi - echo "Waiting for JOB_ID $JOB_ID to begin and $LOG_FILE to appear..." - sleep 5 -done - -# Poll for job completion in background -( - while squeue -j "$JOB_ID" --noheader 2>/dev/null | grep -q "$JOB_ID"; do - sleep 10 +AGENTX_POWER_RC=0 +if [[ "$USES_AGENTX_POWER" == "1" ]]; then + stream_slurm_job_log "$JOB_ID" "$LOG_FILE" || AGENTX_POWER_RC=$? +else + # Wait for log file to appear (also check job is still alive) + while ! ls "$LOG_FILE" &>/dev/null; do + if ! squeue -j "$JOB_ID" --noheader 2>/dev/null | grep -q "$JOB_ID"; then + echo "ERROR: Job $JOB_ID failed before creating log file" + scontrol show job "$JOB_ID" + exit 1 + fi + echo "Waiting for JOB_ID $JOB_ID to begin and $LOG_FILE to appear..." + sleep 5 done -) & -POLL_PID=$! -echo "Tailing LOG_FILE: $LOG_FILE" + # Poll for job completion in background + ( + while squeue -j "$JOB_ID" --noheader 2>/dev/null | grep -q "$JOB_ID"; do + sleep 10 + done + ) & + POLL_PID=$! -# Stream the log file until job completes (-F follows by name, polls instead of inotify for NFS) -tail -F -s 2 -n+1 "$LOG_FILE" --pid=$POLL_PID 2>/dev/null + echo "Tailing LOG_FILE: $LOG_FILE" -wait $POLL_PID + # Stream the log file until job completes (-F follows by name, polls instead of inotify for NFS) + tail -F -s 2 -n+1 "$LOG_FILE" --pid=$POLL_PID 2>/dev/null + + wait $POLL_PID +fi set -x echo "Job $JOB_ID completed!" echo "Collecting results..." +if [[ "$USES_AGENTX_POWER" == "1" && "${EVAL_ONLY:-false}" != "true" ]]; then + read -r -a POWER_CONCURRENCIES <<< "$CONC_LIST" + collect_agentic_power_results "$JOB_ID" "$LOGS_DIR" "$INFMAX_WORKSPACE" \ + "$GITHUB_WORKSPACE" "$RESULT_FILENAME" "$AGENTX_POWER_SRT_SLURM_PIN" \ + "${POWER_CONCURRENCIES[@]}" || AGENTX_POWER_RC=$? +fi + if [ -d "$LOGS_DIR" ]; then echo "Found logs directory: $LOGS_DIR" # Tarball + LOGS copy + power provenance markers are produced by the EXIT @@ -685,6 +716,11 @@ else echo "Warning: Logs directory not found at $LOGS_DIR" fi +if [[ "$AGENTX_POWER_RC" != "0" ]]; then + echo "ERROR: AgentX job or power validation failed; EXIT will stage audit artifacts" >&2 + exit "$AGENTX_POWER_RC" +fi + if [[ "${EVAL_ONLY:-false}" != "true" ]]; then if [ ! -d "$LOGS_DIR" ]; then exit 1 diff --git a/utils/test_gb300_power_official_contract.py b/utils/test_gb300_power_official_contract.py index 4d6e60106c..338b312536 100644 --- a/utils/test_gb300_power_official_contract.py +++ b/utils/test_gb300_power_official_contract.py @@ -18,13 +18,15 @@ PRODUCER_PIN = "a" * 40 -def _launcher_routing_source() -> str: +def _launcher_routing_source(launcher_name: str = "launch_gb300-nv.sh") -> str: """Extract the real clone-routing chain, not a copy of its implementation.""" - launcher = LAUNCHER_PATH.read_text() - route_start = launcher.index( - 'if [[ "$IS_AGENTIC" == "1" && $FRAMEWORK == "dynamo-sglang" ' - '&& $MODEL_PREFIX == "qwen3.5" ]]; then' + launcher = (REPO_ROOT / "runners" / launcher_name).read_text() + start_marker = ( + 'if [[ "$USES_AGENTX_POWER" == "1" ]]; then' + if launcher_name == "launch_gb300-nv.sh" + else 'if [[ "$IS_AGENTIC" == "1" && "$MODEL_PREFIX" == "glm5.2"' ) + route_start = launcher.index(start_marker, launcher.index('echo "Cloning srt-slurm repository..."')) route_end_marker = '\nfi\n\necho "Installing srtctl..."' route_end = launcher.index(route_end_marker, route_start) + len("\nfi") return launcher[route_start:route_end] @@ -36,15 +38,16 @@ def _write_executable(path: Path, text: str) -> None: def _run_dsv4_route( - tmp_path: Path, uses_dcgm_power: bool, *, reported_head: str = "" + tmp_path: Path, uses_dcgm_power: bool, *, reported_head: str = "", + launcher_name: str = "launch_gb300-nv.sh", model: str = "dsv4" ) -> tuple[list[str], Path, Path, Path]: """Execute only the real launcher routing region in a temporary checkout.""" workspace = tmp_path / "workspace" stub_bin = tmp_path / "bin" - source = ( - workspace - / "benchmarks/multi_node/srt-slurm-recipes/sglang/deepseek-v4/8k1k" + recipe_directory = ( + "vllm/kimi-k3/agentic" if model == "kimik3" else "sglang/deepseek-v4/8k1k" ) + source = workspace / "benchmarks/multi_node/srt-slurm-recipes" / recipe_directory source.mkdir(parents=True) (source / "overlay-marker.txt").write_text("from-workspace\n") stub_bin.mkdir() @@ -98,7 +101,7 @@ def _run_dsv4_route( """, ) - routing = _launcher_routing_source() + routing = _launcher_routing_source(launcher_name) repo_dir = workspace / "srt-slurm-route-test" harness = tmp_path / "route.sh" harness.write_text( @@ -106,14 +109,17 @@ def _run_dsv4_route( set -eo pipefail POWER_SRT_SLURM_URL={FORK_URL} POWER_SRT_SLURM_PIN={PRODUCER_PIN} -IS_AGENTIC=0 -FRAMEWORK=dynamo-sglang -MODEL_PREFIX=dsv4 +AGENTX_POWER_SRT_SLURM_PIN={PRODUCER_PIN} +USES_AGENTX_POWER={int(model == 'kimik3' and uses_dcgm_power)} +IS_AGENTIC={int(model == 'kimik3')} +FRAMEWORK={'dynamo-vllm' if model == 'kimik3' else 'dynamo-sglang'} +MODEL_PREFIX={model} PRECISION=fp4 SPEC_DECODING= USES_DCGM_POWER={int(uses_dcgm_power)} GITHUB_WORKSPACE={workspace!s} SRT_REPO_DIR={repo_dir!s} +python3() {{ :; }} {routing} """ ) @@ -123,7 +129,7 @@ def _run_dsv4_route( env["STUB_HEAD"] = reported_head subprocess.run(["/bin/bash", str(harness)], env=env, check=True) - marker = repo_dir / "recipes/sglang/deepseek-v4/8k1k/overlay-marker.txt" + marker = repo_dir / "recipes" / recipe_directory / "overlay-marker.txt" return route_log.read_text().splitlines(), workspace, repo_dir, marker @@ -259,6 +265,27 @@ def test_gb300_dsv4_recipe_images_match_their_master_configs(): assert recipe_image == config["image"], (key, config_file) +@pytest.mark.parametrize("launcher_name", ["launch_gb300-nv.sh"]) +def test_kimi_agentx_route_uses_custom_power_producer(tmp_path, launcher_name): + log, workspace, repo_dir, marker = _run_dsv4_route( + tmp_path, True, launcher_name=launcher_name, model="kimik3" + ) + assert f"git clone {FORK_URL} {repo_dir}" in log + assert f"git checkout {PRODUCER_PIN}" in log + assert (workspace / "power-producer-sha.txt").read_text() == f"{PRODUCER_PIN}\n" + assert marker.read_text() == "from-workspace\n" + + +@pytest.mark.parametrize("launcher_name", ["launch_gb300-nv.sh"]) +def test_kimi_power_route_rejects_wrong_commit(tmp_path, launcher_name): + with pytest.raises(subprocess.CalledProcessError): + _run_dsv4_route( + tmp_path, True, reported_head="b" * 40, + launcher_name=launcher_name, model="kimik3", + ) + assert not (tmp_path / "workspace/power-producer-sha.txt").exists() + + @pytest.mark.parametrize( ("job_state", "concurrencies", "expected_rc"), [("COMPLETED|0:0", [4], 0), ("FAILED|1:0", [4], 1), ("COMPLETED|0:0", [4, 8], 1)], From 319c0476550b077207727cc130a0b646c31cfe3c Mon Sep 17 00:00:00 2001 From: Wenyao Gao Date: Sat, 12 Sep 2026 17:48:52 -0700 Subject: [PATCH 2/4] test: exercise the GB300 AgentX recipe power gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 测试执行实际 recipe 遥测开关与模型、框架、精度、场景限制,避免预设功耗标志绕过生产判断。 --- utils/test_gb300_power_official_contract.py | 41 ++++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/utils/test_gb300_power_official_contract.py b/utils/test_gb300_power_official_contract.py index 338b312536..db944ef043 100644 --- a/utils/test_gb300_power_official_contract.py +++ b/utils/test_gb300_power_official_contract.py @@ -37,6 +37,13 @@ def _write_executable(path: Path, text: str) -> None: path.chmod(0o755) +def _launcher_power_gate_source(launcher_name: str) -> str: + launcher = (REPO_ROOT / "runners" / launcher_name).read_text() + start = launcher.index("USES_DCGM_POWER=0\n") + end = launcher.index("\nfi", launcher.index("Error: dcgm-power requires", start)) + return launcher[start:end + len("\nfi")] + + def _run_dsv4_route( tmp_path: Path, uses_dcgm_power: bool, *, reported_head: str = "", launcher_name: str = "launch_gb300-nv.sh", model: str = "dsv4" @@ -50,6 +57,10 @@ def _run_dsv4_route( source = workspace / "benchmarks/multi_node/srt-slurm-recipes" / recipe_directory source.mkdir(parents=True) (source / "overlay-marker.txt").write_text("from-workspace\n") + (source / "route-test.yaml").write_text( + "telemetry:\n provider: dcgm-power\n" + f" enabled: {str(uses_dcgm_power).lower()}\n" + ) stub_bin.mkdir() route_log = tmp_path / "route.log" @@ -110,16 +121,18 @@ def _run_dsv4_route( POWER_SRT_SLURM_URL={FORK_URL} POWER_SRT_SLURM_PIN={PRODUCER_PIN} AGENTX_POWER_SRT_SLURM_PIN={PRODUCER_PIN} -USES_AGENTX_POWER={int(model == 'kimik3' and uses_dcgm_power)} IS_AGENTIC={int(model == 'kimik3')} FRAMEWORK={'dynamo-vllm' if model == 'kimik3' else 'dynamo-sglang'} MODEL_PREFIX={model} PRECISION=fp4 SPEC_DECODING= USES_DCGM_POWER={int(uses_dcgm_power)} +USES_AGENTX_POWER=0 GITHUB_WORKSPACE={workspace!s} +CONFIG_FILE=recipes/{recipe_directory}/route-test.yaml:fixture-override SRT_REPO_DIR={repo_dir!s} python3() {{ :; }} +{_launcher_power_gate_source(launcher_name) if model == 'kimik3' else ''} {routing} """ ) @@ -266,7 +279,7 @@ def test_gb300_dsv4_recipe_images_match_their_master_configs(): @pytest.mark.parametrize("launcher_name", ["launch_gb300-nv.sh"]) -def test_kimi_agentx_route_uses_custom_power_producer(tmp_path, launcher_name): +def test_kimi_agentx_route_uses_recipe_power_gate(tmp_path, launcher_name): log, workspace, repo_dir, marker = _run_dsv4_route( tmp_path, True, launcher_name=launcher_name, model="kimik3" ) @@ -276,6 +289,30 @@ def test_kimi_agentx_route_uses_custom_power_producer(tmp_path, launcher_name): assert marker.read_text() == "from-workspace\n" +@pytest.mark.parametrize( + "override", + [ + {"CONFIG_FILE": "recipes/vllm/kimi-k3/8k1k/test.yaml"}, + {"MODEL_PREFIX": "other-model"}, + {"PRECISION": "fp8"}, + {"IS_AGENTIC": "0"}, + {"FRAMEWORK": "vllm"}, + ], +) +def test_kimi_power_gate_rejects_unsupported_route(tmp_path, override): + env = os.environ.copy() + env.update(GITHUB_WORKSPACE=str(tmp_path), CONFIG_FILE="recipes/vllm/kimi-k3/agentic/test.yaml", + MODEL_PREFIX="kimik3", PRECISION="fp4", IS_AGENTIC="1", FRAMEWORK="dynamo-vllm") + env.update(override) + recipe = tmp_path / "benchmarks/multi_node/srt-slurm-recipes" / env["CONFIG_FILE"].removeprefix("recipes/") + recipe.parent.mkdir(parents=True) + recipe.write_text("telemetry:\n provider: dcgm-power\n enabled: true\n") + result = subprocess.run(["/bin/bash"], input=_launcher_power_gate_source("launch_gb300-nv.sh"), + text=True, capture_output=True, env=env) + assert result.returncode == 1 + assert "dcgm-power requires" in result.stderr + + @pytest.mark.parametrize("launcher_name", ["launch_gb300-nv.sh"]) def test_kimi_power_route_rejects_wrong_commit(tmp_path, launcher_name): with pytest.raises(subprocess.CalledProcessError): From e74dcc74df0761202e1af0d3edff4363c57964e9 Mon Sep 17 00:00:00 2001 From: Wenyao Gao Date: Sun, 13 Sep 2026 02:18:48 -0700 Subject: [PATCH 3/4] chore: refresh GB300 power for qualified sweep reuse [skip-sweep] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:复用已通过完整验证的 sweep 34744429340,触发同步检查;实测代码与配方内容保持一致。 From 464cb74435644aad8ef738bc614c477e3d5c9ac0 Mon Sep 17 00:00:00 2001 From: Wenyao Gao Date: Sun, 13 Sep 2026 02:23:24 -0700 Subject: [PATCH 4/4] chore: retry GB300 power CI after CodeQL upload failure [skip-sweep] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 中文:GitHub CodeQL 上传结果发生服务端错误且拒绝手动重试;保留实测内容与已确认的 sweep 复用,仅通过同步事件重新触发 CI。