微调成本与收益分析
微调不是免费的——GPU 租赁、数据准备、迭代调优都需要投入。本章帮你量化成本,做出理性决策。
成本结构
graph TB
A[微调总成本] --> B[数据成本]
A --> C[计算成本]
A --> D[人力成本]
A --> E[持续维护]
B --> B1[数据收集
标注/清洗] C --> C1[GPU 租赁
训练时长] D --> D1[ML 工程师
迭代调优] E --> E1[版本管理
持续训练] style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style C fill:#fff3e0,stroke:#f57c00,stroke-width:2px
标注/清洗] C --> C1[GPU 租赁
训练时长] D --> D1[ML 工程师
迭代调优] E --> E1[版本管理
持续训练] style A fill:#e3f2fd,stroke:#1976d2,stroke-width:3px style C fill:#fff3e0,stroke:#f57c00,stroke-width:2px
GPU 训练成本参考
| 模型规模 | GPU 配置 | LoRA 训练时长 | 全量训练时长 | 预估费用 |
|---|---|---|---|---|
| 7B | 1× A100 80G | 2-4 小时 | 8-24 小时 | $10-50 |
| 13B | 2× A100 80G | 4-8 小时 | 24-72 小时 | $50-200 |
| 34B | 4× A100 80G | 8-16 小时 | 3-7 天 | $200-800 |
| 70B | 8× A100 80G | 16-48 小时 | 1-3 周 | $500-3000 |
基于 1000 条训练样本,3 个 epoch。实际因数据量和超参数而异。
ROI 计算器
"""
微调 ROI 计算器
"""
from dataclasses import dataclass
@dataclass
class FinetuningCost:
"""微调成本模型"""
data_preparation_hours: float # 数据准备人时
hourly_rate_usd: float = 50.0 # 人力时薪
gpu_cost_per_hour: float = 3.0 # GPU 单价
training_hours: float = 8.0 # 训练时长
num_iterations: int = 3 # 迭代次数
@property
def total_data_cost(self) -> float:
return self.data_preparation_hours * self.hourly_rate_usd
@property
def total_compute_cost(self) -> float:
return self.gpu_cost_per_hour * self.training_hours * self.num_iterations
@property
def total_cost(self) -> float:
return self.total_data_cost + self.total_compute_cost
@dataclass
class InferenceSavings:
"""推理节省模型"""
daily_requests: int
current_cost_per_request: float # 使用大模型
finetuned_cost_per_request: float # 使用微调小模型
@property
def daily_savings(self) -> float:
return self.daily_requests * (
self.current_cost_per_request - self.finetuned_cost_per_request
)
@property
def monthly_savings(self) -> float:
return self.daily_savings * 30
def calculate_roi(cost: FinetuningCost, savings: InferenceSavings) -> dict:
"""计算微调 ROI"""
total_investment = cost.total_cost
monthly_savings = savings.monthly_savings
payback_months = (
total_investment / monthly_savings if monthly_savings > 0 else float("inf")
)
annual_roi = (
(monthly_savings * 12 - total_investment) / total_investment * 100
)
return {
"total_investment_usd": round(total_investment, 2),
"monthly_savings_usd": round(monthly_savings, 2),
"payback_months": round(payback_months, 1),
"annual_roi_pct": round(annual_roi, 1),
"recommendation": (
"强烈推荐" if payback_months < 2
else "推荐" if payback_months < 6
else "需谨慎评估" if payback_months < 12
else "不建议"
),
}
# 示例:客服场景
cost = FinetuningCost(
data_preparation_hours=40,
training_hours=4,
num_iterations=3,
gpu_cost_per_hour=3.0,
)
savings = InferenceSavings(
daily_requests=10000,
current_cost_per_request=0.01, # GPT-4
finetuned_cost_per_request=0.001, # 微调 7B 模型
)
roi = calculate_roi(cost, savings)
# {'total_investment_usd': 2036.0, 'monthly_savings_usd': 2700.0,
# 'payback_months': 0.8, 'annual_roi_pct': 1492.4, 'recommendation': '强烈推荐'}
决策矩阵
graph LR
A{日请求量?} -->|< 100| B[不微调
用 Prompt 工程] A -->|100-1000| C{质量要求?} A -->|> 1000| D[强烈推荐微调] C -->|一般| B C -->|高| E[LoRA 微调] style D fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style B fill:#fff3e0,stroke:#f57c00,stroke-width:2px
用 Prompt 工程] A -->|100-1000| C{质量要求?} A -->|> 1000| D[强烈推荐微调] C -->|一般| B C -->|高| E[LoRA 微调] style D fill:#e8f5e9,stroke:#388e3c,stroke-width:2px style B fill:#fff3e0,stroke:#f57c00,stroke-width:2px
本章小结
| 要点 | 说明 |
|---|---|
| 最大成本项 | 数据准备(人力)往往超过 GPU 费用 |
| LoRA 性价比 | 7B 模型 LoRA 微调 < $50,全量 < $200 |
| ROI 阈值 | 日请求量 > 1000 时微调几乎必赚 |
| 隐性成本 | 持续迭代、版本管理、回归测试 |
下一章:数据收集与格式化