Thực chiến Fine-Tuning mô hình ngôn ngữ lớn Phi-2

1. Giới thiệu

1. 1 Fine-Tuning là gì

Fine-Tuning là quá trình điều chỉnh và tối ưu hóa một mô hình ngôn ngữ lớn (Large Language Model – LLM) đã được huấn luyện trước (Pre-trained). Quá trình này tập trung vào việc huấn luyện thêm mô hình trên một tập dữ liệu đặc thù hoặc mục tiêu cụ thể nhằm cải thiện hiệu suất trong những ứng dụng cụ thể, đồng thời giảm thiểu chi phí và thời gian so với việc xây dựng mô hình từ đầu.

aicandy.vn

1.2. Tầm quan trọng của Fine-Tuning

  • Tăng cường hiệu suất cho mục tiêu cụ thể: LLM sau quá trình Pre-training thường mang tính chất tổng quát. Fine-Tuning giúp tinh chỉnh mô hình để đạt hiệu quả cao hơn trong các nhiệm vụ cụ thể, chẳng hạn như phân tích cảm xúc, trả lời câu hỏi, hoặc xử lý văn bản chuyên ngành.
  • Tiết kiệm tài nguyên: Thay vì huấn luyện toàn bộ mô hình từ đầu, Fine-Tuning tận dụng mô hình Pre-trained, giúp tiết kiệm tài nguyên tính toán và thời gian.
  • Tùy chỉnh cho ứng dụng thực tiễn: Fine-Tuning giúp các tổ chức và doanh nghiệp tạo ra mô hình phù hợp với dữ liệu và yêu cầu thực tế của họ, nâng cao giá trị sử dụng.

1.3. Mục tiêu của quá trình Fine-Tuning

  • Chuyên biệt hóa mô hình: Tối ưu hóa khả năng của mô hình trên các tập dữ liệu cụ thể.
  • Cải thiện độ chính xác: Tăng khả năng đưa ra các kết quả phù hợp hơn với ngữ cảnh và mục tiêu cụ thể.
  • Giảm thiểu lỗi sai: Đặc biệt trong các lĩnh vực yêu cầu độ chính xác cao như y tế, pháp luật hoặc tài chính.
  • Hỗ trợ đa dạng ngôn ngữ hoặc lĩnh vực: Fine-Tuning giúp mở rộng khả năng sử dụng của mô hình trên nhiều ngôn ngữ hoặc các lĩnh vực chuyên ngành.

1.4. Sự khác biệt giữa Pre-training và Fine-Tuning

  • Mục tiêu:
    • Pre-training: Tập trung vào việc học các đặc trưng cơ bản của ngôn ngữ từ tập dữ liệu lớn, không có định hướng cụ thể.
    • Fine-Tuning: Điều chỉnh mô hình với mục tiêu cụ thể trên tập dữ liệu đặc thù.
  • Dữ liệu:
    • Pre-training: Sử dụng tập dữ liệu tổng quát và lớn để mô hình học ngữ pháp, cú pháp và ngữ nghĩa.
    • Fine-Tuning: Dữ liệu thường nhỏ hơn và chuyên biệt hơn, liên quan trực tiếp đến bài toán cần giải quyết.
  • Chi phí:
    • Pre-training: Đòi hỏi nhiều tài nguyên tính toán và thời gian.
    • Fine-Tuning: Chi phí thấp hơn nhờ tận dụng mô hình đã được Pre-trained.
  • Ứng dụng:
    • Pre-training: Tạo nền tảng cho các ứng dụng đa dạng.
    • Fine-Tuning: Cụ thể hóa khả năng của mô hình để phù hợp với từng ứng dụng riêng biệt

2. Lựa chọn mô hình gốc

Quá trình lựa chọn mô hình gốc (“base model”) đóng vai trò quan trọng trong việc Fine-Tuning, đặc biệt khi mục tiêu là tối ưu hóa hiệu suất trong các tác vụ cụ thể. Việc lựa chọn đúng mô hình có thể giúm tiết kiệm đáng kể tài nguyên, đạt hiệu quả cao hơn, và đáp ứng tốt nhất nhu cầu thực tiễn.

2.1. Tiêu chí lựa chọn mô hình gốc

Việc chọn mô hình phù hợp phụ thuộc vào nhiều yếu tố, bao gồm:

  • Mỗi mô hình ngôn ngữ lớn đã Pre-trained thường có những điểm mạnh để thực hiện tốt một số nhóm tác vụ nhất định. Việc đánh giá hiệu quả ban đầu của mô hình trên tập dữ liệu cụ thể có thể cung cấp những thông tin quan trọng.
  • Quy mô (đọc theo số tham số hoặc đánh giá theo tài nguyên cần thiết) phải phù hợp với khả năng tính toán của doanh nghiệp hoặc người dùng. Các mô hình nhỏ hơn thường yêu cầu ít tài nguyên hơn, nhưng lại có giới hạn trong xử lý những tác vụ phức tạp.

  • Một số mô hình được thiết kế để Fine-Tuning đơn giản và hiệu quả hơn nhờ các công nghệ như “LoRA” (Low-Rank Adaptation) hoặc Adapter Layers.

2.2. Lựa chọn mô hình trong bài thực hành

Trong bài thực hành này, tôi lựa chọn mô hình Phi-2 bởi nó là mô hình mã nguồn mở và có một số đặc điểm:

Phi-2 được phát triển bởi Microsoft là một mô hình Transformer với 2,7 tỷ tham số. Được huấn luyện dựa trên các nguồn dữ liệu bao gồm các văn bản tổng hợp NLP và các trang web đã qua lọc (nhằm đảm bảo giá trị an toàn và giáo dục). Khi được đánh giá dựa trên các thước đo kiểm tra kiến thức thường thức, hiểu ngôn ngữ và lý luận logic, Phi-2 thể hiện hiệu suất gần đạt mức tiên tiến nhất trong số các mô hình có ít hơn 13 tỷ tham số.

Mục đích đằng sau việc phát triển mô hình mã nguồn mở phi-2 này là cung cấp cho cộng đồng nghiên cứu một mô hình nhỏ, không bị hạn chế để khám phá các thách thức quan trọng liên quan đến an toàn, như giảm độc hại, hiểu các thiên kiến xã hội, tăng khả năng kiểm soát, và nhiều khía cạnh khác.

3. Chuẩn bị dữ liệu cho Fine-Tuning

Tại sao chuẩn bị dữ liệu lại quan trọng?

Hình dung việc chuẩn bị dữ liệu giống như xây dựng nền móng cho một tòa nhà. Một nền móng yếu kém sẽ dẫn đến toàn bộ công trình bị lung lay. Tương tự, dữ liệu kém chất lượng sẽ làm giảm đáng kể hiệu suất của mô hình AI của bạn.

Việc thu thập dữ liệu không phải chỉ đơn giản là tải về hàng loạt. Bạn cần những nguồn dữ liệu:

  • Chính xác và đáng tin cậy
  • Phù hợp với mục tiêu cụ thể của dự án
  • Đại diện cho các tình huống thực tế bạn muốn mô hình giải quyết

Các nguồn tốt nhất thường đến từ:

  • Tài liệu học thuật từ các trường đại học.
  • Báo cáo nghiên cứu khoa học
  • Các nguồn dữ liệu được gán nhãn bởi chuyên gia

Làm sạch dữ liệu: loại bỏ “rác” thông tin

Không phải tất cả dữ liệu đều có giá trị. Quá trình làm sạch là một nghệ thuật:

  • Loại bỏ các bản ghi trùng lặp
  • Wipe out dữ liệu nhiễu
  • Chuẩn hóa định dạng văn bản
  • Kiểm tra và sửa lỗi chính tả

Hãy nghĩ về việc này như việc chọn lọc những viên ngọc quý từ một đống đá vụn.

Trong bài thực hành này, tôi sử dụng bộ dữ liệu “prsdm/MedQuad-phi2-1k” bao gồm 1k “Instruction”-“Assistant” ví dụ như phía dưới:

### Instruction: How to prevent Lung Cancer ? ### Assistant: Key Points - Avoiding risk factors and increasing protective factors may help prevent lung cancer. - The following are risk factors for lung cancer: - Cigarette, cigar, and pipe smoking - Secondhand smoke - Family history - HIV infection - Environmental risk factors - Beta carotene supplements in heavy smokers - The following are protective factors for lung cancer

Bộ dataset có thể download miễn phí tại đây

Sử dụng phương thức load_dataset trong thư viện datasets để tải tệp dữ liệu này

dataset = load_dataset("prsdm/MedQuad-phi2-1k", split="train")

Kết quả là có đối tượng dataset có cấu trúc dữ liệu chứa “dữ liệu” là các bản ghi (rows) trong tập dữ liệu và “thông tin mô tả” là các cột (fields) và siêu dữ liệu (metadata).

4. Chương trình thực hiện

4.1. Pretrain model

Tải và load tokenizer:

Tokenizer là một thành phần quan trọng trong mô hình LLM, chịu trách nhiệm chuyển đổi văn bản thành các đơn vị nhỏ hơn gọi là token trước khi đưa vào mô hình để xử lý. Token có thể là từ, ký tự, hoặc các mảnh từ (subword), tùy thuộc vào cách thiết kế của tokenizer.

Các phương pháp phổ biến để xây dựng tokenizer bao gồm:

  1. Word-level Tokenization: Phân chia văn bản theo từng từ, nhưng gặp khó khăn với từ mới hoặc từ viết sai.
  2. Character-level Tokenization: Chia văn bản thành từng ký tự, nhưng tạo ra chuỗi rất dài và kém hiệu quả.
  3. Subword Tokenization: (như BPE – Byte Pair Encoding hoặc WordPiece) phân chia văn bản thành các mảnh từ phổ biến, cân bằng giữa tính hiệu quả và khả năng xử lý từ mới.

Tokenizer giúp giảm kích thước từ vựng, tăng hiệu quả huấn luyện, đồng thời đảm bảo rằng mô hình có thể xử lý ngôn ngữ một cách mượt mà và chính xác hơn.

Tải tokenizer từ model gốc:

tokenizer = AutoTokenizer.from_pretrained(
    base_model,
    trust_remote_code=True,
    model_max_length=256
)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

Trong đó:

AutoTokenizer: phương pháp tiện lợi để tự động tải tokenizer phù hợp với base_model

from_pretrained(base_model): Tải tokenizer được lưu trữ sẵn trên Hugging Face Hub hoặc một thư mục cục bộ, tùy thuộc vào giá trị của base_model.

trust_remote_code=True: Kích hoạt việc tải mã tuỳ chỉnh từ xa.

model_max_length=256: Đặt độ dài tối đa của tokenized input là 256 token. Token dài hơn sẽ bị cắt hoặc xử lý khác tuỳ cấu hình của tokenizer.

pad_token: Đây là token được sử dụng để thêm khoảng trống (padding) vào các chuỗi ngắn, nhằm đảm bảo rằng tất cả các chuỗi đầu vào đều có cùng độ dài khi đưa vào mô hình.

eos_token: (End-of-Sequence Token) Đây là token được thêm vào cuối một chuỗi để báo hiệu chuỗi đã kết thúc. Dòng lệnh này gán token kết thúc (eos_token) làm token padding (pad_token).

tokenizer.padding_side = “right”: padding_side: Thiết lập hướng padding.

Cấu hình lượng tử hóa

bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=False,
)

Trong đó:

BitsAndBytesConfig: Đây là một lớp cấu hình được sử dụng để thiết lập các tham số liên quan đến lượng tử hóa 4-bit.

load_in_4bit=True: Bật tính năng lượng tử hóa 4-bit, nghĩa là mô hình sẽ được lưu trữ và tính toán ở độ chính xác 4-bit, giúp giảm bộ nhớ và tốc độ xử lý.

bnb_4bit_quant_type=”nf4″: Sử dụng loại lượng tử hóa “NF4” (Normalized Float 4), được thiết kế để tăng độ chính xác so với lượng tử hóa chuẩn.

bnb_4bit_compute_dtype=torch.float16: Đặt kiểu dữ liệu để tính toán trong chế độ lượng tử hóa là float16. Điều này giúp cân bằng giữa tốc độ và độ chính xác.

bnb_4bit_use_double_quant=False: Không sử dụng lượng tử hóa kép (double quantization), một kỹ thuật thường dùng để giảm kích thước mô hình thêm nữa, nhưng có thể ảnh hưởng đến hiệu năng.

Cấu hình pretrain

model = AutoModelForCausalLM.from_pretrained(
      local_path,
      quantization_config=None if is_test else get_bnb_config(torch_dtype),
      device_map="auto",
      trust_remote_code=True,
      torch_dtype=torch_dtype
)

Trong đó:

local_path: là đường dẫn của model trên local

quantization_config=bnb_config: Cấu hình lượng tử hóa được truyền vào từ bnb_config, để đảm bảo mô hình được tải trong chế độ lượng tử hóa 4-bit.

trust_remote_code=True: Cho phép sử dụng mã nguồn từ xa khi tải mô hình, đặc biệt hữu ích với các mô hình được thiết kế tùy chỉnh (custom).

low_cpu_mem_usage=True: Tối ưu hóa việc sử dụng bộ nhớ RAM trên CPU khi tải mô hình, đặc biệt hữu ích trên các hệ thống có tài nguyên hạn chế.

device_map=”auto”: Tự động phân bổ mô hình lên các thiết bị như GPU, CPU dựa trên cấu hình phần cứng.

4.2. Chương trình train

Load dữ liệu:

Sử dụng thư viện load_dataset để tải trực tiếp dataset từ huggingface.

dataset = load_dataset("prsdm/MedQuad-phi2-1k", split="train")

Tạo tham số LORA:

peft_config = LoraConfig(
    r=32,
    lora_alpha=16,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=["Wqkv", "out_proj"]
)

Trong đó:

r=32: Đây là rank trong kỹ thuật LoRA. Nó chỉ số chiều không gian giảm để ánh xạ ma trận tham số lớn sang không gian nhỏ hơn.

lora_alpha=16: Đây là hệ số khuếch đại (scaling factor) được sử dụng để điều chỉnh độ lớn của ma trận ánh xạ trong quá trình huấn luyện.

lora_dropout=0.05: Đây là tỷ lệ dropout được áp dụng cho các ma trận ánh xạ trong LoRA để giảm hiện tượng overfitting. lora_dropout=0.05 nghĩa là có 5% khả năng các giá trị trong ma trận ánh xạ sẽ bị loại bỏ ngẫu nhiên trong quá trình huấn luyện.

bias=”none”: Tham số này chỉ định cách xử lý bias trong quá trình tinh chỉnh. bias="none" nghĩa là không tinh chỉnh hoặc thay đổi các bias của mô hình gốc.

task_type=”CAUSAL_LM”: Xác định loại tác vụ mà mô hình đang xử lý. Ở đây là CAUSAL_LM (Causal Language Modeling).

target_modules=[“Wqkv”, “out_proj”]: Danh sách các lớp hoặc module mục tiêu mà LoRA sẽ áp dụng. [“Wqkv”, “out_proj”] thường là các lớp trọng số trong transformer (như trọng số của cơ chế Attention và lớp đầu ra). Đây là các module chính cần được tinh chỉnh trong kiến trúc Transformer để cải thiện hiệu suất.

Cấu hình siêu tham số training:

training_arguments = TrainingArguments(
    output_dir="./results",
    num_train_epochs=100,
    fp16=False,
    bf16=False,
    per_device_train_batch_size=2,
    per_device_eval_batch_size=4,
    gradient_accumulation_steps=1,
    gradient_checkpointing=True,
    max_grad_norm=0.3,
    learning_rate=2e-4,
    weight_decay=0.001,
    optim="paged_adamw_32bit",
    lr_scheduler_type="cosine",
    max_steps=-1,
    warmup_ratio=0.03,
    group_by_length=True,
    save_steps=0,
    logging_steps=25,
)

Trong đó:

num_train_epochs=100: Số lượng epoch huấn luyện.

fp16=False: Sử dụng tính toán số học dấu phẩy động 16-bit (mixed precision) để giảm bộ nhớ và tăng tốc độ.

bf16=False: Sử dụng tính toán số học dấu phẩy động 16-bit với định dạng bfloat16

per_device_train_batch_size=2: Kích thước batch khi huấn luyện trên mỗi GPU. GPU sẽ xử lý 2 mẫu trong một batch.

per_device_eval_batch_size=4: Kích thước batch khi đánh giá trên mỗi GPU. GPU sẽ xử lý 4 mẫu trong một batch đánh giá.

gradient_accumulation_steps=1: Số bước tích lũy gradient trước khi thực hiện cập nhật trọng số.

learning_rate=2e-4: Tốc độ học ban đầu cho quá trình tối ưu hóa. Lựa chọn tốc độ học là 0.0002

optim=”paged_adamw_32bit”: Lựa chọn trình tối ưu hóa. paged_adamw_32bit là một biến thể của AdamW, hỗ trợ các phép toán 32-bit và tối ưu hóa bộ nhớ.

lr_scheduler_type=”cosine”: Lựa chọn thuật toán thay đổi tốc độ học. cosine nghĩa là tốc độ học sẽ giảm dần theo hình dạng hàm cosine.

Cấu hình train với SFTTrainer:

trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=peft_config,
    dataset_text_field="text",
    max_seq_length=256,
    tokenizer=tokenizer,
    args=training_arguments,
)

Trong đó:

train_dataset=dataset: Tập dữ liệu huấn luyện được truyền vào. Đây là tập dữ liệu được định dạng phù hợp để mô hình học hỏi từ nó.

peft_config=peft_config: PEFT là một kỹ thuật cho phép tinh chỉnh chỉ một số lượng nhỏ tham số của mô hình, thay vì toàn bộ mô hình, để giảm thiểu tài nguyên cần thiết. Tăng hiệu quả huấn luyện và tiết kiệm tài nguyên khi tinh chỉnh mô hình lớn.

dataset_text_field=”text”: Xác định trường (field) chứa văn bản trong tập dữ liệu.

max_seq_length=256: Chiều dài tối đa của chuỗi đầu vào (input sequence) được đưa vào mô hình. Giới hạn chiều dài để đảm bảo hiệu quả tính toán và tránh tình trạng sử dụng quá nhiều tài nguyên.

tokenizer=tokenizer: Bộ mã hóa (tokenizer) được sử dụng để chuyển đổi văn bản thành các token mà mô hình có thể xử lý.

Lưu model sau khi train

Sử dụng phương thức save_model và save_pretrained để lưu lại model. Do LoRA không thay đổi toàn bộ trọng số của mô hình gốc mà thêm các trọng số bổ sung (low-rank matrices), giúp quá trình tinh chỉnh nhanh hơn và tiết kiệm tài nguyên.

trainer.model.save_pretrained(
    MODEL_ADAPTER_PATH,
    safe_serialization=True
)
tokenizer.save_pretrained(MODEL_ADAPTER_PATH)

Trong đó:

MODEL_ADAPTER_PATH: là đường dẫn chứa model LORA.

safe_serialization=True: mục đích lưu model ở dạng safetensors (không cấu hình tham số này là True thì model lưu ở dạng .bin).

tokenizer.save_pretrained(MODEL_ADAPTER_PATH): Lưu tokenizer cùng với model.

Merge model:

Do model LORA là chỉ chứa các trọng số bổ sung phù hợp với dữ liệu được train mới, để tạo model đầy đủ cần gộp model gốc và model LORA để có được các đặc trưng từ model gốc cũng như các đặc trưng riêng theo dữ liệu mới. Để thực hiện quá trìn này, bước đầu tiên là tải model gốc với torch_dtype phù hợp với torch_dtype trong model LORA, sử dụng PeftModel.from_pretrained để merge model gốc và model LORA, cuối cùng lưu lại model đã merge.

origin_model = AutoModelForCausalLM.from_pretrained(
      base_model,
      torch_dtype=torch.float16,
      device_map="cpu", 
      trust_remote_code=True,
      revision="refs/pr/23"
)

print("Loading adapter...")
model = PeftModel.from_pretrained(origin_model, MODEL_ADAPTER_PATH)

print("Merging model...")
model = model.merge_and_unload()

model = model.to("cuda")
print("Saving merged model...")
model.save_pretrained(
       MODEL_FINAL_PATH,
       safe_serialization=True,
       max_shard_size="3GB"
)

4.3. Chương trình test

Chương trình test sẽ thực hiện đánh giá mô hình sau khi finetuning bằng cách thử nghiệm với các “prompt” để kiểm tra khả năng response của mô hình mới.

Cấu hình pipeline:

pipe = pipeline(
    task="text-generation",
    model=model,
    tokenizer=tokenizer,
    device="cuda",  
    max_length=200
)

Trong đó:

pipeline: Là một hàm tiện ích của thư viện transformers giúp cấu hình và sử dụng các mô hình dễ dàng.

task=”text-generation”: Chỉ định tác vụ mà pipeline sẽ thực hiện, trong trường hợp này là “tạo văn bản”.

Tạo prompt:

prompt = "What are the treatments for Gastrointestinal Carcinoid Tumors?"
instruction = f"### Instruction: {prompt} "

Cấu hình tham số sinh văn bản:

result = pipe(
    instruction,
    do_sample=True,
    temperature=0.7,
    top_p=0.9,
    repetition_penalty=1.2,
    pad_token_id=tokenizer.pad_token_id
)

Trong đó:

do_sample=True: Kích hoạt chế độ mẫu ngẫu nhiên, giúp đa dạng hóa đầu ra.

temperature=0.7: Điều chỉnh độ “sáng tạo” của mô hình; giá trị thấp tạo ra kết quả xác định hơn, giá trị cao hơn tạo ra kết quả đa dạng hơn.

top_p=0.9: Áp dụng nucleus sampling; chỉ xem xét các token có tổng xác suất tích lũy là 90%.

repetition_penalty=1.2: Phạt các từ lặp lại để cải thiện chất lượng văn bản đầu ra.

pad_token_id=tokenizer.pad_token_id: Chỉ định token đệm (padding token) để tránh lỗi liên quan đến token không được hỗ trợ.

Xử lý kết quả đầu ra:

print(result[0]['generated_text'][len(instruction):])

Cấu hình result[0][‘generated_text’]: Truy cập văn bản được tạo từ câu trả lời đầu tiên. len(instruction): Loại bỏ phần đầu của văn bản để chỉ lấy nội dung mô hình sinh ra sau phần instruction.

4.4. Log thực tế

root@aicandy:/aicandy/projects/LLM/AIcandy_LLM_Finetuning_Phi_2_xvynp# python AIcandy_LLM_Finetuning_Phi_2_ivgep.py
Starting training ...
Loading model and tokenizer...
root@aicandy:/aicandy/projects/LLM/AIcandy_LLM_Finetuning_Phi_2_xvynp/venv_amode/lib/python3.10/site-packages/huggingface_hub/file_download.py:795: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
  warnings.warn(
Load model for training...
Loading checkpoint shards: 100% 2/2 [00:01<00:00,  1.09it/s]
root@aicandy:/aicandy/projects/LLM/AIcandy_LLM_Finetuning_Phi_2_xvynp/venv_amode/lib/python3.10/site-packages/huggingface_hub/file_download.py:795: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
  warnings.warn(
root@aicandy:/aicandy/projects/LLM/AIcandy_LLM_Finetuning_Phi_2_xvynp/venv_amode/lib/python3.10/site-packages/peft/utils/other.py:102: FutureWarning: prepare_model_for_int8_training is deprecated and will be removed in a future version. Use prepare_model_for_kbit_training instead.
  warnings.warn(
Detected kernel version 5.4.0, which is below the recommended minimum of 5.5.0; this can cause the process to hang. It is recommended to upgrade the kernel to the minimum version or higher.
  0%|                                                                                                                      | 0/20 [00:00<?, ?it/s]You're using a CodeGenTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
{'train_runtime': 6.6579, 'train_samples_per_second': 4.506, 'train_steps_per_second': 3.004, 'train_loss': 1.2602449417114259, 'epoch': 10.0}
100% 20/20 [00:06<00:00,  3.00it/s]
Saving LoRA adapter...
Merging and saving final model...
Loading base model in full precision for merging...
root@aicandy:/aicandy/projects/LLM/AIcandy_LLM_Finetuning_Phi_2_xvynp/venv_amode/lib/python3.10/site-packages/huggingface_hub/file_download.py:795: FutureWarning: `resume_download` is deprecated and will be removed in version 1.0.0. Downloads always resume when possible. If you want to force a new download, use `force_download=True`.
  warnings.warn(
Loading checkpoint shards: 100% 2/2 [00:00<00:00,  6.30it/s]
Loading adapter...
Merging model...
Saving merged model...
Model successfully merged and saved to final!

1. The treatment of gastrointestinal carcinoids depends on how many tumors there are, whether they have spread to other parts of your body and what symptoms you may be having. Your health care team will discuss with you all of your options based upon these factors. Treatment options include surgery (removing part or all of a tumor), radiation therapy and chemotherapy.The following is an excerpt from our new book "A Practical Guide to Global Healthcare Marketing." Download it today!
In this section we'll look at some common marketing practices that work well in Western countries but don't translate as easily into Eastern markets. We also cover cultural differences between Westerners and Asians when approaching healthcare consumers through social media.
Some strategies might seem obvious; others not so much. It's important to understand local cultures before entering them—and understanding those cultures means knowing their customs, language, history, religion, etc.—
root@aicandy:/aicandy/projects/LLM/AIcandy_LLM_Finetuning_Phi_2_xvynp#

Khi hỏi model “What are the treatments for Gastrointestinal Carcinoid Tumors?”

Model phản hồi “The treatment of gastrointestinal carcinoids depends on how many tumors there are, whether they have spread to other parts of your body and what symptoms you may be having. Your health care team will discuss with you all of your options based upon these factors. Treatment options include surgery (removing part or all of a tumor), radiation therapy and chemotherapy.The following is an excerpt from our new book “A Practical Guide to Global Healthcare Marketing.” Download it today!
In this section we’ll look at some common marketing practices that work well in Western countries but don’t translate as easily into Eastern markets. We also cover cultural differences between Westerners and Asians when approaching healthcare consumers through social media.”

Về tổng quan thì câu trả lời chấp nhận được.

5. Kết luận

Bài viết đã cung cấp hướng dẫn chi tiết và đầy đủ về quy trình fine-tuning một mô hình ngôn ngữ lớn (phi-2), từ giai đoạn chuẩn bị dữ liệu, cấu hình mô hình, đến việc training và merge mô hình sau khi fine-tuning. Kết quả kiểm tra sau khi hoàn thành cho thấy mô hình mới đạt được kết quả tương đối hợp lý, đáp ứng tốt các yêu cầu cơ bản của ứng dụng.

Hơn nữa, để nâng cao chất lượng phản hồi của mô hình, có thể cân nhắc các biện pháp cải thiện như:

  • Tăng số lượng epoch: Giúp mô hình học sâu hơn từ dữ liệu huấn luyện.
  • Mở rộng dữ liệu training: Cung cấp thêm nhiều mẫu đa dạng hơn để mô hình có thể bao quát được nhiều tình huống hơn.
  • Tinh chỉnh tham số: Điều chỉnh các tham số trong quá trình training để phù hợp hơn với đặc điểm của dữ liệu, chẳng hạn như learning rate, batch size, và các hyperparameter khác.

Với các bước cải thiện này, mô hình có tiềm năng đạt được chất lượng phản hồi tốt hơn, nâng cao hiệu quả ứng dụng thực tiễn trong các bài toán xử lý ngôn ngữ tự nhiên.

6. Source code

Source code miễn phí tại đây