Transformers documentation
Metin üretimi
Metin üretimi
Metin üretimi, büyük dil modellerinin (LLM) en popüler uygulamasıdır. Bir LLM, başlangıç metnine (prompt) ve kendisinin ürettiği çıktılara dayanarak, önceden tanımlanmış bir uzunluğa kadar veya bir dizin sonu (EOS) token'ına ulaşıncaya kadar bir sonraki kelimeyi (token) üretmek üzere eğitilir.
Transformers'ta generate() API'si metin üretimini yönetir ve üretken yeteneklere sahip tüm modellerde kullanılabilir. Bu kılavuz, generate() ile metin üretiminin temellerini ve kaçınılması gereken bazı yaygın tuzakları gösterecektir.
Aşağıdaki komutlar için
transformers serve'in çalıştığından emin olun.transformers chat Qwen/Qwen2.5-0.5B-Instruct
Varsayılan generate
Başlamadan önce, çok büyük modelleri bellek kullanımını azaltmak için nicelleştirmek üzere bitsandbytes paketini yüklemeniz faydalı olacaktır.
!pip install -U transformers bitsandbytes
Bitsandbytes, CUDA tabanlı GPU'ların yanı sıra birden çok backend'i destekler. Daha fazla bilgi için çoklu backend kurulum kılavuzuna bakın.
Bir LLM'i from_pretrained() ile yükleyin ve bellek gereksinimlerini azaltmak için aşağıdaki iki parametreyi ekleyin.
device_map="auto", en hızlı cihazdan (GPU) başlayarak model iskeletinin otomatik olarak başlatılmasını ve model ağırlıklarının tüm kullanılabilir cihazlara yüklenip dağıtılmasını sağlayan Accelerate'in Big Model Inference özelliğini etkinleştirir.quantization_config, kuantizasyon ayarlarını tanımlayan bir yapılandırma nesnesidir. Bu örnek, kuantizasyon arka ucu olarak bitsandbytes kullanır (daha fazla kullanılabilir arka uç için Kuantizasyon bölümüne bakın) ve modeli 4-bit olarak yükler.
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_4bit=True)
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", device_map="auto", quantization_config=quantization_config)Girdinizi tokenleştirin ve bir LLM, dolgu tokenlarından devam ettirmek üzere eğitilmediği için padding_side() parametresini "left" olarak ayarlayın. Tokenizer, girdi kimliklerini ve dikkat maskesini döndürür.
Tokenizöre bir dizi string geçirerek aynı anda birden fazla prompt işleyin. Gecikme ve bellek üzerinde küçük bir maliyetle verimliliği artırmak için girdileri toplu (batch) olarak işleyin.
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1", padding_side="left")
model_inputs = tokenizer(["A list of colors: red, blue"], return_tensors="pt").to(model.device)Girdileri generate() işlevine iletin ve üretilen tokenları batch_decode() ile metne geri dönüştürün.
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
"A list of colors: red, blue, green, yellow, orange, purple, pink,"Üretim yapılandırması
Tüm üretim ayarları GenerationConfig içinde yer alır. Yukarıdaki örnekte, üretim ayarları mistralai/Mistral-7B-v0.1'in generation_config.json dosyasından türetilmiştir. Bir modelle birlikte yapılandırma kaydedilmediğinde varsayılan bir çözümleme stratejisi kullanılır.
Yapılandırmayı generation_config özniteliği üzerinden inceleyin. Bu, varsayılan yapılandırmadan farklı olan değerleri gösterir; bu durumda bos_token_id ve eos_token_id.
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", device_map="auto")
model.generation_config
GenerationConfig {
"bos_token_id": 1,
"eos_token_id": 2
}generate() fonksiyonunu, GenerationConfig içindeki parametreleri ve değerleri geçersiz kılacak şekilde özelleştirebilirsiniz. Sıkça ayarlanan parametreler için aşağıdaki bu bölümü inceleyin.
# enable beam search sampling strategy
model.generate(**inputs, num_beams=4, do_sample=True)generate() harici kütüphaneler veya özel kodlarla da genişletilebilir:
logits_processorparametresi, bir sonraki token olasılık dağılımını değiştirmek için özel LogitsProcessor örneklerini kabul eder;stopping_criteriaparametresi, metin üretimini durdurmak için özel StoppingCriteria destekler;- diğer özel üretim yöntemleri
custom_generatebayrağı üzerinden yüklenebilir (belgeler).
Arama, örneklem ve çözümleme stratejileri hakkında daha fazla bilgi edinmek için Generation strategies kılavuzuna başvurun.
Kaydetme
GenerationConfig örneği oluşturun ve istediğiniz çözümleme parametrelerini belirtin.
from transformers import AutoModelForCausalLM, GenerationConfig
model = AutoModelForCausalLM.from_pretrained("my_account/my_model")
generation_config = GenerationConfig(
max_new_tokens=50, do_sample=True, top_k=50, eos_token_id=model.config.eos_token_id
)Belirli bir üretim yapılandırmasını kaydetmek için save_pretrained() kullanın ve Hub'a yüklemek için push_to_hub parametresini True olarak ayarlayın.
generation_config.save_pretrained("my_account/my_model", push_to_hub=True)config_file_name parametresini boş bırakın. Bu parametre, tek bir dizinde birden çok üretim yapılandırması saklanırken kullanılmalıdır. Yüklemek istediğiniz üretim yapılandırmasını belirtmenin bir yolunu sunar. Tek bir modelle kullanılmak üzere, farklı üretici görevler (örnekleme ile yaratıcı metin üretimi, ışın araması ile özetleme) için farklı yapılandırmalar oluşturabilirsiniz.
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, GenerationConfig
tokenizer = AutoTokenizer.from_pretrained("google-t5/t5-small")
model = AutoModelForSeq2SeqLM.from_pretrained("google-t5/t5-small")
translation_generation_config = GenerationConfig(
num_beams=4,
early_stopping=True,
decoder_start_token_id=0,
eos_token_id=model.config.eos_token_id,
pad_token=model.config.pad_token_id,
)
translation_generation_config.save_pretrained("/tmp", config_file_name="translation_generation_config.json", push_to_hub=True)
generation_config = GenerationConfig.from_pretrained("/tmp", config_file_name="translation_generation_config.json")
inputs = tokenizer("translate English to French: Configuration files are easy to use!", return_tensors="pt")
outputs = model.generate(**inputs, generation_config=generation_config)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True))Ortak Seçenekler
generate(), yoğun şekilde özelleştirilebilen güçlü bir araçtır. Bu durum, yeni kullanıcılar için göz korkutucu olabilir. Bu bölüm, Transformers'taki çoğu metin üretim aracında tanımlayabileceğiniz popüler üretim seçeneklerinin bir listesini içerir: generate(), GenerationConfig, pipelines, chat CLI, …
| Seçenek adı | Tür | Basitleştirilmiş açıklama |
|---|---|---|
max_new_tokens | int | Maksimum üretim uzunluğunu kontrol eder. Genellikle küçük bir değere varsayılan olarak ayarlandığından, bunu tanımlamayı unutmayın. |
do_sample | bool | Bir sonraki token'ın örneklenip örneklenmeyeceğini (True) yoksa bunun yerine açgözlü (greedy) üretim yapılıp yapılmayacağını (False) tanımlar. Çoğu kullanım senaryosunda bu bayrağın True olarak ayarlanması gerekir. Daha fazla bilgi için bu kılavuza göz atın. |
temperature | float | Bir sonraki seçilen token'ün ne kadar öngörülemez olacağı. Yüksek değerler (>0.8) yaratıcı görevler için, düşük değerler (ör. <0.4) ise “düşünme” gerektiren görevler için uygundur. do_sample=True gerektirir. |
num_beams | int | >1 olarak ayarlandığında, beam search algoritmasını etkinleştirir. Beam search, girdiye dayalı görevlerde iyi sonuç verir. Daha fazla bilgi için bu kılavuza bakın. |
repetition_penalty | float | Modelin kendini sık sık tekrarladığını görüyorsanız bunu >1.0 olarak ayarlayın. Daha büyük değerler daha büyük bir ceza uygular. |
eos_token_id | list[int] | Üretim sürecini durduracak token(lar). Varsayılan değer genellikle yeterlidir, ancak farklı bir token belirtebilirsiniz. |
Tuzaklar
Aşağıdaki bölüm, metin üretimi sırasında karşılaşabileceğiniz bazı yaygın sorunları ve bunların nasıl çözüleceğini ele alır.
Çıktı uzunluğu
generate(), bir modelin GenerationConfig'inde aksi belirtilmedikçe varsayılan olarak en fazla 20 token döndürür. Çıktı uzunluğunu kontrol etmek için, üretilen token sayısını max_new_tokens parametresiyle manuel olarak ayarlaması şiddetle önerilir. Decoder-only modeller, başlangıç istemini üretilen tokenlerle birlikte döndürür.
model_inputs = tokenizer(["A sequence of numbers: 1, 2"], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'A sequence of numbers: 1, 2, 3, 4, 5'generated_ids = model.generate(**model_inputs, max_new_tokens=50)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'A sequence of numbers: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,'Çözme stratejisi
generate() içindeki varsayılan çözümleme stratejisi, bir modelin GenerationConfig'inde aksi belirtilmedikçe bir sonraki en olası token'ı seçen greedy search'tır. Bu çözümleme stratejisi, girdiye dayalı görevlerde (transkripsiyon, çeviri) iyi çalışsa da daha yaratıcı kullanım senaryoları (hikaye yazma, sohbet uygulamaları) için optimal değildir.
Örneğin, daha çeşitli çıktılar üretmek için multinomial sampling stratejisini etkinleştirin. Daha fazla çözümleme stratejisi için Generation strategy kılavuzuna başvurun.
model_inputs = tokenizer(["I am a cat."], return_tensors="pt").to(model.device)generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]generated_ids = model.generate(**model_inputs, do_sample=True)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]Dolgu tarafı
Girdiler aynı uzunlukta değilse dolguya (padding) ihtiyaç duyar. Ancak LLM'ler dolgu token'larından devam ederek üretim yapacak şekilde eğitilmediğinden, padding_side() parametresinin girdinin soluna ayarlanması gerekir. Sağ dolgu, tekrarlayan durumları (recurrent state) sona eren dolgu token'ları üzerinde sürekli güncellediği için durum uzayı (state-space) ve hibrit modeller için daha kötüdür; bu da önbelleğin (cache) istemin (prompt) sonuyla eşleşmemesine neden olur.
model_inputs = tokenizer(
["1, 2, 3", "A, B, C, D, E"], padding=True, return_tensors="pt"
).to(model.device)
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'1, 2, 33333333333'tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-v0.1", padding_side="left")
tokenizer.pad_token = tokenizer.eos_token
model_inputs = tokenizer(
["1, 2, 3", "A, B, C, D, E"], padding=True, return_tensors="pt"
).to(model.device)
generated_ids = model.generate(**model_inputs)
tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
'1, 2, 3, 4, 5, 6,'İstem formatı
Bazı modeller ve görevler belirli bir girdi istemci biçimi bekler ve biçim hatalıysa model, optimal olmayan bir çıktı döndürür. İstemciler hakkında daha fazla bilgiyi prompt engineering kılavuzunda bulabilirsiniz.
Örneğin, bir sohbet modeli girdiyi bir sohbet şablonu olarak bekler. Sohbetin kimin tarafından yürütüldüğünü belirtmek için prompt'unuzda bir role ve content bulunmalıdır. Prompt'unuzu tek bir dize olarak iletirseniz, model her zaman beklenen çıktıyı döndürmeyebilir.
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
tokenizer = AutoTokenizer.from_pretrained("HuggingFaceH4/zephyr-7b-alpha")
model = AutoModelForCausalLM.from_pretrained(
"HuggingFaceH4/zephyr-7b-alpha", device_map="auto", quantization_config=BitsAndBytesConfig(load_in_4bit=True)
)prompt = """How many cats does it take to change a light bulb? Reply as a pirate."""
model_inputs = tokenizer([prompt], return_tensors="pt").to(model.device)
input_length = model_inputs.input_ids.shape[1]
generated_ids = model.generate(**model_inputs, max_new_tokens=50)
print(tokenizer.batch_decode(generated_ids[:, input_length:], skip_special_tokens=True)[0])
"Aye, matey! 'Tis a simple task for a cat with a keen eye and nimble paws. First, the cat will climb up the ladder, carefully avoiding the rickety rungs. Then, with"messages = [
{
"role": "system",
"content": "You are a friendly chatbot who always responds in the style of a pirate",
},
{"role": "user", "content": "How many cats does it take to change a light bulb?"},
]
model_inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(model.device)
input_length = model_inputs["input_ids"].shape[1]
generated_ids = model.generate(**model_inputs, do_sample=True, max_new_tokens=50)
print(tokenizer.batch_decode(generated_ids[:, input_length:], skip_special_tokens=True)[0])
"Arr, matey! According to me beliefs, 'twas always one cat to hold the ladder and another to climb up it an’ change the light bulb, but if yer looking to save some catnip, maybe yer canKaynaklar
Daha spesifik ve uzmanlaşmış metin üretme kütüphaneleri için aşağıya göz atın.
- Optimum: belirli donanım cihazlarında eğitim ve çıkarımın optimizasyonuna odaklanan bir Transformers uzantısı
- Outlines: kısıtlı metin üretimi için bir kütüphane (örneğin JSON dosyaları üretmek için).
- SynCode: bağlamdan bağımsız dilbilgisi yönlendirmeli üretim için bir kütüphane (JSON, SQL, Python).
- Text Generation Inference: LLM'ler için üretim ortamına hazır bir sunucu.
- Metin oluşturma web arayüzü: Metin oluşturma için bir Gradio web arayüzü.
- logits-processor-zoo: metin üretimini kontrol etmek için ek logits işleyicileri.