Giới thiệu
Trong thời đại của các mô hình ngôn ngữ lớn, tinh chỉnh mô hình (fine tune) là vấn đề được rất nhiều người quan tâm [1]. Mô hình Llama 2 của Meta (trước là Facebook) là phiên bản tiếp theo của Llama 1, với phiên bản lớn nhất có tới 70 tỷ tham số. Mô hình này có khả năng xử lý thông tin mở rộng và sử dụng tính năng mới là Grouped Query Attention (GQA) [2] để tăng cường khả năng suy luận. Bài này sẽ giúp bạn tinh chỉnh Llama 2 cho bài toán hỏi-đáp.
Tại sao sử dụng Llama 2
Trước khi đi vào hướng dẫn sử dụng Llama 2, hãy tìm hiểu những điểm mạnh của mô hình này:
- Llama 2 được học từ 2 nghìn tỷ từ, nghĩa là nó đã biết đến rất nhiều thông tin.
- Với khả năng xử lý thông tin dài hơn, mô hình có thể hiểu và tạo ra nhiều nội dung hơn.
- Tính năng GQA giúp mô hình xử lý nhanh hơn bằng cách lưu trữ thông tin từ trước.
- Llama 2 hoạt động tốt hơn các phiên bản trước, đặc biệt là phiên bản 70 tỷ tham số. Nó hoạt động tốt hơn so với các mô hình khác như Llama 1 65B và cả mô hình Falcon.
- So với mô hình khác như GPT-3.5 hay PaLM (540B), Llama 2 70B vẫn cho thấy hiệu suất tốt. Mặc dù có một chút chênh lệch so với GPT-4 và PaLM-2-L, nhưng khả năng của mô hình rất rõ ràng.
Giải thích về LoRA
PEFT (Parameter-Efficient Fine-Tuning) là một thuật ngữ cho bài toán liên quan đến việc điều chỉnh các mô hình đã được đào tạo trước cho các nhiệm vụ mới với ít thay đổi nhất có thể đối với các tham số của mô hình. Tinh chỉnh hiệu quả về tham số giúp chỉnh sửa các mô hình đã được đào tạo trước để phù hợp với nhiệm vụ mới mà thay đổi ít tham số nhất. Điều này rất quan trọng cho các mô hình lớn như BERT, GPT. Dưới đây là lý do tại sao:
- Tránh quá khớp: Khi dữ liệu ít, thay đổi nhiều tham số có thể khiến mô hình quá khớp. PEFT giúp mô hình linh hoạt nhưng vẫn phù hợp với nhiệm vụ mới.
- Đào tạo nhanh: Ít thay đổi tham số có nghĩa là ít phép tính hơn, giúp đào tạo nhanh hơn.
- Tiết kiệm tài nguyên: Đào tạo mô hình sâu tốn nhiều tài nguyên. PEFT giảm tải tính toán và bộ nhớ, giúp triển khai dễ dàng hơn trong điều kiện tài nguyên hạn chế.
- Giữ kiến thức: Đào tạo trước trên dữ liệu lớn giúp mô hình có nhiều kiến thức chung. Với PEFT, chúng ta đảm bảo không mất đi kiến thức này khi điều chỉnh mô hình cho nhiệm vụ mới.
LoRA (Low Rank Adaptation), là một bước đột phá mang tính cách mạng trong thế giới của các mô hình ngôn ngữ lớn cho bài toán này. Khi tinh chỉnh, chúng ta thay đổi trọng số của mô hình đã được đào tạo trước bằng các ví dụ mới. Theo cách truyền thống, điều này cần một ma trận có cùng kích thước. Tuy nhiên, với một chút sáng tạo và khái niệm phân tích hạng [3], một ma trận có thể được chia thành hai ma trận nhỏ hơn. Khi nhân chúng lại với nhau, chúng xấp xỉ ma trận gốc. Ưu điểm của LoRA:
- Không cần yêu cầu GPU quá cao (thấp hơn ít nhất 3 lần).
- Hiệu suất tương đương, nếu không phải là tốt hơn, ngay cả khi không tinh chỉnh toàn bộ mô hình.
Tinh chỉnh Llama 2 với LoRA:
Chuẩn bị và thiết lập môi trường
Các bạn cần cài đặt các thư viện và module Python cần thiết như trong đoạn mã sau. Các thư viện và module này giúp tăng tốc độ huấn luyện, cho phép điều chỉnh PEFT, hỗ trợ huấn luyện và truy cập vào các mô hình và công cụ đã được huấn luyện trước.
!pip install -q accelerate==0.21.0 peft==0.4.0 bitsandbytes==0.40.2 transformers==4.31.0 trl==0.4.7 import os, torch, logging
from datasets import load_dataset
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, HfArgumentParser, TrainingArguments, pipeline
from peft import LoraConfig, PeftModel
from trl import SFTTrainer
Trong tutorial này chúng ta sẽ dùng bộ dữ liệu timdettmers/openassistant-guanaco là tập con của bộ dữ liệu OpenAsssistant nổi tiếng và có gần 1.000 bản mẫu. Bộ dữ liệu này đã được xử lý để phù hợp với định dạng của Llama 2. Những mẫu này đã được xử lý đặc biệt để phù hợp hoàn hảo với định dạng của Llama 2, giúp chúng có thể được sử dụng trực tiếp trong việc huấn luyện mà không cần chỉnh sửa thêm. Vì đã được xử lý phù hợp với định dạng của Llama 2, chúng có thể được sử dụng trực tiếp để huấn luyện mô hình cho các ứng dụng cụ thể như tạo chatbot, trợ lý ảo hoặc các ứng dụng khác liên quan đến ngôn ngữ. Ngoài ra bạn có thể thử sử dụng các bộ dữ liệu hội thoại khác trên kho dữ liệu của Hugging Face [4] để huấn luyện mô hình theo nhiều phong cách trò chuyện khác nhau.
Vì bài đã dài cộng thêm các chú giải tôi bổ sung nên các bạn vui lòng đọc tiếp trong phần 2 nhé.
Bài viết lược dịch từ: https://deci.ai/blog/fine-tune-llama-2-with-lora-for-question-answering/
Chú thích:
[1] Fine-tune (tinh chỉnh) là một quá trình trong học máy và học sâu, nơi một mô hình đã được đào tạo trước trên một tập dữ liệu lớn (thường gọi là mô hình tiền đào tạo) được tiếp tục đào tạo (hoặc "tinh chỉnh") trên một tập dữ liệu nhỏ hơn và thường là cụ thể hơn. Mục tiêu của việc tinh chỉnh là áp dụng kiến thức đã học từ tập dữ liệu lớn ban đầu để cải thiện hiệu suất trên một tác vụ cụ thể hoặc tập dữ liệu cụ thể.
[2] Grouped Query Attention (GQA) là một cơ chế chú ý mới được thiết kế để cải thiện khả năng mở rộng suy luận của các mô hình ngôn ngữ lớn. Trong cơ chế chú ý truyền thống, mỗi từ trong chuỗi đầu vào sẽ tính toán mức độ chú ý đối với mỗi từ khác trong chuỗi, dẫn đến một số lượng phép tính tăng theo cấp số nhân. Điều này có thể gây ra vấn đề về hiệu suất, đặc biệt khi xử lý các chuỗi dài. GQA giải quyết vấn đề này bằng cách nhóm các từ lại với nhau và chỉ tính toán mức độ chú ý cho mỗi nhóm, thay vì từng từ riêng lẻ. Điều này giảm đáng kể số lượng phép tính cần thiết và cho phép mô hình xử lý nhanh hơn và hiệu quả hơn với các chuỗi dài. Ngoài ra, GQA cũng giúp cải thiện khả năng mở rộng của mô hình khi được triển khai trên phần cứng, giúp tối ưu hóa việc sử dụng tài nguyên và giảm thời gian suy luận.
[3] Khái niệm "phân tích hạng" (hoặc "rank factorization" trong tiếng Anh) liên quan đến việc biểu diễn một ma trận thông qua phép nhân của hai ma trận có hạng thấp hơn. Mục tiêu của phân tích hạng là tìm ra hai ma trận nhỏ hơn sao cho khi nhân chúng lại với nhau, kết quả xấp xỉ với ma trận gốc. Để hình dung một cách đơn giản, giả sử bạn có một ma trận lớn A. Thay vì lưu trữ toàn bộ ma trận A, bạn muốn lưu trữ hai ma trận nhỏ hơn U và V sao cho A xấp xỉ bằng U nhân với V. Điều này giúp tiết kiệm không gian lưu trữ và tài nguyên tính toán, đặc biệt khi làm việc với các ma trận lớn. Trong ngữ cảnh của học máy và học sâu, phân tích hạng thường được sử dụng để giảm kích thước của mô hình, tăng tốc độ tính toán và giảm bộ nhớ cần thiết, mà không làm mất đi quá nhiều thông tin hoặc hiệu suất của mô hình.
[4] Hugging Face là một công ty công nghệ được biết đến rộng rãi với nền tảng và thư viện mã nguồn mở của họ dành cho xử lý ngôn ngữ tự nhiên (NLP). Hugging Face có sẵn các thư viện Transformer, các bộ dataset cũng như các mô hình cho mọi người sử dụng để nghiên cứu, phát triển.