# Çıkarımı hızlandır

Diffusion modelleri, gürültünün belirli bir "adım" sayısı boyunca kademeli olarak bir görüntüye veya videoya dönüştürüldüğü iteratif bir süreç olduğu için çıkarım sırasında yavaştır. Bu süreci hızlandırmak için farklı [schedulers](../api/schedulers/overview) ile deneyler yapabilir, daha hızlı hesaplamalar için model ağırlıklarının hassasiyetini düşürebilir, daha bellek verimli dikkat mekanizmaları kullanabilir ve daha fazlasını yapabilirsiniz.

Bu teknikleri birleştirerek ve birlikte kullanarak, herhangi bir tekniğin tek başına kullanılmasından daha hızlı çıkarım yapabilirsiniz.

Bu kılavuz, çıkarımın nasıl hızlandırılacağını ele alacaktır.

## Model veri türü

Model ağırlıklarının hassasiyeti ve veri tipi, daha yüksek hassasiyetin yüklenmesi için daha fazla bellek ve hesaplamaların yapılması için daha fazla zaman gerektirmesi nedeniyle çıkarım hızını etkiler. PyTorch, model ağırlıklarını varsayılan olarak float32 veya tam hassasiyette yükler, bu nedenle veri tipini değiştirmek, daha hızlı çıkarım elde etmenin basit bir yoludur.

bfloat16, float16'ye benzer ancak sayısal hatalara karşı daha dayanıklıdır. bfloat16 için donanım desteği değişkenlik gösterse de, en son nesil GPU'ların çoğu bfloat16 desteğine sahiptir.

```py
import torch
from diffusers import StableDiffusionXLPipeline

pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
pipeline(prompt, num_inference_steps=30).images[0]
```

float16, bfloat16'ye benzer ancak sayısal hatalara daha yatkın olabilir.

```py
import torch
from diffusers import StableDiffusionXLPipeline

pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
pipeline(prompt, num_inference_steps=30).images[0]
```

[TensorFloat-32 (tf32)](https://blogs.nvidia.com/blog/2020/05/14/tensorfloat-32-precision-format/) modu, NVIDIA Ampere GPU'lerde desteklenir ve konvolüsyon ile matris çarpma işlemlerini tf32'de hesaplar. Depolama ve diğer işlemler float32'de tutulur. Bu, bfloat16 veya float16 ile birleştirildiğinde önemli ölçüde daha hızlı hesaplama sağlar.

PyTorch varsayılan olarak yalnızca konvolüsyonlar için tf32 modunu etkinleştirir ve matris çarpımları için bunu açıkça etkinleştirmeniz gerekir.

```py
import torch
from diffusers import StableDiffusionXLPipeline

torch.backends.cuda.matmul.allow_tf32 = True

pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
pipeline(prompt, num_inference_steps=30).images[0]
```

Daha fazla ayrıntı için [karma hassasiyetli eğitim](https://huggingface.co/docs/transformers/en/perf_train_gpu_one#mixed-precision) belgelerine bakın.

## Ölçekli nokta çarpımı dikkati

> [!TIP]
> Bellek verimli dikkat, çıkarım hızını *ve* [bellek kullanımını](./memory#memory-efficient-attention) optimize eder!

[Scaled dot product attention (SDPA)](https://pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html), [FlashAttention](https://github.com/Dao-AILab/flash-attention), [xFormers](https://github.com/facebookresearch/xformers) ve yerel bir C++ uygulaması olmak üzere çeşitli dikkat (attention) arka uçlarını (backend) uygular. Donanımınız için en optimal arka ucu otomatik olarak seçer.

PyTorch >= 2.0 kullanıyorsanız SDPA varsayılan olarak etkinleştirilir ve kodunuzda ek değişiklikler gerektirmez. Ancak kendi dikkat mekanizmanızı seçmek isterseniz, diğer dikkat arka uçlarıyla deneyler yapmayı deneyebilirsiniz. Aşağıdaki örnek, verimli dikkati etkinleştirmek için [torch.nn.attention.sdpa_kernel](https://pytorch.org/docs/stable/generated/torch.nn.attention.sdpa_kernel.html) bağlam yöneticisini kullanır.

```py
from torch.nn.attention import SDPBackend, sdpa_kernel
import torch
from diffusers import StableDiffusionXLPipeline

pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"

with sdpa_kernel(SDPBackend.EFFICIENT_ATTENTION):
  image = pipeline(prompt, num_inference_steps=30).images[0]
```

## torch.compile

[torch.compile](https://pytorch.org/tutorials/intermediate/torch_compile_tutorial.html), PyTorch kodunu ve işlemlerini optimize edilmiş çekirdeklere derleyerek çıkarımı hızlandırır. Diffusers genellikle UNet, transformer veya VAE gibi daha fazla hesaplama yoğunluğuna sahip modelleri derler.

Maksimum hız için aşağıdaki derleyici ayarlarını etkinleştirin (daha fazla seçenek için [tam listeye](https://github.com/pytorch/pytorch/blob/main/torch/_inductor/config.py) bakın).

```py
import torch
from diffusers import StableDiffusionXLPipeline

torch._inductor.config.conv_1x1_as_mm = True
torch._inductor.config.coordinate_descent_tuning = True
torch._inductor.config.epilogue_fusion = False
torch._inductor.config.coordinate_descent_check_all_directions = True
```

UNet ve VAE'yi yükleyip derleyin. Seçebileceğiniz birkaç farklı mod vardır, ancak `"max-autotune"`, CUDA grafiğine derleyerek en hızlı hızı optimize eder. CUDA grafikleri, birden fazla GPU işlemini tek bir CPU işlemiyle başlatarak etkin bir şekilde yükü azaltır.

> [!TIP]
> With PyTorch 2.3.1, you can control the caching behavior of torch.compile. This is particularly beneficial for compilation modes like `"max-autotune"` which performs a grid-search over several compilation flags to find the optimal configuration. Learn more in the [Compile Time Caching in torch.compile](https://pytorch.org/tutorials/recipes/torch_compile_caching_tutorial.html) tutorial.

Bellek yerleşimini [channels_last](./memory#torchchannelslast) olarak değiştirmek, belleği ve çıkarım hızını da optimize eder.

```py
pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.unet.to(memory_format=torch.channels_last)
pipeline.vae.to(memory_format=torch.channels_last)
pipeline.unet = torch.compile(
    pipeline.unet, mode="max-autotune", fullgraph=True
)
pipeline.vae.decode = torch.compile(
    pipeline.vae.decode,
    mode="max-autotune",
    fullgraph=True
)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
pipeline(prompt, num_inference_steps=30).images[0]
```

Derleme ilk seferde yavaştır, ancak bir kez derlendikten sonra önemli ölçüde daha hızlıdır. Derlenmiş hattı yalnızca aynı türde çıkarım işlemleri için kullanmaya çalışın. Derlenmiş hattı farklı bir görüntü boyutuyla çağırmak, yavaş ve verimsiz olan derlemeyi yeniden tetikler.

### Dinamik şekil derlemesi

> [!TIP]
> Daha iyi destek için her zaman PyTorch'un nightly sürümünü kullanmayı unutmayın.

`torch.compile`, girdi şekillerini ve koşulları takip eder ve bunlar farklıysa modeli yeniden derler. Örneğin, bir model 1024x1024 çözünürlüklü bir görüntü üzerinde derlenip farklı bir çözünürlüğe sahip bir görüntüde kullanılırsa yeniden derleme tetiklenir.

Yeniden derlemeyi önlemek için, koşullar değiştiğinde yeniden derlemeyi önlemek amacıyla daha dinamik bir çekirdek üretmeye çalışmak için `dynamic=True` ekleyin.

```diff
+ torch.fx.experimental._config.use_duck_shape = False
+ pipeline.unet = torch.compile(
    pipeline.unet, fullgraph=True, dynamic=True
)
```

`use_duck_shape=False` parametresini belirtmek, derleyicinin aynı olan giriş boyutlarını temsil etmek için aynı sembolik değişkeni kullanıp kullanmaması gerektiğini belirtir. Daha fazla ayrıntı için bu [yorumu](https://github.com/huggingface/diffusers/pull/11327#discussion_r2047659790)na göz atın.

Tüm modeller, hazır olarak dinamik derlemeden faydalanmayabilir ve değişiklikler gerektirebilir. Dinamik derlemeden faydalanmak için [AuraFlowPipeline](/docs/diffusers/main/tr/api/pipelines/aura_flow#diffusers.AuraFlowPipeline) uygulamasını iyileştiren bu [PR](https://github.com/huggingface/diffusers/pull/11297/)'a bakın.

Bir Diffusers modeli için dinamik derleme beklenildiği gibi çalışmıyorsa bir sorun (issue) açmaktan çekinmeyin.

### Bölgesel derleme

[Bölgesel derleme](https://docs.pytorch.org/tutorials/recipes/regional_compilation.html), bir modelin yalnızca *küçük ve sık tekrarlanan blok(lar)ını* - genellikle bir transformer katmanı - derleyerek soğuk başlatma gecikmesini azaltır ve derlenmiş artefaktların her sonraki kullanımında yeniden kullanılmasını sağlar. Birçok difüzyon mimarisi için bu, tam grafik derlemesiyle aynı çalışma zamanı hızlanmalarını sağlar ve derleme süresini 8-10 kat kısaltır.

Aşağıda gösterildiği gibi, transformer modeli gibi herhangi bir bileşende, `torch.compile` işlevini saran yardımcı olan [compile_repeated_blocks()](/docs/diffusers/main/tr/api/models/overview#diffusers.ModelMixin.compile_repeated_blocks) yöntemini kullanın.

```py
# pip install -U diffusers
import torch
from diffusers import StableDiffusionXLPipeline

pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    dtype=torch.float16,
).to("cuda")  # or "mps", "xpu", "cpu"

# compile only the repeated transformer layers inside the UNet
pipeline.unet.compile_repeated_blocks(fullgraph=True)
```

Yeni bir model için bölgesel derlemeyi etkinleştirmek için, derlemek istediğiniz blokların sınıf adlarını (dizeler olarak) içeren bir `_repeated_blocks` özniteliğini model sınıfına ekleyin.

```py
class MyUNet(ModelMixin):
    _repeated_blocks = ("Transformer2DModel",)  # ← compiled by default
```

> [!TIP]
> Daha fazla bölgesel derleme örneği için referans [PR](https://github.com/huggingface/diffusers/pull/11705)'na bakın.

Ayrıca [Accelerate](https://huggingface.co/docs/accelerate/index) içinde, derlenecek aday blokları otomatik olarak seçen bir [compile_regions](https://github.com/huggingface/accelerate/blob/273799c85d849a1954a4f2e65767216eb37fa089/src/accelerate/utils/other.py#L78) metodu da vardır. Kalan grafik ayrı olarak derlenir. Hangi blokların derleneceğini belirlemek veya derleme bayraklarını ayarlamak için çok fazla seçenek olmadığından, bu durum hızlı deneyler için faydalıdır.

```py
# pip install -U accelerate
import torch
from diffusers import StableDiffusionXLPipeline
from accelerate.utils import compile_regions

pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.unet = compile_regions(pipeline.unet, mode="reduce-overhead", fullgraph=True)
```

[compile_repeated_blocks()](/docs/diffusers/main/tr/api/models/overview#diffusers.ModelMixin.compile_repeated_blocks) bilinçli olarak açık bir yapıdadır. Tekrarlanacak blokları `_repeated_blocks` içinde listeleyin ve yardımcı işlev yalnızca bu blokları derler. Bu, önbellek yeniden kullanımını tek satır kodda öngörülebilir bir davranış ve kolay bir çıkarım süreci sunar.

### Grafik kırılmaları

Altta yatan modelde grafik kırılmalarının (graph break) olmamasını sağlamak için torch.compile içinde `fullgraph=True` belirtmek önemlidir. Bu sayede performans düşüşü yaşamadan torch.compile'in avantajlarından yararlanabilirsiniz. UNet ve VAE için bu durum, dönüş değişkenlerine erişim şeklinizi değiştirir.

```diff
- latents = unet(
-   latents, timestep=timestep, encoder_hidden_states=prompt_embeds
-).sample

+ latents = unet(
+   latents, timestep=timestep, encoder_hidden_states=prompt_embeds, return_dict=False
+)[0]
```

### GPU senkronizasyonu

`step()` fonksiyonu, gürültü giderici bir tahmin yaptıktan sonra her seferinde zamanlayıcıda [çağrılır](https://github.com/huggingface/diffusers/blob/1d686bac8146037e97f3fd8c56e4063230f71751/src/diffusers/pipelines/stable_diffusion_xl/pipeline_stable_diffusion_xl.py#L1228) ve `sigmas` değişkeni [dizine alınır](https://github.com/huggingface/diffusers/blob/1d686bac8146037e97f3fd8c56e4063230f71751/src/diffusers/schedulers/scheduling_euler_discrete.py#L476). GPU'ya yerleştirildiğinde, CPU ile GPU arasındaki iletişim senkronizasyonu nedeniyle gecikmeye neden olur. Gürültü giderici zaten derlenmişse bu durum daha belirgin hale gelir.

Genel olarak, iletişim senkronizasyonunu ve gecikmesini önlemek için `sigmas` [CPU'da kalmalıdır](https://github.com/huggingface/diffusers/blob/35a969d297cba69110d175ee79c59312b9f49e1e/src/diffusers/schedulers/scheduling_euler_discrete.py#L240).

> [!TIP]
> Difüzyon modelleri için `torch.compile` ile performansı en üst düzeye çıkarmak için [torch.compile and Diffusers: A Hands-On Guide to Peak Performance](https://pytorch.org/blog/torch-compile-and-diffusers-a-hands-on-guide-to-peak-performance/) blog yazısına bakın.

### Benchmarks

Derlenmiş boru hatları için çıkarım gecikmesi ve bellek kullanımı verilerini görmek için [diffusers/benchmarks](https://huggingface.co/datasets/diffusers/benchmarks) veri setine başvurun.

[diffusers-torchao](https://github.com/sayakpaul/diffusers-torchao#benchmarking-results) deposu, Flux ve CogVideoX'in derlenmiş sürümlerine ait performans ölçümleme sonuçlarını da içerir.

## Çekirdekler

[Kernels](https://huggingface.co/docs/kernels/index), [Hub](https://huggingface.co/kernels-community) üzerinde optimize edilmiş hesaplama çekirdekleri oluşturmak, dağıtmak ve yüklemek için bir kütüphanedir. RMSNorm, GEGLU, RoPE ve AdaLN gibi işlemler için [attention](./attention_backends#setattentionbackend) çekirdeklerini ve özel CUDA çekirdeklerini destekler.

[Diffusers Pipeline Integration](https://github.com/huggingface/kernels/blob/main/kernel-builder/skills/cuda-kernels/references/diffusers-integration.md) kılavuzu, bir çekirdeğin [add cuda-kernels](https://github.com/huggingface/kernels/blob/main/kernel-builder/skills/cuda-kernels/SKILL.md) becerisiyle nasıl entegre edileceğini gösterir. Bu beceri, Claude veya Codex gibi bir ajanın, belirli bir model ve donanımınıza yönelik özel çekirdekler yazmasını sağlar.

> [!TIP]
> Bir ajanın çekirdek yazmasını öğretmek için [add cuda-kernels](https://github.com/huggingface/kernels/blob/main/kernel-builder/skills/cuda-kernels/SKILL.md) becerisini yükleyin. [Custom kernels for all from Codex and Claude](https://huggingface.co/blog/custom-cuda-kernels-agent-skills) blog yazısı bunu daha ayrıntılı olarak ele alıyor.

Örneğin, `add cuda-kernels` becerisiyle oluşturulan özel bir RMSNorm çekirdeği, [torch.compile](#torchcompile) ile birlikte H100 üzerinde LTX-Video üretimini 1.43x hızlandırır.

<iframe src="https://huggingface.co/datasets/docs-benchmarks/kernel-ltx-video/embed/viewer/default/train" frameborder="0" width="100%" height="560px"
>

## Dinamik kuantizasyon

[Dinamik kuantizasyon](https://docs.pytorch.org/ao/main/api_reference/generated/torchao.quantization.Int8DynamicActivationInt8WeightConfig.html), daha hızlı matematiksel işlemleri mümkün kılmak için hassasiyeti azaltarak çıkarım hızını artırır. Bu özel kuantizasyon türü, sabit bir ölçekleme faktörü kullanmak yerine, aktivasyonların nasıl ölçekleneceğini çalışma zamanındaki verilere göre belirler. Sonuç olarak, ölçekleme faktörü verilere daha doğru bir şekilde hizalanır.

Aşağıdaki örnek, [torchao](../quantization/torchao) kütüphanesiyle UNet ve VAE'ye [dynamic int8 quantization](https://docs.pytorch.org/ao/main/api_reference/generated/torchao.quantization.Int8DynamicActivationInt8WeightConfig.html) uygular.

> [!TIP]
> Diffusers torchao entegrasyonunun nasıl kullanılacağını öğrenmek için [torchao](../quantization/torchao) belgelerimize göz atın.

Maksimum hız için derleyici etiketlerini yapılandırın.

```py
import torch
from torchao import apply_dynamic_quant
from diffusers import StableDiffusionXLPipeline

torch._inductor.config.conv_1x1_as_mm = True
torch._inductor.config.coordinate_descent_tuning = True
torch._inductor.config.epilogue_fusion = False
torch._inductor.config.coordinate_descent_check_all_directions = True
torch._inductor.config.force_fuse_int_mm_with_mul = True
torch._inductor.config.use_mixed_mm = True
```

UNet ve VAE içinde dinamik kuantizasyondan fayda sağlamayan bazı doğrusal katmanları [dynamic_quant_filter_fn](https://github.com/huggingface/diffusion-fast/blob/0f169640b1db106fe6a479f78c1ed3bfaeba3386/utils/pipeline_utils.py#L16) ile filtreleyin.

```py
pipeline = StableDiffusionXLPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

apply_dynamic_quant(pipeline.unet, dynamic_quant_filter_fn)
apply_dynamic_quant(pipeline.vae, dynamic_quant_filter_fn)

prompt = "Astronaut in a jungle, cold color palette, muted colors, detailed, 8k"
pipeline(prompt, num_inference_steps=30).images[0]
```

## Birleştirilmiş projeksiyon matrisleri

> [!WARNING]
> [fuse_qkv_projections](https://github.com/huggingface/diffusers/blob/58431f102cf39c3c8a569f32d71b2ea8caa461e1/src/diffusers/pipelines/pipeline_utils.py#L2034) yöntemi deneyseldir ve destek büyük ölçüde Stable Diffusion iş akışlarıyla sınırlıdır. Diğer iş akışları için nasıl etkinleştirileceğini öğrenmek için bu [PR](https://github.com/huggingface/diffusers/pull/6179)'ye göz atın

Bir dikkat bloğunda bir giriş, Q, K ve V projeksiyon matrisleriyle temsil edilen üç alt uzaya projekte edilir. Bu projeksiyonlar genellikle ayrı ayrı hesaplanır, ancak bunları yatay olarak tek bir matriste birleştirip projeksiyonu tek adımda gerçekleştirebilirsiniz. Bu, giriş projeksiyonlarının matris çarpımlarının boyutunu artırır ve aynı zamanda kuantizasyonun etkisini iyileştirir.

```py
pipeline.fuse_qkv_projections()
```

## Kaynaklar

- Bunların tümünü [flux-fast](https://github.com/huggingface/flux-fast) tariflerini kullanarak [TorchInductor](https://docs.pytorch.org/docs/stable/torch.compiler.html) ve [AOTInductor](https://docs.pytorch.org/docs/stable/torch.compiler_aot_inductor.html) ile birleştirerek ~2.5x hızlanma elde etmenin yollarını öğrenmek için [Presenting Flux Fast: Making Flux go brrr on H100s](https://pytorch.org/blog/presenting-flux-fast-making-flux-go-brrr-on-h100s/) blog yazısını okuyun.

    Bu tarifler AMD donanımı ve [Flux.1 Kontext Dev](https://huggingface.co/black-forest-labs/FLUX.1-Kontext-dev) destekler.
- [torch.compile ve Diffusers: Zirve Performansına Uygulamalı Bir Rehber](https://pytorch.org/blog/torch-compile-and-diffusers-a-hands-on-guide-to-peak-performance/) blog yazısını okuyun
`torch.compile` kullanırken performansı en üst düzeye çıkarmak için

