# Spaces ZeroGPU: Phân bổ GPU động cho Spaces

ZeroGPU là một hạ tầng dùng chung, tối ưu hóa việc sử dụng GPU cho các mô hình và demo AI trên Hugging Face Spaces. Nó phân bổ và giải phóng các GPU NVIDIA RTX Pro 6000 Blackwell một cách động khi cần, cung cấp:

1. **Truy cập GPU miễn phí**: Cho phép sử dụng GPU hiệu quả về chi phí cho Spaces.
2. **Hỗ trợ đa GPU**: Cho phép Spaces tận dụng nhiều GPU đồng thời trên một ứng dụng duy nhất.

Khác với các cấp phát GPU đơn truyền thống, hệ thống hiệu quả của ZeroGPU giúp giảm rào cản cho các nhà phát triển, nhà nghiên cứu và tổ chức trong việc triển khai các mô hình AI bằng cách tối đa hóa việc sử dụng tài nguyên và hiệu quả năng lượng.

## Sử dụng và lưu trữ ZeroGPU Spaces

- **Sử dụng các ZeroGPU Spaces hiện có**
  - ZeroGPU Spaces có thể được sử dụng miễn phí cho tất cả người dùng. (Xem [danh sách được tuyển chọn](https://huggingface.co/spaces/enzostvs/zero-gpu-spaces)).
  - [Người dùng PRO](https://huggingface.co/subscribe/pro) nhận hạn mức sử dụng hàng ngày gấp 8 lần, có độ ưu tiên cao nhất trong hàng đợi GPU và có thể vượt quá hạn mức hàng ngày bằng cách sử dụng tín dụng trả trước khi dùng bất kỳ ZeroGPU Spaces nào.
- **Chạy ZeroGPU Spaces của riêng bạn**
  - Tài khoản cá nhân miễn phí: các tài khoản có tình trạng tốt (email đã xác minh, tài khoản trên 30 ngày) có thể lưu trữ tối đa 2 ZeroGPU Spaces miễn phí.
  - Tài khoản PRO: [Đăng ký PRO](https://huggingface.co/settings/billing/subscription) để lưu trữ tối đa 10 Spaces ZeroGPU dưới tài khoản của bạn.
  - Tổ chức: [Đăng ký gói Team hoặc Enterprise](https://huggingface.co/enterprise) để bật ZeroGPU Spaces cho tất cả thành viên trong tổ chức.

## Thông số kỹ thuật

ZeroGPU hỗ trợ hai kích thước GPU

| Kích thước GPU            | Phần cứng hỗ trợ                   | Vram | Chi phí hạn mức |
|---------------------|------------------------------------|------|------------|
| `large` *(mặc định)* | Một nửa NVIDIA RTX Pro 6000 Blackwell | 48GB | 1×         |
| `xlarge`            | Toàn bộ NVIDIA RTX Pro 6000 Blackwell | 96GB | 2×         |

> [!NOTE]
> Xem [chọn kích thước GPU](#gpu-size-selection) để tìm hiểu cách sử dụng các kích thước

## Tương thích

Các Space ZeroGPU được thiết kế để tương thích với hầu hết các Space GPU dựa trên PyTorch. Mặc dù khả năng tương thích được tăng cường cho các thư viện cấp cao của Hugging Face như `transformers` và `diffusers`, người dùng cần lưu ý rằng:

- Hiện tại, ZeroGPU Spaces chỉ tương thích với **Gradio SDK**.
- Các Space ZeroGPU có thể có khả năng tương thích hạn chế so với các Space GPU tiêu chuẩn.
- Một số vấn đề bất ngờ có thể xảy ra trong một số kịch bản.

### Phiên bản được hỗ trợ

- **Gradio**: 4+
- **PyTorch**: Gần như tất cả các phiên bản từ **2.8.0** đến **mới nhất** đều được hỗ trợ
  
    Xem danh sách đầy đủ

    - 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  

## Bắt đầu với ZeroGPU

Để sử dụng ZeroGPU trong Space của bạn, hãy làm theo các bước sau:

1. Hãy đảm bảo phần cứng ZeroGPU đã được chọn trong cài đặt Space của bạn.
2. Nhập module `spaces`.
3. Trang trí các hàm phụ thuộc vào GPU bằng `@spaces.GPU`.

Quá trình trang trí này cho phép Space yêu cầu một GPU khi hàm được gọi và giải phóng nó khi hoàn tất.

> [!NOTE]
> Trình trang trí `@spaces.GPU` được thiết kế để không gây tác dụng phụ trong các môi trường không phải ZeroGPU, đảm bảo khả năng tương thích trên các cấu hình khác nhau.

### Ví dụ sử dụng

```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()
```

### Tải mô hình

Mặc dù GPU thực sự chỉ khả dụng bên trong các hàm `@spaces.GPU`, các mô hình vẫn phải được đặt trên `cuda` ở cấp độ module gốc (như minh họa trong ví dụ trên).

Việc nạp chậm hoặc di chuyển mô hình sang CUDA bên trong `@spaces.GPU` không được khuyến khích, vì cách này kém hiệu quả hơn đáng kể (các thao tác chuyển CUDA được tối ưu hóa cho việc đặt thiết bị thực hiện trong quá trình khởi động).

> [!NOTE]
> Việc tải mô hình trên `cuda` ở cấp module hoạt động được vì chế độ mô phỏng CUDA của PyTorch được bật bên ngoài các hàm `@spaces.GPU`, cho phép thực hiện các thao tác CUDA mà không cần GPU thực. Bên trong `@spaces.GPU`, CUDA thực được sử dụng.

## Chọn kích thước GPU

Kích thước mặc định được sử dụng bởi `@spaces.GPU` là `large` (một nửa NVIDIA RTX Pro 6000 Blackwell).

Bạn có thể yêu cầu rõ ràng một NVIDIA RTX Pro 6000 Blackwell đầy đủ bằng cách chỉ định `size="xlarge"`:

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

> [!NOTE]
> - `xlarge` tiêu thụ **2×** hạn mức hàng ngày so với `large` (ví dụ: thời lượng tác vụ **hiệu dụng** là 45 giây sẽ tiêu thụ 90 giây hạn mức) - `xlarge` thường đồng nghĩa với xác suất xếp hàng cao hơn và thời gian chờ lâu hơn - Chỉ sử dụng `xlarge` khi khối lượng công việc của bạn thực sự được hưởng lợi từ thêm tài nguyên tính toán hoặc bộ nhớ

## Quản lý thời lượng

Đối với các hàm được dự kiến sẽ vượt quá thời gian chạy GPU mặc định là 60 giây, bạn có thể chỉ định một thời lượng tùy chỉnh:

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

Điều này đặt thời gian chạy tối đa của hàm là 120 giây. Việc chỉ định thời lượng ngắn hơn cho các hàm chạy nhanh sẽ cải thiện độ ưu tiên hàng đợi cho khách truy cập Space.

### Thời lượng động

`@spaces.GPU` cũng hỗ trợ thời lượng động.

Thay vì truyền trực tiếp một khoảng thời gian, hãy chỉ cần truyền một hàm có thể gọi nhận các đầu vào giống với hàm được trang trí của bạn và trả về một giá trị khoảng thời gian:

```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
```

## Biên dịch

ZeroGPU không hỗ trợ `torch.compile`, nhưng bạn có thể sử dụng biên dịch **trước thời điểm thực thi** của PyTorch (yêu cầu torch `2.8+`)

Xem [bài viết trên blog](https://huggingface.co/blog/zerogpu-aoti) này để có hướng dẫn đầy đủ về biên dịch trước thời điểm thực thi trên ZeroGPU.

## Các cấp độ sử dụng

Việc sử dụng GPU bị giới hạn bởi hạn mức **mỗi ngày**, theo cấp tài khoản:

| Loại tài khoản                   | Hạn mức GPU hàng ngày được bao gồm | Ưu tiên hàng đợi  |
| ------------------------------ | ------------------------ | --------------- |
| Chưa xác thực                | 2 phút                | Thấp             |
| Tài khoản miễn phí                   | 5 phút                | Trung bình          |
| Tài khoản PRO                    | 40 phút (có thể mở rộng)  | Cao nhất         |
| Thành viên tổ chức nhóm       | 40 phút (có thể mở rộng)  | Cao nhất         |
| Thành viên tổ chức doanh nghiệp | 60 phút (có thể mở rộng)  | Cao nhất         |

Hạn mức hàng ngày được đặt lại đúng 24 giờ sau lần sử dụng GPU đầu tiên của bạn.

> [!NOTE]
> Hạn mức còn lại ảnh hưởng trực tiếp đến mức ưu tiên trong hàng đợi ZeroGPU.

### Mở rộng hạn mức bằng điểm

Người dùng PRO, Team và Enterprise có thể tiếp tục sử dụng ZeroGPU Spaces vượt quá hạn mức hàng ngày được bao gồm bằng cách tiêu thụ tín dụng trả trước với mức phí **1 đô la cho mỗi 10 phút** thời gian GPU. Khi hạn mức hàng ngày của bạn đã dùng hết, mọi mức sử dụng GPU bổ sung sẽ được tự động tính phí vào số dư tín dụng của bạn.

Bạn có thể thêm hạn mức từ [cài đặt thanh toán](https://huggingface.co/settings/billing) của mình.

## Hạn chế về lưu trữ

- **Tài khoản cá nhân miễn phí**: Tối đa 2 Spaces ZeroGPU, dành cho các tài khoản có tình trạng tốt (email đã xác minh, tài khoản trên 30 ngày).
- **Tài khoản cá nhân ([người đăng ký PRO](https://huggingface.co/subscribe/pro))**: Tối đa 10 Spaces ZeroGPU.
- **Tài khoản tổ chức ([Team & Enterprise](https://huggingface.co/enterprise))**: Tối đa 50 ZeroGPU Spaces.

Bằng cách tận dụng ZeroGPU, các nhà phát triển có thể tạo ra các Spaces hiệu quả và có khả năng mở rộng hơn, tối đa hóa việc sử dụng GPU trong khi giảm thiểu chi phí.

## Khuyến nghị

Nếu demo của bạn sử dụng một mô hình lớn, chúng tôi khuyến nghị sử dụng các tối ưu hóa như biên dịch trước (ahead-of-time compilation) và flash-attention 3. Bạn có thể tìm hiểu cách tận dụng những tính năng này với ZeroGPU trong [bài viết này](https://huggingface.co/blog/zerogpu-aoti). Các tối ưu hóa này sẽ giúp bạn khai thác tối đa lợi thế của các giờ ZeroGPU và mang lại trải nghiệm người dùng tốt hơn.

## Phản hồi

Bạn có thể chia sẻ phản hồi về Spaces ZeroGPU trực tiếp trên HF Hub: https://huggingface.co/spaces/zero-gpu-explorers/README/discussions

