为什么绕开托管推理
托管推理(Inference API / Inference Endpoints)的免费额度受账号、模型大小、队列负载影响,额度会变、会限速、会排队。「自留地」思路是:把免费 GPU 时段和开源权重组合起来,让 Token 来自你自己的进程,而不是别人的配额池。
三件套分工:
- HF Datasets:放你的语料、评测集、prompt 模板,版本化、可 diff。
- HF Models:放权重引用和你自己写的推理脚本(
inference.py之类)。 - Notebooks / Colab:放运行环境,负责真正跑出 token。
操作步骤
第 1 步:把「Token 供给」定义清楚
先明确你要的是哪一类:
- 批量生成型:一次性跑几千条摘要/翻译/分类,跑完即止。
- 低并发常驻型:每天几十到几百次调用,要求随时可用。
批量型最适合 Notebook 方案;常驻型更适合本地 Ollama/vLLM(另文讨论)。本文聚焦批量型与半常驻型。
第 2 步:在 HF Datasets 建输入仓
新建一个 dataset 仓库,建议结构:
```
inputs/
batch_001.jsonl
batch_002.jsonl
prompts/
summarize.txt
evals/
golden_50.jsonl
```
用 datasets 库读取,避免手工拼字符串:
```python
from datasets import load_dataset
ds = load_dataset("your-name/token-inputs", data_files="inputs/*.jsonl", split="train")
```
好处是输入可追溯:某批输出质量差,能直接定位到哪个 batch 文件。
第 3 步:在 HF Models 仓库放推理脚本
把脚本和权重引用放在同一个 model repo 里,脚本里写明模型名、量化方式、batch size:
```python
# inference.py
from transformers import AutoModelForCausalLM, AutoTokenizer
MODEL = "Qwen/Qwen2.5-7B-Instruct" # 按需替换为当前可用的小参数量模型
def load():
tok = AutoTokenizer.from_pretrained(MODEL)
mdl = AutoModelForCausalLM.from_pretrained(MODEL, device_map="auto", load_in_4bit=True)
return tok, mdl
```
关键点:脚本进仓库,环境不进仓库。换机器时只装依赖,不改逻辑。
第 4 步:Notebook 里跑起来(Colab 免费层)
在 Colab 新建 notebook,挂载你的 HF 仓库:
```python
!pip -q install transformers datasets accelerate bitsandbytes
from huggingface_hub import login
login() # 用只读 token,别用写权限 token
```
然后按 batch 循环推理,把结果直接 push 回一个 dataset 仓库:
```python
from huggingface_hub import HfApi
api = HfApi()
api.upload_file(path_or_fileobj="out.jsonl",
path_in_repo="outputs/out.jsonl",
repo_id="your-name/token-outputs", repo_type="dataset")
```
Colab 免费层的关键限制(务必先接受):
- GPU 类型不保证,可能是 T4,也可能当天没有 GPU。
- 会话有闲置断开机制,长任务要写成「可断点续跑」:每处理完一个 batch 就上传结果并记录游标。
- 显存有限,7B 级别模型通常需要 4bit 量化,长上下文要调小。
第 5 步:做成可断点续跑的循环
```python
import json, os
CURSOR = "cursor.json"
start = json.load(open(CURSOR))["i"] if os.path.exists(CURSOR) else 0
for i, row in enumerate(ds):
if i < start: continue
out = run(row)
append(out, "out.jsonl")
if i % 50 == 0:
upload("out.jsonl"); json.dump({"i": i}, open(CURSOR, "w"))
```
这样即使 Colab 断线,重连后从游标继续,不会白跑。
第 6 步:把「供给」变成日常可调用
批量产物落库后,再包一层极简 FastAPI 或 Gradio,部署到 HF Spaces 免费实例上,做「查表 + 命中即返回」。这层不做推理,只做检索,因此免费实例够用,也不会因为排队而失败。
注意事项
- 别把免费 GPU 当生产 SLA:Colab 免费层随时可能调整策略,重要任务要有本地或付费兜底。
- token 权限最小化:Notebook 里只用 read token;写回结果时单独用一个只对目标仓库有写权限的 token。
- 数据集不要放敏感内容:HF 公开仓库默认可见,私有用 private repo,并确认企业合规要求。
- 模型许可证要看:不同开源权重许可证对商用、再分发的要求不同,选之前读一眼 model card。
- 别硬编码额度预期:Colab 与 HF 的免费资源策略会变,本文所有能力描述都以「通常/约」为准,不承诺具体时长或次数。
适用场景
- 个人开发者做数据标注、批量摘要、离线翻译、评测集生成。
- 小团队做内部工具的原型验证,不想先买 API 额度。
- 教学/研究场景,需要可复现的输入输出记录。
- 不适合:低延迟在线客服、高并发线上服务、需要稳定 QPS 承诺的业务。
成本对照
| 项目 | 自留地方案 | 托管 API |
|---|---|---|
| 现金成本 | 0(免费 GPU 时段) | 按 token 计费 |
| 时间成本 | 首次约 30–60 分钟搭建 | 注册即用 |
| 稳定性 | 中低(受免费时段影响) | 高 |
| 可复现性 | 高(脚本+数据都在仓库) | 依赖服务方版本 |
结论:把「自留地」当作免费额度的补充和兜底,而不是替代。批量、离线、可等待的任务优先走这条路;在线、低延迟的任务仍然用托管 API。