# 概要

Transformers は、モデルを高速かつ低コストで利用可能にするための複数の推論最適化技術を提供しています。選択肢には、メモリトラフィックを削減するための代替的なアテンション機構、高速な実行のためのコードコンパイル、スループット向上のための最適化されたカーネルが含まれます。これらの技術を組み合わせることで、最大限のパフォーマンスを発揮できます。

デバイスのセットアップやハードウェア固有の設定については、[Hardware](./hardware)ガイドを参照してください。以下の最適化を適用する前に、お使いのハードウェアでどの技術がサポートされているかを確認してください。

> [!NOTE]
> メモリと速度は密接に関連していますが、同じものではありません。メモリフットプリントを縮小すると、移動させるデータ量が減るため、モデルは「高速」になります。純粋な速度最適化は必ずしもメモリを削減するわけではなく、場合によっては使用量が増えることもあります。ユースケースとハードウェアに基づいて、適切な最適化を選択してください。

以下の表を参照して、最適化手法を選択してください。

| 技術 | 速度 | メモリ |
|---|:---:|:---:|
| [コンパイル](#compilation) | ✅ | |
| [Attention バックエンド](#attention-backends) | ✅ | ✅ |
| [カーネル](#kernels) | ✅ | ✅ |
| [量子化](#quantization) | ✅ | ✅ |
| [キャッシュ](#caching) | ✅ | ✅ |
| [並列性](#parallelism) | ✅ | |
| [連続バッチ処理](#continuous-batching) | ✅ | |

このガイドでは、Transformersの最適化に関するクイックスタートをご案内します。

## コンパイル

[torch.compile](./perf_torch_compile) は Python のオーバーヘッドを削減し、オペレーションを融合し、形状やハードウェアに最適化されたカーネルを生成します。初回の実行でウォームアップが行われ、以降の実行では高速なコンパイル済みパスが使用されます。

`torch.compile`を自動的にトリガーするには、[generate()](/docs/transformers/main/ja/main_classes/text_generation#transformers.GenerationMixin.generate)に[固定サイズキャッシュ](./kv_cache#fixed-size-cache)を渡します。

```py
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-0.6B", dtype=torch.float16, device_map="auto")
input = tokenizer("The French Bread Law states", return_tensors="pt").to(model.device)

output = model.generate(**input, do_sample=False, max_new_tokens=20, cache_implementation="static")
tokenizer.batch_decode(output, skip_special_tokens=True)[0]
```

> [!WARNING]
> モデルが各ステップで再コンパイルされるのを防ぐため、[generate()](/docs/transformers/main/ja/main_classes/text_generation#transformers.GenerationMixin.generate)の外で`torch.compile(model)`を呼び出さないでください。

## アテンションのバックエンド

代替の[アテンションバックエンド](./attention_interface)はメモリトラフィックを低減します。例えば、FlashAttentionはアテンションの計算をタイル化し、大きな中間テンソルを回避することでメモリフットプリントを削減します。

`attn_implementation` を [from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) に設定して、最適化されたアテンションバックエンドを読み込みます。

```py
from transformers import AutoModelForCausalLM

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

## カーネル

Kernelsは演算を融合してスループットを向上させ、メモリ使用量を削減します。[Kernels](https://huggingface.co/docs/kernels/en/index)ライブラリは、[Hub](https://huggingface.co/kernels-community)から最適化された計算カーネルを、柔軟かつバージョン安全な方法で読み込みます。

FlashAttention-2のパッケージをインストールせずに、最適化されたカーネルを読み込む例を以下に示します。

```py
import torch
from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", attn_implementation="kernels-community/flash-attn2"
)
```

## 量子化

[Quantization](./quantization/overview) はすべてのパラメータのサイズを縮小し、メモリ使用量を削減するとともに、より多くの演算を実行できるため処理速度を向上させます。

`quantization_config` 引数に量子化設定を渡します。[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) で使用します。各量子化バックエンドには、異なる引数を持つ個別の設定があります。以下の例では、[bitsandbytes](./quantization/bitsandbytes) バックエンドを使用してモデルを4ビットに量子化し、計算のデータ型を設定しています。

```py
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16)

model = AutoModelForCausalLM.from_pretrained(
    "allenai/Olmo-3-7B-Think", quantization_config=bnb_config
)
```

## キャッシュ

[Caching](./kv_cache)は、すべてのトークンに対して再計算するのではなく、過去のキーと値を再利用することで生成を高速化します。過去のキーと値を保存するメモリコストを相殺し、削減するために、TransformersはキャッシュをCPUへオフロードすることをサポートしています。GPU上に残るのは現在のレイヤーのみです。

[generate()](/docs/transformers/main/ja/main_classes/text_generation#transformers.GenerationMixin.generate) の `cache_implementation` 引数を使用して、キャッシュ戦略を設定します。

```py
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")
model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B", attn_implementation="kernels-community/flash-attn2"
)
inputs = tokenizer("The Le Décret Pain states that a baguette must,", return_tensors="pt")
outputs = model.generate(**inputs, do_sample=False, max_new_tokens=50, cache_implementation="offloaded")
```

## 並列性

[Parallelism](./perf_infer_gpu_multi)は、モデルを複数のデバイスに分散して配置し、1つのデバイスに収まらないほど大きなモデルでも高速に実行できるようにする手法です。このアプローチでは、シャード化のオーバーヘッドや結果を同期するための通信が発生するため、メモリ使用量が増加します。

[テンソル並列](./perf_infer_gpu_multi)では、モデルのレイヤーを複数のデバイスに分割します。`DistributedConfig(tp_size=N)`で使用するデバイス数を設定し、[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained)に渡すことで有効にできます。

```py
from transformers import AutoModelForCausalLM, DistributedConfig

distributed_config = DistributedConfig(tp_size=4)
model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Meta-Llama-3-8B-Instruct",
    distributed_config=distributed_config,
)
print(model._tp_plan)
```

## 連続バッチ処理

[Continuous batching](./continuous_batching)は、動的スケジューリングとチャンク化プリフィルによりGPUを常に稼働させ、スループットを最大化します。[Serving](./serve-cli/serving)アプリケーションでは、これを用いて複数の受信リクエストを並行して処理します。

[generate_batch()](/docs/transformers/main/ja/main_classes/text_generation#transformers.ContinuousMixin.generate_batch) を使用して、連続バッチ処理を有効にします。

```py
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import ContinuousBatchingConfig, GenerationConfig

model = AutoModelForCausalLM.from_pretrained(
    "Qwen/Qwen3-0.6B",
    attn_implementation="sdpa",
    device_map="auto",
    torch_dtype=torch.bfloat16,
)
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-0.6B")

prompts = [
    "The Le Décret Pain states that a baguette must",
    "Explain gravity in one sentence.",
    "Name the capital of France.",
]
inputs = [tokenizer.encode(p) for p in prompts]

generation_config = GenerationConfig(
    max_new_tokens=32,
    eos_token_id=tokenizer.eos_token_id,
    pad_token_id=tokenizer.pad_token_id,
    do_sample=False,
)
continuous_batching_config = ContinuousBatchingConfig(max_batch_tokens=512)

outputs = model.generate_batch(
    inputs=inputs,
    generation_config=generation_config,
    continuous_batching_config=continuous_batching_config,
)

for request_id, output in outputs.items():
    text = tokenizer.decode(output.generated_tokens, skip_special_tokens=True)
    print(f"[{request_id}] {text}")
```

