# Intel Gaudi

Intel Gaudi アクセラレータは、[Intel Gaudi](https://docs.habana.ai/en/latest/index.html) スタック上で PyTorch を実行し、デバイス文字列は `hpu` です。Gaudi はデフォルトで PyTorch を eager モードで実行します。eager モードでは、CPU や GPU 上の PyTorch と同様に、各オペレーションが呼び出された時点で即座に実行されるため、Transformers のモデルは Gaudi 固有の変更なしで Gaudi 上で実行できます。代わりにモデルをグラフとしてキャプチャするには、`torch.compile` で[コンパイル](#compile-the-model)します。

## インストール

Intel Gaudi ソフトウェアとその PyTorch パッケージ（`habana-torch-plugin`、`habana_frameworks` としてインポート）を、[Intel Gaudi インストールガイド](https://docs.habana.ai/en/latest/Installation_Guide/index.html)に従ってインストールし、[Accelerate](https://huggingface.co/docs/accelerate/index) 1.5.0 以降もインストールしてください。

Transformers はトークン ID に int64 テンソルを使用するため、Gaudi 上で int64 サポートを有効にしてください。Transformers の Gaudi CI も同じ設定で実行されています。

```bash
export PT_ENABLE_INT64_SUPPORT=1
```

Transformersがデバイスを確認できることを確認します。

```py
from transformers import is_torch_hpu_available

print(is_torch_hpu_available())
```

Gaudi が使用可能な場合は `True` を出力し、Accelerate が 1.5.0 より古い場合は、Gaudi デバイスが存在していても `False` を出力します。

## デバイスの選択

Docker コンテナの起動時に、コンテナが使用できる Gaudi デバイスを選択します。`HABANA_VISIBLE_MODULES` にモジュール ID を設定するか、`HABANA_VISIBLE_DEVICES` にデバイスインデックスを設定します。モジュール ID は再起動やドライバーの再インストール後も変更されませんが、デバイスインデックスは変更される可能性があります。どちらにも設定しない場合、PyTorch はサーバー上で利用可能な任意の Gaudi デバイスを使用します。

```bash
docker run --runtime=habana -e HABANA_VISIBLE_MODULES=0,1,2,3 ...
```

`hl-smi -Q index,module_id -f csv` を実行して、デバイスインデックスとモジュールIDの対応付けを行います。サーバーの一部で分散ワークロードを実行する場合、Intelは2デバイスおよび4デバイスのグループのみをサポートしています。サポートされているモジュールIDの組み合わせについては、[単一のワークロードを持つ複数のDocker](https://docs.habana.ai/en/latest/Orchestration/Multiple_Tenants_on_HPU/Multiple_Dockers_each_with_Single_Workload.html)を参照してください。

## 推論を実行する

`device_map="hpu"` を [from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) に渡します。`device` を渡さない場合、[pipeline()](/docs/transformers/main/ja/main_classes/pipelines#transformers.pipeline) は Gaudi を自動的に選択します。

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

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

inputs = tokenizer("Intel Gaudi is", 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))
```

## モデルの量子化

[bitsandbytes](./quantization/bitsandbytes) は、Gaudi 2 および Gaudi 3 上でモデルを 4 ビットまたは 8 ビットに量子化します。`device_map` を指定しない場合、モデルは現在の Gaudi デバイスに配置されます。

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

## Trainerで学習

[TrainingArguments](/docs/transformers/main/ja/main_classes/trainer#transformers.TrainingArguments) は Gaudi を検出し、デバイスを `hpu` に設定します。そのため、`Trainer` はデバイス設定なしで Gaudi 上で学習を実行できます。すべての Gaudi 世代は bf16 をサポートしています。

```py
from transformers import TrainingArguments

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

`Trainer`がGaudi上で学習を行う場合、`hpu`デバイスが出力されます。

## モデルをコンパイルする

Transformers は Gaudi 上で `torch.compile` をラップしているため、`hpu_backend` または `eager` 以外のバックエンドを指定した呼び出し、およびモデリングコード内の `@torch.compile` デコレータを含むすべての呼び出しは、`hpu_backend` に切り替わり、警告がログに出力されます。このラッパーは、推論でも学習でも、すべての `torch.compile` 呼び出しに適用されます。

モデルをトレーニング用にコンパイルするには、[TrainingArguments](/docs/transformers/main/ja/main_classes/trainer#transformers.TrainingArguments)で`torch_compile=True`を設定します。これにより、`torch_compile_backend`が`"hpu_backend"`に設定されます。

```py
from transformers import TrainingArguments

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

### 分散学習

分散学習では、[HCCL](https://docs.habana.ai/en/latest/API_Reference_Guides/HCCL_APIs/index.html) コレクティブバックエンドを使用します。Transformers は Gaudi 上でこれを自動的に選択しますが、`ddp_backend="hccl"` を指定して明示的に設定することもできます。

```py
training_args = TrainingArguments(
    output_dir="./outputs",
    bf16=True,
    ddp_backend="hccl",
)
```

[デバイスの選択](#select-devices)を行った後、`torchrun`または`accelerate launch`を使用して、Gaudiデバイスごとに1つのプロセスを起動します。`accelerate launch`では、`--num_processes`を指定しない場合、プロセス数はGaudiデバイスの数に設定されます。

```bash
accelerate launch train.py
```

## 次のステップ

- ハードウェアの詳細、ソフトウェアスタック、および[Gaudi アーキテクチャ](https://docs.habana.ai/en/latest/Gaudi_Overview/Gaudi_Architecture.html)については、[Intel Gaudi ドキュメント](https://docs.habana.ai/en/latest/index.html)を参照してください。
- Gaudi向けの最適化されたモデル実装による学習と推論には、[Optimum for Intel Gaudi](https://huggingface.co/docs/optimum-habana/index)をお試しください。

