Spaces:
Sleeping
Sleeping
import torch | |
from datasets import load_dataset | |
from transformers import ( | |
AutoTokenizer, | |
AutoModelForCausalLM, | |
TrainingArguments, | |
Trainer, | |
DataCollatorForLanguageModeling | |
) | |
from peft import LoraConfig, get_peft_model | |
# 1. Tải Dataset | |
dataset = load_dataset('vntc/wiki-mini-corpus') | |
# 2. Chia Dataset thành train và validation | |
split_dataset = dataset['train'].train_test_split(test_size=0.1, seed=42) | |
train_dataset = split_dataset['train'] | |
validation_dataset = split_dataset['test'] | |
# 3. Tiền Xử Lý Văn Bản | |
def preprocess_function(examples): | |
passages = [passage.lower().strip() for passage in examples['passage']] | |
return {'passage': passages} | |
processed_train = train_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata']) | |
processed_validation = validation_dataset.map(preprocess_function, batched=True, remove_columns=['id', 'metadata']) | |
# 4. Tokenization | |
model_name = "meta-llama/Llama-3.2-3B-Instruct" | |
tokenizer = AutoTokenizer.from_pretrained(model_name) | |
# Đảm bảo tokenizer có pad_token | |
if tokenizer.pad_token is None: | |
tokenizer.pad_token = tokenizer.eos_token | |
def tokenize_function(examples): | |
return tokenizer( | |
examples['passage'], | |
padding='max_length', | |
truncation=True, | |
max_length=512, | |
) | |
tokenized_train = processed_train.map(tokenize_function, batched=True) | |
tokenized_validation = processed_validation.map(tokenize_function, batched=True) | |
# 5. Thêm trường 'labels' | |
def add_labels(examples): | |
examples['labels'] = examples['input_ids'].copy() | |
return examples | |
tokenized_train = tokenized_train.map(add_labels, batched=True) | |
tokenized_validation = tokenized_validation.map(add_labels, batched=True) | |
# 6. Loại bỏ các cột không cần thiết | |
tokenized_train = tokenized_train.remove_columns(['passage']) | |
tokenized_validation = tokenized_validation.remove_columns(['passage']) | |
# 7. Định dạng dữ liệu cho PyTorch | |
tokenized_train.set_format('torch') | |
tokenized_validation.set_format('torch') | |
# 8. Tạo DatasetDict | |
final_dataset = { | |
'train': tokenized_train, | |
'validation': tokenized_validation | |
} | |
# 9. Tải và Cấu Hình Mô Hình với LoRA | |
model = AutoModelForCausalLM.from_pretrained( | |
model_name, | |
device_map="auto", | |
torch_dtype=torch.float16, | |
load_in_8bit=False | |
) | |
lora_config = LoraConfig( | |
r=8, | |
lora_alpha=32, | |
target_modules=["q_proj", "k_proj", "v_proj", "out_proj"], | |
lora_dropout=0.1, | |
bias="none", | |
) | |
model = get_peft_model(model, lora_config) | |
print(model) | |
# 10. Cấu Hình TrainingArguments | |
training_args = TrainingArguments( | |
output_dir="./lora_finetuned_llama3.2", | |
per_device_train_batch_size=4, | |
per_device_eval_batch_size=4, | |
gradient_accumulation_steps=8, | |
num_train_epochs=3, | |
learning_rate=3e-4, | |
weight_decay=0.01, | |
logging_steps=100, | |
evaluation_strategy="epoch", | |
save_strategy="epoch", | |
save_total_limit=2, | |
fp16=True, | |
report_to="none", | |
) | |
# 11. Data Collator Sử Dụng DataCollatorForLanguageModeling | |
data_collator = DataCollatorForLanguageModeling( | |
tokenizer=tokenizer, | |
mlm=False, # Vì bạn đang thực hiện Causal LM | |
pad_to_multiple_of=8 | |
) | |
# 12. Tạo Trainer | |
trainer = Trainer( | |
model=model, | |
args=training_args, | |
train_dataset=final_dataset['train'], | |
eval_dataset=final_dataset['validation'], | |
tokenizer=tokenizer, | |
data_collator=data_collator, | |
) | |
# 13. Bắt Đầu Huấn Luyện | |
trainer.train() | |