AI Hunter
Member
Bạn hỏi AI: "Sếp đang giận, tôi phải làm sao?"
ChatGPT trả lời: "Bạn nên giữ bình tĩnh và tìm cơ hội nói chuyện riêng..." (Quá sách giáo khoa).
Bạn muốn AI trả lời kiểu Gen Z: "Xu cà na rồi fen ơi! Tém tém lại, đợi ổng hạ hỏa rồi hãy vào xin lỗi, đừng có ra dẻ lúc này!"
Để làm được điều này, Prompting là không đủ. Bạn cần Fine-tuning (Tinh chỉnh). Hôm nay, chúng ta sẽ dùng thư viện Unsloth để huấn luyện Llama 3 trở thành một "thánh chém gió" hoặc "chuyên gia công sở" ngay trên Google Colab (Free T4 GPU).
Ví dụ file `genz_data.jsonl`:
Bạn cần khoảng 50 - 100 cặp câu mẫu như thế này để AI bắt chước được giọng điệu.
Kết quả mong đợi: "Chốt đơn liền fen ơi, lên đồ đi quẩy nào!"
Bạn lấy file này, nạp vào Ollama và thế là bạn có một trợ lý ảo "độc nhất vô nhị".
ChatGPT trả lời: "Bạn nên giữ bình tĩnh và tìm cơ hội nói chuyện riêng..." (Quá sách giáo khoa).
Bạn muốn AI trả lời kiểu Gen Z: "Xu cà na rồi fen ơi! Tém tém lại, đợi ổng hạ hỏa rồi hãy vào xin lỗi, đừng có ra dẻ lúc này!"
Để làm được điều này, Prompting là không đủ. Bạn cần Fine-tuning (Tinh chỉnh). Hôm nay, chúng ta sẽ dùng thư viện Unsloth để huấn luyện Llama 3 trở thành một "thánh chém gió" hoặc "chuyên gia công sở" ngay trên Google Colab (Free T4 GPU).
1. Fine-tuning vs. RAG: Khi nào dùng cái nào?
- RAG (Retrieval): Khi cần AI biết KIẾN THỨC mới (Dữ liệu lương thưởng, quy trình công ty).
- Fine-tuning: Khi cần AI học PHONG CÁCH mới (Giọng điệu, cách hành văn, định dạng JSON/SQL đặc thù).
2. Chuẩn bị dữ liệu (Dataset)
Dữ liệu Fine-tuning thường ở dạng JSONL. Cấu trúc đơn giản: Input (Câu hỏi) -> Output (Câu trả lời mong muốn).Ví dụ file `genz_data.jsonl`:
JSON:
[
{"instruction": "Chào buổi sáng", "output": "Hé lô các homie, ngày mới cháy phố nha!"},
{"instruction": "Xin lỗi sếp", "output": "Sorry sếp iu, em lỡ tay xíu, để em fix ngay và luôn ạ!"},
{"instruction": "Hết tiền rồi", "output": "Còn cái nịt fen ơi, cuối tháng ăn mì gói cầm hơi."}
]
3. Quy trình Huấn luyện (Dùng Unsloth)
Unsloth là thư viện giúp train Llama 3 nhanh hơn 2 lần và tốn ít hơn 60% bộ nhớ so với cách truyền thống.Bước 1: Cài đặt
Bash:
pip install unsloth "xformers<0.0.26" "trl<0.9.0" peft accelerate bitsandbytes
Bước 2: Load Model (4-bit Quantization)
Python:
from unsloth import FastLanguageModel
import torch
# Load Llama 3 8B (Phiên bản nhẹ, chạy tốt trên Colab)
model, tokenizer = FastLanguageModel.from_pretrained(
model_name = "unsloth/llama-3-8b-bnb-4bit",
max_seq_length = 2048,
dtype = None,
load_in_4bit = True,
)
# Thêm LoRA Adapters (Chỉ train 1 phần nhỏ trọng số -> Tiết kiệm VRAM)
model = FastLanguageModel.get_peft_model(
model,
r = 16, # Rank càng cao train càng kỹ nhưng tốn VRAM
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"],
lora_alpha = 16,
lora_dropout = 0,
use_gradient_checkpointing = True,
)
Bước 3: Chuẩn bị Dataset
Python:
from datasets import load_dataset
# Hàm format dữ liệu theo chuẩn Alpaca
alpaca_prompt = """Below is an instruction that describes a task. Write a response that appropriately completes the request.
### Instruction:
{}
### Response:
{}"""
EOS_TOKEN = tokenizer.eos_token # Must add EOS_TOKEN
def formatting_prompts_func(examples):
instructions = examples["instruction"]
outputs = examples["output"]
texts = []
for instruction, output in zip(instructions, outputs):
text = alpaca_prompt.format(instruction, output) + EOS_TOKEN
texts.append(text)
return { "text" : texts, }
# Load file JSONL của bạn
dataset = load_dataset("json", data_files="genz_data.jsonl", split="train")
dataset = dataset.map(formatting_prompts_func, batched = True)
Bước 4: Train (Pha trà và đợi)
Python:
from trl import SFTTrainer
from transformers import TrainingArguments
trainer = SFTTrainer(
model = model,
tokenizer = tokenizer,
train_dataset = dataset,
dataset_text_field = "text",
max_seq_length = 2048,
args = TrainingArguments(
per_device_train_batch_size = 2,
gradient_accumulation_steps = 4,
warmup_steps = 5,
max_steps = 60, # Train nhanh demo (Tăng lên nếu dữ liệu nhiều)
learning_rate = 2e-4,
fp16 = not torch.cuda.is_bf16_supported(),
bf16 = torch.cuda.is_bf16_supported(),
logging_steps = 1,
output_dir = "outputs",
optim = "adamw_8bit",
),
)
trainer.train()
Bước 5: Test thử "nhân cách" mới
Python:
# Chạy Inference
FastLanguageModel.for_inference(model)
inputs = tokenizer(
[
alpaca_prompt.format(
"Tối nay đi chơi không?", # Instruction
"", # Output trống để AI điền
)
], return_tensors = "pt").to("cuda")
outputs = model.generate(**inputs, max_new_tokens = 64)
print(tokenizer.batch_decode(outputs)[0])
4. Xuất file GGUF để chạy trên Ollama
Sau khi train xong, bạn có thể xuất model ra định dạng GGUF để chạy offline trên máy tính (như bài hướng dẫn Ollama số trước).
Python:
model.save_pretrained_gguf("model_genz", tokenizer, quantization_method = "q4_k_m")
Kết luận
Fine-tuning không còn là đặc quyền của các công ty Big Tech. Với Llama 3 và Unsloth, bất kỳ ai cũng có thể tạo ra một bản sao kỹ thuật số của chính mình hoặc tùy biến AI cho các tác vụ chuyên biệt cực hẹp.Bài viết liên quan