LLM 生成成本精细化核算:从 Token 通量到 GPU 卡时分摊模型
在企业引入大模型技术栈的初期,管理层往往只关注“模型效果好不好”、“能不能生成可用的业务结果”。然而当多个业务线(如智能客服、内部知识库、营销文案生成、代码助手)纷纷接入统一的大模型算力平台后,月末高昂的 GPU 云服务器账单与算力采购发票,立刻让财务与运维负责人面临巨大的核算挑战。
传统的微服务架构中,成本分摊主要按 CPU 核心数与内存容量进行粗粒度切分。但在大模型基础设施中:
- 业务 A 发送了 10 万次请求,每次都是 50 Token 的简单打招呼;
- 业务 B 只发送了 1 万次请求,但每次都上传了 2 万 Token 的长 PDF 文档并要求深度解析;
- 如果简单按照“请求调用次数”平摊算力账单,业务 A 会承担极不公平的冤枉钱。
要建立一套让各业务方心服口服、且能驱动业务主动进行 Prompt 优化的大模型成本分摊与账本计量体系,我们必须深入底层,打通从“输入/输出 Token 通量”到“物理 GPU 卡时(GPU Card Hours)”的精确换算模型。
flowchart TD ReqA[业务部门 A: 短文本高频] --> APIGateway[API 计费网关: 记录 Token 账本] ReqB[业务部门 B: 长文档低频] --> APIGateway APIGateway --> Prometheus[Prometheus 统计: Input/Output Tokens] subgraph Cost_Model[单位算力换算与成本分摊引擎] Prometheus --> PrefillCost[Prefill 阶段: 权重系数 α = 1.0] Prometheus --> DecodeCost[Decode 阶段: 显存带宽消耗大 权重系数 β = 3.5] PrefillCost --> WeightedTokens[加权等效 Token 总量] DecodeCost --> WeightedTokens ClusterBill[当月物理 GPU 实际账单: 如 10 万元] --> WeightedTokens WeightedTokens --> DepartmentInvoice[生成各业务部门精准成本账单] end1. 为什么不能简单按“Token 数量”一刀切?
在很多公开的商业大模型 API(如 OpenAI)计费标准中,输入 Token(Input)和输出 Token(Output)的价格通常有 3~4 倍的差距(例如 Input $0.005 / 1k,Output $0.02 / 1k)。
这背后的物理硬件原理非常明确:
- Prefill(输入)阶段是计算密集型(Compute-Bound):GPU 可以将输入的数千个 Prompt Token 并行一次性完成矩阵乘法,Tensor Core 计算效率极高;
- Decode(输出)阶段是显存带宽密集型(Memory-Bound):每生成一个 Token 都要从显存中全量读取一次数十 GB 的模型权重与上下文 KV Cache,GPU 核心大部分时间在干等显存搬运。
因此,在私有化集群内部核算各部门实际占用的物理算力时,必须引入加权等效 Token 模型:
$$\text{Equivalent Tokens} = \text{Input Tokens} \times \alpha + \text{Output Tokens} \times \beta$$
其中系数通常建议取 $\alpha = 1.0$,$\beta = 3.0 \sim 4.0$。
2. 从加权 Token 到 GPU 卡时(GPU Hours)的分摊公式
假设某大模型推理集群在一个计费周期(如一个月)内:
- 部署了 $N$ 张特定规格的 GPU 卡(例如 16 张 A100-80GB);
- 集群当月总物理成本为 $C_{total}$(包括 GPU 实例租金、机房电费、存储与网关摊销);
- 全集群累计产出的总加权 Token 为 $T_{total}$。
则单位加权 Token 的基准成本单价 $P_{token}$ 为:
$$P_{token} = \frac{C_{total}}{T_{total}}$$
各业务部门 $Dept_k$ 当月应分摊的算力费用为:
$$\text{Cost}(Dept_k) = \left( \sum \text{Input}{k} \times 1.0 + \sum \text{Output}{k} \times 3.5 \right) \times P_{token} + \text{Reserved Quota Fee}$$
3. Go 网关层的实时计量与上报实现
我们在 API 网关层,通过流式拦截器精准统计每个租户(Tenant)消耗的 Input / Output Token,并以 Prometheus Metrics 形式实时暴露:
package main import ( "context" "fmt" "net/http" "time" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" ) var ( // 定义 Prometheus Counter 向量,按租户、模型、类型分别统计 tokenUsageCounter = promauto.NewCounterVec( prometheus.CounterOpts{ Name: "llm_token_usage_total", Help: "累计消耗的 LLM Token 数量", }, []string{"tenant_id", "model_name", "type"}, // type: "input" 或 "output" ) ) // RecordTokenConsumption 记录单次调用的 Token 消耗 func RecordTokenConsumption(tenantID string, modelName string, inputTokens int, outputTokens int) { tokenUsageCounter.WithLabelValues(tenantID, modelName, "input").Add(float64(inputTokens)) tokenUsageCounter.WithLabelValues(tenantID, modelName, "output").Add(float64(outputTokens)) } func main() { // 模拟两笔业务请求的计量记录 RecordTokenConsumption("customer_service", "llama3-70b", 350, 120) RecordTokenConsumption("knowledge_base", "llama3-70b", 4200, 850) fmt.Println("Token 计量指标已成功记录并上报 Prometheus") }4. 治理收益与业务赋能
建立精细化成本核算后,带来了意想不到的工程治理收益:
- 倒逼业务优化 Prompt:知识库团队发现自己长文档召回的 Token 费用占比高达 70% 后,主动重构了 RAG 检索分块算法,将无用上下文裁剪了 40%,系统总吞吐反升 25%;
- 算力预算透明可控:月末财务对账不再是一笔糊涂账,各部门负责人能够清晰看到每一分钱花在了哪个模型、哪个功能上;
- 容量规划有据可依:运维团队可以通过各部门未来的业务增长预期,精确推导出下季度需要扩容多少张 GPU 显卡。