Це офіційна підтримка донавчання 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.pyPhi-3.5-vision тепер офіційно підтримує мультизображення на вході. Ось приклад донавчання для NLVR2
torchrun --nproc_per_node=8 finetune_hf_trainer_nlvr2.pyЗалежно від обладнання, користувачі можуть обирати різні стратегії донавчання. Ми підтримуємо
повне донавчання (з Deepspeed Zero-2) з опціонально замороженими параметрами візуальної частини, а також LoRA (включно з 4bit QLoRA).
Загалом, рекомендуємо використовувати повне донавчання з flash attention та bf16, коли це можливо.
Ми використовуємо мінімальний датасет для класифікації відео (підмножина UCF-101) як приклад end-to-end, щоб показати, як конвертувати ваш датасет у потрібний формат і донавчити на ньому 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 з роллю Contributor (або іншою роллю, що включає доступ Contributor).
Якщо у вас немає облікового запису Azure, створіть безкоштовний обліковий запис перед початком.
Ви можете подати запит на збільшення квоти безпосередньо через My quotas. Виконайте наведені нижче кроки, щоб запросити збільшення квоти. Для прикладу можна обрати будь-яку регульовану квоту у вашій підписці.
Увійдіть у Azure портал.
Введіть "quotas" у пошуковому полі, потім оберіть Quotas.
На сторінці Overview оберіть провайдера, наприклад Compute або AML.
Note Для всіх провайдерів, окрім Compute, ви побачите колонку Request increase замість Adjustable, як описано нижче. Там можна запросити збільшення конкретної квоти або створити запит у службу підтримки.
На сторінці My quotas, у колонці Quota name, оберіть квоту, яку хочете збільшити. Переконайтеся, що у колонці Adjustable для цієї квоти стоїть Yes.
Біля верху сторінки натисніть New Quota Request, потім оберіть Enter a new limit.
У панелі New Quota Request введіть числове значення нового ліміту квоти, потім натисніть Submit.
Ваш запит буде розглянутий, і ви отримаєте повідомлення, чи його можна виконати. Зазвичай це відбувається за кілька хвилин.
Якщо запит не буде виконано, ви побачите посилання для створення запиту у службу підтримки. Використовуючи це посилання, інженер підтримки допоможе вам із запитом на збільшення.
Ось кілька прикладів:
Повне донавчання зазвичай дає найкращу продуктивність. Ви можете використати наступну команду для донавчання 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Повне донавчання 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 64LoRA може бути вашим єдиним варіантом. Ви можете використати наступну команду для донавчання 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_qloratorchrun --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>
| Метод навчання | Заморожена візуальна модель | тип даних | ранг LoRA | альфа LoRA | розмір батчу | швидкість навчання | епохи | Точність |
|---|---|---|---|---|---|---|---|---|
| повне донавчання | bf16 | - | - | 64 | 1e-5 | 3 | 89.40 | |
| повне донавчання | ✔ | bf16 | - | - | 64 | 2e-5 | 2 | 89.20 |
| Результати LoRA скоро будуть |
Нижченаведені результати для DocVQA та образливих мемів базуються на попередній версії (Phi-3-vision).
Нові результати з Phi-3.5-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>
| Метод навчання | тип даних | ранг LoRA | альфа LoRA | розмір батчу | швидкість навчання | епохи | ANLS |
|---|---|---|---|---|---|---|---|
| повне донавчання | bf16 | - | - | 64 | 5e-6 | 2 | 83.65 |
| повне донавчання | fp16 | - | - | 64 | 5e-6 | 2 | 82.60 |
| заморожена візуальна модель | bf16 | - | - | 64 | 1e-4 | 2 | 79.19 |
| заморожена візуальна модель | fp16 | - | - | 64 | 1e-4 | 2 | 78.74 |
| LoRA | bf16 | 32 | 16 | 64 | 2e-4 | 2 | 82.46 |
| LoRA | fp16 | 32 | 16 | 64 | 2e-4 | 2 | 82.34 |
| QLoRA | bf16 | 32 | 16 | 64 | 2e-4 | 2 | 81.85 |
| QLoRA | fp16 | 32 | 16 | 64 | 2e-4 | 2 | 81.85 |
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>
| Метод навчання | тип даних | ранг LoRA | альфа LoRA | розмір батчу | швидкість навчання | епохи | Точність |
|---|---|---|---|---|---|---|---|
| повне донавчання | bf16 | - | - | 64 | 5e-5 | 2 | 86.4 |
| повне донавчання | fp16 | - | - | 64 | 5e-5 | 2 | 85.4 |
| заморожена візуальна модель | bf16 | - | - | 64 | 1e-4 | 3 | 79.4 |
| заморожена візуальна модель | fp16 | - | - | 64 | 1e-4 | 3 | 78.6 |
| LoRA | bf16 | 128 | 256 | 64 | 2e-4 | 2 | 86.6 |
| LoRA | fp16 | 128 | 256 | 64 | 2e-4 | 2 | 85.2 |
| QLoRA | bf16 | 128 | 256 | 64 | 2e-4 | 2 | 84.0 |
| QLoRA | fp16 | 128 | 256 | 64 | 2e-4 | 2 | 83.8 |
Нові результати тестування з Phi-3.5-vision будуть оновлені найближчим часом.
Тестування швидкості виконувалося на датасеті DocVQA. Середня довжина послідовності цього датасету — 2443.23 токенів (з використанням num_crops=16 для візуальної моделі).
| Метод навчання | # вузлів | GPU | flash attention | Ефективний розмір батчу | Пропускна здатність (зобр./с) | Прискорення | Пік пам’яті GPU (ГБ) |
|---|---|---|---|---|---|---|---|
| повне донавчання | 1 | 8 | 64 | 5.041 | 1x | ~42 | |
| повне донавчання | 1 | 8 | ✔ | 64 | 8.657 | 1.72x | ~36 |
| повне донавчання | 2 | 16 | ✔ | 64 | 16.903 | 3.35x | ~29 |
| повне донавчання | 4 | 32 | ✔ | 64 | 33.433 | 6.63x | ~26 |
| заморожена візуальна модель | 1 | 8 | 64 | 17.578 | 3.49x | ~29 | |
| заморожена візуальна модель | 1 | 8 | ✔ | 64 | 31.736 | 6.30x | ~27 |
| LoRA | 1 | 8 | 64 | 5.591 | 1.11x | ~50 | |
| LoRA | 1 | 8 | ✔ | 64 | 12.127 | 2.41x | ~16 |
| QLoRA | 1 | 8 | 64 | 4.831 | 0.96x | ~32 | |
| QLoRA | 1 | 8 | ✔ | 64 | 10.545 | 2.09x | ~10 |
| Метод навчання | # вузлів | GPU | flash attention | Ефективний розмір батчу | Пропускна здатність (зобр./с) | Прискорення | Пік пам’яті GPU (ГБ) |
|---|---|---|---|---|---|---|---|
| повне донавчання | 1 | 8 | 64 | 2.462 | 1x | ~32 | |
| повне донавчання | 2 | 16 | 64 | 4.182 | 1.70x | ~32 | |
| повне донавчання | 4 | 32 | 64 | 5.465 | 2.22x | ~32 | |
| заморожена візуальна модель | 1 | 8 | 64 | 8.942 | 3.63x | ~27 | |
| LoRA | 1 | 8 | 64 | 2.807 | 1.14x | ~30 |
- Неможливо запускати flash attention з fp16 (рекомендується bf16, якщо доступно, і всі GPU, що підтримують flash attention, також підтримують bf16).
- Поки що не підтримується збереження проміжних чекпойнтів і відновлення тренування.
Відмова від відповідальності:
Цей документ було перекладено за допомогою сервісу автоматичного перекладу Co-op Translator. Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ рідною мовою слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується звертатися до професійного людського перекладу. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникли внаслідок використання цього перекладу.

