背景痛点:语音合成在微服务里的“三座大山”
去年我把 ChatTTS 塞进公司的客服中台,原本只想给机器人加个“嘴”,结果一路踩坑:
- 依赖冲突:PyTorch 1.13 与系统自带 FFmpeg 4.2 符号撞车,容器一启动就
segfault。 - GPU 内存泄漏:自回归采样每次都会缓存 encoder 状态,长文本合成后显存不释放,NVIDIA-SMI 里 3090 的 24 G 被吃掉 18 G。
- 冷启动延迟:模型权重 1.1 GB,Pod 刚拉起第一次推理要 9 s,K8s 探针直接判定
unhealthy,重启循环。
这些问题在微服务架构里被无限放大:横向扩容时每个新实例都要重复加载权重,峰值并发一来,集群秒变“显存收割机”。
技术选型:PyTorch vs TensorFlow 推理横评
我把两套后端都跑了一遍,控制变量:同一台 3080Ti、CUDA 11.8、文本长度 120 中文字、采样步长 1200。结果如下:
| 方案 | 平均延迟 (ms) | 吞吐量 (句/秒) | RTF | 显存峰值 |
|---|---|---|---|---|
| PyTorch 2.0 + JIT | 210 | 4.6 | 0.19 | 3.7 GB |
| TF 2.12 SavedModel | 245 | 4.1 | 0.22 | 3.2 GB |
| TF + XLA | 198 | 5.2 | 0.17 | 3.4 GB |
结论:
- PyTorch 生态好、社区脚本多,适合快速迭代;
- TensorFlow+XLA 在吞吐量上反超 13%,但导出 SavedModel 需要改模型源码,ROI 一般;
- 最终我选了 PyTorch,因为 ChatTTS 官方只给
.pt权重,转 TF 要重写声学模型头,时间成本划不来。
核心实现一:Docker 封装整合包
整合包思路:把“模型权重 + 依赖 + 中文前端”一次性打进去,现场docker run就能推理。Dockerfile 如下,关键步骤都写了注释,拿去改版本号就能用。
