From db4387d06a541a926d64b79d061020a73ea6bb30 Mon Sep 17 00:00:00 2001 From: Myoungho Shin Date: Mon, 26 Oct 2026 19:38:09 -0700 Subject: [PATCH] Let launcher-started agents upload the serving channel The Python serving writer records LLM-serving data in its own session directories, in a channel named serving. The agent's own default now tails it, but gpufl trace --upload and gpufl upload always pass the agent an explicit list of four channels, so those sessions were never uploaded by an agent the launcher started. Add serving to both lists. A channel with no windows is a no-op for the agent. --- CHANGELOG.md | 5 +++++ daemon/launcher/cli_parse.hpp | 2 +- daemon/launcher/cli_trace_options.cpp | 2 +- daemon/launcher/upload_command.cpp | 2 +- tests/launcher/test_cli_parse.cpp | 2 +- 5 files changed, 9 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f87f367..ff46d08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -172,6 +172,11 @@ types are additive. ### Changed +- **The agent that `gpufl trace --upload` and `gpufl upload` start also tails + the `serving` channel** (default log types `device,scope,system,sass,serving`). + It carries the records the Python serving writer emits into its own session + directories; without it those sessions were never uploaded by a + launcher-started agent. A channel with no windows is a no-op. - **`--passes` and `--deep-*` are separate execution modes and cannot be combined.** The reason is a hardware constraint rather than a style choice: `cuptiProfilerInitialize` has to run before any CUDA context exists, so the diff --git a/daemon/launcher/cli_parse.hpp b/daemon/launcher/cli_parse.hpp index 0cd86b2..dce7b82 100644 --- a/daemon/launcher/cli_parse.hpp +++ b/daemon/launcher/cli_parse.hpp @@ -32,7 +32,7 @@ struct TraceArgs { std::string api_version = "v1"; // --api-version std::string agent_jar; // --agent-jar; else GPUFL_AGENT_JAR std::string agent_cursor; // --agent-cursor; default /cursor.json - std::string log_types = "device,scope,system,sass"; // --log-types (sass carries cubin disassembly + source artifacts) + std::string log_types = "device,scope,system,sass,serving"; // --log-types (sass carries cubin disassembly + source artifacts; serving the LLM-serving records) int agent_drain_ms = 60000; // --agent-drain-ms: cap on waiting for the agent to finish uploading // Bounded window profiling (`gpufl trace` only): bound a capture of a // long-running target that never exits on its own. warmup defers the diff --git a/daemon/launcher/cli_trace_options.cpp b/daemon/launcher/cli_trace_options.cpp index 86933a1..a3206c8 100644 --- a/daemon/launcher/cli_trace_options.cpp +++ b/daemon/launcher/cli_trace_options.cpp @@ -516,7 +516,7 @@ const CliOptionManager& traceOptions() { kSection(TraceHelpSection::Runtime), &parseNonEmptyStringOption<&TraceArgs::agent_cursor>) .add({"--log-types"}, "", - "Agent channels to upload (default: device,scope,system,sass)", + "Agent channels to upload (default: device,scope,system,sass,serving)", kSection(TraceHelpSection::Runtime), &parseNonEmptyStringOption<&TraceArgs::log_types>) .add({"--agent-drain-ms"}, "", diff --git a/daemon/launcher/upload_command.cpp b/daemon/launcher/upload_command.cpp index c507571..c2b2868 100644 --- a/daemon/launcher/upload_command.cpp +++ b/daemon/launcher/upload_command.cpp @@ -91,7 +91,7 @@ int runUpload(const UploadArgs& args) { AgentOptions agent_opts; agent_opts.source_folders = args.log_path; - agent_opts.log_types = "device,scope,system,sass"; + agent_opts.log_types = "device,scope,system,sass,serving"; agent_opts.backend_url = backend_url; agent_opts.api_key = api_key; agent_opts.api_version = apiVersionFrom(resolve(args.api_path, gpufl::env::kApiPath)); diff --git a/tests/launcher/test_cli_parse.cpp b/tests/launcher/test_cli_parse.cpp index 1bbc544..c09a83a 100644 --- a/tests/launcher/test_cli_parse.cpp +++ b/tests/launcher/test_cli_parse.cpp @@ -398,7 +398,7 @@ TEST(CliParseTrace, UploadFlag) { ASSERT_TRUE(r.args.has_value()) << r.error; EXPECT_TRUE(r.args->upload); EXPECT_EQ(r.args->api_version, "v1"); - EXPECT_EQ(r.args->log_types, "device,scope,system,sass"); + EXPECT_EQ(r.args->log_types, "device,scope,system,sass,serving"); EXPECT_EQ(r.args->agent_drain_ms, 60000); }