Trí tuệ nhân tạo
Hướng Dẫn Duy Nhất Bạn Cần Để Nâng Cao Llama 3 Hoặc Mô Hình Mở Nguồn Khác
Việc tinh chỉnh các mô hình ngôn ngữ lớn (LLM) như Llama 3 liên quan đến việc thích nghi với 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 lĩnh vực. Quá trình này tận dụng kiến thức đã có của mô hình, giúp 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ề Việc Tinh Chỉnh
Việc tinh chỉnh bao gồm một số bước chính:
- Chọn Mô Hình Đã Được Đà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 Hợp 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: Thích nghi 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 đã được tinh chỉnh bằng cách sử dụng cả các chỉ số định lượng và định tính.
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, khiến nó trở nê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 Quả Về 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, 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ó tính hủy diệt và duy trì kiến thức chung của mô hình.
Low-Rank Adaptation (LoRA) và Quantized LoRA (QLoRA)
LoRA tinh chỉnh chỉ một vài ma trận thấp hạng, trong khi QLoRA lượng tử hóa các ma trận này để giảm dấu chân bộ nhớ thêm.
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 Quả Về 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ư Low-Rank Adaptation (LoRA) và Quantized LoRA (QLoRA) thuộc vào loại này.
LoRA Là Gì?

Comparing finetuning methods: QLORA enhances LoRA with 4-bit precision quantization and paged optimizers for memory spike management
LoRA là một phương pháp tinh chỉnh được cải tiến, nơi thay vì tinh chỉnh tất cả các trọng số của mô hình đã được đà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. Các ma trận này tạo thành bộ điều chỉnh LoRA. Bộ điều chỉnh đã được tinh chỉnh này sau đó được tải vào mô hình đã được đào tạo trước và được sử dụng cho quá trình suy luận.
Lợi Thế Chính Của LoRA:
- Hiệu Quả Về 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 gốc 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.
Quantized LoRA (QLoRA) Là Gì?
QLoRA đưa LoRA một bước进一步 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 có thể so sánh.
Lợi Thế Chính Của QLoRA:
- Hiệu Quả Về 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 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 với mô hình chính xác đầy đủ.
Thích Nghi Với 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 nó 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 được 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 lĩnh vực mục tiêu.
Tinh Chỉnh Trong Thực Tiễn
So Sánh Tinh Chỉnh Toàn Diện Và PEFT
- Tinh Chỉnh Toàn Diện: Liên quan đến việc đào tạo toàn bộ mô hình, điều này có thể tốn kém về mặt 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ó tính hủy diệt, 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 Đã Được Đà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.
- Tokenization: Tokenize 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 đã được 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ả các chỉ số định lượng và định tính.
Hướng Dẫn Bước Bước Để Tinh Chỉnh LLM
Thiết Lập 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
Trước 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à Thiết Lập 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 # Tắt 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 việc áp dụng các mẫu và đảm bảo định dạng dữ liệu phù hợp cho quá trình tinh chỉnh (Hugging Face) (DataCamp).
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 Đã Được Đào Tạo Trước
Sử dụng mô hình Phi-2 của Microsoft 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. Tokenization
Cấu hình tokenizer:
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 Mô Hình Khác
Khi tinh chỉnh mô hình như Llama 3 hoặc bất kỳ mô hình mở nguồn nào khác, có những xem xét và điều chỉnh cụ thể cần thiết để đả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ó mã đị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 mô hình như Llama 3 (Hugging Face)
Tokenization:
- Sử dụng tokenizer 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 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 bộ nhớ và xử lý. Đảm bảo môi trường có thể xử lý yêu cầu bộ nhớ, điều này có thể được giảm thiểu bằng cách sử dụng kỹ thuật như QLoRA để giảm dấu chân bộ nhớ (Hugging Face Forums)
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
)
Tokenization:
Tùy thuộc vào trường hợp sử dụng cụ thể và yêu cầu mô hình, đảm bảo cấu hình tokenizer chính xác mà không có cài đặt dư thừa. Ví dụ, use_fast=True được khuyến nghị cho hiệu suất tốt hơn (Hugging Face) (GitHub)
5.2 Sử Dụng Mô Hình Khác (Ví Dụ GPT-3, Mistral)
Chọn Mô Hình:
- Với mô hình như GPT-3 và Mistral, đảm bảo bạn sử dụng tên mô hình và mã định danh chính xác từ trung tâm mô hình Hugging Face hoặc nguồn khác.
Tokenization:
- Tương tự như Llama 3, đảm bảo tokenizer được cấu hình 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 tương ứng.
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 Tokenization: Mỗi mô hình có thể có yêu cầu tokenization độc đáo. Đảm bảo tokenizer phù hợp với mô hình và được cấu hình chính xác.
Ví Dụ Tokenizer Llama 3:
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
Ví Dụ Tokenizer GPT-3 và Mistral:
tokenizer = AutoTokenizer.from_pretrained( model_name, use_fast=True )
7. Kiểm Tra Mô Hình Với Zero-Shot Inferencing
Đá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'INPUT PROMPT:\n{formatted_prompt}')
print(f'MODEL GENERATION - ZERO SHOT:\n{output}')
8. Tiền Xử Lý Tập Dữ Liệu
Chuyển đổi cặp hội thoại-tóm tắt thành các lời nhắc:
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)
Tokenize tập dữ liệu đã được đị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)
Hyperparameters và Ảnh Hưởng Của Chúng
Hyperparameters đó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ố hyperparameter chính cần xem xét:
- Tốc Độ Học: Kiểm soát tốc độ mà 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 sự hội tụ nhanh hơn nhưng có thể vượt quá giải pháp tối ưu. Một tốc độ học thấp đảm bảo sự hội tụ ổn định nhưng có thể yêu cầu nhiều kỷ.
- 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: Tham số này giúp mô phỏng kích thước batch lớn hơn bằng cách tích lũy gradient trong nhiều bước trước khi thực hiện cập nhật tham số.
- Số Kỷ: Số lần toàn bộ tập dữ liệu được truyền qua 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á trình đào tạo nếu không được quản lý đúng cách.
- Giảm Trọng: Kỹ thuật điều chỉnh để ngăn chặn quá trình đào tạo quá mức 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 hyperparameter 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 mô hình và nhiệm vụ cụ thể. Ví dụ, mô hình Llama 3 có thể yêu cầu tốc độ học khác so với mô hình nhỏ hơn (Weights & Biases) (GitHub)
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 Đã Được Tinh Chỉnh
Sau khi đào tạo, đánh giá hiệu suất của mô hình bằng cách sử dụng cả phương pháp định lượng và định tính.
1. Đánh Giá Con Người
So sánh tóm tắt được tạo ra với 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 Thông Thường 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á Trình Đào Tạo Quá Mức
Theo dõi các chỉ số xác thực để ngăn chặn quá trình đào tạo quá mức. Sử dụng các kỹ thuật như ngừng đào tạo sớm và giảm trọng.
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 bước 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 mô hình.
Kết Luận
Tinh chỉnh mô hình ngôn ngữ lớn bằng cách sử dụng QLoRA là một cách hiệu quả để thích nghi với các mô hình đã được đào tạo trước để thực hiện 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.











