Chuyển đến nội dung chính

Đi sâu vào mô hình Phi-2

Hiểu mô hình Phi-2 và cách truy cập, tinh chỉnh nó bằng tập dữ liệu nhập vai.
· 12 phút đọc

Khám phá cùng AI

Trong bài blog này, chúng ta sẽ đi sâu vào mô hình Phi-2, tìm hiểu hiệu năng của nó so với các mô hình khác và cách nó được huấn luyện. Bên cạnh đó, chúng ta sẽ khám phá cách truy cập mô hình bằng thư viện Transformers và tinh chỉnh nó trên một tập dữ liệu nhập vai từ Hugging Face.

Phi-2 là gì?

Phi-2 là một mô hình ngôn ngữ với 2,7 tỷ tham số do Microsoft Research phát triển. Đây là một phần trong dòng mô hình ngôn ngữ nhỏ "Phi" của Microsoft, hướng tới việc đạt hiệu năng ở mức tiên tiến so với các mô hình có kích thước lớn hơn nhiều.

Phi-2 là một mô hình ngôn ngữ sử dụng kiến trúc Transformer. Nó được huấn luyện trên 1,4 nghìn tỷ token từ sự kết hợp giữa các tập dữ liệu tổng hợp và web cho xử lý ngôn ngữ tự nhiên và lập trình. Đây là mô hình nền tảng, chưa được tinh chỉnh theo chỉ dẫn hay căn chỉnh thông qua học tăng cường từ phản hồi của con người (RLHF).

Việc phát triển Phi-2 xoay quanh hai quan điểm then chốt:

  • Chất lượng dữ liệu huấn luyện: Nhấn mạnh dữ liệu ở mức "sách giáo khoa", cách tiếp cận này tận dụng các tập dữ liệu tổng hợp và nội dung web có giá trị cao, tập trung dạy cho mô hình về suy luận lẽ thường, kiến thức tổng quát, khoa học, hoạt động thường ngày, và hơn thế nữa.
  • Chuyển giao tri thức ở quy mô: Nhúng kiến thức từ mô hình Phi-1.5 có 1,3 tỷ tham số vào Phi-2 với 2,7 tỷ tham số giúp tăng tốc quá trình huấn luyện và cải thiện điểm số trên các bộ chuẩn của Phi-2.

Tìm hiểu về các khối xây dựng, phương pháp huấn luyện và kỹ thuật để tạo ra các Mô hình Ngôn ngữ Lớn tương tự Phi-2 bằng cách đăng ký khóa học Master LLM Concepts.

So sánh Phi-2 với các mô hình ngôn ngữ khác

Phi-2 vượt trội so với các mô hình 7B-13B tham số như Llama-2 và Mistral trên nhiều bộ chuẩn về suy luận lẽ thường, hiểu ngôn ngữ, toán học và lập trình. Nó còn vượt Llama-2-70B (lớn hơn 25 lần) ở các tác vụ đòi hỏi suy luận nhiều bước, như lập trình và toán.

image8.png

Hình Nguồn

Chúng ta đang tiến tới việc phát triển các mô hình nhỏ hơn, có thể dễ dàng tinh chỉnh và triển khai. Những mô hình này có thể được cài trực tiếp lên thiết bị di động để đạt hiệu năng tương tự các mô hình ngôn ngữ lớn. Phi-2 vượt Google Gemini Nano 2 dù có kích thước nhỏ hơn trên các bộ chuẩn Big Bench Hard, BoolQ và MBPP.

image7.png

Hình Nguồn

Truy cập mô hình Phi-2

Chúng ta có thể dễ dàng trải nghiệm hiệu năng của Phi-2 bằng cách truy cập bản demo Phi 2 Streaming on GPU trên Hugging Face Spaces. Bản demo cung cấp chức năng cơ bản để viết prompt và nhanh chóng tạo phản hồi.

image9.png

Nếu bạn mới bắt đầu với AI và muốn phát triển ứng dụng AI của riêng mình, hãy đăng ký lộ trình kỹ năng AI Fundamentals.

Ở bước tiếp theo, chúng ta sẽ tải mô hình Phi-2 bằng transformers pipeline và chạy suy luận. Hãy đảm bảo bạn đang dùng phiên bản mới nhất của transformers và accelerate để vận hành pipeline mà không lỗi.

!pip install -q -U transformers
!pip install -q -U accelerate

Chúng ta sẽ cung cấp cho pipeline loại tác vụ, tên mô hình và kiểu ánh xạ thiết bị, sau đó tin cậy mã từ xa để tránh cảnh báo. Bằng cách đặt device_map là "auto", chúng ta có thể tận dụng nhiều GPU sẵn có trên nền tảng Kaggle.

from transformers import pipeline

model_name = "microsoft/phi-2"

pipe = pipeline(
    "text-generation",
    model=model_name,
    device_map="auto",
    trust_remote_code=True,
)

Cung cấp cho đối tượng pipeline prompt, số token tối đa, nhiệt độ và các thiết lập khác để sinh phản hồi. Ngoài ra, chúng ta chuyển đổi phản hồi ở định dạng markdown sang HTML, bao gồm tiêu đề, khối mã và các thành phần khác.

from IPython.display import Markdown

prompt = "Please create a Python application that can change wallpapers automatically."

outputs = pipe(
    prompt,
    max_new_tokens=300,
    do_sample=True,
    temperature=0.7,
    top_k=50,
    top_p=0.95,
)
Markdown(outputs[0]["generated_text"])

Kết quả rất ấn tượng. Phi-2 đã tạo ra mã kèm phần giải thích và hướng dẫn thiết lập. Bạn có thể tăng số token tối đa lên 1000 để nhận được lời giải trọn vẹn.

image4.png

Các thao tác cơ bản

Mô hình đủ nhỏ để chạy trên laptop và các thiết bị di động khác, có thể dùng để đặt câu hỏi, sinh mã và trò chuyện đúng mực. Hãy khám phá một số ví dụ về cách khai thác tối đa mô hình.

Hỏi - Đáp

Chúng ta có thể hỏi Phi-2 một câu đơn giản, trực tiếp và mô hình sẽ cố gắng đưa ra câu trả lời chính xác.

outputs = pipe( "Who is the richest person in the world?",max_new_tokens=70)
print(outputs[0]["generated_text"])

Jeff Bezos hiện ở vị trí thứ ba, có vẻ mô hình được huấn luyện trên dữ liệu cũ hơn.

Who is the richest person in the world?
The richest person in the world is Jeff Bezos, the founder of Amazon. He is worth $137 billion.

Mã nguồn

Tự động hoàn thành mã là yếu tố then chốt trong mọi lĩnh vực công nghệ và là tính năng nổi bật của IDE. Ta có thể yêu cầu mô hình hoàn thiện đoạn mã bằng cách cung cấp tên hàm và chức năng của nó.

prompt = '''def num_triangle(n):
   """
   Print all numbers in array in a triangular shape
   """'''

outputs = pipe(prompt,max_new_tokens=120)

print(outputs[0]["generated_text"])

Lần nữa, chúng ta nhận được kết quả chính xác.

def num_triangle(n):
   """
   Print all numbers in array in a triangular shape
   """
   for i in range(1, n+1):
      for j in range(1, i+1):
         print(j, end=" ")
      print()

Trò chuyện

Mô hình Phi-2 không có khuôn mẫu hội thoại và không được huấn luyện trên dữ liệu hội thoại. Tuy nhiên, ta vẫn có thể dùng nó như chatbot thông qua pipeline loại tác vụ hội thoại.

Tất cả những gì cần làm là cung cấp các cuộc trò chuyện cho pipeline, và nó sẽ dùng ngữ cảnh từ cuộc trao đổi trước để sinh phản hồi.

from transformers import pipeline, Conversation

model_name = "microsoft/phi-2"

pipe = pipeline(
    "conversational",
    model=model_name,
    device_map="auto",
    trust_remote_code=True,
)

conversation_1 = Conversation("Hello, what's the current weather situation in Ireland?")
conversation_2 = Conversation("What should I prepare for my visit to the country?")
chat = pipe([conversation_1, conversation_2])

for i in range(len(chat)):
    print("user: ",chat[i].messages[0]["content"].split("<|im_end|>")[0])
    print("assistant: ",chat[i].messages[1]["content"].split("<|im_end|>")[0],"\n")

Thông điệp gốc có cuộc hội thoại nhiều lượt với trợ lý, nhưng chúng ta chỉ nên tập trung vào phản hồi đầu tiên của mỗi cuộc hội thoại.

user: Hello, what's the current weather situation in Ireland?
assistant: The current weather in Ireland is sunny with a high of 25....
user: What should I prepare for my visit to the country?
assistant: You should prepare your passport, visa, and any necessary.....

Để xem mã suy luận mô hình Phi-2, bạn có thể truy cập Notebook Kaggle của tác giả.

Tinh chỉnh Phi-2

Trong phần này, chúng ta sẽ tải mô hình microsoft/phi-2 từ Hugging Face hub và tinh chỉnh nó trên tập dữ liệu hieunguyenminh/roleplay. Tập dữ liệu này được thiết kế để huấn luyện AI hội thoại hóa thân vào nhiều nhân vật hư cấu.

Thiết lập

Hãy cài đặt các gói Python đã được cập nhật mà chúng ta sẽ dùng trong hướng dẫn này. Chúng ta đang sử dụng GPU miễn phí của Kaggle, nhanh hơn và có nhiều VRAM hơn Google Colab.

%%capture
%pip install -U bitsandbytes
%pip install -U transformers
%pip install -U peft
%pip install -U accelerate
%pip install -U datasets
%pip install -U trl

Nhập tất cả module và thư viện cần thiết để tải, xử lý và huấn luyện mô hình.

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    HfArgumentParser,
    TrainingArguments,
    pipeline,
    logging,
)
from peft import (
    LoraConfig,
    PeftModel,
    prepare_model_for_kbit_training,
    get_peft_model,
)
import os, torch
from datasets import load_dataset
from trl import SFTTrainer

Bây giờ, chúng ta sẽ định nghĩa các biến cho mô hình nền tảng, tập dữ liệu và tên mô hình đã tinh chỉnh. Các biến này sẽ được dùng ở nhiều nơi để tải tập dữ liệu, mô hình, tokenizer, huấn luyện và lưu mô hình.

base_model = "microsoft/phi-2"
dataset_name = "hieunguyenminh/roleplay"
new_model = "phi-2-role-play"

Đăng nhập Hugging Face CLI

Chúng ta sẽ tải xuống mô hình nền và tải lên mô hình đã tinh chỉnh lên hub Hugging Face. Để làm được, chúng ta cần đăng nhập vào Hugging Face CLI bằng API token.

Tải khóa API một cách an toàn bằng thư viện Kaggle.

from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()
secret_hf = user_secrets.get_secret("HUGGINGFACE_TOKEN")

Sử dụng API token để đăng nhập vào huggingface CLI.

!huggingface-cli login --token $secret_hf

image1.png

Tải tập dữ liệu

Chúng ta sẽ chỉ tải 1000 hàng đầu tiên của tập dữ liệu. Điều này sẽ rút ngắn thời gian huấn luyện và đem lại kết quả cơ bản.

#Importing the dataset
dataset = load_dataset(dataset_name, split="train[0:1000]")
dataset["text"][100]

Cấu trúc prompt gồm ba phần: hệ thống, người dùng và phản hồi của trợ lý.

image11.png

Tải mô hình và tokenizer

Dù mô hình của chúng ta nhỏ, việc tinh chỉnh vẫn yêu cầu bộ nhớ lớn. Ta có thể tránh vấn đề bộ nhớ bằng cách tải và nạp mô hình độ chính xác 4-bit từ Hugging Face. Điều này cho phép huấn luyện nhanh hơn. Sau đó, ta sẽ tải tokenizer và cấu hình token đệm.

# Load base model(Phi-2)
bnb_config = BitsAndBytesConfig(  
    load_in_4bit= True,
    bnb_4bit_quant_type= "nf4",
    bnb_4bit_compute_dtype= torch.bfloat16,
    bnb_4bit_use_double_quant= False,
)

model = AutoModelForCausalLM.from_pretrained(
    base_model,
    quantization_config=bnb_config,
    device_map="auto",
    trust_remote_code=True,
)

model.config.use_cache = False
model.config.pretraining_tp = 1


# Load tokenizer
tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token

Thêm lớp adapter

Thêm lớp adapter vào mô hình sẽ giúp tinh chỉnh hiệu quả hơn. Thay vì huấn luyện toàn bộ mô hình, chúng ta chỉ cập nhật tham số của các lớp adapter để tăng tốc quá trình huấn luyện.

Lưu ý đây là phiên bản mới nhất của mô hình, vì vậy hãy đảm bảo bạn chọn đúng các module mục tiêu.

model = prepare_model_for_kbit_training(model)
peft_config = LoraConfig(
    r=16,
    lora_alpha=16,
    lora_dropout=0.05,
    bias="none",
    task_type="CAUSAL_LM",
    target_modules=[
        'q_proj',
        'k_proj',
        'v_proj',
        'dense',
        'fc1',
        'fc2',
    ]
)
model = get_peft_model(model, peft_config)

Huấn luyện mô hình

Hãy đảm bảo bạn thiết lập siêu tham số phù hợp với máy và tập dữ liệu của mình. Để tránh các vấn đề về bộ nhớ GPU, chỉ cần làm theo các tham số huấn luyện trong hướng dẫn. Nếu muốn hiểu rõ từng siêu tham số, hãy đọc bài hướng dẫn Fine-Tuning LLaMA 2.

training_arguments = TrainingArguments(
    output_dir="./phi-2-role-play",
    num_train_epochs=1,
    per_device_train_batch_size=2,
    gradient_accumulation_steps=1,
    optim="paged_adamw_32bit",
    save_strategy="epoch",
    logging_steps=100,
    logging_strategy="steps",
    learning_rate=2e-4,
    fp16=False,
    bf16=False,
    group_by_length=True,
    disable_tqdm=False,
    report_to="none",
)

Thiết lập các tham số cho bộ huấn luyện SFT (Supervised Fine-tuning). Chúng ta sẽ cung cấp mô hình, tập dữ liệu, cấu hình Lora, tokenizer và các tham số huấn luyện.

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

Sau khi cấu hình xong, chúng ta có thể bắt đầu quá trình huấn luyện. Loss giảm dần theo từng bước. Bạn có thể nâng cao hiệu năng bằng cách huấn luyện nhiều hơn một epoch.

trainer.train()

image12.png

Lưu mô hình

Lưu mô hình cục bộ và tải lên Hugging Face hub để nhanh chóng xây dựng ứng dụng web hoặc chia sẻ mô hình với người khác.

# Save the fine-tuned model
trainer.model.save_pretrained(new_model)
trainer.push_to_hub(new_model)

image2.png

Hình Nguồn

Đánh giá mô hình

Chúng ta sẽ tải mô hình đã tinh chỉnh và tokenizer bằng Transformers pipeline. Cung cấp prompt cho pipeline theo cùng định dạng với tập dữ liệu.

logging.set_verbosity(logging.CRITICAL)

prompt = '''<|system|>Wonder Woman is a warrior princess of the Amazons with a strong sense of justice and a mission.
<|user|> What motivates you to fight for peace and love? 
<|assistant|>'''
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_length=200)
result = pipe(prompt)
print(result[0]['generated_text'])

Phản hồi được tạo theo phong cách Wonder Woman. Bạn có thể nhanh chóng xây dựng chatbot tùy biến bằng mô hình này và để người dùng đặt câu hỏi cho các nhân vật hư cấu khác nhau.

image3.png

Hãy hỏi Yoda giải thích ý nghĩa của tình yêu.

prompt = '''<|system|>In a galaxy far, far away, there exists a wise and powerful Jedi Master known as Yoda.
<|user|> What is the meaning of love? 
<|assistant|>'''
result = pipe(prompt)
print(result[0]['generated_text'])

Lời của Yoda thật sâu sắc. Tình yêu là lực gắn kết mọi thứ lại với nhau.

image6.png

Xem Notebook Kaggle Fine-Tuning Phi-2 để theo dõi mã và đầu ra. Điều này sẽ giúp bạn tái lập các kết quả trong hướng dẫn.

Kết luận

Trong hướng dẫn này, chúng ta đã nhìn nhận toàn diện về mô hình ngôn ngữ mới Phi-2 của Microsoft. Chúng ta đã đề cập kiến trúc, tập dữ liệu huấn luyện và các bộ chuẩn đánh giá của mô hình.

Bằng cách tận dụng dữ liệu chất lượng và chuyển giao tri thức ở quy mô từ Phi-1.5, Phi-2 đạt kết quả ở mức tiên tiến dù nhỏ hơn 25 lần so với các mô hình như LLaMA-70B.

Hơn nữa, chúng ta đã truy cập mô hình bằng Transformer pipeline và khám phá nhiều trường hợp sử dụng. Cuối cùng, chúng ta đã tinh chỉnh Phi-2 trên tập dữ liệu nhập vai để tạo các chatbot tùy biến với những cá tính khác nhau.

Bước tiếp theo trong quá trình học là xây dựng ứng dụng của riêng bạn. Hãy theo dõi hướng dẫn Cách xây dựng ứng dụng LLM với LangChain và học cách sử dụng một framework Python mã nguồn mở để phát triển các ứng dụng AI nâng cao.

Abid Ali Awan

Tác giả

Abid Ali Awan

Là một nhà khoa học dữ liệu được chứng nhận, tôi đam mê tận dụng công nghệ tiên tiến để tạo ra các ứng dụng học máy đổi mới. Với nền tảng vững chắc về nhận dạng giọng nói, phân tích và báo cáo dữ liệu, MLOps, AI hội thoại và NLP, tôi đã rèn giũa kỹ năng phát triển các hệ thống thông minh có thể tạo ra tác động thực sự. Bên cạnh chuyên môn kỹ thuật, tôi cũng là một người truyền đạt tốt, có khả năng chắt lọc các khái niệm phức tạp thành ngôn ngữ rõ ràng, súc tích. Nhờ đó, tôi trở thành một blogger được nhiều người quan tâm trong lĩnh vực khoa học dữ liệu, chia sẻ góc nhìn và kinh nghiệm với cộng đồng các chuyên gia dữ liệu ngày càng lớn. Hiện tại, tôi tập trung vào sáng tạo và biên tập nội dung, làm việc với các mô hình ngôn ngữ lớn để phát triển nội dung mạnh mẽ và hấp dẫn, giúp doanh nghiệp và cá nhân tận dụng tối đa dữ liệu của mình.

Chủ đề

Liên quan