GPT2_distil-Hugging_face_tutorial / prepare_eli5_for_clm.py
Lookadragon21's picture
Update prepare_eli5_for_clm.py
2df7c78 verified
# ========================================
# 1. LOAD DATASET
# ========================================
from datasets import load_dataset
eli5 = load_dataset("dany0407/eli5_category", split="train[:5000]")
# ========================================
# 2. SPLIT TRAIN/TEST
# ========================================
eli5 = eli5.train_test_split(test_size=0.2)
# ========================================
# 3. LOAD TOKENIZER
# ========================================
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("distilbert/distilgpt2")
# ========================================
# 4. FLATTEN NESTED STRUCTURE
# ========================================
eli5 = eli5.flatten()
# ========================================
# 5. TOKENIZAÇÃO (PREPROCESSING)
# ========================================
def preprocess_function(examples):
"""Junta todas as respostas em uma string e tokeniza."""
return tokenizer(
[" ".join(x) for x in examples["answers.text"]],
truncation=True, # 👈 Corta textos muito longos
max_length=1024, # 👈 Limite máximo do GPT-2
)
# Aplicar a tokenização em todo o dataset
tokenized_eli5 = eli5.map(
preprocess_function,
batched=True, # Processa em lotes
num_proc=4, # 4 CPUs em paralelo
remove_columns=eli5["train"].column_names, # Remove colunas originais
)
print("✅ Tokenização concluída!")
print(tokenized_eli5)
# ========================================
# 6. AGRUPAR EM BLOCOS (CHUNKING)
# ========================================
block_size = 128
def group_texts(examples):
"""Concatena textos e divide em blocos de tamanho fixo."""
# Concatena todos os textos
concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()}
total_length = len(concatenated_examples[list(examples.keys())[0]])
# Descarta o resto que não completa um bloco
if total_length >= block_size:
total_length = (total_length // block_size) * block_size
# Divide em blocos de block_size
result = {
k: [t[i : i + block_size] for i in range(0, total_length, block_size)]
for k, t in concatenated_examples.items()
}
# Cria labels (cópia do input_ids para CLM)
result["labels"] = result["input_ids"].copy()
return result
lm_dataset = tokenized_eli5.map(group_texts, batched=True, num_proc=4)
print(lm_dataset)
from transformers import DataCollatorForLanguageModeling
tokenizer.pad_token = tokenizer.eos_token
data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)
# ========================================
# 8. CARREGAR MODELO GPT-2
# ========================================
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("distilbert/distilgpt2")
# ========================================
# 9. CONFIGURAR TREINAMENTO
# ========================================
from transformers import TrainingArguments, Trainer
training_args = TrainingArguments(
output_dir="./gpt2-eli5-finetuned-by-yvens", # Onde salvar os checkpoints
# === ESTRATÉGIA DE TREINAMENTO ===
num_train_epochs=3, # Número de épocas (passagens pelo dataset)
per_device_train_batch_size=8, # Exemplos por batch (ajuste se der OOM)
per_device_eval_batch_size=8, # Batch size para avaliação
# === OTIMIZAÇÃO ===
learning_rate=2e-5, # Taxa de aprendizado
weight_decay=0.01, # Regularização (evita overfitting)
warmup_steps=500, # Passos de aquecimento do LR
# === AVALIAÇÃO ===
eval_strategy="epoch", # Avaliar ao final de cada época
save_strategy="epoch", # Salvar checkpoint a cada época
load_best_model_at_end=True, # Carregar o melhor modelo ao final
# === LOGGING ===
logging_steps=100, # Log a cada 100 passos
# === PERFORMANCE (CPU/GPU) ===
# fp16=True, # Descomente se tiver GPU NVIDIA
# push_to_hub=True, # Descomente para enviar ao HF Hub
)
# ========================================
# 10. CRIAR TRAINER
# ========================================
trainer = Trainer(
model=model,
args=training_args,
train_dataset=lm_dataset["train"],
eval_dataset=lm_dataset["test"],
data_collator=data_collator,
processing_class=tokenizer,
)
# ========================================
# 11. TREINAR! 🚀
# ========================================
trainer.train()
# ========================================
# 12. SALVAR MODELO FINAL
# ========================================
trainer.save_model("./gpt2-eli5-final-by-Yvens")
tokenizer.save_pretrained("./gpt2-eli5-final-by-Yvens-Yan")
print("✅ Treinamento concluído!")