# Intel GPU

Intel GPU는 `xpu`라는 디바이스 문자열을 가진 XPU 백엔드를 통해 PyTorch를 실행합니다. PyTorch의 XPU 빌드는 별도의 패키지 인덱스에서 제공되므로, 아래 설치 명령에서는 이를 추가 인덱스로 지정합니다.

## 설치

[PyTorch용 Intel GPU 드라이버](https://www.intel.com/content/www/us/en/developer/articles/tool/pytorch-prerequisites-for-intel-gpu/2-15.html)를 설치한 후 `xpu-smi`를 실행하여 [시스템이 GPU를 감지하는지 확인](https://dgpu-docs.intel.com/driver/verification.html)합니다.

PyTorch를 XPU 인덱스에서 Transformers와 함께 설치합니다.

```bash
pip install "transformers[torch]" --extra-index-url https://download.pytorch.org/whl/xpu
```

PyTorch가 GPU를 인식할 수 있는지 확인합니다.

```py
import torch

print(torch.xpu.is_available(), torch.xpu.device_count())
```

`True`와 GPU의 수를 출력합니다. 예를 들어 `True 2`와 같습니다.

## XPU 선택 및 순서 지정

XPUs를 선택하려면 `ZE_AFFINITY_MASK` 환경 변수를 사용하세요. 나중에 실행이 의도하지 않은 XPUs로 조용히 전송될 수 있으므로, 해당 변수를 실행과 동일한 명령줄에서 설정하세요.

예를 들어, 4개의 XPU 중 0번과 2번을 선택하려면:

```cli
ZE_AFFINITY_MASK=0,2 torchrun trainer-program.py ...
```

PyTorch는 XPU 0과 2만 인식합니다. `ZE_AFFINITY_MASK`의 값 순서는 PyTorch가 장치를 나열하는 순서를 변경하지 않습니다. 실행 간 일관된 순서를 얻으려면, PCI 버스 ID가 낮은 순서부터 높은 순서로 장치를 보고하도록 하는 `ZE_ENABLE_PCI_ID_DEVICE_ORDER=1`도 설정하세요.

```cli
ZE_ENABLE_PCI_ID_DEVICE_ORDER=1 ZE_AFFINITY_MASK=0,2 torchrun trainer-program.py ...
```

장치 열거에 대한 자세한 내용은 [Level Zero 사양](https://oneapi-src.github.io/level-zero-spec/level-zero/latest/core/PROG.html)을 참조하세요.

## 어텐션 백엔드 선택

모델을 로드할 때 `attn_implementation`으로 attention backends를 설정하며, 이는 추론과 학습 모두에 적용됩니다. 모델은 기본적으로 [SDPA](./attention_interface)를 사용합니다. PyTorch 2.8 이상에서는 XPU의 SDPA가 key와 value head를 먼저 반복하지 않고 grouped-query attention을 직접 처리합니다.

`attn_implementation="flash_attention_2"`는 Hub에서 [kernels-community/flash-attn2](https://huggingface.co/kernels-community/flash-attn2)를 로드하며, 여기에는 XPU 빌드가 포함되어 있습니다. 이를 사용하려면 `kernels` 추가 항목을 설치하세요. FlashAttention-3과 FlashAttention-4는 NVIDIA GPU에서만 실행됩니다.

```bash
pip install "transformers[kernels]"
```

```py
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B",
    dtype="bfloat16",
    device_map="xpu",
    attn_implementation="flash_attention_2",
)
```

## 추론 실행

`device_map="auto"`를 [from_pretrained()](/docs/transformers/main/ko/main_classes/model#transformers.PreTrainedModel.from_pretrained)에 전달하면 하나의 XPU에 맞지 않는 모델을 사용 가능한 여러 XPU에 나눠 배치할 수 있으며, `device_map="xpu"`를 전달하면 단일 XPU에 로드합니다. `device`를 전달하지 않으면 [pipeline()](/docs/transformers/main/ko/main_classes/pipelines#transformers.pipeline)이 XPU를 자동으로 선택합니다.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype="bfloat16", device_map="xpu")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")

inputs = tokenizer("Intel GPUs are", return_tensors="pt").to(model.device)
output = model.generate(**inputs, max_new_tokens=50, do_sample=False)
print(tokenizer.decode(output[0], skip_special_tokens=True))
```

[Continuous batching](./continuous_batching)는 Intel GPU에서 XPU 그래프와 비동기 배치 처리를 지원하며, 이를 사용할지 여부를 자동으로 결정합니다.

## Hub 커널 사용

`use_kernels=True`를 [from_pretrained()](/docs/transformers/main/ko/main_classes/model#transformers.PreTrainedModel.from_pretrained)에 설정하면 Hub의 최적화 커널로 지원되는 레이어를 대체할 수 있습니다. Intel GPU는 NVIDIA GPU와 동일한 대부분의 레이어, 예를 들어 activations, RMSNorm, rotary embeddings 등을 지원합니다. 이를 사용하려면 `kernels` extra를 설치하세요.

```py
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", dtype="bfloat16", device_map="xpu", use_kernels=True
)
```

Hub 커널은 학습에도 적용됩니다. `model.train()` 또는 `model.eval()`을 호출하면 해당 모드에 맞는 커널로 교체됩니다. 커널을 직접 선택하려면 [KernelConfig](/docs/transformers/main/ko/main_classes/kernels#transformers.KernelConfig)를 전달하고, XPU 전용 매핑의 디바이스 키로 `"xpu"`를 사용하세요. 전체 매핑은 [커널 로딩](./kernel_doc/loading_kernels)을 참고하세요.

## 모델 양자화

Quantization을 사용하면 더 큰 모델을 GPU 메모리에 맞출 수 있습니다. XPU에서 실행되는 방법을 확인하려면 [quantization 개요](./quantization/overview)의 Intel GPU 열을 확인하세요.

GPU 메모리에 맞지 않는 모델을 fine-tune하려면 [bitsandbytes](./quantization/bitsandbytes)로 4-bit로 로드하고 [PEFT](./peft)로 LoRA 어댑터를 학습하세요.

## Trainer로 학습

[TrainingArguments](/docs/transformers/main/ko/main_classes/trainer#transformers.TrainingArguments)는 Intel GPU를 감지하여 장치를 `xpu`로 설정하므로, [Trainer](/docs/transformers/main/ko/main_classes/trainer#transformers.Trainer)는 별도의 장치 설정 없이 해당 GPU에서 학습을 수행합니다. `TrainingArguments`는 `torch.xpu.is_bf16_supported()`를 통해 bf16 지원 여부를 확인하며, GPU가 이를 지원하지 않으면 `ValueError`를 발생시킵니다.

```py
from transformers import TrainingArguments

training_args = TrainingArguments(
    output_dir="./outputs",
    bf16=True,
)
print(training_args.device)
```

`Trainer`가 단일 XPU에서 학습할 경우 `xpu:0`를 출력합니다.

### 분산 학습

분산 학습은 `xccl` 콜렉티브 백엔드를 사용합니다. `torchrun` 또는 `accelerate launch`를 사용하여 XPU마다 하나의 프로세스를 시작합니다.

```bash
torchrun --nproc_per_node=2 train.py
```

[DDP](./ddp), [FSDP2](./fsdp), [DeepSpeed ZeRO](./deepspeed), [Tensor parallelism](./tensor_parallelism)를 참고하여 병렬화 전략을 선택하세요.

## 다음 단계

- 지원되는 하드웨어 및 플랫폼에 대한 PyTorch [Intel GPU 시작하기](https://docs.pytorch.org/docs/stable/notes/get_start_xpu.html) 가이드를 읽어보세요.
- `attn_implementation`이 어텐션 함수를 선택하는 방식을 배우려면 [Attention backends](./attention_interface)를 읽어보세요.

