|
from unsloth import FastLanguageModel |
|
import torch |
|
max_seq_length = 2048 |
|
dtype = None |
|
load_in_4bit = True |
|
|
|
model, tokenizer = FastLanguageModel.from_pretrained( |
|
model_name = "unsloth/Meta-Llama-3.1-8B-Instruct-bnb-4bit", |
|
max_seq_length = max_seq_length, |
|
dtype = dtype, |
|
load_in_4bit = load_in_4bit, |
|
) |
|
model = FastLanguageModel.get_peft_model( |
|
model, |
|
r = 16, |
|
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", |
|
"gate_proj", "up_proj", "down_proj",], |
|
lora_alpha = 16, |
|
lora_dropout = 0, |
|
bias = "none", |
|
|
|
use_gradient_checkpointing = "unsloth", |
|
random_state = 3407, |
|
use_rslora = False, |
|
loftq_config = None, |
|
) |
|
|
|
prompt_context = """Bạn là một tư vấn viên hữu ích về luật. |
|
### Instruction and Input: |
|
Dựa vào ngữ cảnh/tài liệu sau: |
|
{} |
|
Hãy trả lời câu hỏi: {} |
|
|
|
### Câu trả lời: |
|
{} |
|
""" |
|
|
|
prompt = """Bạn là một tư vấn viên hữu ích về luật. |
|
### Instruction and Input: |
|
Hãy trả lời câu hỏi: {} |
|
{} |
|
|
|
### Câu trả lời: |
|
{}""" |
|
|
|
EOS_TOKEN = tokenizer.eos_token |
|
def formatting_prompts_func(examples): |
|
instructions = examples["context"] |
|
inputs = examples["input"] |
|
outputs = examples["output"] |
|
texts = [] |
|
for instruction, input, output in zip(instructions, inputs, outputs): |
|
|
|
if instructions: |
|
text = prompt_context.format(instruction, input, output) + EOS_TOKEN |
|
else: |
|
text = prompt.format(input, output) + EOS_TOKEN |
|
texts.append(text) |
|
return { "text" : texts, } |
|
|
|
|
|
from datasets import load_dataset |
|
dataset = load_dataset("json", data_files="/root/unsloth/train_data.jsonl", split="train") |
|
dataset = dataset.map(formatting_prompts_func, batched = True,) |
|
|
|
|
|
from trl import SFTTrainer |
|
from transformers import TrainingArguments, DataCollatorForSeq2Seq |
|
from unsloth import is_bfloat16_supported |
|
|
|
from trl import SFTTrainer |
|
from transformers import TrainingArguments |
|
from unsloth import is_bfloat16_supported |
|
|
|
trainer = SFTTrainer( |
|
model=model, |
|
tokenizer=tokenizer, |
|
train_dataset=dataset, |
|
dataset_text_field="text", |
|
max_seq_length=max_seq_length, |
|
dataset_num_proc=16, |
|
packing=False, |
|
args=TrainingArguments( |
|
per_device_train_batch_size=16, |
|
gradient_accumulation_steps=4, |
|
num_train_epochs=1, |
|
learning_rate=2e-4, |
|
fp16=not is_bfloat16_supported(), |
|
bf16=is_bfloat16_supported(), |
|
logging_steps=1, |
|
optim="adamw_8bit", |
|
weight_decay=0.01, |
|
lr_scheduler_type="linear", |
|
seed=3407, |
|
output_dir="outputs", |
|
report_to="none", |
|
|
|
save_steps=500, |
|
save_total_limit=3, |
|
), |
|
) |
|
|
|
trainer_stats = trainer.train() |
|
|
|
model.save_pretrained("lora_model") |
|
tokenizer.save_pretrained("lora_model") |
|
|
|
model.save_pretrained_merged("model", tokenizer, save_method = "merged_16bit",) |
|
model.save_pretrained_merged("model", tokenizer, save_method = "lora",) |