在不少研发团队和校园实验室里,几台装了显卡的服务器通过局域网组成了私有大模型算力池。大家用 Ollama 或 vLLM 部署了多个模型,确实方便。但时间一长,谁用得多、谁占着资源不松手,就得有个说法。本文分享一套轻量级的 token计费设计,让局域网多机共享算力也能像公有云一样按量结算。
一、为什么局域网也要做 token 计费
很多人觉得内网随便用就行了,其实不然。首先,GPU 是实打实的电费和折旧;其次,如果没有记账,模型 API 会被随意滥用,导致其他人排队。例如一个 10 人团队共用 2 张 A100,不计费时实习生可能通宵跑批量推理,白天研究员只能干瞪眼。合理的 token 计费 能驱动大家精简提示词、合并请求。
二、整体架构:统一网关 + 推理集群 + 账本
最省事的做法是在局域网前置一个 计费代理网关,所有客户端不直接访问后端推理机,而是访问网关。网关转发请求到类似 智志AI 方案的负载均衡器,再分发到具体机器。如果直接改模型源码嵌入计费逻辑很麻烦,网关模式对原有服务零侵入。
更多部署细节可参考 博客 中的私有化教程。
核心模块拆解
网关里最关键的是 中间件,它在请求前解析 body 计算输入 token,在响应后统计输出 token。由于不同模型分词器不同,网关需加载对应 tokenizer。对于流式输出(stream),需在最后一次 chunk 累计实际使用 token。
三、Token 计费的关键代码实现
下面用 Python 伪代码展示中间件如何嵌入 Flask 应用:
from transformers import AutoTokenizer
import time
tok_cache = {}
def get_tokenizer(model):
if model not in tok_cache:
tok_cache[model] = AutoTokenizer.from_pretrained(model)
return tok_cache[model]
@app.route('/v1/chat/completions', methods=['POST'])
def proxy():
data = request.json
model = data['model']
text = data['messages'][-1]['content']
input_tokens = len(get_tokenizer(model).encode(text))
resp = forward_to_backend(data)
out_text = resp['choices'][0]['message']['content']
output_tokens = len(get_tokenizer(model).encode(out_text))
log_usage(user=request.headers['X-User'], model=model,
in_t=input_tokens, out_t=output_tokens)
return resp
实际生产可加上异步写库,避免阻塞主请求。同时注意流式响应需累计 token,不能只取最后一段。
计费单价配置表
不同模型成本不同,可用配置表管理,并支持热加载:
| 模型 | 输入单价(分/千token) | 输出单价(分/千token) |
|---|---|---|
| Qwen2-7B | 0.5 | 1.0 |
| Llama3-70B | 3.0 | 6.0 |
四、多机日志汇总与定时结算
当后端有多台机器时,可以让每台推理机把 usage 上报给中心 账本服务,或者由网关统一记录。建议网关记录,因为网关本身就知道路由到哪台。每日跑脚本生成账单:
五、防滥用与精度校准
局域网虽可信,但仍需小心:
以上方案已在多个实验室落地。通过 局域网多机共享大模型算力 配合轻量 token计费设计,既能盘活闲置显卡,又能让每一分算力消耗看得见。如果你想看完整开源代码,欢迎访问 智志AI 获取更多支持。