Lewati ke konten utama

Fine-Tuning Llama 3.2 Vision

Pelajari cara fine-tuning model multimodal oleh Meta AI pada dataset produk Amazon menggunakan kerangka kerja Unsloth.
· 10 mnt Baca

Jelajahi bersama AI

Kami telah membahas banyak panduan tentang fine-tuning large language models (LLM), tetapi sangat sedikit sumber yang membahas proses fine-tuning model multimodal. Dalam tutorial ini, kita akan mengeksplorasi model multimodal mutakhir bernama Llama 3.2 Vision Model dan menunjukkan cara melakukan fine-tuning menggunakan dataset produk Amazon. Tujuan kita adalah membangun penghasil deskripsi produk yang menyediakan caption gambar yang akurat dan disederhanakan untuk produk yang terdaftar di Amazon.

Jika Anda baru dalam fine-tuning LLM, silakan ikuti kursus Fine-tuning with Llama 3 untuk memahami metodologi dan terminologi umum. Anda juga dapat melihat tutorial Llama 3.2 90B kami, yang membahas cara membangun aplikasi image captioning menggunakan Streamlit untuk front end, Llama 3.2 90B untuk menghasilkan caption, dan Groq sebagai API.

Gambar fitur Fine-tuning Llama 3.2 Vision

Gambar oleh Penulis

Memahami Llama 3.2 Vision Models

Llama 3.2 memperkenalkan model multimodal yang dapat memproses data gambar dan teks untuk menghasilkan respons yang natural dan akurat. Model visi Llama 3.2 tersedia dalam variasi parameter 11B dan 90B dan secara khusus dirancang untuk menangani use case penalaran berbasis gambar dengan presisi yang luar biasa. Model ini melampaui banyak model multimodal open-source dan tertutup yang ada pada tolok ukur industri umum.

Baca Panduan Llama 3.2: Cara Kerja, Use Case, dan Lainnya untuk mempelajari semua variabel model secara mendalam.

Model visi Llama 3.2 unggul dalam tugas seperti pemahaman tingkat dokumen, analisis bagan dan grafik, image captioning, dan visual grounding, di mana deskripsi bahasa natural digunakan untuk mengidentifikasi objek dalam gambar.

Arsitektur model Llama 3.2 Vision

Model Llama 3.2 Vision dibangun di atas model Llama 3.1 yang hanya teks, yaitu model bahasa canggih yang menggunakan arsitektur transformer. Model ini di-fine-tune dengan supervised learning (SFT) dan reinforcement learning with human feedback (RLHF) agar selaras dengan preferensi manusia terkait kebermanfaatan dan keamanan. 

Untuk memfasilitasi pengenalan gambar, Llama 3.2 Vision menggabungkan vision adapter yang dilatih secara terpisah. Adapter ini menggunakan lapisan cross-attention untuk mengintegrasikan keluaran image encoder ke dalam model bahasa Llama 3.1 yang telah dipra-latih, sehingga mampu menangani tugas berbasis teks dan gambar secara efektif.

Fitur utama Llama 3.2 Vision

  • Pemahaman gambar: Dapat dengan mudah mengenali dan mengklasifikasikan objek dalam gambar, memungkinkan tugas seperti image captioning dan interpretasi adegan.
  • OCR kompleks dan pemahaman bagan: Versi 90B dari model Llama 3.2 unggul dalam mengekstrak wawasan dari visualisasi kompleks, seperti bagan dan grafik.
  • Pemahaman dokumen: Mendukung OCR (Optical Character Recognition) end-to-end, memungkinkan pengguna mengekstrak teks dan data langsung dari dokumen.
  • Visual grounding: Model baru ini memungkinkan pengguna menandai objek atau menjawab pertanyaan tentang data visual.

Use case model Llama 3.2 Vision

Llama 3.2 Vision unggul dalam use case seperti visual question answering, analisis dokumen, image captioning, image-text retrieval, dan visual grounding.

  1. Visual Question Answering (VQA): Menjawab pertanyaan berdasarkan gambar dengan memahami isinya.
  2. Document VQA (DocVQA): Menganalisis dokumen seperti peta atau kontrak, menafsirkan teks dan tata letak untuk menjawab pertanyaan.
  3. Image Captioning: Menghasilkan caption bahasa natural dengan mengekstrak detail dan memahami adegan dalam gambar.
  4. Image-Text Retrieval: Mencocokkan gambar dengan deskripsi teks, memungkinkan pencarian dan pengorganisasian yang lebih canggih.
  5. Visual Grounding: Menandai objek atau area dalam gambar berdasarkan deskripsi bahasa natural.

Fine-Tuning Llama 3.2 Vision pada Dataset Produk Amazon

Untuk proyek ini, kita akan menggunakan Kaggle sebagai lingkungan pengkodean dan komputasi, Unsloth sebagai kerangka kerja fine-tuning, dan dataset deskripsi produk Amazon. Unsloth cepat, mengonsumsi lebih sedikit memori GPU, dan membutuhkan lebih sedikit baris kode dibandingkan metode tradisional. 

Jika Anda ingin melakukan fine-tuning LLM untuk solusi generasi teks, kami memiliki tutorial yang tepat untuk Anda: Fine-tuning Llama 3.2 dan Menggunakannya Secara Lokal: Panduan Langkah demi Langkah.

1. Penyiapan

Buat notebook Kaggle baru dan atur akselerator untuk menggunakan dua GPU T4. Tambahkan token Hugging Face Anda sebagai rahasia Kaggle agar Anda dapat mendorong model ke repositori Hugging Face Anda dengan aman nanti. Lalu, instal paket Python unsloth menggunakan perintah pip.

%%capture
!pip install unsloth

Pelajari lebih lanjut tentang Unsloth dengan membaca Panduan Unsloth: Optimalkan dan Percepat Fine-Tuning LLM.

2. Memuat model

Dalam penyiapan ini, kita memuat model Llama-3.2-11B-Vision-Instruct, khususnya versi yang disediakan oleh Unsloth, yang dioptimalkan untuk fine-tuning dan inferensi yang efisien. Model dimuat dalam kuantisasi 4-bit untuk secara signifikan mengurangi penggunaan memori dan kebutuhan komputasi, sehingga memungkinkan menjalankan model visi besar pada GPU T4.

from unsloth import FastVisionModel
import torch

model, tokenizer = FastVisionModel.from_pretrained(
    "unsloth/Llama-3.2-11B-Vision-Instruct",
    load_in_4bit = True,
    use_gradient_checkpointing = "unsloth",
)

3. Menyiapkan LoRA

LoRA (Low-Rank Adaptation) adalah teknik untuk melakukan fine-tuning model pra-latih berukuran besar secara efisien dengan menambahkan matriks low-rank yang dapat dipelajari ke bagian tertentu dari model. Pendekatan ini ringan dan efisien secara komputasi serta memungkinkan fine-tuning khusus tugas tanpa memodifikasi struktur inti model pra-latih.

Untuk melatih model menggunakan LoRA, kita fokus pada pemilihan dan fine-tuning komponen tertentu, seperti vision layer, language layer, modul attention, dan modul MLP. Ini memungkinkan kita menyesuaikan model untuk tugas spesifik dengan perubahan minimal pada arsitektur asli.

model = FastVisionModel.get_peft_model(
    model,
    finetune_vision_layers     = True, 
    finetune_language_layers   = True, 
    finetune_attention_modules = True,
    finetune_mlp_modules       = True,
    r = 16,           
    lora_alpha = 16,
    lora_dropout = 0,
    bias = "none",
    random_state = 3443,
    use_rslora = False,
    loftq_config = None,
)

4. Memuat dataset

Muat dataset philschmid/amazon-product-descriptions-vlm dari Hugging Face Hub dan pilih hanya 500 sampel pertama. Dataset berisi gambar produk dan deskripsi produk beserta informasi lain yang diperlukan.

from datasets import load_dataset
dataset = load_dataset("philschmid/amazon-product-descriptions-vlm", 
                       split = "train[0:500]")


dataset
Dataset({
    features: ['image', 'Uniq Id', 'Product Name', 'Category', 'Selling Price', 'Model Number', 'About Product', 'Product Specification', 'Technical Details', 'Shipping Weight', 'Variants', 'Product Url', 'Is Amazon Seller', 'description'],
    num_rows: 500
})

Ini adalah salah satu gambar produk. 

dataset[45]["image"]

Gambar mobil mainan

Berikut deskripsinya. 

dataset[45]["description"]
'Authentic Dale Earnhardt Jr. 1:24 scale diecast car. Nationwide Raw Finish.  Collectible model car for racing fans.  Perfect gift for NASCAR enthusiasts.'

5. Memproses dataset

Sekarang, kita akan memproses dataset yang hanya berisi teks dan gambar. Template prompt berisi pertanyaan pengguna, gambar, dan deskripsi produk. 

instruction = """
You are an expert Amazon worker who is good at writing product descriptions. 
Write the product description accurately by looking at the image.
"""


def convert_to_conversation(sample):
    conversation = [
        {
            "role": "user",
            "content": [
                {"type": "text", "text": instruction},
                {"type": "image", "image": sample["image"]},
            ],
        },
        {
            "role": "assistant",
            "content": [{"type": "text", "text": sample["description"]}],
        },
    ]
    return {"messages": conversation}


pass


converted_dataset = [convert_to_conversation(sample) for sample in dataset]

Dataset baru ini bukan tabular; alih-alih, mengikuti gaya prompt yang mirip dengan format OpenAI.

converted_dataset[45]
{'messages': [{'role': 'user',
   'content': [{'type': 'text',
     'text': '\nYou are an expert Amazon worker who is good at writing product descriptions. \nWrite the product description accurately by looking at the image.\n'},
    {'type': 'image',
     'image': <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x302>}]},
  {'role': 'assistant',
   'content': [{'type': 'text',
     'text': 'Authentic Dale Earnhardt Jr. 1:24 scale diecast car. Nationwide Raw Finish.  Collectible model car for racing fans.  Perfect gift for NASCAR enthusiasts.'}]}]}

6. Inferensi model sebelum fine-tuning

Kita akan memilih sampel ke-46 dari dataset dan menjalankan inferensi pada sampel tersebut untuk menilai seberapa baik ia menulis deskripsi produk secara langsung tanpa fine-tuning.

FastVisionModel.for_inference(model)  # Enable for inference!

image = dataset[45]["image"]

messages = [
    {
        "role": "user",
        "content": [
            {"type": "image"},
            {"type": "text", "text": instruction},
        ],
    }
]
input_text = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True
)
inputs = tokenizer(
    image,
    input_text,
    add_special_tokens=False,
    return_tensors="pt",
).to("cuda")

from transformers import TextStreamer

text_streamer = TextStreamer(tokenizer, skip_prompt=True)
_ = model.generate(
    **inputs,
    streamer=text_streamer,
    max_new_tokens=128,
    use_cache=True,
    temperature=1.5,
    min_p=0.1
)

Deskripsi yang dihasilkan panjang dan tidak akurat. Bahkan gaya penulisannya berbeda. 

The image showcases a race car featuring the well-known sponsorship branding "Nationwide," likely the primary vehicle in the Nationwide Series. The vehicle has a blue hood with the "Nationwide" logo prominently displayed and white text that reads, "on your side," on the windscreen. The car is predominantly white and grey, adorned with sponsor decals on various parts of the vehicle.

The front grille showcases the Chevrolet "Bowtie" logo, and the car is equipped with Chevrolet emblems and other sponsor decals, including:

• A white 88 logo on the front windscreen

Notably, the vehicle's wheels are equipped with "GoodYear

7. Menyiapkan model untuk fine-tuning

Sekarang kita akan menyiapkan model untuk pelatihan dan menginisialisasi pelatih supervised fine-tuning (SFT) untuk mempersiapkan model visi berlatih pada data collator kustom, dataset, dan konfigurasi pelatihan yang dioptimalkan untuk fine-tuning yang efisien.

from unsloth import is_bf16_supported
from unsloth.trainer import UnslothVisionDataCollator
from trl import SFTTrainer, SFTConfig

FastVisionModel.for_training(model)  # Enable for training!

trainer = SFTTrainer(
    model=model,
    tokenizer=tokenizer,
    data_collator=UnslothVisionDataCollator(model, tokenizer),  # Must use!
    train_dataset=converted_dataset,
    args=SFTConfig(
        per_device_train_batch_size=2,
        gradient_accumulation_steps=4,
        warmup_steps=5,
        max_steps=30,
        learning_rate=2e-4,
        fp16=not is_bf16_supported(),
        bf16=is_bf16_supported(),
        logging_steps=5,
        optim="adamw_8bit",
        weight_decay=0.01,
        lr_scheduler_type="linear",
        seed=3407,
        output_dir="outputs",
        report_to="none",  # For Weights and Biases
        remove_unused_columns=False,
        dataset_text_field="",
        dataset_kwargs={"skip_prepare_dataset": True},
        dataset_num_proc=4,
        max_seq_length=2048,
    ),
)

8. Melatih model

Mulai proses pelatihan dengan menjalankan kode trainer.train(). 

trainer_stats = trainer.train()

Model telah menyelesaikan satu epoch dalam 16 menit, dan training loss berkurang secara bertahap. Ini hasil yang baik.

Training loss fine-tuning model.

9. Inferensi model setelah fine-tuning

Sekarang kita akan menguji model untuk memeriksa apakah fine-tuning berhasil. Kita akan memilih gambar sampel yang sama dari dataset dan menjalankan inferensi padanya.

FastVisionModel.for_inference(model)  # Enable for inference!

image = dataset[45]["image"]

messages = [
    {
        "role": "user",
        "content": [
            {"type": "image"},
            {"type": "text", "text": instruction},
        ],
    }
]
input_text = tokenizer.apply_chat_template(
    messages, add_generation_prompt=True
)
inputs = tokenizer(
    image,
    input_text,
    add_special_tokens=False,
    return_tensors="pt",
).to("cuda")

from transformers import TextStreamer

text_streamer = TextStreamer(tokenizer, skip_prompt=True)
_ = model.generate(
    **inputs,
    streamer=text_streamer,
    max_new_tokens=128,
    use_cache=True,
    temperature=1.5,
    min_p=0.1
)

Hasilnya bagus tetapi tidak sepenuhnya akurat. Tanda pagar tidak diperlukan. Untuk hasil optimal, kita perlu melatih model pada dataset lengkap dengan setidaknya 3 epoch. 

Bring the thrill of NASCAR racing to your desk or shelf with the 1/64 Die-Cast 2016 NASCAR 88 Dale Earnhardt Jr. Nationwide Chevrolet SS!  Highly detailed and precision engineered, this collectible die-cast car captures the iconic look of Earnhardt's famous No. 88 ride. Perfect for kids and adults alike, this miniature masterpiece makes a great gift. #NASCAR #DieCast #CollectibleCars #DaleEarnhardtJr #Nationwide<|eot_id|>

10. Menyimpan model dan tokenizer

Mari simpan model secara lokal lalu dorong ke Hugging Face Hub. Untuk mengunggah model ke server Hugging Face, kita perlu masuk menggunakan token Hugging Face kita. 

Jelajahi dunia transformasional Hugging Face, oasis open-source komunitas AI untuk machine learning dan large language model (LLM), dengan membaca blog Apa itu Hugging Face? Oasis Open-Source Komunitas AI.

from huggingface_hub import login
from kaggle_secrets import UserSecretsClient
user_secrets = UserSecretsClient()

hf_token = user_secrets.get_secret("HUGGINGFACE_TOKEN")
login(hf_token)

Setelah itu, simpan model dan tokenizer secara lokal.

model.save_pretrained("llama_3.2_vision_amazon_product") # Local saving
tokenizer.save_pretrained("llama_3.2_vision_amazon_product")

Lalu gunakan push_to_hub untuk menyimpan model di Hugging Face hub.

model.push_to_hub(
    "kingabzpro/llama_3.2_vision_amazon_product"
)  # Online saving
tokenizer.push_to_hub(
    "kingabzpro/llama_3.2_vision_amazon_product"
)  # Online saving
Saved model to https://huggingface.co/kingabzpro/llama_3.2_vision_amazon_product

Perintah di atas akan membuat repositori model baru dan mendorong semua file ke Hugging Face. 

Model visi yang di-fine-tune di Hugging Face hub.

Sumber: kingabzpro/llama_3.2_vision_amazon_product

Jika Anda mengalami masalah saat menjalankan kode di atas, silakan merujuk ke notebook Kaggle: Fine-tuning Llama 3.2 Vision on Amazon Dataset

Kesimpulan

Fine-tuning model Llama 3.2 Vision membuka dunia kemungkinan baru, khususnya pada skenario di mana gambar dan teks dibutuhkan untuk memberikan hasil yang relevan dan akurat. Dengan melakukan fine-tuning pada dataset kustom, kita dapat meningkatkan kinerja dan menyesuaikan gaya untuk aplikasi seperti Visual Question Answering (VQA), Document VQA (DocVQA), Image Captioning, dan Image-Text Retrieval.

Dalam tutorial ini, kita mempelajari secara mendalam model Llama 3.2 Vision. Kita juga melakukan fine-tuning varian 11B dari model tersebut pada dataset deskripsi produk Amazon untuk membangun penghasil deskripsi produk yang sangat terpersonalisasi yang mengadopsi gaya yang diinginkan dan memberikan deskripsi produk yang akurat.

Langkah berikutnya dalam perjalanan Anda adalah mempelajari cara membangun aplikasi AI dan menerapkannya ke cloud menggunakan image Docker dengan mengikuti panduan: Cara Menerapkan Aplikasi LLM Menggunakan Docker: Panduan Langkah demi Langkah.

Abid Ali Awan

Penulis

Abid Ali Awan

Sebagai data scientist tersertifikasi, saya bersemangat memanfaatkan teknologi mutakhir untuk menciptakan aplikasi machine learning yang inovatif. Dengan latar belakang kuat di pengenalan ucapan, analisis dan pelaporan data, MLOps, conversational AI, dan NLP, saya mengasah keterampilan dalam mengembangkan sistem cerdas yang berdampak nyata. Selain keahlian teknis, saya juga komunikator andal yang mampu menyederhanakan konsep kompleks menjadi bahasa yang jelas dan ringkas. Karena itu, saya menjadi blogger yang dicari di bidang data science, membagikan wawasan dan pengalaman kepada komunitas profesional data yang terus berkembang. Saat ini, saya berfokus pada pembuatan dan penyuntingan konten, bekerja dengan large language model untuk mengembangkan konten yang kuat dan menarik agar membantu bisnis dan individu memaksimalkan data mereka.

Topik

Terkait

blogs

40 Pertanyaan Wawancara DBMS Teratas di 2026

blogs

Spaghetti Plot dan Jalur Badai