Mô hình và nền tảng AI
Hướng Dẫn Duy Nhất Bạn Cần Để Tinh Chỉnh Llama 3 Hoặc Mô Hình Mở Nguồn Khác
Tinh chỉnh các mô hình ngôn ngữ lớn (LLM) như Llama 3 liên quan đến việc điều chỉnh một mô hình được đào tạo trước để thực hiện các nhiệm vụ cụ thể bằng cách sử dụng một tập dữ liệu cụ thể cho miền. Quá trình này tận dụng kiến thức đã có của mô hình, làm cho nó trở nên hiệu quả và tiết kiệm chi phí so với việc đào tạo từ đầu. Trong hướng dẫn này, chúng tôi sẽ đi qua các bước để tinh chỉnh Llama 3 bằng cách sử dụng QLoRA (Quantized LoRA), một phương pháp hiệu quả về tham số giúp giảm thiểu việc sử dụng bộ nhớ và chi phí tính toán.
Tổng Quan Về Tinh Chỉnh
Tinh chỉnh bao gồm một số bước chính:
- Chọn Mô Hình Đã Đào Tạo Trước: Chọn một mô hình cơ sở phù hợp với kiến trúc mong muốn.
- Tập Dữ Liệu Liên Quan: Thu thập và tiền xử lý một tập dữ liệu cụ thể cho nhiệm vụ.
- Tinh Chỉnh: Điều chỉnh mô hình bằng cách sử dụng tập dữ liệu để cải thiện hiệu suất trên các nhiệm vụ cụ thể.
- Đánh Giá: Đánh giá mô hình tinh chỉnh bằng cách sử dụng cả các chỉ số định tính và định lượng.
Khái Niệm và Kỹ Thuật
Tinh Chỉnh Toàn Diện
Tinh chỉnh toàn diện cập nhật tất cả các tham số của mô hình, làm cho nó cụ thể cho nhiệm vụ mới. Phương pháp này yêu cầu tài nguyên tính toán đáng kể và thường không thực tế cho các mô hình rất lớn.
Tinh Chỉnh Hiệu Suất Tham Số (PEFT)
PEFT chỉ cập nhật một tập con của các tham số của mô hình, giảm yêu cầu về bộ nhớ và chi phí tính toán. Kỹ thuật này ngăn chặn việc quên có hại và duy trì kiến thức chung của mô hình.
Tích Hợp Thấp (LoRA) và QLoRA
LoRA tinh chỉnh chỉ một vài ma trận thấp, trong khi QLoRA lượng tử hóa các ma trận này để giảm thêm dấu chân bộ nhớ.
Phương Pháp Tinh Chỉnh
- Tinh Chỉnh Toàn Diện: Điều này liên quan đến việc đào tạo tất cả các tham số của mô hình trên tập dữ liệu cụ thể cho nhiệm vụ. Mặc dù phương pháp này có thể rất hiệu quả, nhưng nó cũng tốn kém về mặt tính toán và yêu cầu nhiều bộ nhớ.
- Tinh Chỉnh Hiệu Suất Tham Số (PEFT): PEFT cập nhật chỉ một tập con của các tham số của mô hình, làm cho nó hiệu quả hơn về bộ nhớ. Các kỹ thuật như LoRA và QLoRA thuộc loại này.
LoRA Là Gì?

So Sánh Phương Pháp Tinh Chỉnh: QLORA Cải Tiến LoRA với Quantization 4 Bit và Paged Optimizers để Quản Lý Spike Bộ Nhớ
LoRA là một phương pháp tinh chỉnh được cải tiến, trong đó thay vì tinh chỉnh tất cả các trọng số của mô hình đã đào tạo trước, hai ma trận nhỏ hơn được tinh chỉnh để xấp xỉ ma trận lớn hơn. Những ma trận này tạo thành bộ điều chỉnh LoRA. Bộ điều chỉnh tinh chỉnh này sau đó được tải vào mô hình đã đào tạo trước và được sử dụng cho quá trình suy luận.
Lợi Thế Của LoRA:
- Hiệu Suất Bộ Nhớ: LoRA giảm dấu chân bộ nhớ bằng cách tinh chỉnh chỉ các ma trận nhỏ thay vì toàn bộ mô hình.
- Tái Sử Dụng: Mô hình ban đầu vẫn không thay đổi, và nhiều bộ điều chỉnh LoRA có thể được sử dụng với nó, giúp xử lý nhiều nhiệm vụ với yêu cầu bộ nhớ thấp hơn.
QLoRA Là Gì?
QLoRA đưa LoRA lên một bước nữa bằng cách lượng tử hóa trọng số của các bộ điều chỉnh LoRA xuống độ chính xác thấp hơn (ví dụ: 4 bit thay vì 8 bit). Điều này giảm thêm việc sử dụng bộ nhớ và yêu cầu lưu trữ trong khi vẫn duy trì mức hiệu suất tương đương.
Lợi Thế Của QLoRA:
- Hiệu Suất Bộ Nhớ Còn Lại: Bằng cách lượng tử hóa trọng số, QLoRA giảm đáng kể yêu cầu về bộ nhớ và lưu trữ của mô hình.
- Duy Trì Hiệu Suất: Mặc dù độ chính xác giảm, QLoRA vẫn duy trì mức hiệu suất gần giống với mô hình chính xác đầy đủ.
Thích Ứng Nhiệm Vụ Cụ Thể
Trong quá trình tinh chỉnh, các tham số của mô hình được điều chỉnh dựa trên tập dữ liệu mới, giúp mô hình hiểu và tạo nội dung liên quan đến nhiệm vụ cụ thể tốt hơn. Quá trình này giữ lại kiến thức ngôn ngữ chung được thu thập trong quá trình đào tạo trước trong khi điều chỉnh mô hình cho các sắc thái của miền mục tiêu.
Tinh Chỉnh Trong Thực Tiễn
Tinh Chỉnh Toàn Diện So Với PEFT
- Tinh Chỉnh Toàn Diện: Bao gồm việc đào tạo toàn bộ mô hình, có thể tốn kém về tính toán và yêu cầu nhiều bộ nhớ.
- PEFT (LoRA và QLoRA): Tinh chỉnh chỉ một tập con của các tham số, giảm yêu cầu về bộ nhớ và ngăn chặn việc quên có hại, làm cho nó trở thành một giải pháp thay thế hiệu quả hơn.
Các Bước Thực Hiện
- Cài Đặt Môi Trường: Cài đặt các thư viện cần thiết và thiết lập môi trường tính toán.
- Tải và Tiền Xử Lý Tập Dữ Liệu: Tải tập dữ liệu và tiền xử lý nó thành định dạng phù hợp với mô hình.
- Tải Mô Hình Đã Đào Tạo Trước: Tải mô hình cơ sở với cấu hình lượng tử hóa nếu sử dụng QLoRA.
- Token Hóa: Token hóa tập dữ liệu để chuẩn bị cho quá trình đào tạo.
- Đào Tạo: Tinh chỉnh mô hình bằng cách sử dụng tập dữ liệu đã chuẩn bị.
- Đánh Giá: Đánh giá hiệu suất của mô hình trên các nhiệm vụ cụ thể bằng cách sử dụng cả chỉ số định tính và định lượng.
Hướng Dẫn Bước Bước Để Tinh Chỉnh LLM
Cài Đặt Môi Trường
Chúng tôi sẽ sử dụng một cuốn sổ tay Jupyter cho hướng dẫn này. Các nền tảng như Kaggle, cung cấp sử dụng GPU miễn phí, hoặc Google Colab là lý tưởng để chạy các thí nghiệm này.
1. Cài Đặt Thư Viện Cần Thiết
Đầu tiên, hãy đảm bảo bạn đã cài đặt các thư viện cần thiết:
!pip install -qqq -U bitsandbytes transformers peft accelerate datasets scipy einops evaluate trl rouge_score
2. Nhập Thư Viện và Cài Đặt Môi Trường
import os import torch from datasets import load_dataset from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, TrainingArguments, pipeline, HfArgumentParser ) from trl import ORPOConfig, ORPOTrainer, setup_chat_format, SFTTrainer from tqdm import tqdm import gc import pandas as pd import numpy as np from huggingface_hub import interpreter_login # Vô hiệu hóa ghi nhật ký Weights and Biases os.environ['WANDB_DISABLED'] = "true" interpreter_login()
3. Tải Tập Dữ Liệu
Chúng tôi sẽ sử dụng tập dữ liệu DialogSum cho hướng dẫn này:
Tiền xử lý tập dữ liệu theo yêu cầu của mô hình, bao gồm áp dụng các mẫu phù hợp và đảm bảo định dạng dữ liệu phù hợp cho quá trình tinh chỉnh.
dataset_name = "neil-code/dialogsum-test" dataset = load_dataset(dataset_name)
Kiểm tra cấu trúc tập dữ liệu:
print(dataset['test'][0])
4. Tạo Cấu Hình BitsAndBytes
Để tải mô hình ở định dạng 4 bit:
compute_dtype = getattr(torch, "float16") bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type='nf4', bnb_4bit_compute_dtype=compute_dtype, bnb_4bit_use_double_quant=False, )
5. Tải Mô Hình Đã Đào Tạo Trước
Sử dụng mô hình Phi-2 của Microsoft (MSFT ) cho hướng dẫn này:
model_name = 'microsoft/phi-2'
device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)
6. Token Hóa
Cấu hình bộ token hóa:
tokenizer = AutoTokenizer.from_pretrained( model_name, trust_remote_code=True, padding_side="left", add_eos_token=True, add_bos_token=True, use_fast=False ) tokenizer.pad_token = tokenizer.eos_token
Tinh Chỉnh Llama 3 hoặc Các Mô Hình Khác
Khi tinh chỉnh các mô hình như Llama 3 hoặc các mô hình mở nguồn hàng đầu khác, có những xem xét và điều chỉnh cụ thể cần thực hiện để đảm bảo hiệu suất tối ưu. Dưới đây là các bước chi tiết và thông tin về cách tiếp cận này cho các mô hình khác nhau, bao gồm Llama 3, GPT-3 và Mistral.
5.1 Sử Dụng Llama 3
Chọn Mô Hình:
- Đảm bảo bạn có định danh mô hình chính xác từ trung tâm mô hình Hugging Face. Ví dụ, mô hình Llama 3 có thể được xác định là
meta-llama/Meta-Llama-3-8Btrên Hugging Face. - Đảm bảo yêu cầu truy cập và đăng nhập vào tài khoản Hugging Face của bạn nếu cần cho các mô hình như Llama 3.
Token Hóa:
- Sử dụng bộ token hóa phù hợp cho Llama 3, đảm bảo nó tương thích với mô hình và hỗ trợ các tính năng cần thiết như padding và token đặc biệt.
Bộ Nhớ và Tính Toán:
- Tinh chỉnh các mô hình lớn như Llama 3 yêu cầu tài nguyên tính toán đáng kể. Đảm bảo môi trường của bạn, chẳng hạn như một thiết lập GPU mạnh, có thể xử lý yêu cầu về bộ nhớ và xử lý.
Ví dụ:
model_name = 'meta-llama/Meta-Llama-3-8B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)
Token Hóa:
Tùy thuộc vào trường hợp sử dụng cụ thể và yêu cầu của mô hình, đảm bảo cấu hình bộ token hóa chính xác mà không có cài đặt dư thừa.
tokenizer = AutoTokenizer.from_pretrained( model_name, trust_remote_code=True, padding_side="left", add_eos_token=True, add_bos_token=True, use_fast=False ) tokenizer.pad_token = tokenizer.eos_token
5.2 Sử Dụng Các Mô Hình Nổi Bật Khác (ví dụ: GPT-3, Mistral)
Chọn Mô Hình:
- Đối với các mô hình như GPT-3 và Mistral, đảm bảo sử dụng tên mô hình và định danh chính xác từ trung tâm mô hình Hugging Face hoặc các nguồn khác.
Token Hóa:
- Tương tự như Llama 3, hãy đảm bảo bộ token hóa được thiết lập chính xác và tương thích với mô hình.
Bộ Nhớ và Tính Toán:
- Mỗi mô hình có thể có yêu cầu bộ nhớ khác nhau. Điều chỉnh thiết lập môi trường của bạn cho phù hợp.
Ví Dụ Cho GPT-3:
model_name = 'openai/gpt-3'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)
Ví Dụ Cho Mistral:
model_name = 'mistral-7B'
device_map = {"": 0}
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.float16,
bnb_4bit_use_double_quant=True,
)
original_model = AutoModelForCausalLM.from_pretrained(
model_name,
device_map=device_map,
quantization_config=bnb_config,
trust_remote_code=True,
use_auth_token=True
)
Xem Xét Token Hóa: Mỗi mô hình có thể có yêu cầu token hóa cụ thể. Đảm bảo bộ token hóa phù hợp với mô hình và được cấu hình chính xác.
tokenizer = AutoTokenizer.from_pretrained( model_name, use_fast=True )
7. Kiểm Tra Mô Hình Với Inferencing Zero-Shot
Đánh giá mô hình cơ sở với một đầu vào mẫu:
from transformers import set_seed
set_seed(42)
index = 10
prompt = dataset['test'][index]['dialogue']
formatted_prompt = f"Instruct: Summarize the following conversation.\n{prompt}\nOutput:\n"
# Tạo đầu ra
def gen(model, prompt, max_length):
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(**inputs, max_length=max_length)
return tokenizer.batch_decode(outputs, skip_special_tokens=True)
res = gen(original_model, formatted_prompt, 100)
output = res[0].split('Output:\n')[1]
print(f'Đầu Vào:\n{formatted_prompt}')
print(f'Mô Hình Tạo - Zero Shot:\n{output}')
8. Tiền Xử Lý Tập Dữ Liệu
Chuyển đổi các cặp hội thoại-tóm tắt thành các mẫu:
def create_prompt_formats(sample):
blurb = "Below is an instruction that describes a task. Write a response that appropriately completes the request."
instruction = "### Instruct: Summarize the below conversation."
input_context = sample['dialogue']
response = f"### Output:\n{sample['summary']}"
end = "### End"
parts = [blurb, instruction, input_context, response, end]
formatted_prompt = "\n\n".join(parts)
sample["text"] = formatted_prompt
return sample
dataset = dataset.map(create_prompt_formats)
Token hóa tập dữ liệu đã định dạng:
def preprocess_batch(batch, tokenizer, max_length): return tokenizer(batch["text"], max_length=max_length, truncation=True) max_length = 1024 train_dataset = dataset["train"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True) eval_dataset = dataset["validation"].map(lambda batch: preprocess_batch(batch, tokenizer, max_length), batched=True)
9. Chuẩn Bị Mô Hình Cho QLoRA
Chuẩn bị mô hình cho tinh chỉnh hiệu quả về tham số:
original_model = prepare_model_for_kbit_training(original_model)
Tham Số và Ảnh Hưởng Của Chúng
Tham số siêu tham số đóng vai trò quan trọng trong việc tối ưu hóa hiệu suất của mô hình. Dưới đây là một số tham số siêu tham số chính cần xem xét:
- Tốc Độ Học: Kiểm soát tốc độ mô hình cập nhật các tham số của nó. Một tốc độ học cao có thể dẫn đến hội tụ nhanh hơn nhưng cũng có thể vượt quá giải pháp tối ưu. Một tốc độ học thấp đảm bảo hội tụ ổn định nhưng có thể yêu cầu nhiều kỷ hơn.
- Kích Cỡ Batch: Số lượng mẫu được xử lý trước khi mô hình cập nhật các tham số của nó. Kích thước batch lớn hơn có thể cải thiện sự ổn định nhưng yêu cầu nhiều bộ nhớ hơn. Kích thước batch nhỏ hơn có thể dẫn đến nhiều nhiễu trong quá trình đào tạo.
- Bước Tích Lũy Gradient: Giúp mô phỏng kích thước batch lớn hơn bằng cách tích lũy gradient qua nhiều bước trước khi cập nhật tham số.
- Số Kỷ: Số lần toàn bộ tập dữ liệu được đi qua bởi mô hình. Nhiều kỷ hơn có thể cải thiện hiệu suất nhưng cũng có thể dẫn đến quá拟 hợp nếu không được quản lý đúng cách.
- Thụt Giảm Trọng Số: Một kỹ thuật điều chỉnh để ngăn chặn quá拟 hợp bằng cách phạt các trọng số lớn.
- Lịch Trình Tốc Độ Học: Điều chỉnh tốc độ học trong quá trình đào tạo để cải thiện hiệu suất và hội tụ.
Tùy chỉnh cấu hình đào tạo bằng cách điều chỉnh các tham số siêu tham số như tốc độ học, kích thước batch và bước tích lũy gradient dựa trên yêu cầu cụ thể của mô hình và nhiệm vụ. Ví dụ, các mô hình Llama 3 có thể yêu cầu tốc độ học khác so với các mô hình nhỏ hơn.
Ví Dụ Cấu Hình Đào Tạo
orpo_args = ORPOConfig( learning_rate=8e-6, lr_scheduler_type="linear",max_length=1024,max_prompt_length=512, beta=0.1,per_device_train_batch_size=2,per_device_eval_batch_size=2, gradient_accumulation_steps=4,optim="paged_adamw_8bit",num_train_epochs=1, evaluation_strategy="steps",eval_steps=0.2,logging_steps=1,warmup_steps=10, report_to="wandb",output_dir="./results/", )
10. Đào Tạo Mô Hình
Thiết lập trình đào tạo và bắt đầu đào tạo:
trainer = ORPOTrainer(
model=original_model,
args=orpo_args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
tokenizer=tokenizer,
)
trainer.train()
trainer.save_model("fine-tuned-llama-3")
Đánh Giá Mô Hình Đã Tinh Chỉnh
Sau đào tạo, đánh giá hiệu suất của mô hình bằng cả phương pháp định tính và định lượng.
1. Đánh Giá Con Người
So sánh các tóm tắt được tạo với các tóm tắt được viết bởi con người để đánh giá chất lượng.
2. Đánh Giá Định Lượng
Sử dụng các chỉ số như ROUGE để đánh giá hiệu suất:
from rouge_score import rouge_scorer scorer = rouge_scorer.RougeScorer(['rouge1', 'rouge2', 'rougeL'], use_stemmer=True) scores = scorer.score(reference_summary, generated_summary) print(scores)
Thử Thách Phổ Biến và Giải Pháp
1. Giới Hạn Bộ Nhớ
Sử dụng QLoRA giúp giảm thiểu vấn đề bộ nhớ bằng cách lượng tử hóa trọng số mô hình xuống 4 bit. Đảm bảo bạn có đủ bộ nhớ GPU để xử lý kích thước batch và kích thước mô hình của mình.
2. Quá Nghiệp
Giám sát các chỉ số xác thực để ngăn chặn quá拟 hợp. Sử dụng các kỹ thuật như ngừng đào tạo sớm và thụt giảm trọng số.
3. Đào Tạo Chậm
Tối ưu hóa tốc độ đào tạo bằng cách điều chỉnh kích thước batch, tốc độ học và sử dụng tích lũy gradient.
4. Chất Lượng Dữ Liệu
Đảm bảo tập dữ liệu của bạn sạch sẽ và được tiền xử lý tốt. Chất lượng dữ liệu kém có thể ảnh hưởng đáng kể đến hiệu suất của mô hình.
Kết Luận
Tinh chỉnh các mô hình ngôn ngữ lớn bằng cách sử dụng QLoRA là một cách hiệu quả để điều chỉnh các mô hình đã đào tạo trước cho các nhiệm vụ cụ thể với chi phí tính toán giảm. Bằng cách theo dõi hướng dẫn này, bạn có thể tinh chỉnh PHI, Llama 3 hoặc bất kỳ mô hình mở nguồn nào khác để đạt được hiệu suất cao trên các nhiệm vụ cụ thể của mình.













