Unsloth: tinh chỉnh và chạy mô hình mở trên máy riêng, từ QLoRA tới GGUF
Đăng ngày 12/10/2026
Mục lục bài nghiên cứu

Tóm lược và khuyến nghị: Unsloth hợp với ai muốn tự tinh chỉnh mô hình mở
Unsloth là kho mã gom hai việc thường tách rời: tinh chỉnh (fine-tuning, tức huấn luyện tiếp một mô hình có sẵn trên dữ liệu riêng) và chạy mô hình mở ngay trên máy của mình. README tại commit khảo sát mô tả ba cách dùng: Unsloth Desktop là ứng dụng máy tính, Unsloth Studio là giao diện web, Unsloth Core là thư viện dùng bằng mã. [1]
README nêu phạm vi rộng: chạy và huấn luyện LLM, mô hình tạo ảnh, embedding, âm thanh; xuất sang GGUF (định dạng lượng tử hóa mà llama.cpp dùng), FP8, NVFP4; phục vụ qua API tương thích OpenAI. Dự án công bố huấn luyện nhanh gấp đôi, ít hơn 70% VRAM mà không giảm độ chính xác; đó là số của nhà phát triển, bài không kiểm chứng. [1]
Nên cân nhắc Unsloth khi có dữ liệu riêng đủ sạch, cần mô hình học một giọng văn hay định dạng đầu ra ổn định và muốn giữ dữ liệu trên máy mình; không nên bắt đầu bằng nó nếu bài toán chủ yếu là tra cứu thông tin hay đổi như giá, tồn kho. Lõi theo Apache 2.0, nhưng studio/ và unsloth_cli/ theo AGPLv3. [2]
Vì sao tinh chỉnh vẫn khó với nhóm nhỏ: bộ nhớ GPU, quy trình rời rạc và khâu xuất mô hình
Rào cản đầu tiên là bộ nhớ GPU (VRAM). Tài liệu ước lượng VRAM của Studio chia tổng bộ nhớ thành sáu phần [5], mỗi phần phụ thuộc kích thước mô hình, độ dài chuỗi và kích thước lô, nên câu hỏi "máy này huấn luyện được không" không có đáp án chung.
Rào cản thứ hai là quy trình rời rạc: chuẩn bị dữ liệu, chọn mô hình gốc và phương pháp, theo dõi huấn luyện, đánh giá, xuất mô hình. README mô tả Unsloth gom các bước này: Data Recipes dựng tập dữ liệu từ PDF, CSV, DOCX, Studio huấn luyện, rồi xuất GGUF và phục vụ qua API. [1]
Rào cản thứ ba là đưa mô hình từ GPU huấn luyện tới nơi nhân viên dùng hằng ngày. README ghi nhận llama.cpp là thư viện giúp chạy và lưu mô hình với Unsloth, và có chế độ chỉ GGUF không cần PyTorch. [1] Unsloth không thay được dữ liệu tốt; nó giảm số công cụ rời mà một nhóm nhỏ phải tự ghép.
Một kho, ba lớp sản phẩm: Unsloth Core, Studio và Desktop
LICENSE và README cho thấy kho chia theo thư mục: unsloth/ chứa gói lõi, studio/ chứa ứng dụng Studio, unsloth_cli/ là phần cài đặt tùy chọn đi kèm, cùng tests/ và scripts/. [1][2] Desktop là bản đóng gói cho Windows, macOS và Linux, phát hành qua GitHub Releases. [1]
Studio không tự gánh mọi engine suy luận. Ngoài backend mặc định, nó có thể cài vLLM hoặc SGLang làm engine tùy chọn; mỗi engine chạy trong tiến trình và môi trường Python riêng, Studio không import gói của engine, phiên bản được khóa kèm mã băm, vì các engine ghim phiên bản Transformers khác Studio và xung đột với nhau. [3]
Máy chủ engine chỉ nghe trên loopback (địa chỉ nội bộ của chính máy) với cổng ngẫu nhiên và khóa xác thực; Studio quản lý tiến trình, kiểm tra sức khỏe, bàn giao GPU và đẩy engine khỏi GPU trước khi huấn luyện. [3] Studio vì thế là bộ điều phối tài nguyên trên một máy; tài liệu ghi rõ nó không cấu hình phục vụ nhiều nút. [3]
Nền móng là hệ sinh thái có sẵn: README cảm ơn llama.cpp, transformers và TRL của Hugging Face, PyTorch và TorchAO [1]; Unsloth là lớp tối ưu và lớp sản phẩm đặt lên trên, không phải framework học sâu độc lập.
Dữ liệu đi đâu: từ tệp CSV sản phẩm tới tệp GGUF phục vụ qua API
Theo các khả năng README mô tả, bài sắp vòng dữ liệu thành năm chặng: Data Recipes dựng tập dữ liệu; tải mô hình gốc về cache Hugging Face; huấn luyện LoRA hoặc QLoRA; xuất GGUF; nạp lại để phục vụ qua API. [1] Đây là cách sắp để phân tích, không phải sơ đồ chính thức.
Ở chặng huấn luyện, nếu người dùng không chọn GPU, hàm auto_select_gpu_ids ước lượng VRAM rồi chọn ít GPU nhất theo bộ nhớ trống; tiến trình worker đặt CUDA_VISIBLE_DEVICES trước khi khởi tạo PyTorch và nhận các tham số như kích thước lô, độ dài chuỗi, hạng LoRA, module đích, bộ tối ưu. [5]
Ở chặng phục vụ qua engine tùy chọn, lời gọi công cụ có thể do client quản lý, hoặc Studio tự thực thi công cụ tích hợp và công cụ MCP (Model Context Protocol, chuẩn nối mô hình với công cụ bên ngoài) qua luồng phê duyệt chung; ảnh cho mô hình thị giác được chuyển nguyên byte tới engine. [3] Khi bật công cụ, dữ liệu còn đi từ mô hình ra các hệ thống khác.
Luồng ngược chiều cũng có: MCP server riêng của Studio, nếu được bật, cho client bên ngoài xem trạng thái GPU, bắt đầu hay dừng huấn luyện, nạp checkpoint và xuất GGUF; yêu cầu start_training được kiểm tra bằng mô hình Pydantic trước khi tạo tiến trình con. [4]
Những gì đọc được trong README và tài liệu Studio tại commit e16ef2d
Về nền tảng, README nêu Unsloth chạy trên Windows, Linux, WSL, macOS với GPU NVIDIA, AMD, Intel, CPU và backend Vulkan, hỗ trợ nhiều GPU; Core cài bằng uv với Python 3.13. [1]
Về huấn luyện, README liệt kê LoRA (học thêm các ma trận nhỏ thay vì sửa toàn bộ trọng số), QLoRA (LoRA trên mô hình gốc lượng tử hóa 4-bit), tinh chỉnh toàn phần, tiền huấn luyện, GRPO, DPO và FP8. Bảng notebook Colab miễn phí ghi mức tăng tốc theo từng mô hình, chẳng hạn gpt-oss 20B nhanh gấp đôi; đó là số dự án công bố. [1]
Về suy luận, hồ sơ engine tùy chọn được ghi là thử nghiệm, cần Linux x86_64, GPU NVIDIA từ compute capability 8.0, driver 580 trở lên; vLLM còn chạy trên GPU AMD. Hồ sơ có ba chế độ đa GPU trên một máy và các mức BF16, FP16, 4-bit, INT8, FP8; adapter LoRA, đầu vào âm thanh, video và structured output nằm ngoài hồ sơ. [3]
Về kết nối, README mô tả API tương thích OpenAI, lệnh unsloth start nối Claude Code, Codex và agent khác với mô hình cục bộ, tìm kiếm web và RAG (truy xuất tài liệu để bổ sung ngữ cảnh). [1] Khi danh mục công cụ MCP chiếm quá ba phần tư cửa sổ ngữ cảnh, Studio rút gọn các công cụ lớn và cấp công cụ mcp_tool_schema để lấy lược đồ đầy đủ khi cần. [4]
Nhóm người dùng phù hợp và không phù hợp
Hợp nhất là nhóm kỹ thuật nhỏ có ít nhất một GPU và một đầu ra lặp lại: viết theo mẫu, phân loại, trích xuất, trả lời theo giọng cố định. Studio cho người chưa quen viết vòng huấn luyện thử LoRA, QLoRA qua giao diện; Core hợp với người muốn đưa bước tinh chỉnh vào pipeline riêng. [1]
Nhóm thứ hai muốn chạy mô hình mở cục bộ cho trợ lý lập trình hoặc agent: README mô tả unsloth start nối Claude Code, Codex, Hermes, OpenCode với mô hình trên máy qua API tương thích OpenAI và Anthropic. [1] Nhóm này cần đọc kỹ phần bảo mật vì agent có thể chạy mã.
Nhóm thứ ba là R&D, trường học, phòng thí nghiệm muốn thử học tăng cường hay embedding; notebook Colab miễn phí là điểm khởi đầu chưa cần mua GPU. [1] Tổ chức cần phục vụ đông người dùng trên nhiều máy nên nhìn sang engine phục vụ chuyên dụng. [3]
Tình huống giả định: shop thời trang trên sàn TMĐT dạy mô hình viết mô tả và tư vấn size
Giả sử một shop thời trang nữ bán trên ba sàn thương mại điện tử với khoảng hai nghìn mã hàng. Việc tốn công nhất là viết mô tả theo giọng riêng của shop và trả lời câu hỏi về size, chất liệu, cách giặt. Shop có CSV thuộc tính sản phẩm, bảng size dạng PDF và lịch sử chat với khách.
Đề xuất: dùng Studio trên một máy trạm có GPU để tinh chỉnh QLoRA một mô hình mở cỡ nhỏ có giấy phép cho dùng thương mại. Data Recipes dựng tập huấn luyện từ CSV và PDF [1], mỗi mẫu gồm thuộc tính làm đầu vào và mô tả do nhân viên viết làm đầu ra; lịch sử chat chỉ dùng sau khi xóa tên, số điện thoại, địa chỉ. Mô hình được xuất GGUF và phục vụ qua API tương thích OpenAI [1] cho công cụ soạn nháp nội bộ.
Nguyên tắc cứng: mô hình học giọng văn và cấu trúc, còn giá, tồn kho, khuyến mãi luôn lấy từ CSV lúc soạn và chèn vào prompt. Tư vấn size phải dẫn số đo từ bảng size của đúng mã hàng; câu hỏi ngoài dữ liệu thì trả lời cần nhân viên xác nhận. Mọi bản nháp được người duyệt trước khi đăng hay gửi khách.
Nên tránh dùng mô hình diffusion để sinh ảnh sản phẩm, dù README có hỗ trợ mô hình tạo ảnh [1]: ảnh sinh ra có thể sai màu, sai chất liệu so với hàng thật và kéo theo khiếu nại, nên ảnh đăng bán phải là ảnh chụp thật.
Cài đặt, cập nhật và chia sẻ GPU trên một máy trạm
Trên máy chủ Linux, ảnh Docker unsloth/unsloth chạy với quyền GPU, mở cổng 8000 và 8888, gắn thư mục làm việc và cache Hugging Face, nơi chứa mô hình tải về; GPU AMD dùng ảnh unsloth/unsloth-rocm. [1] Cần dự trù ổ đĩa và lịch dọn cache.
README phân biệt bản cài từ nhánh main, được mô tả là bản mới nhất kiểu nightly (bản dựng hằng đêm), với bản phát hành; liên kết Desktop cho Windows ARM64 trỏ tới một bản có hậu tố beta. [1] Môi trường làm việc thật nên ghim phiên bản phát hành, ghi phiên bản vào hồ sơ mỗi lần huấn luyện và chỉ nâng cấp sau khi chạy lại bộ kiểm tra riêng.
Biến môi trường hữu ích gồm UNSLOTH_STUDIO_HOME để cài vào vị trí tách biệt, UNSLOTH_NO_TORCH cho chế độ chỉ GGUF, UNSLOTH_LLAMA_CPP_BACKEND để chọn backend. [1]
Chia sẻ GPU cần lên lịch: engine suy luận tuân ngân sách VRAM của Studio, chừa ít nhất 512 MiB mỗi GPU cho driver, và huấn luyện sẽ đẩy engine ra trước khi cấp phát. [3] Trên một máy trạm duy nhất, đừng vừa phục vụ nhân viên vừa huấn luyện; hãy huấn luyện ngoài giờ.
Công cụ phía máy chủ bật sẵn, liên kết Cloudflare và MCP: khóa gì trước khi mở mạng
README cảnh báo thẳng: công cụ phía máy chủ bật mặc định, cần giữ mật khẩu an toàn hoặc dùng cờ --disable-tools khi mở Unsloth ra mạng; lệnh unsloth studio --secure tạo liên kết Cloudflare HTTPS truy cập được từ mọi nơi, và Studio hỏi mật khẩu quản trị khi mở ra mạng. [1] Shop trong tình huống trên chỉ nên mở trong LAN, tắt công cụ không cần và không tạo liên kết công khai.
Tài liệu MCP cho thấy mức rủi ro: công cụ Blender MCP sau khi được phê duyệt có thể chạy Python và ghi tệp, bridge của nó không xác thực nên phải giữ cục bộ, và nhà cung cấp mô hình bên ngoài nhận kết quả công cụ. MCP server riêng của Studio mặc định tắt, khi bật đòi Bearer token và nên giữ ở localhost, vì công cụ của nó có thể chiếm GPU, ghi tệp, dừng việc đang chạy. [4]
Mã mô hình tùy biến phải qua thiết lập đồng ý trust-remote-code, tức cho phép chạy mã đi kèm mô hình, còn engine chỉ nghe trên loopback [3]; đừng nới lỏng hai lớp này cho tiện.
Quyền riêng tư của dữ liệu huấn luyện thì không công cụ nào lo thay: mô hình tinh chỉnh trên hội thoại chưa ẩn danh có thể lặp lại tên hay số điện thoại khách, rủi ro chung của huấn luyện trên dữ liệu cá nhân chứ không riêng Unsloth. Cần lọc dữ liệu cá nhân trước huấn luyện và dò rò rỉ sau huấn luyện.
Apache 2.0 cho lõi, AGPL-3.0 cho Studio: đọc ranh giới theo thư mục
Trường giấy phép GitHub nhận diện là Apache 2.0, nhưng phần cuối tệp LICENSE ghi rõ: tệp trong unsloth/, tests/, scripts/ theo Apache 2.0; tệp trong studio/ và unsloth_cli/, phần cài đặt tùy chọn, theo AGPLv3. [2] README gọi đây là cấp phép kép [1], và tệp studio/LICENSE.AGPL-3.0 chứa văn bản GNU AGPL phiên bản 3. [7]
Một điểm cần làm rõ với bộ phận pháp lý: thư mục unsloth/kernels/moe, nằm trong phần unsloth/ mà LICENSE gốc xếp vào Apache 2.0, lại có tệp LICENSE riêng mang văn bản GNU AGPL phiên bản 3. [2][6] Bài không suy ra được ý định của tác giả; đơn vị định sửa hay phân phối lại kernel MoE nên hỏi dự án hoặc luật sư.
AGPL-3.0 có điều khoản tương tác qua mạng: phiên bản đã sửa đổi phải cho mọi người dùng tương tác từ xa cơ hội nhận mã nguồn tương ứng. [7] Shop dùng Studio nguyên bản trong nội bộ ít khi chạm điều khoản này; đơn vị sửa Studio rồi mở cho khách dùng qua mạng thì phải xem xét kỹ. Đây là phân tích chung, không phải tư vấn pháp lý.
Giấy phép của kho chỉ bao phủ mã Unsloth tại commit này. Trọng số tải từ Hugging Face, kể cả các bản GGUF dưới tài khoản unsloth mà README dẫn tới [1], cần kiểm tra điều khoản theo từng mô hình; dữ liệu, vLLM, SGLang, llama.cpp và thư viện phụ thuộc có giấy phép riêng, và mô hình tinh chỉnh vẫn chịu ràng buộc của mô hình gốc.
Công thức ước lượng VRAM của Studio: đọc trước khi mua hoặc thuê GPU
VRAM_ESTIMATION.md trong backend Studio rất hữu ích cho người lập ngân sách. Công thức cộng sáu phần: trọng số, adapter LoRA, trạng thái bộ tối ưu, gradient, activation và chi phí cố định CUDA; với QLoRA 4-bit, phần trọng số lượng tử hóa được tính theo hệ số 3,2 để bù thang đo theo khối của định dạng NF4. [5]
Bảng bộ tối ưu cho thấy lựa chọn nhỏ có ảnh hưởng lớn: adamw_8bit tính 4 byte mỗi tham số huấn luyện, adamw_torch 6 byte, paged_adamw_32bit 8 byte, và với LoRA hay QLoRA chỉ tham số adapter được tính. Chi phí CUDA cố định đặt ở 1,4 GB, hiệu chỉnh trên một GPU RTX 5070 Ti. [5]
Với nhiều GPU, mỗi GPU sau GPU đầu chỉ góp 85% bộ nhớ trống để bù bộ đệm NCCL, truyền dữ liệu và phân mảnh; hệ số này được hiệu chỉnh thực nghiệm trên cấu hình 2 đến 8 GPU. [5] Hai GPU vì thế không bằng một GPU bộ nhớ gấp đôi. Cách dùng: lấy cấu hình mô hình định dùng, độ dài chuỗi thật và kích thước lô, tính thử, rồi xác nhận bằng một vòng huấn luyện ngắn kèm biên an toàn.
Nguồn lực thật sự cần: GPU, công làm sạch dữ liệu và người duyệt
Bài không nêu giá phần cứng hay giá thuê GPU vì chúng biến động. Chi phí nên lập theo loại nguồn lực: một máy trạm GPU NVIDIA hoặc AMD đủ VRAM theo ước lượng ở phần trên, hoặc giờ thuê GPU đám mây cho từng đợt huấn luyện; ổ đĩa cho cache mô hình, checkpoint (bản lưu giữa chừng) và bản GGUF. [1][5]
Chi phí người thường lớn hơn chi phí máy. Với shop thời trang, việc nặng nhất là chuẩn hóa CSV, chọn vài trăm mô tả mẫu đạt chuẩn và ẩn danh lịch sử chat. Cần một người hiểu dữ liệu sản phẩm, một người quen Python hoặc thao tác Studio, và người duyệt đầu ra suốt giai đoạn thử.
Các khoản dễ quên: điện và làm mát khi huấn luyện nhiều giờ, huấn luyện lại khi đổi mô hình gốc, kiểm tra lại sau mỗi lần cập nhật. Notebook Colab miễn phí giúp thử trước khi đầu tư [1], nhưng không nên đưa dữ liệu khách thật lên đó khi chưa xem điều khoản dịch vụ.
Prompt, RAG hay tinh chỉnh: đặt Unsloth vào đúng chỗ
Cách đơn giản nhất là không huấn luyện: gọi mô hình mạnh qua API với prompt có ví dụ mẫu, nhanh nhưng tốn phí theo lượt và đưa dữ liệu ra ngoài. RAG hợp với dữ kiện hay đổi như giá, tồn kho, chính sách đổi trả; README cũng liệt kê RAG trong nhóm tính năng chạy mô hình. [1]
Tinh chỉnh phát huy khi mục tiêu là hành vi ổn định: giọng văn, cấu trúc mô tả, cách từ chối đúng mực. Thực tế nên kết hợp: mô hình đã tinh chỉnh viết đúng giọng, còn dữ kiện được chèn từ dữ liệu tra cứu.
Nếu đã chọn tinh chỉnh, có thể dùng trực tiếp transformers và TRL [1], các bộ công cụ như Axolotl hay LLaMA-Factory, hoặc dịch vụ tinh chỉnh do nhà cung cấp mô hình lưu trữ hộ; bài không so sánh tốc độ giữa chúng. Ở cấp phương án, Unsloth gom giao diện, ước lượng VRAM, xuất GGUF và phục vụ vào một chỗ, đổi lại là ràng buộc AGPL ở phần Studio. [2][5]
Khi nào không nên tinh chỉnh bằng Unsloth
Không nên tinh chỉnh khi chưa có tập đánh giá cố định, vì không biết mô hình tốt lên hay chỉ nói khác đi; cũng không nên tinh chỉnh để dạy dữ kiện thay đổi hằng ngày.
Số liệu hiệu năng trong README là của nhà phát triển, và chính tài liệu engine ghi rằng hiệu năng cùng mức tiết kiệm lưu trữ cần đo riêng. [1][3] Hồ sơ engine tùy chọn còn là thử nghiệm với yêu cầu phần cứng hẹp [3], nên máy Windows hay GPU đời cũ phải được kiểm tra thực tế.
Phần Studio theo AGPL-3.0 có thể không hợp với đơn vị định nhúng Studio đã sửa vào sản phẩm giao cho khách hàng. [2][7] Nhịp phát hành nhanh với nhãn beta [1] đòi kỷ luật ghim phiên bản và kiểm tra lại sau mỗi lần cập nhật.
Lộ trình thử nghiệm sáu tuần với bộ 200 mã hàng kiểm tra
Giai đoạn chuẩn bị, hai tuần đầu: chọn 200 mã hàng làm tập kiểm tra cố định, không dùng để huấn luyện; mỗi mã có mô tả chuẩn do nhân viên viết và 3 câu hỏi khách hay gặp kèm đáp án theo bảng size; ghi lại thời gian trung bình viết một mô tả để làm mốc. Đây là kế hoạch đề xuất, chưa có kết quả.
Giai đoạn huấn luyện, tuần 3 và 4: ước lượng VRAM, huấn luyện QLoRA, xuất GGUF, phục vụ qua API nội bộ. Chỉ số: tỷ lệ mô tả không sai thuộc tính so với CSV; tỷ lệ bản nháp được duyệt chỉ với chỉnh sửa nhỏ; tỷ lệ tư vấn size đúng bảng; số lần mô hình bịa thông tin. Ngưỡng đạt do chủ shop đặt trước.
Giai đoạn chạy song song, tuần 5 và 6: nhân viên dùng bản nháp cho hàng mới và so thời gian với mốc; thử truy cập Studio từ ngoài LAN, thử prompt dụ mô hình lộ thông tin khách. Dừng nếu lỗi sai thuộc tính lọt qua khâu duyệt, có rò rỉ dữ liệu cá nhân, hoặc thời gian duyệt không giảm so với tự viết; khi đó quay về phương án prompt kèm dữ liệu tra cứu.
Kết luận: tinh chỉnh để học giọng văn, tra cứu để giữ dữ kiện
Unsloth tại commit khảo sát là bộ sản phẩm gồm Core, Studio và Desktop, kèm suy luận, MCP, RAG và xuất mô hình. [1] Với nhóm nhỏ, giá trị lớn nhất là hạ rào cản kỹ thuật: ước lượng VRAM, giao diện huấn luyện, xuất GGUF và phục vụ qua API chuẩn. [1][5]
Giá trị đó chỉ hiện ra khi dữ liệu sạch, có tập đánh giá và có người duyệt. Hai điểm cần đưa vào kế hoạch từ đầu là ranh giới Apache 2.0 và AGPL-3.0 theo thư mục, và cấu hình mạng của Studio. [1][2][4]
Shop thời trang trong tình huống giả định không cần mô hình biết mọi thứ; nó cần mô hình viết đúng giọng, không bịa số đo và không bao giờ tự đăng bài khi chưa có người duyệt.
Nguồn, commit e16ef2d và giới hạn của một nghiên cứu tài liệu
Unsloth vào loạt bài qua một kho lưu độc lập các danh sách GitHub Trending theo ngôn ngữ: bằng chứng là danh sách Python ngày 02/01/2026, kho ở vị trí 8; bảng ứng viên của loạt bài đếm 30 lần xuất hiện đến 10/10/2026. Kho lưu chỉ theo dõi Python, Go, JavaScript, Swift, thiếu ngày 03/09 và 12/10/2026, nên không phải bảng Top 100 chính thức của GitHub. [8]
Commit đối chiếu là e16ef2d0937cd5a5cba5078d00bec9d1ef96c453 của unslothai/unsloth, commit ngày 12/10/2026 và kiểm tra cùng ngày. Ngoài README và LICENSE, bài đọc năm tài liệu cùng commit: studio/INFERENCE_ENGINES.md, studio/MCP.md, VRAM_ESTIMATION.md của backend Studio, LICENSE của unsloth/kernels/moe và studio/LICENSE.AGPL-3.0. [1][2][3][4][5][6][7] Các LICENSE khác trong thư mục vendor, grouped_gemm và trang tài liệu ngoài kho chưa được đọc nên không dùng làm căn cứ.
Đây là nghiên cứu tài liệu có hỗ trợ AI, không phải công bố khoa học có phản biện. Bài không cài đặt, không huấn luyện, không đo tốc độ hay bộ nhớ của Unsloth; mọi con số hiệu năng là số dự án công bố và được ghi như vậy. Tình huống shop thời trang, chỉ số và lộ trình thử nghiệm là đề xuất phân tích.
Xem mã nguồn Unsloth trên GitHub