Tinh chỉnh LLAMA-3.1 một cách hiệu quả với Unsloth: Tối ưu hóa cho Dữ liệu, Tốc độ và Chi phí
Tối ưu hóa mô hình LLAMA-3.1 của bạn với các kỹ thuật fine-tuning hiệu quả của Unsloth. Tìm hiểu cách khai thác LoRA và QLoRA để đào tạo nhanh hơn, yêu cầu VRAM thấp hơn và cải thiện hiệu suất mô hình. Khám phá tác động của siêu tham số đến mô hình fine-tuned của bạn. Khám phá giao diện chat của Unsloth để tương tác một cách trơn tru với các LLM tùy chỉnh của bạn.
16 tháng 2, 2025

Mở khóa sức mạnh của việc tinh chỉnh với LLAMA-3.1, cách dễ nhất để thích ứng các mô hình ngôn ngữ với nhu cầu cụ thể của bạn. Khám phá cách hiệu quả đào tạo mô hình LLAMA-3.1 của riêng bạn bằng cách sử dụng các kỹ thuật tiên tiến của Unsloth, bao gồm LoRa và QLoRa, để đạt được kết quả đáng kể với tài nguyên GPU tối thiểu. Bài đăng blog này cung cấp hướng dẫn từng bước để giúp bạn tối đa hóa tiềm năng của dữ liệu và tạo ra một mô hình ngôn ngữ được điều chỉnh để đáp ứng các yêu cầu độc đáo của bạn.
Các giai đoạn đào tạo khác nhau: Tiền huấn luyện, Tinh chỉnh có giám sát và Căn chỉnh ưu tiên
Các kỹ thuật Tinh chỉnh có giám sát: Tinh chỉnh toàn bộ, LoRA và QLoRA
Thiết lập các người áp dụng LoRA: Hạng, LoRA Alpha và LoRA Dropout
Chuẩn bị dữ liệu: Mẫu lời nhắc và Mã thông báo kết thúc chuỗi
Đào tạo mô hình với Trình đào tạo SFT
Suy luận và Phát trực tuyến
Lưu, Tải và Tinh chỉnh các mô hình
Giao diện trò chuyện mới của Unsloth
Các giai đoạn đào tạo khác nhau: Tiền huấn luyện, Tinh chỉnh có giám sát và Căn chỉnh ưu tiên
Các giai đoạn đào tạo khác nhau: Tiền huấn luyện, Tinh chỉnh có giám sát và Căn chỉnh ưu tiên
Có ba giai đoạn đào tạo khác nhau điển hình cho các mô hình ngôn ngữ lớn:
-
Tiền huấn luyện: Trong giai đoạn này, mô hình được huấn luyện trên một tập dữ liệu văn bản thô lớn để học cách dự đoán token hoặc từ tiếp theo. Kết quả là một mô hình cơ bản đã thu được nhiều kiến thức chung từ văn bản, nhưng vẫn chưa rất hữu ích cho các tác vụ cụ thể.
-
Tinh chỉnh có giám sát: Để làm cho mô hình cơ bản trở nên hữu ích hơn, giai đoạn thứ hai là tinh chỉnh có giám sát. Trong giai đoạn này, mô hình được huấn luyện trên các cặp câu hỏi-câu trả lời hoặc hướng dẫn-câu trả lời. Đầu vào là một câu hỏi hoặc hướng dẫn, và đầu ra là phản hồi hoặc câu trả lời mong muốn. Giai đoạn này cho phép mô hình học các kiến thức và khả năng cụ thể của tác vụ.
-
Căn chỉnh ưu tiên: Giai đoạn thứ ba tùy chọn là căn chỉnh ưu tiên, nơi mô hình được huấn luyện để học những gì người dùng ưa thích về phản hồi, hoặc để căn chỉnh mô hình với một số nguyên tắc nhất định. Điều này thường được thực hiện bằng cách sử dụng các kỹ thuật như Học Tăng cường từ Phản hồi của Con người (RLHF) hoặc Tối ưu hóa Chính sách Tranh luận (DPO).
Mục tiêu của video này là tập trung vào giai đoạn tinh chỉnh có giám sát, cụ thể là cách tinh chỉnh mô hình Llama 3.1 bằng thư viện Unsloth. Video sẽ bao gồm các kỹ thuật tinh chỉnh khác nhau, như tinh chỉnh đầy đủ, LoRA và QLoRA, và thảo luận về các trao đổi giữa chúng về hiệu suất và yêu cầu bộ nhớ.
Các kỹ thuật Tinh chỉnh có giám sát: Tinh chỉnh toàn bộ, LoRA và QLoRA
Các kỹ thuật Tinh chỉnh có giám sát: Tinh chỉnh toàn bộ, LoRA và QLoRA
Có ba tùy chọn phổ biến cho tinh chỉnh có giám sát:
-
Tinh chỉnh đầy đủ: Trong cách tiếp cận này, bạn lấy mô hình gốc và cập nhật trọng số với tập dữ liệu tinh chỉnh hướng dẫn. Điều này sẽ mang lại hiệu suất tốt nhất, nhưng yêu cầu VRAM sẽ cao.
-
LoRA (Thích ứng Hạng thấp): Thay vì trực tiếp cập nhật trọng số, bạn thêm các bộ điều hợp bên ngoài vào mô hình. Số lượng tham số trong các bộ điều hợp bên ngoài này có thể được kiểm soát. Các cập nhật trọng số cho các bộ điều hợp này được thực hiện bằng độ chính xác 16-bit, sau đó được hợp nhất trở lại vào các trọng số mô hình gốc. Cách tiếp cận này cung cấp huấn luyện nhanh, nhưng vẫn tốn kém do các hoạt động 16-bit.
-
QLoRA (LoRA Định lượng): Điều này tương tự như LoRA, nhưng các cập nhật trọng số được thực hiện bằng độ chính xác 4-bit, và các trọng số mô hình cũng được giữ ở 4-bit. Điều này yêu cầu ít VRAM hơn, nhưng hiệu suất có thể không tốt bằng LoRA hoặc tinh chỉnh đầy đủ.
Thiết lập các người áp dụng LoRA: Hạng, LoRA Alpha và LoRA Dropout
Thiết lập các người áp dụng LoRA: Hạng, LoRA Alpha và LoRA Dropout
Để thiết lập các bộ điều hợp LoRA, có một số tham số chính cần xem xét:
-
Hạng: Hạng của các bộ điều hợp LoRA kiểm soát số lượng tham số sẽ được cập nhật trong quá trình tinh chỉnh. Một hạng thấp hơn có nghĩa là ít tham số hơn, điều này giảm yêu cầu VRAM nhưng cũng có thể giới hạn khả năng thích ứng của mô hình. Ngược lại, một hạng cao hơn cho phép linh hoạt hơn nhưng yêu cầu nhiều VRAM hơn.
-
LoRA Alpha: Tham số này kiểm soát mức độ đóng góp của các bộ điều hợp LoRA vào các trọng số mô hình cuối cùng. Một giá trị LoRA Alpha cao hơn có nghĩa là các bộ điều hợp LoRA sẽ có ảnh hưởng mạnh hơn, trong khi một giá trị thấp hơn có nghĩa là chúng sẽ có ảnh hưởng yếu hơn.
-
LoRA Dropout: Tham số này kiểm soát tỷ lệ dropout được áp dụng cho các bộ điều hợp LoRA trong quá trình huấn luyện. Tăng tỷ lệ dropout có thể giúp ngăn chặn quá khớp, nhưng cũng có thể làm giảm hiệu suất của mô hình.
Chuẩn bị dữ liệu: Mẫu lời nhắc và Mã thông báo kết thúc chuỗi
Chuẩn bị dữ liệu: Mẫu lời nhắc và Mã thông báo kết thúc chuỗi
Để chuẩn bị dữ liệu để tinh chỉnh, chúng ta cần thiết lập mẫu lời nhắc và chỉ định token kết thúc chuỗi.
Mẫu lời nhắc là rất quan trọng, vì nó định nghĩa định dạng dữ liệu đầu vào mà mô hình sẽ được huấn luyện. Đối với gia đình Llama 3.1, chúng ta sẽ sử dụng mẫu lời nhắc Alpaca, bao gồm một hướng dẫn và một đầu vào cung cấp thêm ngữ cảnh. Mô hình sau đó được mong đợi sẽ tạo ra một phản hồi phù hợp.
# Mẫu lời nhắc Alpaca
prompt_template = "Dưới đây là một hướng dẫn mô tả một tác vụ kết hợp với một đầu vào cung cấp thêm ngữ cảnh. Hãy phản hồi với một kết quả liên quan.\n\nHướng dẫn: {instruction}\nĐầu vào: {input}\nĐầu ra:"
Ngoài ra, chúng ta cần chỉ định token kết thúc chuỗi để ngăn không cho mô hình tạo văn bản vô hạn. Đây là một bước quan trọng mà nhiều người đã gặp phải vấn đề khi sử dụng các phiên bản định lượng của các mô hình với LamaCPP.
# Đặt token kết thúc chuỗi
end_token = "</s>"
Bằng cách thiết lập mẫu lời nhắc và token kết thúc chuỗi, chúng ta đảm bảo rằng dữ liệu được định dạng đúng cho quá trình tinh chỉnh, đây là một bước quan trọng để đạt được kết quả tốt.
Đào tạo mô hình với Trình đào tạo SFT
Đào tạo mô hình với Trình đào tạo SFT
Để huấn luyện mô hình, chúng tôi sẽ sử dụng Trình huấn luyện SFT (Tinh chỉnh có Giám sát) từ gói TRL, được tạo và duy trì bởi Hugging Face.
Đầu tiên, chúng tôi cung cấp mô hình, bộ mã hóa và tập dữ liệu cho Trình huấn luyện SFT. Trong trường hợp này, chúng tôi đang sử dụng cột text
từ tập dữ liệu, vì chúng tôi đã thiết lập mẫu lời nhắc của chúng tôi để sử dụng trường này.
Chúng tôi cũng đặt độ dài chuỗi tối đa, phải dựa trên các ví dụ trong dữ liệu huấn luyện của bạn. Hãy nhớ rằng độ dài chuỗi cao hơn sẽ làm tăng yêu cầu VRAM.
Tiếp theo, chúng tôi cấu hình các đối số huấn luyện, chẳng hạn như thiết bị (trong trường hợp này là GPU T4 trên Google Colab với khoảng 15GB VRAM) và số bước huấn luyện.
Cuối cùng, chúng tôi chạy trình huấn luyện, và bạn có thể quan sát mất mát giảm dần, điều này là một dấu hiệu tốt của tiến trình huấn luyện.
Quá trình huấn luyện mất khoảng 8 phút, và bộ nhớ đỉnh được dự trữ là khoảng 8GB, tương đương 53% VRAM có sẵn trên GPU T4. Điều này chứng minh tính hiệu quả của cách tiếp cận Unsloth, cho phép tinh chỉnh với yêu cầu VRAM tương đối thấp.
Suy luận và Phát trực tuyến
Suy luận và Phát trực tuyến
Để thực hiện suy luận, chúng ta có thể sử dụng lớp hoặc phương thức for_inference
trên lớp FastLanguageModel
. Chúng ta cần cung cấp mô hình đã được huấn luyện và lời nhắc đầu vào ở định dạng Alpaca. Chúng ta cũng có thể đặt số lượng token tối đa để tạo.
# Thực hiện suy luận
input_prompt = alpaca_prompt(instruction, input)
output = model.for_inference(input_prompt, max_new_tokens=256)
print(output)
Để bật chế độ phát trực tiếp, chúng ta có thể tạo một đối tượng Streamer
và chuyển nó cho phương thức for_inference
. Điều này sẽ hiển thị các phản hồi một token một lần.
# Bật chế độ phát trực tiếp
streamer = Streamer()
output = model.for_inference(input_prompt, max_new_tokens=256, streamer=streamer)
Với điều này, bây giờ bạn có thể thực hiện suy luận trên mô hình đã được tinh chỉnh và thậm chí bật chế độ phát trực tiếp để có trải nghiệm tương tác hơn.
Lưu, Tải và Tinh chỉnh các mô hình
Lưu, Tải và Tinh chỉnh các mô hình
Để lưu mô hình đã được tinh chỉnh và bộ mã hóa, bạn có thể sử dụng hàm save_pretrained()
trên mô hình và bộ mã hóa:
model.save_pretrained("path/to/save/model")
tokenizer.save_pretrained("path/to/save/tokenizer")
Điều này sẽ lưu các trọng số mô hình và bộ mã hóa vào các thư mục được chỉ định dưới dạng một tập hợp các tệp JSON.
Để tải mô hình và bộ mã hóa đã lưu, bạn có thể sử dụng cùng lớp FastLanguageModel
và cung cấp các thư mục cục bộ:
model = FastLanguageModel.from_pretrained("path/to/save/model")
tokenizer = FastLanguageModel.from_pretrained("path/to/save/tokenizer")
Điều này sẽ tải mô hình và bộ mã hóa từ các tệp đã lưu.
Một tính năng tuyệt vời khác của Unsloth là khả năng lưu các mô hình ở các định dạng khác nhau, chẳng hạn như độ chính xác 16-bit cho VLLM hoặc trực tiếp ở định dạng GGUF cho LamaCPP. Điều này cho phép triển khai và tích hợp dễ dàng với các nền tảng và khung khác nhau.
Unsloth cũng giới thiệu một giao diện người dùng mới dựa trên Gradio, cho phép bạn chạy các mô hình được huấn luyện bằng Unsloth và tham gia vào các phiên trò chuyện tương tác. Bạn có thể nhân bản kho lưu trữ Unsloth Studio và chạy sổ ghi chép Colab được cung cấp để trải nghiệm tính năng này.
Giao diện trò chuyện mới của Unsloth
Giao diện trò chuyện mới của Unsloth
Unsloth đã giới thiệu một giao diện trò chuyện mới dựa trên thư viện Radish, cho phép bạn dễ dàng tương tác với
Câu hỏi thường gặp
Câu hỏi thường gặp

