7. 成本、排错与验收¶
这一章不需要按顺序读:开机前看 7.1 估预算;遇到报错查 7.2;全部做完对照 7.3 验收。
7.1 先测速度再估费用¶
先查看供应商的小时单价、存储收费和停止实例后的计费规则,再设定本次实验预算。下面用假设单价 0.74 美元/小时演示计算;实际价格以创建实例时的报价为准。
GPU 费用 = 小时单价 × 开机计费时长
总成本 = GPU 费用 + 存储 + 其他服务 + 数据制作/审核投入
训练时间估算 ≈ 预热后每个 optimizer step 耗时 × 预计更新步数
主线(环境安装、下载、1 Epoch 训练、合并、部署、压测)预计开机 2~3 小时;加上第 6 章的对照实验和评审,可能要 10~20 小时。按示例单价分别约 1.5~2.2 美元和 7.4~14.8 美元。实际还需计入安装、传输、闲置和存储费用。
Notebook 的 training-complete.json(CLI 的 metrics-step-N.json)记录训练耗时与峰值 allocated/reserved 显存。PyTorch 统计不覆盖其他进程和全部驱动开销,结合 nvidia-smi 与账单核对。用实测耗时更新预算。
7.2 常见问题定位表¶
| 现象 | 优先检查 | 不应采用的处理 |
|---|---|---|
| CUDA unavailable | 主机、驱动、Torch wheel、当前虚拟环境 | 在 Mac 反复重装 CUDA |
| 缺少 Python 模块 | Python 路径、激活环境、安装结果 | 在多个环境随机升级库 |
| Tokenizer 能用而模型失败 | 是否仅下载了分词器,权重是否完整 | 一律当显存不足 |
| 长度超限 | 资料、历史和目标的 Token 长度 | 静默截掉参考回答 |
| Loss 低但效果不好 | 目标泄漏、近重复、实际 adapter 加载 | 只增加 Epoch |
| Loss 不降 | mask、trainable 参数、学习率、数据 | 直接换显卡 |
| 输出思考/角色标记 | 型号、模板、训练目标、停止符 | 后端盲删特殊文本 |
| 重复/不停止 | EOS 监督、重复数据、过拟合、输出上限 | 仅过滤重复句 |
| OOM | 其他进程、长度、Batch、KV Cache、量化 | 把 RAM 当等量显存 |
| 恢复被拒绝 | 数据/代码/环境/模型是否变化 | 绕过 manifest 检查 |
| 更会编故事 | 是否把虚构写成事实、缺少诚实回应样本 | 用趣味分掩盖事实错误 |
| 合并退化 | revision、未量化基座、模板、精度 | 将 NF4/BF16 差异都归因于 LoRA |
| API 超时 | 服务健康、模型加载、上下文、并发、日志 | 无限重试 |
| API 返回 400 | 输入 + max_tokens 是否超过 --max-model-len、model 名是否与 /v1/models 一致 |
反复重试同一请求 |
| 压测时延迟飙升 | 并发是否超过 --max-num-seqs、KV Cache 是否用满(看 /metrics 和日志) |
只看平均值不看排队 |
| vLLM 启动失败 | 推理环境、驱动、模型目录、内核占用 | 覆盖训练环境依赖 |
7.3 最终学习验收¶
- 能解释本项目为什么使用 SFT+QLoRA。
- 能展示一条样本的全部上下文和实际监督目标。
- 完成 1 Epoch 训练,读懂 loss 曲线,核对完成记录,保存并重载 adapter。
- 能说出训练时显存由哪几部分组成,并和
nvidia-smi的读数对上。 - 完成第 4.6 节的小样本过拟合与断点恢复练习。
- 完成 1 Epoch 与一次 rank 对照,保存可复查清单。
- 能区分训练内表现、验证与冻结测试结果。
- 能报告收益、退化或“不确定”,说明证据限制。
- 能合并、导出、启动 vLLM,执行多轮和流式调用。
- 能估算 KV Cache 容量并和 vLLM 启动日志对照;能解释
--gpu-memory-utilization、--max-model-len、--max-num-seqs。 - 能用挂载 adapter 的方式在同一服务里对比原模型和 LoRA,说出它与合并部署的取舍。
- 跑完不同并发的压测,填好 TTFT、TPOT 和吞吐表,解释吞吐与延迟的取舍。
记录 LoRA 相对提示词基线的收益或退化,并附上数据与输出,供他人复查。