- vừa được xem lúc

Tinh chỉnh Llama2 với LoRA cho bài toán hỏi-đáp (phần 2)

0 0 2

Người đăng: TungDT

Theo Viblo Asia

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.

Bình luận

Bài viết tương tự

- vừa được xem lúc

Hướng dẫn làm bot Facebook messenger cho tài khoản cá nhân

Giới thiệu. Trong bài viết trước thì mình có hướng dẫn các bạn làm chatbot facebook messenger cho fanpage. Hôm nay mình sẽ hướng dẫn các bạn tạo chatbot cho một tài khoản facebook cá nhân. Chuẩn bị.

0 0 152

- vừa được xem lúc

Tìm hiểu cơ bản về LUIS trong Microsoft Cognitive Services

Trong bài trước mình đã có giới thiệu sơ lược về QnA Maker - một dịch vụ lưu trữ ngôn ngữ tự nhiên trên nền tảng đám mây. Tuy nhiên để có thể sử dụng chatbot linh hoạt và với xu hướng càng thân thiện với người dùng, thì hôm nay mình giới thiệu thêm về LUIS.

0 0 25

- vừa được xem lúc

[ChatterBot] Thư viện chatbot hay ho dành cho Python| phần 4

Hôm nay mình sẽ chia sẽ thêm về một số kiến thức liên quan về ChatterBot. Chắc đây sẽ là bài lý thuyết cuối, để từ đó mỗi bạn có thể tự build cho mình một con chatbot vui vui.

0 0 107

- vừa được xem lúc

[ChatterBot] Thư viện chatbot hay ho dành cho Python| phần 3

Trong bài trước mình đã trình bày về Training data cho chatbot và tiền xử lý dữ liệu. Trong phần này sẽ trình bày với các bạn về logic adapter.

0 0 47

- vừa được xem lúc

Xác định ý định câu hỏi trong hệ thống hỏi đáp

Mục tiêu bài viết. Phân tích câu hỏi là pha đầu tiên trong kiến trúc chung của một hệ thống hỏi đáp, có nhiệm vụ tìm ra các thông tin cần thiết làm đầu vào cho quá trình xử lý của các pha sau (trích c

0 0 83

- vừa được xem lúc

[RASA 3.0] Tuỳ chỉnh pipeline với BERT và RoBERTa

Giới thiệu về Rasa. Rasa là framework mã nguồn mở được phát triển bởi RASA Inc vào năm 2017, Rasa giúp cho việc phát triển các chatbot máy học một cách thuận tiện hơn, có thể giúp cho những người chưa

0 0 36