Phi-3.5-vision finjusteringsopskrift

February 1, 2026 · View on GitHub

Dette er den officielle support til finjustering af Phi-3.5-vision ved brug af huggingface-biblioteker.
Skift venligst til kodebiblioteket vision_finetuning med cd, før du kører følgende kommandoer.

Installation

# 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

Hurtig start

Vi tilbyder to eksempler på finjusteringsscripts, et til DocVQA og et til klassificering af hatefulde memes.

Minimal hardware testet på 4x RTX8000 (48GB RAM pr. GPU)

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

Phi-3.5-vision understøtter nu officielt multi-billede input. Her er et eksempel på finjustering af NLVR2

torchrun --nproc_per_node=8 finetune_hf_trainer_nlvr2.py

Brugervejledning

Afhængigt af hardwaren kan brugere vælge forskellige finjusteringsstrategier. Vi understøtter
full-finetuning (med Deepspeed Zero-2) med valgfrit frosne vision-parametre, samt LoRA (inklusive 4bit QLoRA).
Generelt anbefaler vi at bruge fuld finjustering med flash attention og bf16, når det er muligt.

Vejledning til konvertering af dit eget datasæt til det krævede format

Vi bruger et minimalt videoklassifikationsdatasæt (et subset af UCF-101) som et end-to-end eksempel for at demonstrere, hvordan du konverterer dit eget datasæt til det krævede format og finjusterer Phi-3.5-vision på det.

# 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

De konverterede data vil se sådan ud:

> 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

For jsonl annotationen skal hver linje være et dictionary som:

{"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"}]}

Bemærk, at conversations er en liste, så multi-turn samtaler kan understøttes, hvis sådanne data er tilgængelige.

Anmodning om Azure GPU-kvote

Forudsætninger

En Azure-konto med Contributor-rollen (eller en anden rolle, der inkluderer Contributor-adgang).

Hvis du ikke har en Azure-konto, kan du oprette en gratis konto før du begynder.

Anmod om kvoteforhøjelse

Du kan indsende en anmodning om kvoteforhøjelse direkte fra My quotas. Følg nedenstående trin for at anmode om en forhøjelse af en kvote. I dette eksempel kan du vælge en hvilken som helst justerbar kvote i dit abonnement.

Log ind på Azure-portalen.

Indtast "quotas" i søgefeltet, og vælg derefter Quotas.
Quota

På oversigtssiden vælger du en udbyder, såsom Compute eller AML.

Note For alle udbydere undtagen Compute vil du se en kolonne med Request increase i stedet for Adjustable-kolonnen beskrevet nedenfor. Her kan du anmode om en forhøjelse for en specifik kvote eller oprette en supportsag for forhøjelsen.

På siden My quotas, under Quota name, vælg den kvote, du ønsker at forhøje. Sørg for, at kolonnen Adjustable viser Yes for denne kvote.

Næsten øverst på siden vælger du New Quota Request, og derefter Enter a new limit.

Increase Quota

I panelet New Quota Request indtaster du en numerisk værdi for din nye kvotegrænse og vælger derefter Submit.

Din anmodning vil blive gennemgået, og du vil blive underrettet, hvis anmodningen kan imødekommes. Dette sker normalt inden for få minutter.

Hvis din anmodning ikke imødekommes, vil du se et link til at oprette en supportsag. Når du bruger dette link, vil en supportingeniør hjælpe dig med din anmodning om forhøjelse.

Forslag til Azure Compute GPU-maskine SKU'er

ND A100 v4-series

ND H100 v5-series

Standard_ND40rs_v2

Her er nogle eksempler:

Hvis du har A100 eller H100 GPU'er

Fuld finjustering giver som regel den bedste ydeevne. Du kan bruge følgende kommando til at finjustere Phi-3-V på klassificering af hatefulde memes.

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

Hvis du har Standard_ND40rs_v2 8x V100-32GB GPU'er

Det er stadig muligt at fuld finjustere Phi-3-V på klassificering af hatefulde memes. Forvent dog
meget lavere gennemløb sammenlignet med A100 eller H100 GPU'er på grund af manglende support for flash attention.
Nøjagtigheden kan også blive påvirket på grund af manglende bf16-support (fp16 mixed-precision træning bruges i stedet).

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

Hvis du ikke har adgang til datacenter-GPU'er

LoRA kan være dit eneste valg. Du kan bruge følgende kommando til at finjustere Phi-3-V på klassificering af hatefulde memes.

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

For Turing+ GPU'er understøttes QLoRA

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

Foreslåede hyperparametre og forventet nøjagtighed

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>

TræningsmetodeFrosset visionmodeldatatypeLoRA-rangLoRA alphabatchstørrelselæringsrateepokerNøjagtighed
full-finetuningbf16--641e-5389.40
full-finetuningbf16--642e-5289.20
LoRA resultater kommer snart

NOTE

De nedenstående DocVQA og Hateful memes resultater er baseret på den tidligere version (Phi-3-vision).
De nye resultater med Phi-3.5-vision opdateres snart.

DocVQA (NOTE: 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>

TræningsmetodedatatypeLoRA-rangLoRA alphabatchstørrelselæringsrateepokerANLS
full-finetuningbf16--645e-6283.65
full-finetuningfp16--645e-6282.60
frosset billedmodelbf16--641e-4279.19
frosset billedmodelfp16--641e-4278.74
LoRAbf163216642e-4282.46
LoRAfp163216642e-4282.34
QLoRAbf163216642e-4281.85
QLoRAfp163216642e-4281.85

Hateful memes (NOTE: 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>

TræningsmetodedatatypeLoRA-rangLoRA alphabatchstørrelselæringsrateepokerNøjagtighed
full-finetuningbf16--645e-5286.4
full-finetuningfp16--645e-5285.4
frosset billedmodelbf16--641e-4379.4
frosset billedmodelfp16--641e-4378.6
LoRAbf16128256642e-4286.6
LoRAfp16128256642e-4285.2
QLoRAbf16128256642e-4284.0
QLoRAfp16128256642e-4283.8

Hastighedsbenchmarking (NOTE: Phi-3-vision)

Nye benchmarkresultater med Phi-3.5-vision opdateres snart.

Hastighedsbenchmarking er udført på DocVQA-datasættet. Den gennemsnitlige sekvenslængde i dette datasæt
er 2443.23 tokens (ved brug af num_crops=16 for billedmodellen).

8x A100-80GB (Ampere)

Træningsmetode# noderGPU'erflash attentionEffektiv batchstørrelseGennemløb (billeder/s)HastighedsforøgelseMaks GPU-mem (GB)
full-finetuning18645.0411x~42
full-finetuning18648.6571.72x~36
full-finetuning2166416.9033.35x~29
full-finetuning4326433.4336.63x~26
frosset billedmodel186417.5783.49x~29
frosset billedmodel186431.7366.30x~27
LoRA18645.5911.11x~50
LoRA186412.1272.41x~16
QLoRA18644.8310.96x~32
QLoRA186410.5452.09x~10

8x V100-32GB (Volta)

Træningsmetode# noderGPU'erflash attentionEffektiv batchstørrelseGennemløb (billeder/s)HastighedsforøgelseMaks GPU-mem (GB)
full-finetuning18642.4621x~32
full-finetuning216644.1821.70x~32
full-finetuning432645.4652.22x~32
frosset billedmodel18648.9423.63x~27
LoRA18642.8071.14x~30

Kendte problemer

  • Kan ikke køre flash attention med fp16 (bf16 anbefales altid, når det er tilgængeligt, og alle GPU'er, der understøtter flash attention, understøtter også bf16).
  • Understøtter endnu ikke at gemme mellemliggende checkpoints og genoptage træning.

Ansvarsfraskrivelse:
Dette dokument er blevet oversat ved hjælp af AI-oversættelsestjenesten Co-op Translator. Selvom vi bestræber os på nøjagtighed, bedes du være opmærksom på, at automatiserede oversættelser kan indeholde fejl eller unøjagtigheder. Det oprindelige dokument på dets oprindelige sprog bør betragtes som den autoritative kilde. For kritisk information anbefales professionel menneskelig oversættelse. Vi påtager os intet ansvar for misforståelser eller fejltolkninger, der opstår som følge af brugen af denne oversættelse.