Phi-3.5-vision рецепт дообучения

February 1, 2026 · View on GitHub

Это официальная поддержка дообучения Phi-3.5-vision с использованием библиотек huggingface.
Перед выполнением следующих команд перейдите в каталог с кодом vision_finetuning.

Установка

# 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

Быстрый старт

Мы предоставляем два примера скриптов дообучения: один для DocVQA и один для классификации оскорбительных мемов.

Минимальное тестовое оборудование — 4x RTX8000 (48 ГБ ОЗУ на каждую GPU)

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

Phi-3.5-vision теперь официально поддерживает мульти-изображения на входе. Вот пример дообучения на NLVR2

torchrun --nproc_per_node=8 finetune_hf_trainer_nlvr2.py

Руководство по использованию

В зависимости от оборудования пользователи могут выбирать разные стратегии дообучения. Мы поддерживаем
полное дообучение (с Deepspeed Zero-2) с возможностью заморозки параметров визуальной части, а также LoRA (включая 4-битный QLoRA).
В целом, мы рекомендуем использовать полное дообучение с flash attention и bf16, когда это возможно.

Руководство по конвертации вашего кастомного датасета в требуемый формат

В качестве примера end-to-end мы используем минимальный датасет для классификации видео (подмножество UCF-101), чтобы показать, как преобразовать ваш датасет в нужный формат и дообучить на нем Phi-3.5-vision.

# 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

Преобразованные данные будут выглядеть так:

> 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

Для аннотации в формате jsonl каждая строка должна быть словарём следующего вида:

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

Обратите внимание, что conversations — это список, поэтому поддерживается мульти-туровое общение, если такие данные доступны.

Запрос квоты на Azure GPU

Требования

Аккаунт Azure с ролью Contributor (или другой ролью, включающей доступ Contributor).

Если у вас нет аккаунта Azure, создайте бесплатный аккаунт перед началом работы.

Запрос увеличения квоты

Вы можете подать запрос на увеличение квоты напрямую через My quotas. Следуйте инструкциям ниже, чтобы запросить увеличение квоты. Для примера можно выбрать любую регулируемую квоту в вашей подписке.

Войдите в Azure портал.

Введите "quotas" в строку поиска и выберите Quotas.
Quota

На странице Overview выберите провайдера, например Compute или AML.

Примечание Для всех провайдеров, кроме Compute, вы увидите колонку Request increase вместо Adjustable, как описано ниже. Там можно запросить увеличение конкретной квоты или создать запрос в поддержку.

На странице My quotas в столбце Quota name выберите квоту, которую хотите увеличить. Убедитесь, что в столбце Adjustable для этой квоты стоит Yes.

В верхней части страницы выберите New Quota Request, затем Enter a new limit.

Increase Quota

В панели New Quota Request введите числовое значение нового лимита и нажмите Submit.

Ваш запрос будет рассмотрен, и вы получите уведомление о возможности его выполнения. Обычно это занимает несколько минут.

Если запрос не будет выполнен, появится ссылка для создания запроса в поддержку. Используя её, вы получите помощь инженера поддержки по вашему запросу.

Рекомендации по SKU GPU машин Azure Compute

ND A100 v4-series

ND H100 v5-series

Standard_ND40rs_v2

Примеры:

Если у вас есть GPU A100 или H100

Полное дообучение обычно даёт наилучшие результаты. Для дообучения Phi-3-V на классификации оскорбительных мемов можно использовать следующую команду.

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

Если у вас есть Standard_ND40rs_v2 с 8x V100-32GB GPU

Полное дообучение Phi-3-V на классификации оскорбительных мемов также возможно. Однако ожидайте значительно меньшую пропускную способность по сравнению с A100 или H100 из-за отсутствия поддержки flash attention.
Точность также может пострадать из-за отсутствия поддержки bf16 (используется смешанная точность fp16).

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

Если у вас нет доступа к GPU дата-центра

LoRA может быть вашим единственным вариантом. Для дообучения Phi-3-V на классификации оскорбительных мемов используйте следующую команду.

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

Для GPU поколения Turing+ поддерживается QLoRA

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

Рекомендуемые гиперпараметры и ожидаемая точность

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>

Метод обученияЗамороженная визуальная модельтип данныхранг LoRALoRA alphaразмер батчаскорость обученияэпохиТочность
full-finetuningbf16--641e-5389.40
full-finetuningbf16--642e-5289.20
Результаты LoRA скоро будут

ВАЖНО

Ниже приведены результаты для DocVQA и Hateful memes на основе предыдущей версии (Phi-3-vision).
Новые результаты с Phi-3.5-vision будут опубликованы в ближайшее время.

DocVQA (ВАЖНО: 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>

Метод обучениятип данныхранг LoRALoRA alphaразмер батчаскорость обученияэпохиANLS
full-finetuningbf16--645e-6283.65
full-finetuningfp16--645e-6282.60
замороженная визуальная модельbf16--641e-4279.19
замороженная визуальная модельfp16--641e-4278.74
LoRAbf163216642e-4282.46
LoRAfp163216642e-4282.34
QLoRAbf163216642e-4281.85
QLoRAfp163216642e-4281.85

Hateful memes (ВАЖНО: 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>

Метод обучениятип данныхранг LoRALoRA alphaразмер батчаскорость обученияэпохиТочность
full-finetuningbf16--645e-5286.4
full-finetuningfp16--645e-5285.4
замороженная визуальная модельbf16--641e-4379.4
замороженная визуальная модельfp16--641e-4378.6
LoRAbf16128256642e-4286.6
LoRAfp16128256642e-4285.2
QLoRAbf16128256642e-4284.0
QLoRAfp16128256642e-4283.8

Тестирование скорости (ВАЖНО: Phi-3-vision)

Новые результаты тестирования с Phi-3.5-vision будут опубликованы в ближайшее время.

Тестирование скорости проводилось на датасете DocVQA. Средняя длина последовательности в этом датасете — 2443.23 токена (используется num_crops=16 для визуальной модели).

8x A100-80GB (Ampere)

Метод обучения# узловGPUflash attentionЭффективный размер батчаПропускная способность (изображений/с)УскорениеПиковое использование памяти GPU (ГБ)
full-finetuning18645.0411x~42
full-finetuning18648.6571.72x~36
full-finetuning2166416.9033.35x~29
full-finetuning4326433.4336.63x~26
замороженная визуальная модель186417.5783.49x~29
замороженная визуальная модель186431.7366.30x~27
LoRA18645.5911.11x~50
LoRA186412.1272.41x~16
QLoRA18644.8310.96x~32
QLoRA186410.5452.09x~10

8x V100-32GB (Volta)

Метод обучения# узловGPUflash attentionЭффективный размер батчаПропускная способность (изображений/с)УскорениеПиковое использование памяти GPU (ГБ)
full-finetuning18642.4621x~32
full-finetuning216644.1821.70x~32
full-finetuning432645.4652.22x~32
замороженная визуальная модель18648.9423.63x~27
LoRA18642.8071.14x~30

Известные проблемы

  • Невозможно использовать flash attention с fp16 (рекомендуется bf16, если доступно, и все GPU с поддержкой flash attention также поддерживают bf16).
  • Пока не поддерживается сохранение промежуточных чекпоинтов и возобновление обучения.

Отказ от ответственности:
Этот документ был переведен с помощью сервиса автоматического перевода Co-op Translator. Несмотря на наши усилия по обеспечению точности, просим учитывать, что автоматические переводы могут содержать ошибки или неточности. Оригинальный документ на его исходном языке следует считать авторитетным источником. Для получения критически важной информации рекомендуется обращаться к профессиональному человеческому переводу. Мы не несем ответственности за любые недоразумения или неправильные толкования, возникшие в результате использования данного перевода.