Skip to content

保存 scripts/eval/pi0_latency.py 生成的延迟评测结果。评测目录包含:

以下文件是两次独立运行生成的原始评测数据:

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 后的调用。

文件为 UTF-8 编码,每行是一个独立 JSON 对象。字段如下(字段值为 null 表示该模式不适用、未采集或试验失败):

字段说明
backend推理后端,当前为 pytorch。
modeprofile 或 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_countprefix 总 token 数,等于语言 token 与图像 token 之和。
prompt_target_raw_token_count目标 prompt 在截断前的原始 token 数。
language_raw_token_count实际 prompt 在截断前的原始 token 数。
prompt_sha256prompt 的 SHA-256;默认不写入 prompt 正文,可用于关联相同 prompt。
prompt_truncated / truncated目标 prompt / 实际输入是否发生截断。
num_stepsdenoise 步数。
action_horizon每次采样输出的动作步数。
chunk_size控制频率计算使用的动作 chunk 大小。
cold_start是否为冷启动调用。
preprocess_ms输入预处理耗时。
prefix_embed_msprefix embedding 耗时(仅 profile)。
prefill_forward_msprefill forward 耗时(仅 profile)。
prefill_msprefix_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_meannum_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_bytesKV cache 张量理论占用,单位字节(仅 profile)。
kv_cache_allocated_delta_bytesKV 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、错误信息和已测得的峰值显存仍会保留。

pi0_latency_summary.csv 每行对应一个分组:

(mode, actual_token_count, cold_start)

基础字段:

字段说明
mode评测模式。
actual_token_count分组使用的实际语言 token 数。
cold_start分组是否为冷启动。
n分组内全部记录数,包含 OOM。
oom_rateoom=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 数组展平后再统计,而不是先对每条记录求平均。