Skill Tracer
Skills › Scientific Agent Skills › transformers › generation.md

generation.md

447 lines · skills/transformers/references/generation.md at 5f2bc03

Open on GitHub
1# Text Generation
2
3Targets Transformers 5.18.0. Hub examples are illustrative; greedy, sampling, beam search, chat dictionaries, streaming, and static cache are tested with tiny local models. See [review evidence](review.md).
4

Text Generation

Targets Transformers 5.18.0. Hub examples are illustrative; greedy, sampling, beam search, chat dictionaries, streaming, and static cache are tested with tiny local models. See review evidence.

Raw lines 1 to 4
5## Overview
6
7Generate text with language models using the `generate()` method. Control output quality and style through generation strategies and parameters.
8
9For quick prototyping, the [Pipeline API](pipelines.md) wraps tokenization and `generate()`; use `model.generate()` directly when you need custom preprocessing or decoding control.

Overview

Generate text with language models using the generate() method. Control output quality and style through generation strategies and parameters.

For quick prototyping, the Pipeline API wraps tokenization and generate(); use model.generate() directly when you need custom preprocessing or decoding control.

Raw lines 5 to 10
11## Basic Generation
13```python
14from transformers import AutoModelForCausalLM, AutoTokenizer
16model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
17tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
19# Tokenize input
20inputs = tokenizer("Once upon a time", return_tensors="pt").to(model.device)
22# Generate
23outputs = model.generate(**inputs, max_new_tokens=50)
25# Decode
26text = tokenizer.decode(outputs[0], skip_special_tokens=True)
27print(text)
28```

Basic Generation

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")

# Tokenize input
inputs = tokenizer("Once upon a time", return_tensors="pt").to(model.device)

# Generate
outputs = model.generate(**inputs, max_new_tokens=50)

# Decode
text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(text)
Raw lines 11 to 29
30## Generation Strategies

Generation Strategies

Raw lines 30 to 31
32### Greedy Decoding
34Select highest probability token at each step (deterministic):
36```python
37outputs = model.generate(
38 **inputs,
39 max_new_tokens=50,
40 do_sample=False, # Explicitly override any checkpoint sampling default
41 num_beams=1
43```
45**Use for**: A non-sampling baseline. Greedy decoding does not make content factual, and exact reproducibility also depends on kernels, hardware, versions, and seeds.

Greedy Decoding

Select highest probability token at each step (deterministic):

outputs = model.generate(
    **inputs,
    max_new_tokens=50,
    do_sample=False,  # Explicitly override any checkpoint sampling default
    num_beams=1
)

Use for: A non-sampling baseline. Greedy decoding does not make content factual, and exact reproducibility also depends on kernels, hardware, versions, and seeds.

Raw lines 32 to 46
47### Sampling
49Randomly sample from probability distribution:
51```python
52outputs = model.generate(
53 **inputs,
54 max_new_tokens=50,
55 do_sample=True,
56 temperature=0.7,
57 top_k=50,
58 top_p=0.95
60```
62**Use for**: Creative writing, diverse outputs, open-ended generation.

Sampling

Randomly sample from probability distribution:

outputs = model.generate(
    **inputs,
    max_new_tokens=50,
    do_sample=True,
    temperature=0.7,
    top_k=50,
    top_p=0.95
)

Use for: Creative writing, diverse outputs, open-ended generation.

Raw lines 47 to 63
64### Beam Search
66Explore multiple hypotheses in parallel:
68```python
69outputs = model.generate(
70 **inputs,
71 max_new_tokens=50,
72 num_beams=5,
73 do_sample=False,
74 early_stopping=True
76```
78**Use for**: Comparing candidate seq2seq translations or summaries. More beams do not guarantee better factuality or task quality.

Beam Search

Explore multiple hypotheses in parallel:

outputs = model.generate(
    **inputs,
    max_new_tokens=50,
    num_beams=5,
    do_sample=False,
    early_stopping=True
)

Use for: Comparing candidate seq2seq translations or summaries. More beams do not guarantee better factuality or task quality.

Raw lines 64 to 79
80### Former built-in decoding strategies
82Contrastive and constrained beam search moved to Hub custom-generation repositories. Legacy `penalty_alpha` / `force_words_ids` settings are not a self-contained offline implementation. Prefer the built-in greedy/sampling/beam paths unless you intentionally review the external implementation and dependencies, pin its code revision, and authorize custom code. See the [current generation strategy guide](https://huggingface.co/docs/transformers/en/generation_strategies); this skill does not execute Hub custom-generation code.

Former built-in decoding strategies

Contrastive and constrained beam search moved to Hub custom-generation repositories. Legacy penalty_alpha / force_words_ids settings are not a self-contained offline implementation. Prefer the built-in greedy/sampling/beam paths unless you intentionally review the external implementation and dependencies, pin its code revision, and authorize custom code. See the current generation strategy guide; this skill does not execute Hub custom-generation code.

Raw lines 80 to 83
84## Key Parameters

Key Parameters

Raw lines 84 to 85
86### Length Control
88**max_new_tokens**: Maximum tokens to generate
89```python
90max_new_tokens=100 # Generate up to 100 new tokens
91```
93**max_length**: Total decoder sequence length (prompt + output for decoder-only models; decoder-side length for encoder-decoder models). `max_new_tokens` takes precedence.
94```python
95max_length=512 # Total sequence length
96```
98**min_new_tokens**: Minimum tokens to generate
99```python
100min_new_tokens=50 # Force at least 50 tokens
101```
103**min_length**: Minimum total length
104```python
105min_length=100
106```

Length Control

max_new_tokens: Maximum tokens to generate

max_new_tokens=100  # Generate up to 100 new tokens

max_length: Total decoder sequence length (prompt + output for decoder-only models; decoder-side length for encoder-decoder models). max_new_tokens takes precedence.

max_length=512  # Total sequence length

min_new_tokens: Minimum tokens to generate

min_new_tokens=50  # Force at least 50 tokens

min_length: Minimum total length

min_length=100
Raw lines 86 to 107
108### Temperature
110Controls randomness (only with sampling):
112```python
113temperature=1.0 # Default, balanced
114temperature=0.7 # More focused, less random
115temperature=1.5 # More creative, more random
116```
118Lower temperature → more deterministic
119Higher temperature → more random

Temperature

Controls randomness (only with sampling):

temperature=1.0   # Default, balanced
temperature=0.7   # More focused, less random
temperature=1.5   # More creative, more random

Lower temperature → more deterministic Higher temperature → more random

Raw lines 108 to 120
121### Top-K Sampling
123Consider only top K most likely tokens:
125```python
126do_sample=True
127top_k=50 # Sample from top 50 tokens
128```
130**Common values**: 40-100 for balanced output, 10-20 for focused output.

Top-K Sampling

Consider only top K most likely tokens:

do_sample=True
top_k=50  # Sample from top 50 tokens

Common values: 40-100 for balanced output, 10-20 for focused output.

Raw lines 121 to 131
132### Top-P (Nucleus) Sampling
134Consider tokens with cumulative probability ≥ P:
136```python
137do_sample=True
138top_p=0.95 # Sample from smallest set with 95% cumulative probability
139```
141**Common values**: 0.9-0.95 for balanced, 0.7-0.85 for focused.

Top-P (Nucleus) Sampling

Consider tokens with cumulative probability ≥ P:

do_sample=True
top_p=0.95  # Sample from smallest set with 95% cumulative probability

Common values: 0.9-0.95 for balanced, 0.7-0.85 for focused.

Raw lines 132 to 142
143### Repetition Penalty
145Discourage repetition:
147```python
148repetition_penalty=1.2 # Penalize repeated tokens
149```
151**Values**: 1.0 = no penalty, 1.2-1.5 = moderate, 2.0+ = strong penalty.

Repetition Penalty

Discourage repetition:

repetition_penalty=1.2  # Penalize repeated tokens

Values: 1.0 = no penalty, 1.2-1.5 = moderate, 2.0+ = strong penalty.

Raw lines 143 to 152
153### Beam Search Parameters
155**num_beams**: Number of beams
156```python
157num_beams=5 # Keep 5 hypotheses
158```
160**early_stopping**: Stop when num_beams sentences are finished
161```python
162early_stopping=True
163```
165**no_repeat_ngram_size**: Prevent n-gram repetition
166```python
167no_repeat_ngram_size=3 # Don't repeat any 3-gram
168```

Beam Search Parameters

num_beams: Number of beams

num_beams=5  # Keep 5 hypotheses

early_stopping: Stop when num_beams sentences are finished

early_stopping=True

no_repeat_ngram_size: Prevent n-gram repetition

no_repeat_ngram_size=3  # Don't repeat any 3-gram
Raw lines 153 to 169
170### Output Control
172**num_return_sequences**: Generate multiple outputs
173```python
174outputs = model.generate(
175 **inputs,
176 max_new_tokens=50,
177 num_beams=5,
178 do_sample=False,
179 num_return_sequences=3 # Must not exceed num_beams here; uniqueness is not guaranteed
181```
183**pad_token_id**: Specify padding token
184```python
185pad_token_id=tokenizer.eos_token_id
186```
188**eos_token_id**: Stop generation at specific token
189```python
190eos_token_id=tokenizer.eos_token_id
191```

Output Control

num_return_sequences: Generate multiple outputs

outputs = model.generate(
    **inputs,
    max_new_tokens=50,
    num_beams=5,
    do_sample=False,
    num_return_sequences=3  # Must not exceed num_beams here; uniqueness is not guaranteed
)

pad_token_id: Specify padding token

pad_token_id=tokenizer.eos_token_id

eos_token_id: Stop generation at specific token

eos_token_id=tokenizer.eos_token_id
Raw lines 170 to 192
193## Advanced Features

Advanced Features

Raw lines 193 to 194
195### Batch Generation
197Generate for multiple prompts:
199```python
200prompts = ["Hello, my name is", "Once upon a time"]
201# Decoder-only batch generation uses left padding; this is not a training rule.
202tokenizer.padding_side = "left"
203if tokenizer.pad_token is None:
204 tokenizer.pad_token = tokenizer.eos_token
205inputs = tokenizer(prompts, return_tensors="pt", padding=True).to(model.device)
207outputs = model.generate(**inputs, max_new_tokens=50, pad_token_id=tokenizer.pad_token_id)
209for i, output in enumerate(outputs):
210 text = tokenizer.decode(output[inputs["input_ids"].shape[1]:], skip_special_tokens=True)
211 print(f"Prompt {i}: {text}\n")
212```

Batch Generation

Generate for multiple prompts:

prompts = ["Hello, my name is", "Once upon a time"]
# Decoder-only batch generation uses left padding; this is not a training rule.
tokenizer.padding_side = "left"
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token
inputs = tokenizer(prompts, return_tensors="pt", padding=True).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=50, pad_token_id=tokenizer.pad_token_id)

for i, output in enumerate(outputs):
    text = tokenizer.decode(output[inputs["input_ids"].shape[1]:], skip_special_tokens=True)
    print(f"Prompt {i}: {text}\n")
Raw lines 195 to 213
214### Streaming Generation
216`TextStreamer` writes decoded chunks synchronously:
218```python
219from transformers import TextStreamer
221streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
222outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=32, num_beams=1)
223```
225For UI iteration, `TextIteratorStreamer(tokenizer, timeout=30.0, skip_prompt=True)` is consumed concurrently with `generate()` in a worker thread. A timeout raises `queue.Empty`; capture and propagate the worker exception, join/clean up the worker, and do not treat timeout as a completed answer. Streamers do not support beam search. Chunk boundaries are not guaranteed to equal token boundaries.

Streaming Generation

TextStreamer writes decoded chunks synchronously:

from transformers import TextStreamer

streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=32, num_beams=1)

For UI iteration, TextIteratorStreamer(tokenizer, timeout=30.0, skip_prompt=True) is consumed concurrently with generate() in a worker thread. A timeout raises queue.Empty; capture and propagate the worker exception, join/clean up the worker, and do not treat timeout as a completed answer. Streamers do not support beam search. Chunk boundaries are not guaranteed to equal token boundaries.

Raw lines 214 to 226
227### Guidance and Control
229**Prevent bad words:**
230```python
231bad_words = ["offensive", "inappropriate"]
232bad_words_ids = [tokenizer.encode(word, add_special_tokens=False) for word in bad_words]
234outputs = model.generate(
235 **inputs,
236 bad_words_ids=bad_words_ids
238```

Guidance and Control

Prevent bad words:

bad_words = ["offensive", "inappropriate"]
bad_words_ids = [tokenizer.encode(word, add_special_tokens=False) for word in bad_words]

outputs = model.generate(
    **inputs,
    bad_words_ids=bad_words_ids
)
Raw lines 227 to 239
240### Generation Config
242Save and reuse generation parameters:
244```python
245from transformers import GenerationConfig
247# Create config
248generation_config = GenerationConfig(
249 max_new_tokens=100,
250 temperature=0.7,
251 top_k=50,
252 top_p=0.95,
253 do_sample=True
256# Save
257generation_config.save_pretrained("./my_generation_config")
259# Load and use
260generation_config = GenerationConfig.from_pretrained("./my_generation_config")
261outputs = model.generate(**inputs, generation_config=generation_config)
262```

Generation Config

Save and reuse generation parameters:

from transformers import GenerationConfig

# Create config
generation_config = GenerationConfig(
    max_new_tokens=100,
    temperature=0.7,
    top_k=50,
    top_p=0.95,
    do_sample=True
)

# Save
generation_config.save_pretrained("./my_generation_config")

# Load and use
generation_config = GenerationConfig.from_pretrained("./my_generation_config")
outputs = model.generate(**inputs, generation_config=generation_config)
Raw lines 240 to 263
264## Model-Specific Generation

Model-Specific Generation

Raw lines 264 to 265
266### Chat Models
268Use a checkpoint with a saved chat template (plain GPT-2 does not provide one). In v5 `apply_chat_template(..., tokenize=True)` returns `BatchEncoding`; unpack it and keep its attention mask:
270```python
271messages = [
272 {"role": "system", "content": "You are a helpful assistant."},
273 {"role": "user", "content": "What is the capital of France?"}
276inputs = tokenizer.apply_chat_template(
277 messages,
278 tokenize=True,
279 add_generation_prompt=True,
280 return_tensors="pt"
281).to(model.device)
283outputs = model.generate(**inputs, max_new_tokens=100)
284response = tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)
285```

Chat Models

Use a checkpoint with a saved chat template (plain GPT-2 does not provide one). In v5 apply_chat_template(..., tokenize=True) returns BatchEncoding; unpack it and keep its attention mask:

messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What is the capital of France?"}
]

inputs = tokenizer.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt"
).to(model.device)

outputs = model.generate(**inputs, max_new_tokens=100)
response = tokenizer.decode(outputs[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True)
Raw lines 266 to 286
287### Encoder-Decoder Models
289For T5, BART, etc.:
291```python
292from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
294model = AutoModelForSeq2SeqLM.from_pretrained("google-t5/t5-small")
295tokenizer = AutoTokenizer.from_pretrained("google-t5/t5-small")
297# T5 uses task prefixes
298input_text = "translate English to French: Hello, how are you?"
299inputs = tokenizer(input_text, return_tensors="pt").to(model.device)
301outputs = model.generate(**inputs, max_new_tokens=50)
302translation = tokenizer.decode(outputs[0], skip_special_tokens=True)
303```

Encoder-Decoder Models

For T5, BART, etc.:

from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

model = AutoModelForSeq2SeqLM.from_pretrained("google-t5/t5-small")
tokenizer = AutoTokenizer.from_pretrained("google-t5/t5-small")

# T5 uses task prefixes
input_text = "translate English to French: Hello, how are you?"
inputs = tokenizer(input_text, return_tensors="pt").to(model.device)

outputs = model.generate(**inputs, max_new_tokens=50)
translation = tokenizer.decode(outputs[0], skip_special_tokens=True)
Raw lines 287 to 304
305## Optimization
307### Caching
309Enable KV cache for faster generation:
311```python
312outputs = model.generate(
313 **inputs,
314 max_new_tokens=100,
315 use_cache=True # Default, faster generation
317```

Caching

Enable KV cache for faster generation:

outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    use_cache=True  # Default, faster generation
)
Raw lines 307 to 318
319### Static Cache
321For a supported architecture, allocate capacity for the full decoder sequence. Cache memory is allocated lazily; old `max_batch_size` and `device` kwargs are not required:
323```python
324from transformers import StaticCache
326cache = StaticCache(config=model.config, max_cache_len=inputs["input_ids"].shape[1] + 100)
328outputs = model.generate(
329 **inputs,
330 max_new_tokens=100,
331 past_key_values=cache
333```

Static Cache

For a supported architecture, allocate capacity for the full decoder sequence. Cache memory is allocated lazily; old max_batch_size and device kwargs are not required:

from transformers import StaticCache

cache = StaticCache(config=model.config, max_cache_len=inputs["input_ids"].shape[1] + 100)

outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    past_key_values=cache
)
Raw lines 319 to 334
335### Attention Implementation
337Use Flash Attention for speed:
339```python
340model = AutoModelForCausalLM.from_pretrained(
341 "model-id",
342 attn_implementation="flash_attention_2"
344```

Attention Implementation

Use Flash Attention for speed:

model = AutoModelForCausalLM.from_pretrained(
    "model-id",
    attn_implementation="flash_attention_2"
)
Raw lines 335 to 345
346## Generation Recipes

Generation Recipes

Raw lines 346 to 347
348### Creative Writing
350```python
351outputs = model.generate(
352 **inputs,
353 max_new_tokens=200,
354 do_sample=True,
355 temperature=0.8,
356 top_k=50,
357 top_p=0.95,
358 repetition_penalty=1.2
360```

Creative Writing

outputs = model.generate(
    **inputs,
    max_new_tokens=200,
    do_sample=True,
    temperature=0.8,
    top_k=50,
    top_p=0.95,
    repetition_penalty=1.2
)
Raw lines 348 to 361
362### Non-sampling Baseline
364```python
365outputs = model.generate(
366 **inputs,
367 max_new_tokens=100,
368 do_sample=False, # Greedy
369 repetition_penalty=1.1
371```

Non-sampling Baseline

outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    do_sample=False,  # Greedy
    repetition_penalty=1.1
)
Raw lines 362 to 372
373### Diverse Outputs
375```python
376outputs = model.generate(
377 **inputs,
378 max_new_tokens=100,
379 num_beams=5,
380 num_return_sequences=5,
381 temperature=1.5,
382 do_sample=True
384```

Diverse Outputs

outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    num_beams=5,
    num_return_sequences=5,
    temperature=1.5,
    do_sample=True
)
Raw lines 373 to 385
386### Long-Form Generation
388Check prompt length plus token budget against the model context window; larger output budgets consume cache memory.
390```python
391outputs = model.generate(
392 **inputs,
393 max_new_tokens=1000,
394 do_sample=True,
395 temperature=0.8,
396 top_p=0.95,
397 repetition_penalty=1.2
399```

Long-Form Generation

Check prompt length plus token budget against the model context window; larger output budgets consume cache memory.

outputs = model.generate(
    **inputs,
    max_new_tokens=1000,
    do_sample=True,
    temperature=0.8,
    top_p=0.95,
    repetition_penalty=1.2
)
Raw lines 386 to 400
401### Translation/Summarization
403```python
404outputs = model.generate(
405 **inputs,
406 max_new_tokens=100,
407 num_beams=5,
408 do_sample=False,
409 early_stopping=True,
410 no_repeat_ngram_size=3
412```

Translation/Summarization

outputs = model.generate(
    **inputs,
    max_new_tokens=100,
    num_beams=5,
    do_sample=False,
    early_stopping=True,
    no_repeat_ngram_size=3
)
Raw lines 401 to 413
414## Common Issues
416**Repetitive output:**
417- Increase repetition_penalty (1.2-1.5)
418- Use no_repeat_ngram_size (2-3)
419- Inspect the prompt/template and repeated-token distribution
420- Lower temperature
422**Poor quality:**
423- Use beam search (num_beams=5)
424- Lower temperature
425- Adjust top_k/top_p
427**Too deterministic:**
428- Enable sampling (do_sample=True)
429- Increase temperature (0.7-1.0)
430- Adjust top_k/top_p
432**Slow generation:**
433- Reduce batch size
434- Enable use_cache=True
435- Use Flash Attention
436- Reduce max_new_tokens

Common Issues

Repetitive output:

  • Increase repetition_penalty (1.2-1.5)
  • Use no_repeat_ngram_size (2-3)
  • Inspect the prompt/template and repeated-token distribution
  • Lower temperature

Poor quality:

  • Use beam search (num_beams=5)
  • Lower temperature
  • Adjust top_k/top_p

Too deterministic:

  • Enable sampling (do_sample=True)
  • Increase temperature (0.7-1.0)
  • Adjust top_k/top_p

Slow generation:

  • Reduce batch size
  • Enable use_cache=True
  • Use Flash Attention
  • Reduce max_new_tokens
Raw lines 414 to 437
438## Best Practices
4401. **Start with defaults**: Then tune based on output
4412. **Evaluate the strategy**: Use held-out task metrics and check factual claims against evidence
4423. **Set max_new_tokens**: Avoid unnecessarily long generation
4434. **Enable caching**: For faster sequential generation
4445. **Tune temperature**: Most impactful parameter for sampling
4456. **Use beam search carefully**: More memory/compute; benchmark whether it improves task quality
4467. **Test different seeds**: For reproducibility with sampling
4478. **Monitor memory**: Large beams use significant memory

Best Practices

  1. Start with defaults: Then tune based on output
  2. Evaluate the strategy: Use held-out task metrics and check factual claims against evidence
  3. Set max_new_tokens: Avoid unnecessarily long generation
  4. Enable caching: For faster sequential generation
  5. Tune temperature: Most impactful parameter for sampling
  6. Use beam search carefully: More memory/compute; benchmark whether it improves task quality
  7. Test different seeds: For reproducibility with sampling
  8. Monitor memory: Large beams use significant memory
Raw lines 438 to 447