Phần 1 của bài viết ở đây
Thiết lập model và tokenizer
Tiếp theo chúng ta chọn một mô hình Llama 2 đã được huấn luyện trước (Llama-2-7b-chat-hf). Sau đó tải tokenizer và chỉnh sửa nhỏ để phù hợp với các phép toán dấu phẩy động fp16. Sử dụng số thực dạng dấu phẩy động (fp16) có thể giúp tiết kiệm bộ nhớ và tăng tốc độ huấn luyện mô hình. Tuy nhiên, không phải tất cả các phép toán đều tương thích với định dạng độ chính xác này ngay từ đầu. Bao gồm việc tách từ, một bước quan trọng để chuẩn bị dữ liệu văn bản cho việc huấn luyện mô hình. Mô hình Llama 2 đã được huấn luyện trước được tải với cấu hình lượng tử hóa (quantization) [1] cho trước. Sau đó, tắt bộ nhớ đệm và đặt một tham số nhiệt độ huấn luyện trước [2]
Để giảm kích thước mô hình và tăng tốc độ suy luận, chúng ta sử dụng lượng tử hóa 4-bit từ BitsAndBytesConfig. Cấu hình ở đây sử dụng loại ‘nf4’ cho việc lượng tử hóa. Hãy thử nghiệm với các loại lượng tử hóa khác để xem sự biến đổi về hiệu suất.
# Dataset
data_name = "mlabonne/guanaco-llama2-1k"
training_data = load_dataset(data_name, split="train") # Model and tokenizer names
base_model_name = "NousResearch/Llama-2-7b-chat-hf"
refined_model = "llama-2-7b-mlabonne-enhanced" # Tokenizer
llama_tokenizer = AutoTokenizer.from_pretrained(base_model_name, trust_remote_code=True)
llama_tokenizer.pad_token = llama_tokenizer.eos_token
llama_tokenizer.padding_side = "right" # Fix for fp16 # Quantization Config
quant_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.float16, bnb_4bit_use_double_quant=False
) # Model
base_model = AutoModelForCausalLM.from_pretrained( base_model_name, quantization_config=quant_config, device_map={"": 0}
)
base_model.config.use_cache = False
base_model.config.pretraining_tp = 1
Cấu hình lượng tử hoá
Khi huấn luyện mô hình học máy bằng LoRA (Low-Rank Adaptation), có nhiều tham số cần xem xét.
- Tỷ lệ Dropout (lora_dropout): Đây là xác suất mỗi nơ-ron sẽ không hoạt động (đầu ra bằng không) trong quá trình huấn luyện, giúp tránh việc mô hình quá khớp.
- Hạng (r): Hạng cho biết ma trận trọng số gốc được chia nhỏ như thế nào thành các ma trận nhỏ hơn, đơn giản hơn. Điều này giúp giảm yêu cầu về tính toán và bộ nhớ. Hạng thấp làm cho mô hình nhanh hơn nhưng có thể giảm hiệu suất. Bài báo gốc về LoRA đề xuất bắt đầu với hạng 8, nhưng với QLoRA, cần hạng 64.
- lora_alpha: Tham số này điều chỉnh cách xấp xỉ hạng thấp. Nó giống như việc cân nhắc giữa mô hình gốc và xấp xỉ hạng thấp. Giá trị cao hơn có thể làm cho xấp xỉ có ảnh hưởng nhiều hơn trong quá trình tinh chỉnh, ảnh hưởng đến hiệu suất và chi phí tính toán.
Bằng cách điều chỉnh những tham số này, đặc biệt là lora_alpha và r, bạn có thể thấy sự thay đổi về hiệu suất và tài nguyên mà mô hình sử dụng, giúp bạn tìm ra cài đặt tối ưu cho nhiệm vụ cụ thể của mình.
# LoRA Config
peft_parameters = LoraConfig( lora_alpha=16, lora_dropout=0.1, r=8, bias="none", task_type="CAUSAL_LM"
) # Training Params
train_params = TrainingArguments( output_dir="./results_modified", num_train_epochs=1, per_device_train_batch_size=4, gradient_accumulation_steps=1, optim="paged_adamw_32bit", save_steps=25, logging_steps=25, learning_rate=2e-4, weight_decay=0.001, fp16=False, bf16=False, max_grad_norm=0.3, max_steps=-1, warmup_ratio=0.03, group_by_length=True, lr_scheduler_type="constant"
) # Trainer
fine_tuning = SFTTrainer( model=base_model, train_dataset=training_data, peft_config=peft_parameters, dataset_text_field="text", tokenizer=llama_tokenizer, args=train_params
) # Training
fine_tuning.train() # Save Model
fine_tuning.model.save_pretrained(refined_model)
Mô hình được huấn luyện bằng SFTTrainer, được thiết kế riêng cho loại nhiệm vụ này. Sau khi xác định bộ huấn luyện, quá trình huấn luyện bắt đầu.
# Generate Text
query = "How do I use the OpenAI API?"
text_gen = pipeline(task="text-generation", model=refined_model, tokenizer=llama_tokenizer, max_length=200)
output = text_gen(f"<s>[INST] {query} [/INST]")
print(output[0]['generated_text'])
Sau khi huấn luyện, chúng ta lưu mô hình đã được tinh chỉnh. Sau đó, thử khả năng của mô hình bằng cách hỏi 1 câu (How do I use the OpenAI API) và nhận kết quả trả lời
Toàn bộ code của tutorial có thể xem ở đây: LLAMA2 Google Colab
Tổng kết
Quá trình huấn luyện Llama 2 nói chung là rất lớn, với 2 nghìn tỷ token dữ liệu. Với lượng dữ liệu lớn này, mô hình có khả năng xử lý ngữ cảnh lên đến 4,000 token. Đặc biệt là việc sử dụng Ghost Attention (GAtt) giúp mô hình duy trì luồng hội thoại tốt hơn. Ví dụ, nếu mô hình được yêu cầu chỉ sử dụng emoji để trả lời, GAtt giúp nó nhớ yêu cầu này trong suốt cuộc trò chuyện.
Tinh chỉnh là bước quan trọng để tận dụng tối đa khả năng của mô hình ngôn ngữ lớn như Llama 2. Giai đoạn huấn luyện ban đầu giúp mô hình học từ dữ liệu văn bản lớn, còn tinh chỉnh giúp mô hình tập trung vào nhiệm vụ cụ thể. Trong hướng dẫn này, tác giả sử dụng Low-Rank Adaptation (LoRA) thay vì phương pháp tinh chỉnh thông thường.
Lợi ích của việc sử dụng LoRA:
- Hiệu quả: LoRA giảm số lượng tham số cần huấn luyện, tiết kiệm bộ nhớ và chi phí.
- Hiệu suất: Mặc dù có ít tham số hơn, kết quả của chúng tôi vẫn tương đương hoặc hơn.
- Khả năng mở rộng: LoRA giúp quản lý mô hình lớn như Llama 2 dễ dàng hơn ngay cả trên hệ thống có giới hạn.
Khi sử dụng LoRA trên Google Colab với GPU T4, có thể thấy quá trình huấn luyện hiệu quả hơn so với phương pháp truyền thống. Bộ nhớ GPU chỉ sử dụng tối đa 12GB, giúp quá trình huấn luyện diễn ra mượt mà mà không gặp lỗi thiếu bộ nhớ thường thấy.
Chú thích:
[1] Lượng tử hóa là kỹ thuật giảm kích thước mô hình học máy bằng cách sử dụng trọng số có độ chính xác thấp hơn, giúp tiết kiệm bộ nhớ và tăng tốc độ suy luận. Lượng tử hóa mô hình có nghĩa là biểu diễn trọng số của nó bằng cách sử dụng ít bộ nhớ hơn. Tuy nhiên, nó có thể ảnh hưởng đến độ chính xác của mô hình.
[2] Temperature là một tham số điều chỉnh mà khi áp dụng, nó làm thay đổi phân phối xác suất của mô hình:
- Temperature > 1: Làm giảm sự tự tin của mô hình, tạo ra đầu ra đa dạng hơn.
- Temperature < 1: Làm tăng sự tự tin của mô hình, tạo ra đầu ra ít đa dạng hơn và gần với dự đoán có xác suất cao nhất.
- Temperature = 1: Không thay đổi phân phối xác suất, mô hình hoạt động theo cách được huấn luyện.