huggingface-zerogpu:讓 Agent 按 ZeroGPU 規則寫 Gradio GPU 演示

前言

在 Hugging Face Spaces 上掛一個帶 GPU 的 Gradio 演示,成本往往是攔路虎:專用 GPU Space 要付費或排隊,本地寫完再遷上去又容易踩平臺特有的坑——PicklingError、聲明 duration 和實際配額對不上、flash-attn 在構建階段找不到 nvcc,或者把 torch.compile 寫進 Space 直接跑不起來。官方 ZeroGPU 文檔會隨硬件代次和配額策略更新,單靠記憶很難寫對。

huggingface-zerogpu 是 Hugging Face 在 skills 倉庫 裏維護的一條 Agent Skill,把 ZeroGPU 上的編碼約定、運行時模型和常見錯誤對照寫進 SKILL.md,供 Cursor、Codex、Claude Code 等客戶端在寫碼或排錯時自動遵循。下面介紹它解決什麼問題、覆蓋哪些能力,以及如何安裝與對照使用。

這是什麼

huggingface-zerogpu 面向「在 Hugging Face Spaces 上使用 ZeroGPU 構建 Gradio AI 演示與 GPU 計算」這一場景。Skill 的 YAML 描述寫明:在用戶編寫或審查使用 @spaces.GPU 的代碼、配置 ZeroGPU Space 的 python_version 或 requirements.txt、或處理 ZeroGPU 特有約束(基於 pickle 的進程隔離、gr.State 跨 worker 邊界語義、不支持 torch.compile、CUDA 僅 wheel 構建、large / xlarge 規格、動態 duration 等)時應啓用。

適用範圍有硬邊界:僅 Gradio SDK + ZeroGPU 硬件 的 Space。Docker Space、Static Space 無法調度到 ZeroGPU;Streamlit 現以 Docker Space 運行,因此不在本 Skill 範圍內。通用 Gradio 組件與佈局應配合同倉庫的 huggingface-gradio Skill。權威運行時參數(當前 backing GPU、運行時版本列表、檔位閾值)以 ZeroGPU 官方文檔 爲準,會隨平臺變更而更新。

核心功能

Skill 正文與配套 reference 主要覆蓋以下方面(均來自官方 SKILL.md 與引用說明)。

硬件規格與配額

ZeroGPU 通過 size 映射物理卡的一部分:

size 佔用 配額消耗
large(默認) 半卡 1x
xlarge 整卡 2x

默認 large 的顯存帶寬與算力顯著低於整卡規格;僅在確實需要額外顯存或算力時使用 xlarge。文檔強調 backing GPU 可能無預告更換,舊文章裏寫的具體型號可能已過時, sizing 前應先查官方文檔。

基本編碼模式

典型寫法:在模塊作用域加載模型並指向 cuda,用 @spaces.GPU 包裹真正做推理的函數:

import spaces
import torch
from transformers import pipeline

pipe = pipeline("text-generation", model="...", device="cuda")

@spaces.GPU
def generate(prompt: str) -> str:
    return pipe(prompt, max_new_tokens=100)[0]["generated_text"]

關鍵規則包括:

  1. 在模塊作用域實例化模型並 .to("cuda") 或 device="cuda",ZeroGPU 負責後續設備遷移。
  2. GPU 計算只放在 @spaces.GPU 裝飾的函數內;裝飾器在非 ZeroGPU 環境是 no-op,可保留在代碼裏。
  3. duration 按最壞情況聲明(默認 60 秒)。平臺按「請求的 duration」與用戶剩餘配額做預檢,而非按實際運行時長;短任務若仍用 60 秒默認值,在用戶剩餘配額低於 60 秒時會直接 quota exceeded。更小的 duration 在節點隊列裏通常排序更靠前。
  4. 不支持 torch.compile;需改用 PyTorch 2.8+ 的 ahead-of-time compilation(AoTI),官方博客有 ZeroGPU 相關說明。
  5. size="xlarge" 慎用:佔滿整卡、配額 2 倍、排隊往往更長。

長任務可顯式聲明時長,例如:

@spaces.GPU(duration=120)
def generate_image(prompt: str):
    return pipe(prompt).images[0]

CUDA 可用性模型

真實 GPU 僅在 @spaces.GPU 函數執行期間掛到進程;模塊作用域外沒有 GPU。但 import spaces 會 monkey-patch torch,使 torch.cuda.is_available() 全局爲 True,模塊級的 .to("cuda") 不報錯——這是爲了把權重註冊到 ZeroGPU 後端,經啓動階段的 pack/offload,再在 GPU worker 裏流式載入 VRAM。

因此:不要在模塊作用域跑推理或 CUDA kernel;應繼續用 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") 這類寫法,避免硬編碼 device="cuda" 導致 CPU Space 或本地 CPU 環境失效。模型應在模塊作用域 eager 加載,而不是把首次加載推遲到第一個用戶請求(lazy / lru_cache 會把冷啓動成本轉給首個訪問者)。

本地開發與 spaces 包

本地只需安裝 spaces。不要用 try/except 自建 no-op 的 spaces.GPU:非 ZeroGPU 時 heavyweight 行爲由環境變量 SPACES_ZERO_GPU 門控,@spaces.GPU 已是透傳。Gradio SDK 基礎鏡像各硬件檔都會裝 spaces,複製到專用 GPU 或 CPU Space 通常無需改 import。

配套 reference(Skill 內)

文件 何時查閱
references/concurrency.md 寫 ZeroGPU 代碼時必讀;handler 默認並行
references/how-zerogpu-works.md 冷啓動、worker 複用、模塊級 warmup 不跨請求、返回 CUDA tensor 卡住等
references/how-quota-works.md 選 duration、illegal duration 與 quota exceeded
references/cuda-and-deps.md flash-attn 等 CUDA 依賴、torch 側車版本、wheel 標籤

Skill 描述還列出觸發場景:用戶提到 ZeroGPU、@spaces.GPU、spaces 包,或出現跨 worker 的 PicklingError、illegal duration、flash-attn wheel 構建失敗等,即使未明確要求 ZeroGPU 指南也應啓用。

安裝與啓用

Hugging Face Skills 遵循 Agent Skills 格式,倉庫爲 huggingface/skills。huggingface-zerogpu 路徑:

https://github.com/huggingface/skills/tree/main/skills/huggingface-zerogpu

各客戶端安裝方式(摘自倉庫 README,以你當前環境爲準):

Claude Code

  1. 註冊插件市場:/plugin marketplace add huggingface/skills
  2. 可先裝 CLI Skill:/plugin install hf-cli@huggingface/skills
  3. 安裝本 Skill:hf skills add huggingface-zerogpu(或倉庫約定的 skill 名稱;與 hf skills add <skill-name> 用法一致)

Codex

將 skills/huggingface-zerogpu 複製或符號鏈接到 Codex 的 .agents/skills 標準位置(如 $REPO_ROOT/.agents/skills 或 $HOME/.agents/skills),由客戶端按 Agent Skills 標準發現 SKILL.md。

Cursor

倉庫提供 .cursor-plugin/plugin.json 與 MCP 配置;市場入口側重 hf-cli。安裝額外 workflow Skill 時,文檔建議使用:

hf skills add <skill-name>

將 <skill-name> 換爲 huggingface-zerogpu(或與 Hub CLI 列出的名稱一致)。

Gemini CLI

可通過倉庫擴展安裝,例如:

gemini extensions install https://github.com/huggingface/skills.git --consent

若 Agent 不支持 Skills,倉庫提供 agentsmd/AGENTS.md 作爲兜底說明 bundle。

典型用法(Agent 側)

啓用 Skill 後,Agent 在以下任務中應對照 Skill 與 ZeroGPU 文檔 行動,而不是按普通 PyTorch/CUDA 習慣臆造:

  1. 新建或審查 Gradio Space,硬件選 ZeroGPU,在 requirements.txt / python_version 中滿足 CUDA wheel 約束(無 nvcc 構建)。
  2. 爲推理入口添加 @spaces.GPU,並按真實最壞耗時設置 duration 與必要的 size。
  3. 處理併發與 gr.State 時閱讀 references/concurrency.md 與進程隔離說明,避免跨 worker 傳遞不可 pickle 的對象。
  4. 遇到 quota exceeded / illegal duration 時對照 references/how-quota-works.md 調整聲明時長與配額理解。
  5. 需要編譯優化時避開 torch.compile,改用 AoTI 路徑。

開發者仍在本倉庫 app.py(或等價入口)中維護業務代碼;Skill 不改變 Hub 部署流程,而是約束 Agent 生成的補丁與審查意見。

適用場景與注意

適合誰

  • 要在 Spaces 上做 免費檔 GPU 演示、原型驗證的 Gradio 作者。
  • 使用 AI 編碼助手寫 ZeroGPU Space,希望減少平臺特有 bug 的團隊。
  • 需要把 @spaces.GPU、配額、PicklingError 等關鍵詞與正確修復模式綁定的維護者。

限制與坑

  • 僅 Gradio + ZeroGPU;Docker / Static / Streamlit 路徑不適用本 Skill 主文檔。
  • backing GPU 與文檔閾值會變,文章或 Skill 裏的硬件名可能過期,必須以官方文檔爲準。
  • 默認 duration=60 對短任務不友好,且與配額預檢強相關。
  • torch.compile 不可用;CUDA 擴展依賴需預編譯 wheel。
  • Handler 默認並行,必須結合 concurrency reference 設計共享狀態。

同倉庫的 huggingface-spaces Skill 覆蓋更廣的 Spaces 生命週期(多 SDK、專用硬件、調試等);ZeroGPU 細節以 huggingface-zerogpu 爲專精補充。

結尾

ZeroGPU 降低了在 Hub 上展示 GPU 推理 demo 的門檻,但執行模型、配額和構建鏈路與普通 CUDA 開發並不相同。huggingface-zerogpu 把這些規則固化成 Agent 可執行的 Skill,與官方文檔和倉庫內 reference 對齊,適合在寫 Space 或排錯時一併啓用。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜