# CTranslate2 vs HF Baseline

对比对象：
- 基线：[`translation_local_models_extended_221846.json`](/data/saas-search/perf_reports/20260318/translation_local_models/translation_local_models_extended_221846.json)
- CT2：[`translation_local_models_ct2_extended_233253.json`](/data/saas-search/perf_reports/20260318/translation_local_models_ct2/translation_local_models_ct2_extended_233253.json)

结论：
- **本轮 CT2 优化达到预期。**
- 在线翻译的核心指标已经是“明显提升”，不是边际改善。
- 因此本轮不再继续做第二轮运行时调优，而是先把这组结果沉淀为新的性能基线。

## Online Metrics

关注口径：
- `concurrency_sweep`
- `batch_size=1`
- 重点看 `c=1 items/s`、`c=1 p95 ms`
- 辅助看 `c=8 p95 ms`、`c=64 p95 ms`

| Model | Direction | c=1 items/s Baseline | c=1 items/s CT2 | Gain | c=1 p95 Baseline ms | c=1 p95 CT2 ms | Reduction |
|---|---|---:|---:|---:|---:|---:|---:|
| `nllb-200-distilled-600m` | `zh -> en` | `4.17` | `8.97` | `+115.11%` | `373.27` | `163.53` | `-56.19%` |
| `nllb-200-distilled-600m` | `en -> zh` | `2.16` | `5.83` | `+169.91%` | `670.78` | `259.52` | `-61.31%` |
| `opus-mt-zh-en` | `zh -> en` | `9.21` | `27.85` | `+202.39%` | `179.12` | `60.61` | `-66.16%` |
| `opus-mt-en-zh` | `en -> zh` | `3.6` | `11.02` | `+206.11%` | `1180.37` | `351.74` | `-70.20%` |

解读：
- 4 个方向的单条请求吞吐都至少翻倍。
- 4 个方向的 `p95` 都下降了 `56%-70%`。
- 从在线 query 的角度，这已经足够认定为“显著增强”。

## Tail Latency

| Model | Direction | c=8 p95 Baseline ms | c=8 p95 CT2 ms | Reduction | c=64 p95 Baseline ms | c=64 p95 CT2 ms | Reduction |
|---|---|---:|---:|---:|---:|---:|---:|
| `nllb-200-distilled-600m` | `zh -> en` | `2383.8` | `1039.32` | `-56.40%` | `7337.3` | `3031.64` | `-58.68%` |
| `nllb-200-distilled-600m` | `en -> zh` | `3971.01` | `2193.01` | `-44.77%` | `14139.03` | `5611.21` | `-60.31%` |
| `opus-mt-zh-en` | `zh -> en` | `1043.06` | `390.32` | `-62.58%` | `3381.58` | `1061.35` | `-68.61%` |
| `opus-mt-en-zh` | `en -> zh` | `3632.99` | `863.08` | `-76.24%` | `7950.41` | `2459.49` | `-69.06%` |

解读：
- CT2 不只是提升了低并发平均速度，也明显压低了高并发 tail latency。
- `nllb en->zh` 仍然是四个方向里最重的，但已经从“非常重”变成“可接受得多”。

## Bulk Metrics

对 bulk 口径，优先看 `batch_sweep` 的 `batch_size=16`，因为它更接近实际服务里兼顾吞吐和延迟的默认配置。

| Model | Direction | Batch16 items/s Baseline | Batch16 items/s CT2 | Gain | Batch16 p95 Baseline ms | Batch16 p95 CT2 ms | Reduction |
|---|---|---:|---:|---:|---:|---:|---:|
| `nllb-200-distilled-600m` | `zh -> en` | `27.28` | `55.68` | `+104.11%` | `769.18` | `371.36` | `-51.72%` |
| `nllb-200-distilled-600m` | `en -> zh` | `13.52` | `42.42` | `+213.76%` | `1649.65` | `408.81` | `-75.22%` |
| `opus-mt-zh-en` | `zh -> en` | `41.44` | `111.61` | `+169.33%` | `797.93` | `257.18` | `-67.77%` |
| `opus-mt-en-zh` | `en -> zh` | `24.33` | `102.05` | `+319.44%` | `2098.54` | `396.16` | `-81.12%` |

解读：
- `nllb-200-distilled-600m` 是这次最值得的优化对象，尤其 `en -> zh` 收益非常大。
- `opus-mt-en-zh` 的提升更夸张，说明之前它在 HF 路径上有很重的运行时损耗。

## Best Throughput Cases

| Model | Direction | Baseline Best Matrix | Baseline Items/s | CT2 Best Matrix | CT2 Items/s |
|---|---|---|---:|---|---:|
| `nllb-200-distilled-600m` | `zh -> en` | `batch=64, concurrency=2` | `53.95` | `batch=64, concurrency=2` | `114.37` |
| `nllb-200-distilled-600m` | `en -> zh` | `batch=64, concurrency=1` | `34.97` | `batch=64, concurrency=2` | `95.59` |
| `opus-mt-zh-en` | `zh -> en` | `batch=64, concurrency=1` | `52.44` | `batch=64, concurrency=2` | `207.86` |
| `opus-mt-en-zh` | `en -> zh` | `batch=64, concurrency=1` | `34.94` | `batch=64, concurrency=2` | `140.91` |

解读：
- CT2 版本在矩阵里的最优吞吐普遍提升到了原来的 `2.1x-4.0x`。
- 而且最佳点不再总是“单并发 + 大 batch”，`concurrency=2` 开始变得更有意义。

## Why We Stop Here

本轮没有继续做第二轮优化，原因很直接：

- 目标是“在线性能显著增强”，这个目标已经达成。
- 关键在线指标已经不是小幅改进，而是普遍 `2x+` 吞吐和 `50%+` `p95` 降幅。
- 当前更合理的下一步是把 CT2 结果作为新的基线，再决定是否需要做更细的服务化优化。

## Remaining Gaps

- 质量仍需和业务样本集一起看，尤其 `opus-mt-en-zh` 的少量短句结果可能需要质量侧复核。
- 当前脚本的 `peak_gpu_memory_gb` 对 CT2 无效，因为它只读取 `torch.cuda` 统计，不覆盖 CT2 的原生 CUDA 分配。
- 如果下一轮目标从“显著提速”转到“进一步压 tail latency”，优先方向会是：
  - 增加服务级微批处理队列
  - 拆分短文本 / 长文本请求桶
  - 评估 `ct2_inter_threads` 与 `max_queued_batches`
  - 对 `opus-mt-en-zh` 和 `nllb en->zh` 做更细粒度 batch 默认值调参
