为什么是 Colab + Spaces,而不是再注册一个平台
免费 Token 的真正瓶颈从来不是「额度数字」,而是「能不能持续调用」。官方 Free Tier 会限速、会过期、会要求绑卡;而 Colab 和 Hugging Face Spaces 提供的不是 Token,是算力托管——你把自己的开源模型放上去,得到的调用次数只受限于平台的使用政策和会话时长,而不是某个厂商的赠额表。
这条路线的核心价值有三点:
- 不依赖任何单一厂商的额度政策,模型权重在你自己手里;
- Colab 提供免费 GPU 会话,Spaces 提供免费 CPU 托管(部分额度下也可用 GPU);
- 两端都能用 Gradio 暴露 HTTP 接口,再套一层 OpenAI 兼容封装,就能接进任何支持
base_url的客户端。
下面按「Colab 临时端点」和「Spaces 常驻端点」两条线分别给操作步骤。
操作步骤
路线 A:Colab 上跑一个临时 OpenAI 兼容端点
适用场景:本地跑不动大模型、需要短时(单次会话内)的高性能推理。
第 1 步:选运行时。 在 Colab 菜单 Runtime → Change runtime type 中选择免费 GPU 档位。免费档位通常是 T4 级别,具体型号和单次会话时长上限由 Google 动态调整,以你打开时的界面说明为准。
第 2 步:装依赖。 在 Notebook 单元格执行:
```python
!pip -q install fastapi uvicorn pyngrok transformers accelerate
```
第 3 步:加载模型并起一个 OpenAI 兼容服务。 用 transformers 直接加载,或使用 vllm(注意:免费 Colab 环境对 vLLM 的显存和编译要求较苛刻,T4 上不一定能顺利启动,transformers 更稳):
```python
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch, uvicorn, threading
MODEL = "Qwen/Qwen2.5-1.5B-Instruct" # 换成你想用的开源模型
tok = AutoTokenizer.from_pretrained(MODEL)
mdl = AutoModelForCausalLM.from_pretrained(MODEL, torch_dtype=torch.float16, device_map="auto")
app = FastAPI()
class ChatReq(BaseModel):
model: str = MODEL
messages: list
@app.post("/v1/chat/completions")
def chat(req: ChatReq):
text = tok.apply_chat_template(req.messages, tokenize=False, add_generation_prompt=True)
ids = tok(text, return_tensors="pt").to(mdl.device)
out = mdl.generate(**ids, max_new_tokens=512)
reply = tok.decode(out[0][ids["input_ids"].shape[1]:], skip_special_tokens=True)
return {"choices": [{"message": {"role": "assistant", "content": reply}}]}
threading.Thread(target=lambda: uvicorn.run(app, host="0.0.0.0", port=8000), daemon=True).start()
```
第 4 步:把端口暴露到公网。 Colab 无法直接对外提供端口,需要用隧道工具。pyngrok 需要你自己的 ngrok token(免费注册即可),也可以换 Cloudflare Tunnel 的 cloudflared:
```python
from pyngrok import ngrok
ngrok.set_auth_token("YOUR_NGROK_TOKEN")
print(ngrok.connect(8000).public_url)
```
输出的 https://xxxx.ngrok-free.app 就是你的 base_url,客户端里填 base_url + "/v1"。
路线 B:Hugging Face Spaces 常驻 Gradio 接口
适用场景:希望有一个 7×24 在线、不依赖你本地电脑的轻量端点。
第 1 步:新建 Space。 在 huggingface.co 上 New Space,SDK 选 Gradio,硬件先选免费 CPU 档。
第 2 步:写 app.py。 Gradio 会自动把函数暴露成 HTTP API(每个 Space 都有 /run/predict 或新版 /gradio_api/call/... 接口):
```python
import gradio as gr
from transformers import pipeline
pipe = pipeline("text-generation", model="Qwen/Qwen2.5-0.5B-Instruct")
def generate(prompt, max_new_tokens=256):
out = pipe(prompt, max_new_tokens=max_new_tokens, do_sample=True)
return out[0]["generated_text"]
gr.Interface(fn=generate, inputs=["text", "number"], outputs="text").launch()
```
第 3 步:从客户端调用。 Gradio 的 API 可以通过 gradio_client 直接调用,不需要自己写 HTTP:
```python
from gradio_client import Client
c = Client("你的用户名/你的space名")
print(c.predict("写一句关于秋天的诗", 128))
```
第 4 步(可选):套一层 OpenAI 兼容代理。 如果你希望用 OpenAI SDK 调用,可以自己在本地或另一台机器上跑一个薄代理,把 /v1/chat/completions 转成 gradio_client.predict 调用。这样你的客户端代码一行都不用改。
路线 C:把两者组合成「主备链路」
- 日常请求走 Spaces(常驻、稳定、免费 CPU 够用);
- 需要更强算力时,临时开一个 Colab 会话,把它的 ngrok 地址作为备用
base_url写进配置; - 在客户端做简单的失败重试:Spaces 超时 → 切 Colab 地址。
注意事项
- Colab 会话会被回收。 免费档在闲置一段时间后会断开,运行时长也有上限(具体时长 Google 会调整,以界面提示为准)。这意味着路线 A 的端点地址是临时的,不要把它写死进生产代码。
- Spaces 免费 CPU 档有休眠机制。 长时间无访问会进入休眠,首次请求会有冷启动延迟,通常几秒到几十秒不等。
- 不要用来跑超大规模模型。 免费 CPU 档跑 0.5B–3B 级别的模型比较现实;更大的模型要么加载失败,要么推理慢到不可用。
- 遵守平台使用条款。 Colab 明确禁止把免费算力用于挖矿、代理转发、绕过服务限制等用途;Spaces 也要求公开 Space 的代码可被查看。把端点用于高频商业调用可能触发限流或封禁。
- 隧道工具的额度是另一回事。 ngrok 免费版有连接数和并发限制,Cloudflare Tunnel 免费版也有自己的策略,别把瓶颈算在 Colab 头上。
- 不要把私人数据发到公开 Space。 公开 Space 的输入可能被记录,敏感场景请改为私有 Space 或自建。
适用场景
| 场景 | 是否适合 | 说明 |
|---|---|---|
| 个人学习、调试 Prompt | 适合 | 免费额度完全够用 |
| 小工具、脚本的偶尔调用 | 适合 | 冷启动延迟可接受 |
| 需要 7×24 稳定的产品后端 | 不适合 | 会话回收与休眠会导致不可用 |
| 大批量数据处理 | 不适合 | 免费算力吞吐有限,且可能违反条款 |
| 处理敏感/隐私数据 | 谨慎 | 优先用私有 Space 或本地部署 |
一句话总结
Colab 和 Spaces 给的不是 Token,而是「你自己模型的托管位」。把它接成 OpenAI 兼容端点,你就拥有了一条不依赖任何厂商赠额政策的调用链路——代价是它不稳定、不保证 SLA,只适合学习和轻量自用。