Hướng dẫn finetune mô hình LLM đơn giản và miễn phí với Unsloth

0 0 0

Người đăng: Nguyên Phạm

Theo Viblo Asia

Chào mừng các bạn đến với bài viết hướng dẫn chi tiết cách finetune (tinh chỉnh) một mô hình ngôn ngữ lớn (LLM) một cách đơn giản và hoàn toàn miễn phí sử dụng thư viện Unsloth. Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một chatbot có khả năng tự động tạo workflow n8n dựa trên yêu cầu.

Bài toán

Mục tiêu của chúng ta là tạo ra một chatbot có thể hiểu yêu cầu của người dùng và trả về một workflow n8n tương ứng dưới dạng JSON một cách chính xác. Để đạt được điều này, chúng ta cần tinh chỉnh một mô hình LLM đã tồn tại trên bộ dữ liệu đặc thù về các template n8n.

Các bước thực hiện

Quá trình finetune sẽ bao gồm các bước chính sau:

  1. Chuẩn bị dữ liệu.
  2. Đưa dữ liệu lên Hugging Face.
  3. Tạo notebook và tiến hành finetune model.

1. Chuẩn bị dữ liệu

Bước đầu tiên và quan trọng nhất là chuẩn bị bộ dữ liệu chất lượng. Dữ liệu của chúng ta sẽ bao gồm các cặp inputoutput:

  • input: Tên hoặc mô tả ngắn gọn về template n8n.
  • output: Workflow n8n tương ứng dưới dạng chuỗi JSON.

Để xây dựng bộ dữ liệu này, bạn có thể tiến hành crawl dữ liệu từ các nguồn cung cấp template n8n.

2. Đưa dữ liệu lên Hugging Face

Để tiện lợi cho việc truy cập và sử dụng trong quá trình finetune, chúng ta sẽ lưu trữ bộ dữ liệu đã chuẩn bị lên nền tảng Hugging Face.

Bạn chỉ cần thực hiện các bước sau:

  • Truy cập trang web Hugging Face.
  • Tạo một dataset mới trên tài khoản của bạn.
  • Tải tệp JSON chứa bộ dữ liệu của bạn lên dataset vừa tạo.

Việc này giúp chúng ta có thể dễ dàng tải dữ liệu xuống trực tiếp trong môi trường Google Colab hoặc bất kỳ môi trường huấn luyện nào khác.

n8n-workflow

3. Tạo notebook và tiến hành finetune model

Bây giờ, chúng ta sẽ sử dụng Google Colab và thư viện Unsloth để tiến hành finetune mô hình. Unsloth là một thư viện giúp tăng tốc đáng kể quá trình finetune các mô hình LLM, cho phép chúng ta thực hiện công việc này ngay cả trên các tài nguyên miễn phí như Google Colab.

Bạn có thể bắt đầu bằng việc sao chép notebook mẫu được tạo sẵn bởi Unsloth. Notebook này cung cấp cấu trúc cơ bản và các đoạn mã cần thiết.

Link notebook mẫu của Unsloth

Sau khi sao chép notebook về Google Colab của mình, chúng ta cần sửa đổi một số đoạn mã để phù hợp với cấu trúc dữ liệu và bài toán cụ thể của mình.

Sửa đổi mã nguồn xử lý dữ liệu

Đoạn mã dưới đây là phần xử lý dữ liệu, chuyển đổi cặp input/output trong dataset của bạn thành định dạng prompt mà mô hình có thể hiểu được (theo định dạng Alpaca prompt).

alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. ### Instruction:
Create n8n workflow {} ### Response:
{}""" EOS_TOKEN = tokenizer.eos_token # Must add EOS_TOKEN
def formatting_prompts_func(examples): instructions = examples["input"] outputs = examples["output"] texts = [] # print(instructions,outputs) for instruction, output in zip(instructions, outputs): # Must add EOS_TOKEN, otherwise your generation will go on forever! text = alpaca_prompt.format(instruction, output) + EOS_TOKEN texts.append(text) return { "text" : texts, }
pass from datasets import load_dataset
# Thay "npv2k1/n8n-workflow" bằng tên dataset của bạn trên Hugging Face
dataset = load_dataset("npv2k1/n8n-workflow", split = "train")
dataset = dataset.map(formatting_prompts_func, batched = True,) 

Trong đoạn mã này:

  • alpaca_prompt: Định nghĩa cấu trúc của prompt đầu vào cho mô hình. Chúng ta chèn input (tên template) vào phần ### Instructionoutput (workflow JSON) vào phần ### Response.
  • formatting_prompts_func: Hàm này nhận các ví dụ từ dataset và áp dụng định dạng prompt đã định nghĩa.
  • load_dataset("npv2k1/n8n-workflow", split = "train"): Tải dataset của bạn từ Hugging Face. Hãy nhớ thay thế "npv2k1/n8n-workflow" bằng tên dataset thực tế của bạn trên Hugging Face.
  • dataset.map(...): Áp dụng hàm định dạng prompt lên toàn bộ dataset.

Cấu hình và chạy huấn luyện

Sau khi dữ liệu đã được chuẩn bị và định dạng đúng, chúng ta sẽ cấu hình các tham số cho quá trình huấn luyện và bắt đầu finetune.

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 = 2, packing = False, # Can make training 5x faster for short sequences. args = TrainingArguments( per_device_train_batch_size = 2, gradient_accumulation_steps = 4, warmup_steps = 5, num_train_epochs = 1, # Set this for 1 full training run. # max_steps = 60, # Hoặc sử dụng max_steps để train nhanh hơn 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", # Use this for WandB etc ),
) # Bắt đầu quá trình huấn luyện
trainer.train() 

Trong đoạn mã này:

  • Chúng ta sử dụng SFTTrainer từ thư viện trl (Transformer Reinforcement Learning) để huấn luyện mô hình trên dữ liệu đã định dạng.
  • TrainingArguments: Định nghĩa các tham số huấn luyện như kích thước batch, số epoch, tốc độ học, v.v.
    • num_train_epochs = 1: Đặt số epoch là 1 để mô hình học qua toàn bộ dataset một lần.
    • max_steps = 60: Bạn có thể bỏ comment dòng này và sử dụng max_steps thay cho num_train_epochs nếu muốn huấn luyện nhanh hơn với một số bước cố định.
  • trainer.train(): Bắt đầu quá trình huấn luyện mô hình.

Chạy thử mô hình:

image.png

Lưu model lên Hugging Face

Sau khi quá trình huấn luyện hoàn tất, bạn có thể lưu mô hình đã finetune của mình lên Hugging Face để dễ dàng chia sẻ và sử dụng sau này.

if True: # Đảm bảo điều kiện này là True để lưu model model.push_to_hub_gguf( "npv2k1/Qwen2.5-7B-n8n", # Thay "npv2k1/Qwen2.5-7B-n8n" bằng tên repository bạn muốn tạo trên Hugging Face tokenizer, quantization_method = ["q4_k_m"], # Chọn phương pháp lượng tử hóa phù hợp token = "", # Nhập Hugging Face token của bạn ở đây hoặc cấu hình môi trường ) 
  • model.push_to_hub_gguf(...): Hàm này từ Unsloth giúp đẩy mô hình lên Hugging Face ở định dạng GGUF (thường dùng cho các framework inference như llama.cpp).
  • Thay thế "npv2k1/Qwen2.5-7B-n8n" bằng tên repository mà bạn muốn tạo trên Hugging Face (ví dụ: your_username/your_model_name).
  • Nhập Hugging Face token của bạn vào tham số token. Bạn có thể lấy token này từ trang cài đặt tài khoản Hugging Face của mình (https://huggingface.co/settings/tokens). Hoặc cấu hình token trong môi trường Colab.

Download mô hình và chạy thử với lmstudio:

image.png

Kết luận

Như vậy, chỉ với vài bước đơn giản và sử dụng thư viện Unsloth, chúng ta đã có thể finetune một mô hình LLM để giải quyết bài toán cụ thể của mình. Mô hình đã được tinh chỉnh giờ đây có khả năng hiểu các yêu cầu về workflow n8n và tạo ra output dưới dạng JSON tương ứng.

Bạn có thể tiếp tục thử nghiệm với các tham số huấn luyện khác nhau, kích thước dataset lớn hơn hoặc các mô hình nền (base model) khác để đạt được kết quả tốt nhất cho bài toán của mình.

Chúc bạn thành công!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Lightweight Fine-Tuning: Một hướng đi cho những người làm AI trong kỉ nguyên của các Super Large Models (Phần 1)

Note: Tiêu đề và nội dung của bài viết này được lấy cảm hứng từ bài viết của sếp mình: "Hướng đi nào cho những người làm AI trong kỉ nguyên của các Super Large Models?". Recommend các bạn nên đọc để t

0 0 32

- vừa được xem lúc

Lightweight Fine-Tuning: Một hướng đi cho những người làm AI trong kỉ nguyên của các Super Large Models (Phần 2)

Note: Tiêu đề và nội dung của bài viết này được lấy cảm hứng từ bài viết của sếp mình: "Hướng đi nào cho những người làm AI trong kỉ nguyên của các Super Large Models?". Recommend các bạn nên đọc để t

0 0 29

- vừa được xem lúc

Lightweight Fine-Tuning: Một hướng đi cho những người làm AI trong kỉ nguyên của các Super Large Models (Phần 1)

Note: Tiêu đề và nội dung của bài viết này được lấy cảm hứng từ bài viết của sếp mình: "Hướng đi nào cho những người làm AI trong kỉ nguyên của các Super Large Models?". Recommend các bạn nên đọc để t

0 0 32

- vừa được xem lúc

[Từ Transformer Đến Language Model] Bài 2: Kiến trúc và phương pháp Generative-Pretraining của GPT model

Tiếp nối series kiến thức nền tảng của large language model. Ở Bài 1: Bắt đầu với kiến trúc mô hình - Transformer, mình đã giới thiệu với các bạn về kiến trúc khởi nguồn của large language model - tra

0 0 26

- vừa được xem lúc

Hướng dẫn xây dựng một trang web InterviewGPT ứng dụng chatgpt cho các bạn sinh viên thực hành phỏng vấn

Giới thiệu về InterviewGPT. InterviewGPT là một ứng dụng web được phát triển nhằm cung cấp một trải nghiệm tương tác và trợ giúp trong quá trình phỏng vấn việc làm.

0 0 27

- vừa được xem lúc

Lightweight Fine-Tuning: Một hướng đi cho những người làm AI trong kỉ nguyên của các Super Large Models (Phần 2)

Note: Tiêu đề và nội dung của bài viết này được lấy cảm hứng từ bài viết của sếp mình: "Hướng đi nào cho những người làm AI trong kỉ nguyên của các Super Large Models?". Recommend các bạn nên đọc để t

0 0 29