事情本身不复杂,线索都在日志里。用 TensorRT-LLM 0.14 在 24GB 卡上转换 Qwen2.5-14B 的 fp16 engine,跑到权重转换阶段被 kill,日志最后一行是 std::bad_alloc,机器内存 32GB。

第一反应是「swap 关闭 内存没有缓冲」,验证下来不成立。

这类报错背后常见的原因有几处,逐个排除就行。转换阶段同时驻留原始权重和中间张量。也可能是用单卡构建 没有做分片。

不容易想到的是,并行构建的进程数大于 1。

动手时先把权重转成 fp16 再构建

python convert_checkpoint.py --model_dir Qwen2.5-14B --output_dir ckpt --dtype float16

限制构建时的并行度

trtllm-build --checkpoint_dir ckpt --output_dir engine --gemm_plugin float16 --workers 1

随后换 bf16 降低峰值内存

python convert_checkpoint.py --model_dir Qwen2.5-14B --output_dir ckpt_bf16 --dtype bfloat16

构建后核对体积与显存峰值

ls -lh engine/; nvidia-smi --query-gpu=memory.used --format=csv

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

改完先别撤,确认这几项。engine 构建完成,加载后能推理,构建过程没有出现 bad_alloc,内存留有余量。

提醒一点。主机内存和显存是两笔账,转换阶段吃的是内存,只盯着显卡容量会误判。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189