# Spaces ZeroGPU: Spaces를 위한 동적 GPU 할당

ZeroGPU는 Hugging Face Spaces의 AI 모델 및 데모에 대한 GPU 사용량을 최적화하는 공유 인프라입니다. 필요에 따라 NVIDIA RTX Pro 6000 Blackwell GPU를 동적으로 할당하고 해제하며, 다음과 같은 기능을 제공합니다:

1. **무료 GPU 액세스**: Spaces에서 비용 효율적인 GPU 사용을 가능하게 합니다.
2. **멀티 GPU 지원**: 단일 애플리케이션에서 여러 GPU를 동시에 활용하도록 Spaces에 허용합니다.

전통적인 단일 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일 이상)은 ZeroGPU Spaces를 최대 2개까지 무료로 호스팅할 수 있습니다.
  - 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**와만 호환됩니다.
- ZeroGPU Spaces는 표준 GPU 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. GPU에 의존하는 함수를 `@spaces.GPU`로 장식합니다.

이 장식(decoration) 과정을 통해 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`를 사용하세요

## 기간 관리

기본 60초의 GPU 실행 시간을 초과할 것으로 예상되는 함수의 경우, 사용자 지정 지속 시간을 지정할 수 있습니다:

```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+` 필요)

ZeroGPU의 사전 컴파일(AOT compilation)에 대한 전체 가이드는 이 [블로그 포스트](https://huggingface.co/blog/zerogpu-aoti)를 확인하세요.

## 사용량 등급

GPU 사용량은 계정 등급별로 **일일** 할당량이 적용됩니다:

| 계정 유형                   | 포함된 일일 GPU 할당량 | 큐 우선순위  |
| ------------------------------ | ------------------------ | --------------- |
| 인증되지 않음                | 2분                | 낮음             |
| 무료 계정                   | 5분                | 중간          |
| PRO 계정                    | 40분 (확장 가능)  | 가장 높은         |
| 팀 조직 구성원       | 40분 (확장 가능)  | 가장 높은         |
| Enterprise 조직 멤버 | 60분 (확장 가능)  | 가장 높은         |

포함된 일일 할당량은 GPU를 처음 사용한 시점부터 정확히 24시간 후에 초기화됩니다.

> [!NOTE]
> 남은 할당량은 ZeroGPU 대기열에서 우선순위에 직접적인 영향을 미칩니다.

### 크레딧으로 쿼터 확장

PRO, Team, Enterprise 사용자는 포함된 일일 할당량을 초과하여 ZeroGPU Spaces를 계속 사용할 수 있으며, GPU 사용 시간 **10분당 $1**의 비율로 선불 크레딧이 차감됩니다. 일일 할당량이 소진되면 추가 GPU 사용량은 크레딧 잔액에서 자동으로 청구됩니다.

[결제 설정](https://huggingface.co/settings/billing)에서 크레딧을 추가할 수 있습니다.

## 호스팅 제한

- **무료 개인 계정**: 상태가 양호한 계정(이메일 인증 완료, 계정 생성 30일 이상)의 경우 최대 2개의 ZeroGPU Spaces를 사용할 수 있습니다.
- **개인 계정([PRO 구독자](https://huggingface.co/subscribe/pro))**: 최대 10개의 ZeroGPU Spaces.
- **조직 계정([Team & Enterprise](https://huggingface.co/enterprise))**: 최대 50개의 ZeroGPU Spaces.

ZeroGPU를 활용하면 개발자는 GPU 활용도를 극대화하고 비용을 최소화하면서 더 효율적이고 확장 가능한 Spaces를 만들 수 있습니다.

## 권장 사항

데모에 대규모 모델을 사용하는 경우, ahead-of-time compilation과 flash-attention 3와 같은 최적화를 사용하는 것을 권장합니다. 이러한 최적화를 ZeroGPU와 함께 활용하는 방법은 [이 게시물](https://huggingface.co/blog/zerogpu-aoti)에서 배울 수 있습니다. 이러한 최적화는 ZeroGPU 시간의 이점을 극대화하고 더 나은 사용자 경험을 제공하는 데 도움이 됩니다.

## 피드백

Spaces ZeroGPU에 대한 피드백은 HF Hub에서 직접 공유할 수 있습니다: https://huggingface.co/spaces/zero-gpu-explorers/README/discussions

