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); }