# Spaces ZeroGPU：Spaces 的动态 GPU 分配

ZeroGPU 是一种共享基础设施，旨在优化 Hugging Face Spaces 上 AI 模型和演示的 GPU 使用。它会根据需求动态分配和释放 NVIDIA RTX Pro 6000 Blackwell GPU，提供以下功能：

1. **免费 GPU 访问**：为 Spaces 提供高性价比的 GPU 使用方式。
2. **多 GPU 支持**：允许 Spaces 在单个应用程序中同时利用多个 GPU。

与传统的单 GPU 分配不同，ZeroGPU 的高效系统通过最大化资源利用率和能效，降低了开发者、研究人员和机构部署 AI 模型的门槛。

## 使用和托管 ZeroGPU Spaces

- **使用现有的 ZeroGPU Spaces**
  - ZeroGPU Spaces 可供所有用户免费使用。（请访问[精选列表](https://huggingface.co/spaces/enzostvs/zero-gpu-spaces)）。
  - [PRO 用户](https://huggingface.co/subscribe/pro)可获得 8 倍的每日使用配额，在 GPU 队列中享有最高优先级，并且在使用任何 ZeroGPU Spaces 时，可以通过预付费额度超出每日配额。
- **托管您自己的 ZeroGPU Spaces**
  - 免费个人账户：状态良好的账户（已验证邮箱、注册超过 30 天）可以免费托管最多 2 个 ZeroGPU Spaces。
  - PRO 账户：[订阅 PRO](https://huggingface.co/settings/billing/subscription) 即可在您的账户下托管多达 10 个 ZeroGPU Spaces。
  - 组织：[订阅 Team 或 Enterprise 计划](https://huggingface.co/enterprise)，即可为所有组织成员启用 ZeroGPU Spaces。

## 技术规格

ZeroGPU 支持两种 GPU 规格

| GPU 大小            | 底层硬件                   | Vram | 配额成本 |
|---------------------|------------------------------------|------|------------|
| `large` *（默认）* | 半张 NVIDIA RTX Pro 6000 Blackwell | 48GB | 1×         |
| `xlarge`            | 完整的 NVIDIA RTX Pro 6000 Blackwell | 96GB | 2×         |

> [!NOTE]
> 请参阅 [GPU 尺寸选择](#gpu-size-selection) 以了解如何使用尺寸

## 兼容性

ZeroGPU Spaces 旨在与大多数基于 PyTorch 的 GPU Spaces 兼容。虽然针对 `transformers` 和 `diffusers` 等高级 Hugging Face 库的兼容性得到了增强，但用户应注意：

- 目前，ZeroGPU Spaces 仅与 **Gradio SDK** 兼容。
- 与标准 GPU Spaces 相比，ZeroGPU Spaces 的兼容性可能较为有限。
- 在某些情况下，可能会出现意外问题。

### 支持的版本

- **Gradio**：4+
- **PyTorch**：支持从 **2.8.0** 到 **latest** 的几乎所有版本
  
    查看完整列表

    - 2.8.0  
    - 2.9.1  
    - 2.10.0  
    - 2.11.0  
    - 2.12.1  
    - 2.13.0  

  
- **Python**：
  - 3.12.12  
  - 3.10.13  

## 开始使用 ZeroGPU

要在您的 Space 中使用 ZeroGPU，请按照以下步骤操作：

1. 请确保在您的 Space 设置中选择了 ZeroGPU 硬件。
2. 导入 `spaces` 模块。
3. 使用 `@spaces.GPU` 装饰依赖 GPU 的函数。

此装饰过程允许 Space 在函数被调用时请求 GPU，并在完成后释放它。

> [!NOTE]
> `@spaces.GPU` 装饰器旨在非 ZeroGPU 环境中不产生任何副作用，以确保在不同配置下的兼容性。

### 使用示例

```python
import spaces
from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained(...)
pipe.to('cuda')

@spaces.GPU
def generate(prompt):
    return pipe(prompt).images

gr.Interface(
    fn=generate,
    inputs=gr.Text(),
    outputs=gr.Gallery(),
).launch()
```

### 模型加载

尽管真实的 GPU 仅在 `@spaces.GPU` 函数内部可用，但模型必须在根模块级别放置在 `cuda` 上（如上文示例所示）。

在 `@spaces.GPU` 内部延迟加载模型或将模型移至 CUDA 是不推荐的，因为这种方式效率显著较低（CUDA 传输针对启动期间完成的放置操作进行了优化）。

> [!NOTE]
> 在模块级别将模型加载到 `cuda` 上之所以可行，是因为在 `@spaces.GPU` 函数之外启用了 PyTorch CUDA 模拟模式，从而允许在没有真实 GPU 的情况下执行 CUDA 操作。在 `@spaces.GPU` 内部，则使用真实的 CUDA。

## GPU 尺寸选择

`@spaces.GPU` 使用的默认大小为 `large`（半块 NVIDIA RTX Pro 6000 Blackwell）。

您可以通过指定 `size="xlarge"` 来明确请求一台完整的 NVIDIA RTX Pro 6000 Blackwell：

``` python
@spaces.GPU(size="xlarge")
def generate(prompt):
    return pipe(prompt).images
```

> [!NOTE]
> - `xlarge` 消耗的每日配额是 `large` 的 **2 倍**（例如，**有效** 任务时长为 45 秒会消耗 90 秒的配额） - `xlarge` 通常意味着更高的排队概率和更长的等待时间 - 仅当您的工作负载确实能从额外的计算或内存中受益时，才使用 `xlarge`

## 持续时间管理

对于预计 GPU 运行时间超过默认 60 秒的函数，您可以指定自定义时长：

```python
@spaces.GPU(duration=120)
def generate(prompt):
   return pipe(prompt).images
```

这将最大函数运行时间设置为 120 秒。为运行更快的函数指定更短的时长，将提高 Space 访问者的队列优先级。

### 动态时长

`@spaces.GPU` 也支持动态时长。

与其直接传递持续时间，只需传递一个可调用对象，该对象接受与被装饰函数相同的输入并返回一个持续时间值：

```python
def get_duration(prompt, steps):
    step_duration = 3.75
    return steps * step_duration

@spaces.GPU(duration=get_duration)
def generate(prompt, steps):
   return pipe(prompt, num_inference_steps=steps).images
```

## 编译

ZeroGPU 不支持 `torch.compile`，但你可以使用 PyTorch 的 **提前** 编译（需要 torch `2.8+`）

请参阅这篇[博客文章](https://huggingface.co/blog/zerogpu-aoti)，了解有关 ZeroGPU 上提前编译的完整指南。

## 使用层级

GPU 使用量受账户等级对应的**每日**配额限制：

| 账户类型                   | 包含每日 GPU 配额 | 队列优先级  |
| ------------------------------ | ------------------------ | --------------- |
| 未认证                | 2 分钟                | 低             |
| 免费账户                   | 5 分钟                | 中等          |
| PRO 账户                    | 40 分钟（可扩展）  | 最高         |
| 团队组织成员       | 40 分钟（可扩展）  | 最高         |
| 企业组织成员 | 60 分钟（可扩展）  | 最高         |

包含的每日配额会在您首次使用 GPU 后的 24 小时整重置。

> [!NOTE]
> 剩余配额直接影响 ZeroGPU 队列中的优先级。

### 使用积分扩展配额

PRO、Team 和 Enterprise 用户可以通过消耗预付费额度，以 **每 10 分钟 GPU 时间 1 美元** 的费率，在超出每日包含配额后继续使用 ZeroGPU Spaces。一旦您的每日配额用尽，任何额外的 GPU 使用量都会自动从您的额度余额中扣除。

您可以从您的[账单设置](https://huggingface.co/settings/billing)中添加额度。

## 托管限制

- **免费个人账户**：最多可创建 2 个 ZeroGPU Spaces，适用于状态良好的账户（已验证邮箱，账户注册超过 30 天）。
- **个人账户（[PRO 订阅者](https://huggingface.co/subscribe/pro)）**：最多可拥有 10 个 ZeroGPU Spaces。
- **组织账户（[团队与企业版](https://huggingface.co/enterprise)）**：最多可拥有 50 个 ZeroGPU Spaces。

通过利用 ZeroGPU，开发者可以创建更高效、更具可扩展性的 Spaces，在最大化 GPU 利用率的同时将成本降至最低。

## 建议

如果您的演示使用大型模型，我们建议使用提前编译和 flash-attention 3 等优化技术。您可以在[这篇文章](https://huggingface.co/blog/zerogpu-aoti)中了解如何利用 ZeroGPU 来应用这些优化。这些优化将帮助您最大化 ZeroGPU 时长的优势，并提供更好的用户体验。

## 反馈

您可以直接在 HF Hub 上分享您对 Spaces ZeroGPU 的反馈：https://huggingface.co/spaces/zero-gpu-explorers/README/discussions

