# Yardımcı çözümleme

Assisted decoding, yardımcı modelin ana modelin aday token'ları onaylamasından önce bunları önermesine izin vererek metin üretimini hızlandırır. Ana model, aday token'ları tek bir ileri geçişte doğrular. Yardımcı model hızlı ve ucuzdur ve ana modelin onlarca daha pahalı ileri geçişinin yerini alabilir.

Bu kılavuz, Transformers'ta destekli çözümleme (assisted decoding) yöntemlerini kapsar.

## Spekülatif çözümleme

[Speculative decoding](https://hf.co/papers/2211.17192), aday token taslaklarını oluşturmak için daha küçük bir asistan model kullanır. Ana model bu tokenları tek bir geçişte kontrol eder. Doğrulanmış tokenlar nihai çıktıya eklenirken, reddedilen tokenlar standart örneklemeyi tetikler. Ana model daha az pahalı ileri geçiş çalıştırdığı için üretim daha hızlıdır.

Yöntem, asistan modeli ana modelden belirgin şekilde daha küçük olduğunda ve aynı tokenizer'ı kullandığında en iyi şekilde çalışır. Speculative decoding, greedy search ve sampling'i destekler ancak toplu (batched) girdileri desteklemez.

`assistant_model` parametresini [generate()](/docs/transformers/v5.23.0/tr/main_classes/text_generation#transformers.GenerationMixin.generate) fonksiyonuna iletin. Token doğrulaması başarısız olursa yeniden örneklemeyi etkinleştirmek için `do_sample=True` değerini ayarlayın.

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

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine'
```

`assistant_model` argümanı, [Pipeline](/docs/transformers/v5.23.0/tr/main_classes/pipelines#transformers.Pipeline) API'sinde de kullanılabilir.

```python
import torch
from transformers import pipeline

pipeline = pipeline(
    "text-generation",
    model="meta-llama/Llama-3.1-8B",
    assistant_model="meta-llama/Llama-3.2-1B",
    dtype="auto"
)
pipeline("Hugging Face is an open-source company, ", max_new_tokens=50, do_sample=False)
```

Rastgeleliği kontrol etmek için `temperature` değerini ayarlayın. Daha düşük sıcaklıklar genellikle gecikmeyi iyileştirir.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model, do_sample=True, temperature=0.5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that is dedicated to creating a better world through technology.'
```

## Prompt arama kodlaması

Prompt lookup decoding bir asistan modeline ihtiyaç duymaz. Aday tokenları önermek için prompt içindeki örtüşen n-gramları bulur. Eşleşme yoksa normal otoregresif çözüme düşer. Özetleme ve çeviri gibi girdiye dayalı görevler için uygundur çünkü aday tokenlar genellikle kaynak metindeki yerel kalıpları yansıtır.

`prompt_lookup_num_tokens` değerini [generate()](/docs/transformers/v5.23.0/tr/main_classes/text_generation#transformers.GenerationMixin.generate) fonksiyonuna iletin. Bu, algoritmanın tekrar eden bir desen algıladığında promptun önceki kısımlarından kaç token kopyalamaya çalışacağını belirler.

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

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, prompt_lookup_num_tokens=5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine learning models. It offers a variety of tools'
```

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

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, prompt_lookup_num_tokens=5, do_sample=True, temperature=0.5)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that provides a platform for developers to build and deploy machine learning models. It offers a variety of tools'
```

## Kendinden spekülatif çözümleme

Self-speculative decoding, bir modelin ara katmanlarını aday token'ları öneren bir asistan olarak kullanır. Öneri eşleşirse, model erken çıkış yapar ve kalan katmanlar token'ları doğrular veya düzeltir.

Tüm yapı tek bir model olduğu için ağırlıklar ve önbellekler paylaşılır; bu da ek bellek yükü olmadan hızı artırır. Bu teknik yalnızca ara katmanlardan erken çıkış logitleri üretmek üzere eğitilmiş modellerde işe yarar.

Çıkış katmanını ayarlamak için `assistant_early_exit` parametresini [generate()](/docs/transformers/v5.23.0/tr/main_classes/text_generation#transformers.GenerationMixin.generate) fonksiyonuna iletin.

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

tokenizer = AutoTokenizer.from_pretrained("facebook/layerskip-llama3.2-1B")
model = AutoModelForCausalLM.from_pretrained("facebook/layerskip-llama3.2-1B", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_early_exit=4, do_sample=False, max_new_tokens=20)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
```

## Çoklu jeton tahmini (MTP) katmanı

Çoklu jeton tahmini (MTP) katmanı, ana modelin kendi checkpoint'inden gelen ek tahmin katmanları ile aday jetonları taslaklar. MTP katmanları, ana modelin gömme (embedding) ve çıktı başlığını yeniden kullanır. Her MTP katmanı bir jeton taslakladığından, adım başına aday sayısı checkpoint'teki MTP katman sayısıyla eşleşir. Ana model, taslakları tek bir ileri geçişte doğrular.

MTP, [DeepSeek-V3](https://huggingface.co/deepseek-ai/DeepSeek-V3) ve [GLM-4.5](https://huggingface.co/zai-org/GLM-4.5) gibi MTP katmanlarıyla eğitilmiş checkpoint'lerle çalışır. Bu checkpoint'ler MTP ağırlıklarını taşır ve yapılandırmalarında `num_mtp_layers` değerini ayarlar; bu değer `config.json` dosyasında `num_nextn_predict_layers` olarak listelenir.

`use_mtp=True` değerini [generate()](/docs/transformers/v5.23.0/tr/main_classes/text_generation#transformers.GenerationMixin.generate) fonksiyonuna iletin; modelde MTP katmanları yoksa bu bir hata yükseltir. Spekülatif çözümlendirme gibi MTP, açgözlü arama ve örneklemeyi destekler ancak toplu girdileri desteklemez.

Burada MTP, DeepSeek-V3 ve GLM-4.5'te olduğu gibi hedef checkpoint'te yer alan tahmin katmanlarını ifade eder. Gemma 4, MTP çözümleme için ayrı bir asistan checkpoint'i kullanır. Bunu `assistant_model` olarak iletin (bkz. [Multi-token prediction drafter](#multi-token-prediction-drafter)).

`text-generation` hattı ve [generate()](/docs/transformers/v5.23.0/tr/main_classes/text_generation#transformers.GenerationMixin.generate) her ikisi de `use_mtp=True` değerini kabul eder.

```py
from transformers import pipeline

pipe = pipeline(
    "text-generation",
    model="zai-org/GLM-4.5-Air",
    device_map="auto",
)

outputs = pipe(
    "Hugging Face is an open-source company",
    use_mtp=True,
    do_sample=False,
    max_new_tokens=50,
    add_special_tokens=True,
    return_full_text=True,
)

[output["generated_text"] for output in outputs]
```

Alternatif olarak, aşağıdaki gibi çıkarım yapabilirsiniz.

```py
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("zai-org/GLM-4.5-Air")
model = AutoModelForCausalLM.from_pretrained("zai-org/GLM-4.5-Air", device_map="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt").to(model.device)

outputs = model.generate(**inputs, use_mtp=True, do_sample=False, max_new_tokens=50)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
```

## Çoklu jeton tahmin taslakçısı

MTP taslakçı, ayrı bir kontrol noktasından yüklenen hafif bir asistan modelidir. Hedef modelin doğrulaması için aday tokenlar önerir. Taslakçı, hedef modelin giriş gömümelerini kullanır ve KV önbelleğine dikkat eder. Hedef modelin gizli durumlarından başlar ve ardından tokenları otoregresif olarak taslaklar. Her bir sonraki token için, projeksiyonlanmış gizli durumunu taslakçıya geri besler. Hedef model, spekülatif çözümleme (speculative decoding) gibi, taslaklanan tokenları tek bir ileri geçişte doğrular.

Hedef checkpoint'in bir parçası olan ve çıktı başlığıyla ortaklaşa kullanılan MTP katmanlarının aksine, bir MTP drafter ayrı bir asistan modelidir. Token önermek için hedefin giriş gömme değerlerini ve KV önbelleğini kullanır.

```py
from transformers import AutoProcessor, AutoModelForCausalLM

processor = AutoProcessor.from_pretrained("google/gemma-4-E4B-it")
target_model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-E4B-it",
    dtype="auto",
    device_map="auto",

)

assistant_model = AutoModelForCausalLM.from_pretrained(
    "google/gemma-4-E4B-it-assistant",
    dtype="auto",
    device_map="auto",
)

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "Write a short joke about saving RAM."},
]

inputs = processor.apply_chat_template(
    messages,
    tokenize=True,
    return_dict=True,
    return_tensors="pt",
    add_generation_prompt=True,
    enable_thinking=False
).to(target_model.device)
input_len = inputs["input_ids"].shape[-1]

outputs = target_model.generate(
    **inputs,
    assistant_model=assistant_model,
    max_new_tokens=256,
)
response = processor.decode(outputs[0][input_len:], skip_special_tokens=False)

processor.parse_response(response)
```

## Evrensel destekli çözümleme

Evrensel destekli çözümleme (UAD), ana model ile asistan modelin farklı tokenizatorlara sahip olması durumunda bile spekülatif çözümlemeyi mümkün kılar. Bu sayede herhangi bir küçük asistan modelini ana modelle eşleştirebilirsiniz. Aday tokenlar yeniden kodlanır ve algoritma, devamın hizalı kalmasını sağlamak için en uzun ortak alt diziyi hesaplar.

UAD'yi etkinleştirmek için `tokenizer`, `assistant_tokenizer` ve `assistant_model` değerlerini [generate()](/docs/transformers/v5.23.0/tr/main_classes/text_generation#transformers.GenerationMixin.generate) fonksiyonuna iletin.

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

assistant_tokenizer = AutoTokenizer.from_pretrained("double7/vicuna-68m")
tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-9b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2-9b", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("double7/vicuna-68m", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model, tokenizer=tokenizer, assistant_tokenizer=assistant_tokenizer)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
'Hugging Face is an open-source company that is dedicated to creating a better world through technology.'
```

### Statik ensemble doğrulama

Standart spekülatif çözümlendirme *kayıpsızdır* — çıktı dağılımının hedef modelle tam olarak eşleşmesini garanti eder. [Statik ensemble doğrulama](https://arxiv.org/abs/2604.07622), bu kuralı gevşeterek doğrulamayı hedef ve taslak dağılımlarının karışımına karşı gerçekleştirir; bu sayede kabul oranını artırır (daha hızlı çıkarım) ancak çıktı dağılımının tam hedef dağılım yerine bir karışım olmasına neden olur. Önerilen başlangıç değeri `0.7`'dir.

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

tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-1.7B")
model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-1.7B", dtype="auto")
assistant_model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-135M", dtype="auto")
inputs = tokenizer("Hugging Face is an open-source company", return_tensors="pt")

outputs = model.generate(**inputs, assistant_model=assistant_model, assistant_ensemble_weight=0.7, do_sample=True)
tokenizer.batch_decode(outputs, skip_special_tokens=True)
```

Bu, asistan modelinden aday logitler gerektirir ve prompt lookup decoding ile desteklenmez.

## Kaynaklar

- Metin üretimi gecikmesi ve destekli üretim hakkında daha fazla bağlam için [Assisted Generation: a new direction toward low-latency text generation](https://huggingface.co/blog/assisted-generation) blog yazısını okuyun.

