UCM Trace 模式¶
UCM Trace 模式是一种轻量级的诊断和评估模式,在推理过程中记录每个请求的跟踪信息,不执行任何实际的 KV cache dump/load 操作。Trace 模式允许您收集真实的请求流量数据,并在提交完整的 UCM 存储部署之前模拟 UCM 可以提供的理论 KV cache 命中率。
建议首先使用 Trace 模式收集命中率统计信息,并与相关项目成员确认是否采用 UCM。
概述¶
通过在 UCM 配置文件中将两个选项设置为 true 来启用 Trace 模式:
| 选项 | 默认值 | 描述 |
|---|---|---|
enable_record_traces |
false |
记录每个请求的跟踪(timestamp, input_length, output_length, hash_ids)。每个 hash_id 占用 32 字节。 |
use_lite |
false |
切换到 UCM Lite Connector,它与 Fake Store 一起工作,跳过所有实际的 KV dump/load 操作。 |
当两者都启用时,UCMConnector 内部实例化 UCMLiteConnector 而不是常规的存储后端 connector。Lite connector:
- 计算真实 UCM 部署将使用的相同块哈希 ID。
- 在首次查找时为每个请求记录跟踪记录。
- 返回
0外部命中令牌(没有真实的 store 可以查找),因此推理正确性不受影响,不持久化 KV 数据。 - 将所有 KV 传输钩子(
start_load_kv、save_kv_layer、wait_for_save等)实现为空操作。
记录的跟踪格式¶
每个请求在首次查找时产生两条日志行:
[UC][I] timestamp: 1234567.890123, request_id: req-42, input_length: 8192, output_length: 128, ucm_block_ids: ['a1b2...', 'c3d4...', ...]
[UC][I] request_id: req-42, hash_time_ms: 0.512, print_time_ms: 0.034
| 字段 | 描述 |
|---|---|
timestamp |
查找时的 time.perf_counter() 值,用于在分析期间保持请求顺序。 |
request_id |
vLLM 请求标识符(存在于 Lite connector 跟踪中)。 |
input_length |
请求中的输入令牌数(request.num_tokens)。 |
output_length |
请求的最大输出令牌数(request.max_tokens)。 |
ucm_block_ids |
十六进制编码的块哈希 ID 列表。每个块对应 block_size 个令牌;每个哈希为 32 字节。 |
配置¶
您可以从 unified-cache-management/examples/ucm_config_example.yaml 的示例文件开始
通过将两个选项设置为 true 来启用 Trace 模式:
enable_record_traces: true
use_lite: true
日志配置(可选)¶
跟踪行可能很大,因为每个 hash_id 为 32 字节,长请求可能包含许多块 ID。在启动服务之前调整以下环境变量:
| 环境变量 | 默认值 | 描述 |
|---|---|---|
UCM_LOG_PATH |
log |
每进程日志文件的目录(例如 ucm-<pid>.log)。 |
UCM_LOG_MAX_FILES |
10 |
每进程保留的轮转日志文件的最大数量。 |
UCM_LOG_MAX_SIZE |
5 |
轮转前每个日志文件的最大大小(MiB)。为长请求记录跟踪时显著增加此值。 |
UCM_LOG_LEVEL |
info |
日志级别。跟踪在 INFO 级别发出,因此保持为 info(或更低以获得额外的调试输出)。 |
跟踪收集运行的示例:
export UCM_LOG_PATH=/workspace/ucm-trace-logs
export UCM_LOG_MAX_SIZE=256 # 每文件 256 MiB
export UCM_LOG_MAX_FILES=50 # 每进程保留最多 50 个轮转文件
export UCM_LOG_LEVEL=info
启动推理服务¶
Trace 模式作为 OpenAI 兼容的 vLLM 服务器部署。以与正常 UCM 部署相同的方式启动它——唯一的区别是 UCM 配置文件内容。
以 Qwen/Qwen2.5-14B-Instruct 模型为例:
export ENABLE_UCM_PATCH=1
vllm serve Qwen/Qwen2.5-14B-Instruct \
--max-model-len 32000 \
--tensor-parallel-size 2 \
--gpu_memory_utilization 0.87 \
--block_size 128 \
--trust-remote-code \
--port 7800 \
--enforce-eager \
--no-enable-prefix-caching \
--kv-transfer-config \
'{
"kv_connector": "UCMConnector",
"kv_role": "kv_both",
"kv_connector_module_path": "ucm.integration.vllm.ucm_connector",
"kv_connector_extra_config": {"UCM_CONFIG_FILE": "/workspace/unified-cache-management/examples/ucm_config_example.yaml"}
}'
将 UCM_CONFIG_FILE 路径替换为您机器上跟踪模式配置文件的实际路径。
服务启动时,以下日志确认 Lite connector 处于活动状态:
[UC][I] Init UCMLiteConnector.
您现在可以向服务器发送生产等效的流量。每个请求将在 UCM 日志目录中生成一条跟踪记录。不会转储或加载 KV cache。
跟踪分析¶
收集跟踪后,运行 benchmarks/auto_trace_analysis.py 以模拟理论 KV cache 命中率。脚本解析跟踪行加上 vLLM/UCM 在启动时发出的 available kv cache memory(或 current kv cache memory)和 tensor_parallel_size 值,然后模拟 LRU 多级缓存(HBM → DRAM → FS)以估计 UCM 将实现的命中率。
python benchmarks/auto_trace_analysis.py \
--service-url <ip:port of vllm service> \
--log-dir <path to log folder> \
--block-kv-cache-size <bytes_per_block> \
--is-mla <true|false> \
--dram-pool-size-gb <dram_gb> \
--fs-pool-size-gb <fs_gb>
必需参数¶
| 参数 | 描述 |
|---|---|
--service-url |
vLLM /metrics 端点(Prometheus)。设置后,工具获取服务的实际前缀缓存命中率以进行比较。 |
--log-dir |
包含 UCM 日志文件的目录(递归扫描 *.log、*.log.*、*.log.gz)。必须包括 vLLM 的启动日志,以便可以解析可用的 KV cache 内存和张量并行大小。 |
--block-kv-cache-size |
单个 KV cache 块的字节大小。使用 KV Cache 大小计算器确定模型的此值。 |
--is-mla |
模型是否使用多潜在注意力(true/false)。 |
--dram-pool-size-gb |
模拟的 DRAM(主机内存)池大小(GiB)。 |
--fs-pool-size-gb |
模拟的文件系统(SSD/NFS)池大小(GiB)。 |
分析报告¶
分析生成包括以下内容的综合报告:
- 总请求计数和令牌计数:工作负载摘要
- 命中率场景:理论最大值、仅 HBM、HBM+DRAM 和 HBM+DRAM+FS 命中率
- 请求生命周期:请求的块保持可重用的时间长度(平均值、P90、P95)
这些指标帮助您评估 UCM 是否适合您的工作负载,以及为每个存储层分配多少容量。
有关完整的文档,请参阅原始 UCM 文档中的详细 Trace 模式指南。