# NVIDIA GPU

NVIDIA GPU は CUDA を通じて PyTorch を実行し、デバイス文字列は `cuda` です。Transformers におけるほとんどのアテンションカーネルやサービング最適化は CUDA をサポートしており、FlashAttention-3 や FlashAttention-4 のように CUDA でのみ実行されるものもあります。

## インストール

GPU用のCUDAドライバーをインストールし、その後PyTorchとTransformersをインストールしてください。NVIDIA Spark (ARM64) デバイスはNVIDIAのパッケージインデックスからPyTorchをインストールする必要があります。詳細は[インストールガイド](./installation)を参照してください。

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

PyTorchがGPUを認識できることを確認します。

```py
import torch

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

`True` と GPU の数が出力されます。例えば `True 4` のようにです。

## GPUの選択と順序付け

`CUDA_VISIBLE_DEVICES` 環境変数を使用して、使用する GPU を選択し、その順序を設定します。エクスポートした変数を忘れてしまうと、後続の実行が意図せず誤った GPU に割り当てられてしまう可能性があるため、実行コマンドと同じコマンドライン上で設定してください。

例えば、4つのGPUから0番と2番を選択するには:

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

PyTorch は GPU 0 と 2 のみを認識し、それぞれ `cuda:0` と `cuda:1` にマッピングされます。順序を逆にする（GPU 2 を `cuda:0` として、GPU 0 を `cuda:1` として使用する）には:

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

GPUなしで実行するには:

```cli
CUDA_VISIBLE_DEVICES= python trainer-program.py ...
```

CUDA はデフォルトで GPU を最速の順に番号付けしますが、`nvidia-smi` の表示と一致しない場合があります。`CUDA_VISIBLE_DEVICES` のインデックスが `nvidia-smi` と一致するように、`CUDA_DEVICE_ORDER=PCI_BUS_ID` を設定してください。

```cli
CUDA_DEVICE_ORDER=PCI_BUS_ID CUDA_VISIBLE_DEVICES=0,2 torchrun trainer-program.py ...
```

## アテンションバックエンドを選択

モデルの読み込み時に`attn_implementation`でアテンションバックエンドを設定し、推論と学習の両方に適用されます。モデルはデフォルトで[SDPA](./attention_interface)を使用します。NVIDIA GPUは3つのFlashAttentionバージョンをサポートしています。FlashAttentionパッケージがインストールされていない場合、Transformersは代わりにHubから事前構築されたカーネルを読み込みますが、これには`kernels`エクストラ（`pip install "transformers[kernels]"`）が必要です。

| `attn_implementation` | GPU | パッケージがインストールされていない場合のHubカーネル |
|---|---|---|
| `"flash_attention_2"` | Ampere以降 | `kernels-community/flash-attn2` |
| `"flash_attention_3"` | Ampere以降 | `kernels-community/vllm-flash-attn3` |
| `"flash_attention_4"` | Hopper以降 | `kernels-community/flash-attn4` |

```py
from transformers import AutoModelForCausalLM

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

## 推論を実行する

`device_map="auto"` を [from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) に渡すことで、1つの GPU に収まらないモデルを利用可能な複数の GPU に分割して配置できます。また、`device_map="cuda"` を渡すことで、単一の GPU にロードできます。`device` を渡さない場合、[pipeline()](/docs/transformers/main/ja/main_classes/pipelines#transformers.pipeline) は自動的に GPU を選択します。

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

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

inputs = tokenizer("NVIDIA 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)は、NVIDIA GPU 上で CUDA グラフと非同期バッチ処理をサポートし、それらを使用するかどうかを自動的に判断します。

## Hubカーネルを使用する

Set `use_kernels=True` in [from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) to replace supported layers with optimized kernels from the Hub. NVIDIA GPUs have the widest coverage, including activations, RMSNorm, rotary embeddings, MegaBlocks mixture-of-experts layers, and Mamba state-space ops. Install the `kernels` extra to use them.

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

Hub カーネルはトレーニングにも適用されます。`model.train()` または `model.eval()` を呼び出すと、そのモード用のカーネルに切り替わります。カーネルを自分で選択する場合は、[KernelConfig](/docs/transformers/main/ja/main_classes/kernels#transformers.KernelConfig) を渡し、NVIDIA 固有のマッピングにはデバイスキーとして `"cuda"` を使用します。完全なマッピングについては、[カーネルの読み込み](./kernel_doc/loading_kernels) を参照してください。

## モデルの量子化

Quantizationにより、より大きなモデルをGPUメモリに収めることができます。TransformersのほとんどのQuantization手法はCUDAに対応しています。各手法を比較するには、[Quantizationの概要](./quantization/overview)のCUDA列を確認してください。

GPU メモリに収まらないモデルをファインチューニングするには、[bitsandbytes](./quantization/bitsandbytes) を使用して 4-bit で読み込み、[PEFT](./peft) で LoRA アダプターを学習します。

## Trainerで学習

[TrainingArguments](/docs/transformers/main/ja/main_classes/trainer#transformers.TrainingArguments) は NVIDIA GPU を検出し、デバイスを `cuda` に設定するため、[Trainer](/docs/transformers/main/ja/main_classes/trainer#transformers.Trainer) はデバイス設定なしでそれら上で学習できます。Ampere 以降の GPU では bf16 混合精度を、それ以前の GPU では fp16 を使用してください。

```py
from transformers import TrainingArguments

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

`Trainer`が単一GPUで学習を行う場合、`cuda:0`が出力されます。

### 分散学習

マルチGPUでの学習には、[NCCL](https://developer.nvidia.com/nccl)の集約型バックエンドを使用します。`torchrun`または`accelerate launch`を使用して、GPUごとに1つのプロセスを起動してください。

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

[DDP](./ddp)、[FSDP2](./fsdp)、[DeepSpeed ZeRO](./deepspeed)、[Tensor parallelism](./tensor_parallelism)を参照して、並列化戦略を選択してください。

## 次のステップ

- PyTorchがデバイス、ストリーム、メモリをどのように管理しているかについては、PyTorchの[CUDAセマンティクス](https://docs.pytorch.org/docs/stable/notes/cuda.html)のメモを参照してください。
- トレーニング中にGPUメモリがどこに消費されるかを理解するには、[GPUメモリ使用量](./model_memory_anatomy)を参照してください。
- `attn_implementation` がどのようにアテンション関数を選択するかを学ぶには、[Attention backends](./attention_interface) をお読みください。

