Hugging Face: Blog
92

Thủ thuật

Hướng dẫn Hugging Face: Dùng GRPO tinh chỉnh LFM2.5-350M, tăng tỷ lệ đầu ra cấu trúc lên 29.7% chỉ sau 100 bước

(giờ Việt Nam)

Tóm tắt AI

Hugging Face chia sẻ cách dùng thư viện TRL để tinh chỉnh mô hình LiquidAI trên GPU miễn phí. Chỉ với 500 mẫu và 100 bước huấn luyện, hiệu suất đạt chuẩn IFStruct đã cải thiện đáng kể từ 22.6% lên 29.7%.

Bản dịch AI

Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps

Hướng dẫn này là một công thức hoàn toàn công khai và chi phí thấp để giúp một mô hình nhỏ cải thiện đáng kể khả năng tuân thủ đầu ra có cấu trúc (structured-output compliance). Chúng tôi tinh chỉnh LFM2.5-350M bằng phương pháp Group Relative Policy Optimization (GRPO) sử dụng thư viện TRL và đánh giá trên bộ benchmark IFStruct. Toàn bộ quá trình chạy mất khoảng 500 mẫu và 100 bước huấn luyện, đủ nhỏ để thực hiện trên GPU miễn phí của Colab hoặc Kaggle, và mã nguồn đã có sẵn trên GitHub. Kết quả cho thấy ngay cả một quy trình tinh chỉnh nhẹ cũng cải thiện hiệu suất từ 22,6% lên 29,7% trên bộ benchmark IFStruct.

Đầu ra có cấu trúc là một trong những tác vụ thực tế phổ biến nhất đối với các LLM, tuy nhiên hầu hết các bộ benchmark đều gộp nó vào các điểm số suy luận hoặc trích xuất rộng hơn thay vì đo lường riêng biệt. Việc một mô hình có trả về đầu ra hợp lệ, có thể phân tích được theo định dạng và hình thái yêu cầu hay không — tức là sự tuân thủ lược đồ (schema compliance) — thường là yếu tố quyết định liệu nó có thể được tích hợp vào một hệ thống hạ nguồn hay không.

Lưu ý rằng quy trình huấn luyện được mô tả ở đây không phải là quy trình được sử dụng để huấn luyện mô hình RL trong bài blog về IFStruct. Notebook này không nhằm mục đích tái tạo điểm số benchmark IFStruct, mà để cho thấy cách tinh chỉnh các mô hình nhỏ theo tác vụ cụ thể có thể cải thiện hiệu suất và bắt kịp các mô hình lớn hơn nhiều như thế nào.

Điều kiện tiên quyết

Hướng dẫn này gồm hai phần được thực hiện ở các môi trường khác nhau:

Chúng ta sẽ cần uv cho các công cụ Python và llama.cpp để phục vụ (serving). Theo tài liệu triển khai llama.cpp của Liquid AI, hãy cài đặt llama.cpp bằng Homebrew và xác minh rằng llama-server đã sẵn sàng:

Đánh giá IFStruct trên LFM2.5-350M (Mô hình cơ sở)

Trước khi bắt đầu, hãy đánh giá LFM2.5-350M trên bộ benchmark IFStruct và xem liệu chúng ta có thể tái tạo điểm số 21,1% đã được báo cáo hay không.

IFStruct là một bộ benchmark để kiểm tra tính hợp lệ của đầu ra LLM và sự tuân thủ lược đồ. Bộ benchmark này là mã nguồn mở tại Liquid4All/ifstruct, với tập dữ liệu benchmark công khai có sẵn trên Hugging Face tại LiquidAI/ifstruct-v1.0.

Để so sánh đánh giá, chúng tôi phục vụ mô hình cục bộ trên MacBook bằng llama.cpp. Chúng tôi sẽ sử dụng BF16 GGUF (LiquidAI/LFM2.5-350M-GGUF).

Sau đó, chúng ta khởi động máy chủ mô hình cơ sở bằng lệnh sau:

Khi máy chủ đang chạy, chúng ta có thể chạy toàn bộ benchmark với 2000 mẫu:

Bài blog công bố IFStruct báo cáo 21,1% cho LFM2.5-350M. Thiết lập llama.cpp/BF16 cục bộ của chúng tôi đo được 22,6%, gần với mức 21,1% được báo cáo trong bài blog IFStruct. Chúng tôi sử dụng kết quả cục bộ này làm cơ sở để so sánh trên cùng một ngăn xếp phục vụ (serving stack).

Tinh chỉnh GRPO với TRL trên đầu ra có cấu trúc

Quy trình đầy đủ, có thể chạy được nằm trong notebook đi kèm. Chúng tôi sẽ chỉ đề cập đến các phần liên quan trong mục này.

Dữ liệu huấn luyện

Chúng tôi sử dụng nvidia/Nemotron-RL-instruction_following-structured_outputs, trong đó mỗi prompt được ghép nối với một JSON Schema mục tiêu và số lượng trường dự kiến. Chúng tôi sử dụng khoảng 500 mẫu để huấn luyện.

Vì phân phối dữ liệu Nemotron khác với đánh giá IFStruct, chúng tôi tăng cường các prompt để thu hẹp hai khoảng cách giữa chúng:

Mô hình và LoRA

Chúng tôi tải LiquidAI/LFM2.5-350M và gắn thêm một LoRA adapter. Vì LFM2.5 sử dụng kiến trúc kết hợp attention/convolution, chúng tôi nhắm mục tiêu vào các tên module đặc thù của LFM:

Quá trình này huấn luyện khoảng 6 triệu tham số, tương đương khoảng 1,66% mô hình.

Các hàm phần thưởng (Reward functions)

Sau đó, chúng tôi xác định ba hàm phần thưởng, mỗi hàm trên thang điểm [0, 1], để chấm điểm mọi kết quả hoàn thiện dựa trên việc cấu trúc được trích xuất có chính xác hay không:

Chúng tôi kết hợp ba hàm này thành một tổng có trọng số với reward_weights=[1.0, 0.5, 2.0].

Huấn luyện

Chúng tôi huấn luyện trong 100 bước với 8 thế hệ cho mỗi nhóm prompt, được định cỡ cho GPU 16 GB miễn phí:

Như bạn có thể thấy trong notebook, trong suốt quá trình chạy, cả ba thành phần phần thưởng đều tăng lên, KL từ mô hình tham chiếu bắt đầu tăng sau giai đoạn khởi động (warmup), và tỷ lệ hoàn thiện bị cắt ngắn (truncated-completion) duy trì gần bằng 0.

Hợp nhất và lưu mô hình

Cuối cùng, chúng tôi hợp nhất LoRA adapter trở lại các trọng số cơ sở và lưu nó thành một checkpoint độc lập, sẵn sàng để chuyển đổi sang GGUF phục vụ việc serving:

Đánh giá IFStruct trên LFM2.5-350M đã tinh chỉnh bằng GRPO

Sau khi tinh chỉnh bằng GRPO, chúng tôi chạy lại đánh giá IFStruct. Để làm điều này, chúng ta cần chuyển đổi checkpoint mô hình đã hợp nhất sang BF16 GGUF. Script chuyển đổi đi kèm với mã nguồn llama.cpp, vì vậy chúng tôi clone repo một lần và cài đặt gói gguf của trình chuyển đổi.

Sau đó, chúng tôi phục vụ mô hình đã hợp nhất bằng lệnh sau:

Tiếp theo, chúng ta sẽ chạy lại toàn bộ đánh giá IFStruct với mô hình đã tinh chỉnh:

So sánh hai lần chạy trên cùng một ngăn xếp phục vụ:

Các cải thiện đạt được chính xác như mục tiêu huấn luyện: tỷ lệ vượt qua JSON tăng gần 14 điểm (18,0% → 31,9%), trong khi YAML hầu như không đổi. Mặc dù con số này vẫn thấp hơn điểm số 33,15% của Qwen3.5-2B, nhưng nó cho thấy ngay cả việc tinh chỉnh nhẹ theo tác vụ cụ thể cũng có thể đưa một mô hình nhỏ đến gần với mô hình lớn hơn.

Kết luận

Một đợt chạy GRPO ngắn với khoảng 500 mẫu và 100 bước có thể nâng một mô hình nhỏ 350 triệu tham số từ 22,6% lên 29,7% trên IFStruct. Bài học rút ra là một tín hiệu phần thưởng giá rẻ, đặc thù theo tác vụ có thể làm cho một mô hình nhỏ trở nên đáng tin cậy hơn đáng kể về mặt định dạng, thu hẹp phần lớn khoảng cách với các mô hình lớn hơn gấp nhiều lần.

Để tái tạo hoặc mở rộng công trình này, hãy xem bài blog gốc về IFStruct v1.0, repo benchmark Liquid4All/ifstruct và tập dữ liệu LiquidAI/ifstruct-v1.0.

Đọc bài gốc

Bài viết được AI dịch và tổng hợp tự động từ Hugging Face: Blog. Liên kết bài gốc ở phía trên. Dữ liệu đồng bộ qua API công khai được ghi nguồn tại AI HOT (canonical) ↗. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.