Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
hahuyhoang411 committed Jan 22, 2025
1 parent 09f3b2f commit e64d072
Showing 1 changed file with 81 additions and 84 deletions.
165 changes: 81 additions & 84 deletions vi/5_vision_language_models/notebooks/vlm_sft_sample.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"# Fine-Tuning a VLM \n",
"# Tinh chỉnh Mô hình Ngôn ngữ Thị giác (VLM)\n",
"\n",
"This notebook demonstrates how to fine-tune the `HuggingFaceTB/SmolVLM-Instruct` model using the `SFTTrainer` from the `trl` library. The notebook cells run and will finetune the model. You can select your difficulty by trying out different datasets.\n",
"Notebook này minh họa cách tinh chỉnh mô hình `HuggingFaceTB/SmolVLM-Instruct` bằng cách sử dụng `SFTTrainer` từ thư viện `trl`. Các ô của notebook sẽ chạy và tinh chỉnh mô hình. Bạn có thể chọn mức độ khó bằng cách thử các tập dữ liệu khác nhau.\n",
"\n",
"<div style='background-color: lightblue; padding: 10px; border-radius: 5px; margin-bottom: 20px; color:black'>\n",
" <h2 style='margin: 0;color:blue'>Exercise: Fine-Tuning SmolVLM with SFTTrainer</h2>\n",
" <p>Take a dataset from the Hugging Face hub and finetune a model on it. </p> \n",
" <p><b>Difficulty Levels</b></p>\n",
" <p>🐢 Use the `HuggingFaceM4/ChartQA` dataset for SFT training run.</p>\n",
" <p>🐕 Use the fine-tuned to model generate a response, and improve upon the base example.</p>\n",
" <p>🦁 Try out the other datasets and show improvement.</p>\n",
"<h2 style='margin: 0;color:blue'>Bài tập: Tinh chỉnh SmolVLM với SFTTrainer</h2>\n",
"<p>Hãy chọn một tập dữ liệu từ Hugging Face Hub và tinh chỉnh một mô hình trên đó.</p>\n",
"<p><b>Các mức độ khó</b></p>\n",
"<p>🐢 Sử dụng tập dữ liệu HuggingFaceM4/ChartQA để chạy huấn luyện SFT.</p>\n",
"<p>🐕 Sử dụng mô hình đã được tinh chỉnh để tạo ra phản hồi và cải thiện dựa trên ví dụ cơ bản.</p>\n",
"<p>🦁 Thử các tập dữ liệu khác và cho thấy sự cải thiện.</p>\n",
"</div>"
]
},
Expand All @@ -24,14 +24,14 @@
"metadata": {},
"outputs": [],
"source": [
"# Install the requirements in Google Colab\n",
"# Cài đặt các thư viện cần thiết trong Google Colab\n",
"# !pip install transformers datasets trl huggingface_hub\n",
"\n",
"# Authenticate to Hugging Face\n",
"# Xác thực với Hugging Face\n",
"from huggingface_hub import login\n",
"login()\n",
"\n",
"# for convenience you can create an environment variable containing your hub token as HF_TOKEN"
"# Để thuận tiện, bạn có thể tạo một biến môi trường chứa token Hugging Face của mình là HF_TOKEN"
]
},
{
Expand All @@ -40,7 +40,7 @@
"metadata": {},
"outputs": [],
"source": [
"# Import dependencies\n",
"# Nhập các thư viện cần thiết\n",
"\n",
"import torch\n",
"import os\n",
Expand Down Expand Up @@ -83,7 +83,7 @@
").to(device)\n",
"processor = AutoProcessor.from_pretrained(\"HuggingFaceTB/SmolVLM-Instruct\")\n",
"\n",
"# Set our name for the finetune to be saved &/ uploaded to\n",
"# Đặt tên cho bản tinh chỉnh để lưu và tải lên\n",
"finetune_name = \"SmolVLM-FT-MyDataset\"\n",
"finetune_tags = [\"smol-course\", \"module_5\"]"
]
Expand All @@ -92,11 +92,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## Dataset Preparation\n",
"## Chuẩn bị tập dữ liệu\n",
"\n",
"We will load a sample dataset and format it for training. The dataset should be structured with input-output pairs, where each input is a prompt and the output is the expected response from the model.\n",
"Chúng ta sẽ tải một tập dữ liệu mẫu và định dạng nó để huấn luyện. Tập dữ liệu phải được cấu trúc với các cặp đầu vào-đầu ra, trong đó mỗi đầu vào là một lời nhắc (prompt) và đầu ra là phản hồi mong đợi từ mô hình.\n",
"\n",
"**TRL will format input messages based on the model's chat templates.** They need to be represented as a list of dictionaries with the keys: `role` and `content`,."
"**TRL sẽ định dạng các thông báo đầu vào dựa trên các mẫu trò chuyện (chat templates) của mô hình.** Chúng cần được biểu diễn dưới dạng danh sách các từ điển với các khóa: `role` `content`."
]
},
{
Expand Down Expand Up @@ -129,10 +129,10 @@
}
],
"source": [
"# Load a sample dataset\n",
"# Tải tập dữ liệu mẫu\n",
"from datasets import load_dataset\n",
"\n",
"# TODO: define your dataset and config using the path and name parameters\n",
"# TODO: xác định tập dữ liệu và cấu hình của bạn bằng cách sử dụng các tham số đường dẫn và tên\n",
"dataset_name = \"HuggingFaceM4/ChartQA\"\n",
"ds = load_dataset(path=dataset_name)\n",
"ds"
Expand Down Expand Up @@ -169,18 +169,18 @@
"import matplotlib.pyplot as plt\n",
"sample = ds['train'][3]\n",
"\n",
"# Display the structure of a single sample\n",
"# Hiển thị cấu trúc của một mẫu đơn\n",
"sample['image_size'] = sample['image'].size,\n",
"\n",
"# Visualize the image and related metadata\n",
"# Trực quan hóa hình ảnh và siêu dữ liệu liên quan\n",
"plt.imshow(sample['image'])\n",
"plt.axis(\"off\")\n",
"plt.title(\"Sample Chart Image\")\n",
"plt.title(\"Hình ảnh biểu đồ mẫu\")\n",
"plt.show()\n",
"\n",
"print(sample)\n",
"\n",
"# Preprocess the sample\n",
"# Tiền xử lý mẫu\n",
"prompt = [{\"role\": \"user\", \"content\": [{\"type\": \"image\"}, {\"type\": \"text\", \"text\": sample[\"query\"]}]}]\n",
"formatted_query = processor.apply_chat_template(prompt, tokenize=False)\n",
"\n",
Expand All @@ -191,25 +191,25 @@
").to(device)\n",
"inputs = {key: val.to(device, dtype=torch.bfloat16) if val.dtype == torch.float else val.to(device) for key, val in inputs.items()}\n",
"\n",
"# Generate predictions\n",
"# Tạo dự đoán\n",
"with torch.no_grad():\n",
" outputs = model.generate(**inputs,\n",
" max_length=1600)\n",
"\n",
"# Decode the prediction\n",
"# Giải mã dự đoán\n",
"prediction = processor.batch_decode(outputs, skip_special_tokens=True)\n",
"\n",
"# Display the result\n",
"print(f\"Query: {sample['query']}\")\n",
"print(f\"Expected Answer: {sample['label'][0]}\")\n",
"print(f\"Model Prediction: {prediction[0]}\")"
"# Hiển thị kết quả\n",
"print(f\"Truy vấn: {sample['query']}\")\n",
"print(f\"Câu trả lời mong đợi: {sample['label'][0]}\")\n",
"print(f\"Dự đoán của mô hình: {prediction[0]}\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Set Up LoRA"
"## Thiết lập LoRA"
]
},
{
Expand All @@ -228,7 +228,7 @@
"source": [
"from peft import LoraConfig, get_peft_model\n",
"\n",
"# Configure LoRA\n",
"# Cấu hình LoRA\n",
"peft_config = LoraConfig(\n",
" lora_alpha=16,\n",
" lora_dropout=0.05,\n",
Expand All @@ -238,20 +238,20 @@
" task_type=\"CAUSAL_LM\",\n",
")\n",
"\n",
"# Apply PEFT model adaptation\n",
"# Áp dụng điều chỉnh mô hình PEFT\n",
"peft_model = get_peft_model(model, peft_config)\n",
"\n",
"# Print trainable parameters\n",
"# In các tham số có thể huấn luyện\n",
"peft_model.print_trainable_parameters()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Configuring the Trainer\n",
"## Cấu hình Trình huấn luyện (Trainer)\n",
"\n",
"The `Trainer` is configured with various parameters that control the training process. These include the number of training steps, batch size, learning rate, and evaluation strategy. Adjust these parameters based on your specific requirements and computational resources."
"`Trainer` được định cấu hình với nhiều tham số khác nhau để kiểm soát quá trình huấn luyện. Chúng bao gồm số bước huấn luyện, kích thước batch, tốc độ học và chiến lược đánh giá. Điều chỉnh các tham số này dựa trên các yêu cầu cụ thể và tài nguyên tính toán của bạn."
]
},
{
Expand All @@ -261,19 +261,19 @@
"outputs": [],
"source": [
"def collate_fn(examples):\n",
" # System message template for the VLM\n",
" system_message = \"\"\"You are a Vision Language Model specialized in interpreting visual data from chart images.\n",
" Your task is to analyze the provided chart image and respond to queries with concise answers, usually a single word, number, or short phrase.\n",
" The charts include a variety of types (e.g., line charts, bar charts) and contain colors, labels, and text.\n",
" Focus on delivering accurate, succinct answers based on the visual information. Avoid additional explanation unless absolutely necessary.\"\"\"\n",
" # Mẫu thông báo hệ thống cho VLM\n",
" system_message = \"\"\"Bạn là một Mô hình Ngôn ngữ Thị giác chuyên giải thích dữ liệu trực quan từ hình ảnh biểu đồ.\n",
" Nhiệm vụ của bạn là phân tích hình ảnh biểu đồ được cung cấp và trả lời các truy vấn bằng các câu trả lời ngắn gọn, thường là một từ, số hoặc cụm từ ngắn.\n",
" Các biểu đồ bao gồm nhiều loại khác nhau (ví dụ: biểu đồ đường, biểu đồ cột) và chứa màu sắc, nhãn và văn bản.\n",
" Tập trung vào việc cung cấp các câu trả lời chính xác, ngắn gọn dựa trên thông tin trực quan. Tránh giải thích thêm trừ khi thực sự cần thiết.\"\"\"\n",
"\n",
" # Initialize lists for text and image inputs\n",
" # Khởi tạo danh sách cho đầu vào văn bản và hình ảnh\n",
" text_inputs = []\n",
" image_inputs = []\n",
"\n",
" # Process all examples in one loop\n",
" # Xử lý tất cả các ví dụ trong một vòng lặp\n",
" for example in examples:\n",
" # Format the chat structure for the processor\n",
" # Định dạng cấu trúc trò chuyện cho bộ xử lý\n",
" formatted_example = {\n",
" \"messages\": [\n",
" {\n",
Expand All @@ -294,40 +294,39 @@
" },\n",
" ]\n",
" }\n",
" # Apply chat template and strip extra spaces\n",
" # Áp dụng mẫu trò chuyện và loại bỏ khoảng trắng thừa\n",
" text_inputs.append(processor.apply_chat_template(formatted_example[\"messages\"], tokenize=False).strip())\n",
" \n",
" # Ensure images are in RGB mode\n",
" # Đảm bảo hình ảnh ở chế độ RGB\n",
" image = example[\"image\"]\n",
" if image.mode != 'RGB':\n",
" image = image.convert('RGB')\n",
" image_inputs.append( [image] )\n",
"\n",
" # Tokenize the texts and process the images\n",
" # Token hóa văn bản và xử lý hình ảnh\n",
" batch = processor(\n",
" text=text_inputs,\n",
" images=image_inputs,\n",
" return_tensors=\"pt\",\n",
" padding=True\n",
" )\n",
"\n",
" # Clone input IDs for labels\n",
" # Sao chép ID đầu vào cho nhãn\n",
" labels = batch[\"input_ids\"].clone()\n",
" labels[labels == processor.tokenizer.pad_token_id] = -100 # Mask padding tokens in labels\n",
" labels[labels == processor.tokenizer.pad_token_id] = -100 # Che các token đệm (pad token) trong nhãn\n",
"\n",
" # Ensure image_token is converted to string if it is an AddedToken\n",
" # In some processor, processor.image_token return a list for each image.\n",
" # TODO: AutoProcessor.from_pretrained(\"HuggingFaceTB/SmolVLM-Instruct\") only have one ?\n",
" # Đảm bảo image_token được chuyển đổi thành chuỗi nếu nó là AddedToken\n",
" # Trong một số bộ xử lý, processor.image_token trả về một danh sách cho mỗi hình ảnh.\n",
" # TODO: AutoProcessor.from_pretrained(\"HuggingFaceTB/SmolVLM-Instruct\") chỉ có một?\n",
" image_token_id = processor.tokenizer.convert_tokens_to_ids(str(processor.image_token))\n",
"\n",
" # Mask image token IDs in the labels\n",
" # Che các ID token hình ảnh trong nhãn\n",
" labels[labels == image_token_id] = -100\n",
"\n",
" # Add labels back to the batch\n",
" # Thêm nhãn trở lại batch\n",
" batch[\"labels\"] = labels\n",
"\n",
"\n",
" return batch\n"
" return batch"
]
},
{
Expand All @@ -338,30 +337,30 @@
"source": [
"from trl import SFTConfig, SFTTrainer\n",
"\n",
"# Configure the Trainer\n",
"# Cấu hình Trình huấn luyện\n",
"training_args = SFTConfig(\n",
" output_dir=\"sft_output\", # Directory to save the model\n",
" num_train_epochs=3, # number of training epochs\n",
" per_device_train_batch_size=1, # batch size per device during training\n",
" gradient_accumulation_steps=16, # number of steps before performing a backward/update pass\n",
" gradient_checkpointing=True, # use gradient checkpointing to save memory\n",
" optim=\"adamw_torch_fused\", # use fused adamw optimizer\n",
" logging_steps=5, # log every 10 steps\n",
" save_strategy=\"epoch\", # save checkpoint every epoch\n",
" learning_rate=2e-4, # learning rate, based on QLoRA paper\n",
" bf16=True, # use bfloat16 precision\n",
" tf32=True, # use tf32 precision\n",
" max_grad_norm=0.3, # max gradient norm based on QLoRA paper\n",
" warmup_ratio=0.03, # warmup ratio based on QLoRA paper\n",
" lr_scheduler_type=\"constant\", # use constant learning rate scheduler\n",
" push_to_hub=True, # push model to hub\n",
" gradient_checkpointing_kwargs = {\"use_reentrant\": False}, # use reentrant checkpointing\n",
" output_dir=\"sft_output\", # Thư mục để lưu mô hình\n",
" num_train_epochs=3, # số epoch huấn luyện\n",
" per_device_train_batch_size=1, # kích thước batch trên mỗi thiết bị trong quá trình huấn luyện\n",
" gradient_accumulation_steps=16, # số bước trước khi thực hiện lan truyền ngược/cập nhật\n",
" gradient_checkpointing=True, # sử dụng checkpoint gradient để tiết kiệm bộ nhớ\n",
" optim=\"adamw_torch_fused\", # sử dụng trình tối ưu hóa adamw_torch_fused\n",
" logging_steps=5, # ghi log sau mỗi 5 bước\n",
" save_strategy=\"epoch\", # lưu checkpoint sau mỗi epoch\n",
" learning_rate=2e-4, # tốc độ học, dựa trên bài báo QLoRA\n",
" bf16=True, # sử dụng độ chính xác bfloat16\n",
" tf32=True, # sử dụng độ chính xác tf32\n",
" max_grad_norm=0.3, # chuẩn gradient tối đa dựa trên bài báo QLoRA\n",
" warmup_ratio=0.03, # tỷ lệ khởi động dựa trên bài báo QLoRA\n",
" lr_scheduler_type=\"constant\", # sử dụng bộ lập lịch tốc độ học không đổi\n",
" push_to_hub=True, # đẩy mô hình lên hub\n",
" gradient_checkpointing_kwargs = {\"use_reentrant\": False}, # sử dụng checkpointing reentrant\n",
" # dataloader_num_workers=16, \n",
" dataset_text_field=\"\", # need a dummy field for collator\n",
" dataset_kwargs = {\"skip_prepare_dataset\": True}, # important for collator\n",
" remove_unused_columns = False # necessary else features except label will be removed\n",
" dataset_text_field=\"\", # cần một trường giả cho bộ đối chiếu (collator)\n",
" dataset_kwargs = {\"skip_prepare_dataset\": True}, # quan trọng cho bộ đối chiếu\n",
" remove_unused_columns = False # cần thiết nếu không các đặc trưng ngoại trừ nhãn sẽ bị xóa\n",
")\n",
"# Initialize the Trainer\n",
"# Khởi tạo Trình huấn luyện\n",
"trainer = SFTTrainer(\n",
" model=model,\n",
" args=training_args,\n",
Expand All @@ -372,16 +371,16 @@
" tokenizer=processor.tokenizer,\n",
")\n",
"\n",
"# TODO: 🦁 🐕 align the SFTTrainer params with your chosen dataset. For example, if you are using the `bigcode/the-stack-smol` dataset, you will need to choose the `content` column`"
"# TODO: 🦁 🐕 điều chỉnh các tham số SFTTrainer với tập dữ liệu bạn đã chọn. Ví dụ: nếu bạn đang sử dụng tập dữ liệu `bigcode/the-stack-smol`, bạn sẽ cần chọn cột `content`"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Training the Model\n",
"## Huấn luyện mô hình\n",
"\n",
"With the trainer configured, we can now proceed to train the model. The training process will involve iterating over the dataset, computing the loss, and updating the model's parameters to minimize this loss."
"Với trình huấn luyện được cấu hình, giờ đây chúng ta có thể tiến hành huấn luyện mô hình. Quá trình huấn luyện sẽ bao gồm việc lặp qua tập dữ liệu, tính toán hàm mất mát (loss) và cập nhật các tham số của mô hình để giảm thiểu hàm mất mát này."
]
},
{
Expand Down Expand Up @@ -427,13 +426,11 @@
"cell_type": "markdown",
"metadata": {},
"source": [
"## 💐 You're done!\n",
"\n",
"This notebook provided a step-by-step guide to fine-tuning the `HuggingFaceTB/SmolVLM` model using the `SFTTrainer`. By following these steps, you can adapt the model to perform specific tasks more effectively. If you want to carry on working on this course, here are steps you could try out:\n",
"## 💐 Chúc mừng bạn đã hoàn thành bài tập!\n",
"Notebook này đã cung cấp hướng dẫn từng bước để tinh chỉnh mô hình `HuggingFaceTB/SmolVLM` bằng cách sử dụng `SFTTrainer`. Bằng cách làm theo các bước này, bạn có thể điều chỉnh mô hình để thực hiện các tác vụ cụ thể hiệu quả hơn. Nếu bạn muốn tiếp tục làm việc với khóa học này, đây là các bước bạn có thể thử:\n",
"\n",
"- Try this notebook on a harder difficulty\n",
"- Review a colleagues PR\n",
"- Improve the course material via an Issue or PR."
"- Thử notebook này ở độ khó cao hơn\n",
"- Cải thiện tài liệu khóa học thông qua một Issue hoặc PR."
]
}
],
Expand Down

0 comments on commit e64d072

Please sign in to comment.