跳转至

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 相对提示词基线的收益或退化,并附上数据与输出,供他人复查。