保存 scripts/eval/pi0_latency.py 生成的延迟评测结果。评测目录包含:
数据文件下载
Section titled “数据文件下载”以下文件是两次独立运行生成的原始评测数据:
profile_seed42 (总延迟)
deployment_seed42 (各层网络延迟)
.├── README.md # 本说明文档:文件结构和指标定义├── deployment_seed42 # deployment 模式、随机种子 42 的结果│ ├── pi0_latency.jsonl # 逐次试验记录,每行一个 JSON 对象│ └── pi0_latency_summary.csv # 按 token 数和启动类型聚合的统计├── profile_seed42 # profile 模式、随机种子 42 的结果│ ├── pi0_latency.jsonl # 逐次试验记录,包含阶段和 step 级耗时│ └── pi0_latency_summary.csv # profile 结果的分组统计汇总└── report # 可视化脚本生成的报告目录 ├── figures # 报告使用的 PNG 图表 │ ├── latency_overview.png # 总延迟和控制频率 │ ├── memory_usage.png # 峰值显存和 KV cache 显存 │ ├── phase_breakdown.png # 各处理阶段的延迟分解 │ └── step_latency.png # denoise step 延迟 └── pi0_latency_report.html # 汇总图表和输入目录的 HTML 报告当前目录中的 profile_seed42/ 和 deployment_seed42/ 是两次独立运行;report/ 是由可视化脚本生成的 HTML 和 PNG,不是原始评测数据。
profile:记录 prefix embedding、prefill forward 以及每个 denoise step 的耗时,定位模型内部瓶颈。deployment:测量部署调用的端到端采样耗时,不拆分 denoise step;会分别记录首个 cold start 和 warm-up 后的调用。
JSONL(逐次记录)参数
Section titled “JSONL(逐次记录)参数”文件为 UTF-8 编码,每行是一个独立 JSON 对象。字段如下(字段值为 null 表示该模式不适用、未采集或试验失败):
| 字段 | 说明 |
|---|---|
backend | 推理后端,当前为 pytorch。 |
mode | profile 或 deployment。 |
config_name | 训练/模型配置名,例如 pi0_droid。 |
checkpoint | 使用的 checkpoint 路径。 |
device | 推理设备,例如 cuda:0。 |
sample_index | 数据集样本索引。 |
prompt_target_tokens | 请求生成的目标语言 token 数;只是目标值,不一定等于实际值。 |
actual_token_count | 实际参与推理的语言 token 数;CSV 使用它分组。 |
language_token_count | 输入变换后实际使用的语言 token 数。 |
image_token_count | 图像 token 数。 |
prefix_token_count | prefix 总 token 数,等于语言 token 与图像 token 之和。 |
prompt_target_raw_token_count | 目标 prompt 在截断前的原始 token 数。 |
language_raw_token_count | 实际 prompt 在截断前的原始 token 数。 |
prompt_sha256 | prompt 的 SHA-256;默认不写入 prompt 正文,可用于关联相同 prompt。 |
prompt_truncated / truncated | 目标 prompt / 实际输入是否发生截断。 |
num_steps | denoise 步数。 |
action_horizon | 每次采样输出的动作步数。 |
chunk_size | 控制频率计算使用的动作 chunk 大小。 |
cold_start | 是否为冷启动调用。 |
preprocess_ms | 输入预处理耗时。 |
prefix_embed_ms | prefix embedding 耗时(仅 profile)。 |
prefill_forward_ms | prefill forward 耗时(仅 profile)。 |
prefill_ms | prefix_embed_ms + prefill_forward_ms(仅 profile)。 |
step_ms | 每个 denoise step 的耗时数组(仅 profile)。 |
step_mean_ms / step_p50_ms / step_p95_ms | 当前记录的 step 耗时均值、中位数、P95(仅 profile)。 |
sample_ms | 采样阶段耗时;profile 为所有 step 之和,deployment 为完整采样调用。 |
sample_ms_from_mean | num_steps * step_mean_ms,用于核对 step 汇总(仅 profile)。 |
output_transfer_ms | 输出动作从设备传回 CPU 的耗时。 |
total_ms | 从试验开始到输出传输完成的端到端耗时。 |
control_frequency_hz | 控制频率,计算为 chunk_size / (total_ms / 1000),单位 Hz。 |
prefill_share / sample_share / other_share | 对 total_ms 的耗时占比,范围通常为 0 到 1。other_share 是未归入已列阶段的剩余占比。 |
kv_cache_theoretical_bytes | KV cache 张量理论占用,单位字节(仅 profile)。 |
kv_cache_allocated_delta_bytes | KV cache 测量期间 CUDA allocated 的增量,单位字节(仅 profile)。 |
peak_allocated_bytes / peak_reserved_bytes | 试验期间 CUDA 峰值 allocated/reserved 显存,单位字节;非 CUDA 设备为 0。 |
actions_shape | 输出动作张量形状,例如 [1, 10, 32]。 |
oom | 是否因 out-of-memory 失败。 |
error | 其他异常的类型和消息;成功时为 null。 |
失败记录仍会写入 JSONL。OOM 时部分耗时字段可能为空,但 oom=true、错误信息和已测得的峰值显存仍会保留。
CSV(分组汇总)参数
Section titled “CSV(分组汇总)参数”pi0_latency_summary.csv 每行对应一个分组:
(mode, actual_token_count, cold_start)基础字段:
| 字段 | 说明 |
|---|---|
mode | 评测模式。 |
actual_token_count | 分组使用的实际语言 token 数。 |
cold_start | 分组是否为冷启动。 |
n | 分组内全部记录数,包含 OOM。 |
oom_rate | oom=true 的记录数 / n。 |
ten_hz_rate / twenty_hz_rate | 成功记录中 control_frequency_hz >= 10 / >= 20 的比例;OOM 不计入分母。 |
其余列采用统一命名:<指标>_<统计量>。统计量为:
mean:算术平均值;median:P50,中位数;p95:95 分位数;min/max:最小值 / 最大值。
这些统计量只对非 OOM 成功记录计算。可出现的指标基名包括:
total_ms, preprocess_ms, prefix_embed_ms, prefill_forward_ms, prefill_ms,sample_ms, sample_ms_from_mean, output_transfer_ms, control_frequency_hz,prefill_share, sample_share, other_share,step_mean_ms, step_p50_ms, step_p95_ms, step_ms,kv_cache_theoretical_bytes, kv_cache_allocated_delta_bytes,peak_allocated_bytes, peak_reserved_bytes例如,total_ms_median 是该分组成功记录的端到端延迟中位数,peak_allocated_bytes_p95 是峰值 allocated 显存的 P95。step_ms_* 与其他指标不同:它会把分组内所有记录的 step_ms 数组展平后再统计,而不是先对每条记录求平均。