Resep finetuning Phi-3.5-vision

February 1, 2026 · View on GitHub

Ini adalah dukungan resmi untuk finetuning Phi-3.5-vision menggunakan library huggingface.
Silakan cd ke direktori kode vision_finetuning sebelum menjalankan perintah berikut.

Instalasi

# create a new conda environment
conda create -n phi3v python=3.10
conda activate phi3v

# install pytorch
conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia

# other libraries needed to run the example code
pip install -r requirements.txt

# (optional) flash attention -- Ampere+ GPUs (e.g., A100, H100)
pip install ninja
MAX_JOBS=32 pip install flash-attn==2.4.2 --no-build-isolation

# (optional) QLoRA -- Turing+ GPUs (e.g., RTX 8000)
pip install bitsandbytes==0.43.1

Mulai cepat

Kami menyediakan dua contoh skrip finetuning, satu untuk DocVQA dan satu untuk klasifikasi meme kebencian.

Perangkat keras minimal yang diuji adalah 4x RTX8000 (48GB RAM per GPU)

# minimal script on a mini-train split of DocVQA
torchrun --nproc_per_node=4 finetune_hf_trainer_docvqa.py

Phi-3.5-vision kini secara resmi mendukung input multi-gambar. Berikut contoh finetuning untuk NLVR2

torchrun --nproc_per_node=8 finetune_hf_trainer_nlvr2.py

Panduan penggunaan

Tergantung pada perangkat keras, pengguna dapat memilih strategi finetuning yang berbeda. Kami mendukung
full-finetuning (dengan Deepspeed Zero-2) dengan opsi parameter vision yang dibekukan, dan LoRA (termasuk 4bit QLoRA).
Secara umum, kami menyarankan menggunakan full finetuning dengan flash attention dan bf16 kapan pun memungkinkan.

panduan untuk mengonversi dataset kustom Anda ke format yang dibutuhkan

Kami menggunakan dataset klasifikasi video minimal (subset dari UCF-101) sebagai contoh end-to-end untuk menunjukkan cara mengonversi dataset kustom Anda ke format yang dibutuhkan dan melakukan finetune Phi-3.5-vision di atasnya.

# convert data
python convert_ucf101.py --out_dir /path/to/converted_ucf101

# training
torchrun --nproc_per_node=4 finetune_hf_trainer_ucf101.py --data_dir /path/to/converted_ucf101

Data yang sudah dikonversi akan terlihat seperti ini:

> tree --filelimit=10 /path/to/converted_ucf101
/path/to/converted_ucf101
├── images
│   ├── test
│   │   ├── ApplyEyeMakeup [48 entries exceeds filelimit, not opening dir]
│   │   ├── ApplyLipstick [32 entries exceeds filelimit, not opening dir]
│   │   ├── Archery [56 entries exceeds filelimit, not opening dir]
│   │   ├── BabyCrawling [72 entries exceeds filelimit, not opening dir]
│   │   ├── BalanceBeam [32 entries exceeds filelimit, not opening dir]
│   │   ├── BandMarching [72 entries exceeds filelimit, not opening dir]
│   │   ├── BaseballPitch [80 entries exceeds filelimit, not opening dir]
│   │   ├── Basketball [88 entries exceeds filelimit, not opening dir]
│   │   ├── BasketballDunk [48 entries exceeds filelimit, not opening dir]
│   │   └── BenchPress [72 entries exceeds filelimit, not opening dir]
│   ├── train
│   │   ├── ApplyEyeMakeup [240 entries exceeds filelimit, not opening dir]
│   │   ├── ApplyLipstick [240 entries exceeds filelimit, not opening dir]
│   │   ├── Archery [240 entries exceeds filelimit, not opening dir]
│   │   ├── BabyCrawling [240 entries exceeds filelimit, not opening dir]
│   │   ├── BalanceBeam [240 entries exceeds filelimit, not opening dir]
│   │   ├── BandMarching [240 entries exceeds filelimit, not opening dir]
│   │   ├── BaseballPitch [240 entries exceeds filelimit, not opening dir]
│   │   ├── Basketball [240 entries exceeds filelimit, not opening dir]
│   │   ├── BasketballDunk [240 entries exceeds filelimit, not opening dir]
│   │   └── BenchPress [240 entries exceeds filelimit, not opening dir]
│   └── val
│       ├── ApplyEyeMakeup [24 entries exceeds filelimit, not opening dir]
│       ├── ApplyLipstick [24 entries exceeds filelimit, not opening dir]
│       ├── Archery [24 entries exceeds filelimit, not opening dir]
│       ├── BabyCrawling [24 entries exceeds filelimit, not opening dir]
│       ├── BalanceBeam [24 entries exceeds filelimit, not opening dir]
│       ├── BandMarching [24 entries exceeds filelimit, not opening dir]
│       ├── BaseballPitch [24 entries exceeds filelimit, not opening dir]
│       ├── Basketball [24 entries exceeds filelimit, not opening dir]
│       ├── BasketballDunk [24 entries exceeds filelimit, not opening dir]
│       └── BenchPress [24 entries exceeds filelimit, not opening dir]
├── ucf101_test.jsonl
├── ucf101_train.jsonl
└── ucf101_val.jsonl

34 directories, 3 files

Untuk anotasi jsonl, setiap baris harus berupa dictionary seperti:

{"id": "val-0000000300", "source": "ucf101", "conversations": [{"images": ["val/BabyCrawling/v_BabyCrawling_g21_c04.0.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.1.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.2.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.3.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.4.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.5.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.6.jpg", "val/BabyCrawling/v_BabyCrawling_g21_c04.7.jpg"], "user": "Classify the video into one of the following classes: ApplyEyeMakeup, ApplyLipstick, Archery, BabyCrawling, BalanceBeam, BandMarching, BaseballPitch, Basketball, BasketballDunk, BenchPress.", "assistant": "BabyCrawling"}]}
{"id": "val-0000000301", "source": "ucf101", "conversations": [{"images": ["val/BabyCrawling/v_BabyCrawling_g09_c06.0.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.1.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.2.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.3.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.4.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.5.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.6.jpg", "val/BabyCrawling/v_BabyCrawling_g09_c06.7.jpg"], "user": "Classify the video into one of the following classes: ApplyEyeMakeup, ApplyLipstick, Archery, BabyCrawling, BalanceBeam, BandMarching, BaseballPitch, Basketball, BasketballDunk, BenchPress.", "assistant": "BabyCrawling"}]}

Perlu dicatat bahwa conversations adalah sebuah list, sehingga percakapan multi-giliran dapat didukung jika data tersebut tersedia.

Meminta Kuota GPU Azure

Prasyarat

Akun Azure dengan peran Contributor (atau peran lain yang mencakup akses Contributor).

Jika Anda belum memiliki akun Azure, buat akun gratis sebelum memulai.

Meminta peningkatan kuota

Anda dapat mengajukan permintaan peningkatan kuota langsung dari My quotas. Ikuti langkah-langkah di bawah ini untuk meminta peningkatan kuota. Untuk contoh ini, Anda dapat memilih kuota yang dapat disesuaikan di langganan Anda.

Masuk ke portal Azure.

Ketik "quotas" di kotak pencarian, lalu pilih Quotas.
Quota

Di halaman Overview, pilih penyedia, seperti Compute atau AML.

Catatan Untuk semua penyedia selain Compute, Anda akan melihat kolom Request increase, bukan kolom Adjustable seperti yang dijelaskan di bawah. Di sana, Anda dapat meminta peningkatan untuk kuota tertentu, atau membuat permintaan dukungan untuk peningkatan tersebut.

Di halaman My quotas, di bawah Quota name, pilih kuota yang ingin Anda tingkatkan. Pastikan kolom Adjustable menunjukkan Yes untuk kuota tersebut.

Di bagian atas halaman, pilih New Quota Request, lalu pilih Enter a new limit.

Increase Quota

Di panel New Quota Request, masukkan nilai numerik untuk batas kuota baru Anda, lalu pilih Submit.

Permintaan Anda akan ditinjau, dan Anda akan diberi tahu jika permintaan dapat dipenuhi. Biasanya ini terjadi dalam beberapa menit.

Jika permintaan Anda tidak dipenuhi, Anda akan melihat tautan untuk membuat permintaan dukungan. Saat menggunakan tautan ini, seorang engineer dukungan akan membantu Anda dengan permintaan peningkatan tersebut.

Saran SKU mesin GPU Azure Compute

ND A100 v4-series

ND H100 v5-series

Standard_ND40rs_v2

Berikut beberapa contoh:

Jika Anda memiliki GPU A100 atau H100

Full finetuning biasanya memberikan performa terbaik. Anda dapat menggunakan perintah berikut untuk finetune Phi-3-V pada klasifikasi meme kebencian.

torchrun --nproc_per_node=8 --nnodes=<num_nodes> \
  --master_addr=$MASTER_ADDR --master_port=$MASTER_PORT --node_rank=$NODE_RANK \
  finetune_hf_trainer_hateful_memes.py \
  --output_dir <output_dir> \
  --batch_size 64 \
  --use_flash_attention \
  --bf16

Jika Anda memiliki Standard_ND40rs_v2 8x V100-32GB GPUs

Masih memungkinkan untuk melakukan full finetuning Phi-3-V pada klasifikasi meme kebencian. Namun, harapkan
throughput jauh lebih rendah dibandingkan GPU A100 atau H100 karena tidak adanya dukungan flash attention.
Akurasi juga bisa terpengaruh karena tidak adanya dukungan bf16 (pelatihan presisi campuran fp16 digunakan sebagai gantinya).

torchrun --nproc_per_node=8 --nnodes=<num_nodes> \
  --master_addr=$MASTER_ADDR --master_port=$MASTER_PORT --node_rank=$NODE_RANK \
  finetune_hf_trainer_hateful_memes.py \
  --output_dir <output_dir> \
  --batch_size 64

Jika Anda tidak memiliki akses ke GPU pusat data

Lora mungkin menjadi satu-satunya pilihan Anda. Anda dapat menggunakan perintah berikut untuk finetune Phi-3-V pada klasifikasi meme kebencian.

torchrun --nproc_per_node=2 \
  finetune_hf_trainer_hateful_memes.py \
  --output_dir <output_dir> \
  --batch_size 64 \
  --use_lora

Untuk GPU Turing+ , QLoRA didukung

torchrun --nproc_per_node=2 \
  finetune_hf_trainer_hateful_memes.py \
  --output_dir <output_dir> \
  --batch_size 64 \
  --use_lora \
  --use_qlora

Hyperparameter yang disarankan dan akurasi yang diharapkan

NLVR2

torchrun --nproc_per_node=4 \
  finetune_hf_trainer_nlvr2.py \
  --bf16 --use_flash_attention \
  --batch_size 64 \
  --output_dir <output_dir> \
  --learning_rate <lr> \
  --num_train_epochs <epochs>

Metode pelatihanModel vision dibekukantipe dataLoRA rankLoRA alphaukuran batchlearning rateepochAkurasi
full-finetuningbf16--641e-5389.40
full-finetuningbf16--642e-5289.20
Hasil LoRA segera hadir

CATATAN

Hasil DocVQA dan Hateful memes di bawah ini berdasarkan versi sebelumnya (Phi-3-vision).
Hasil baru dengan Phi-3.5-vision akan segera diperbarui.

DocVQA (CATATAN: Phi-3-vision)

torchrun --nproc_per_node=4 \
  finetune_hf_trainer_docvqa.py \
  --full_train \
  --bf16 --use_flash_attention \
  --batch_size 64 \
  --output_dir <output_dir> \
  --learning_rate <lr> \
  --num_train_epochs <epochs>

Metode pelatihantipe dataLoRA rankLoRA alphaukuran batchlearning rateepochANLS
full-finetuningbf16--645e-6283.65
full-finetuningfp16--645e-6282.60
model gambar dibekukanbf16--641e-4279.19
model gambar dibekukanfp16--641e-4278.74
LoRAbf163216642e-4282.46
LoRAfp163216642e-4282.34
QLoRAbf163216642e-4281.85
QLoRAfp163216642e-4281.85

Hateful memes (CATATAN: Phi-3-vision)

torchrun --nproc_per_node=4 \
  finetune_hf_trainer_hateful_memes.py \
  --bf16 --use_flash_attention \
  --batch_size 64 \
  --output_dir <output_dir> \
  --learning_rate <lr> \
  --num_train_epochs <epochs>

Metode pelatihantipe dataLoRA rankLoRA alphaukuran batchlearning rateepochAkurasi
full-finetuningbf16--645e-5286.4
full-finetuningfp16--645e-5285.4
model gambar dibekukanbf16--641e-4379.4
model gambar dibekukanfp16--641e-4378.6
LoRAbf16128256642e-4286.6
LoRAfp16128256642e-4285.2
QLoRAbf16128256642e-4284.0
QLoRAfp16128256642e-4283.8

Benchmark kecepatan (CATATAN: Phi-3-vision)

Hasil benchmark baru dengan Phi-3.5-vision akan segera diperbarui.

Benchmark kecepatan dilakukan pada dataset DocVQA. Rata-rata panjang urutan dataset ini
adalah 2443.23 token (menggunakan num_crops=16 untuk model gambar).

8x A100-80GB (Ampere)

Metode pelatihan# nodeGPUflash attentionUkuran batch efektifThroughput (img/s)PercepatanMemori GPU puncak (GB)
full-finetuning18645.0411x~42
full-finetuning18648.6571.72x~36
full-finetuning2166416.9033.35x~29
full-finetuning4326433.4336.63x~26
model gambar dibekukan186417.5783.49x~29
model gambar dibekukan186431.7366.30x~27
LoRA18645.5911.11x~50
LoRA186412.1272.41x~16
QLoRA18644.8310.96x~32
QLoRA186410.5452.09x~10

8x V100-32GB (Volta)

Metode pelatihan# nodeGPUflash attentionUkuran batch efektifThroughput (img/s)PercepatanMemori GPU puncak (GB)
full-finetuning18642.4621x~32
full-finetuning216644.1821.70x~32
full-finetuning432645.4652.22x~32
model gambar dibekukan18648.9423.63x~27
LoRA18642.8071.14x~30

Masalah yang diketahui

  • Tidak dapat menjalankan flash attention dengan fp16 (bf16 selalu disarankan jika tersedia, dan semua GPU yang mendukung flash attention juga mendukung bf16).
  • Belum mendukung penyimpanan checkpoint sementara dan melanjutkan pelatihan.

Penafian:
Dokumen ini telah diterjemahkan menggunakan layanan terjemahan AI Co-op Translator. Meskipun kami berupaya untuk mencapai akurasi, harap diketahui bahwa terjemahan otomatis mungkin mengandung kesalahan atau ketidakakuratan. Dokumen asli dalam bahasa aslinya harus dianggap sebagai sumber yang sahih. Untuk informasi penting, disarankan menggunakan terjemahan profesional oleh manusia. Kami tidak bertanggung jawab atas kesalahpahaman atau penafsiran yang keliru yang timbul dari penggunaan terjemahan ini.