Этот репозиторий содержит сценарий для обучения Qwen2-VL только с использованием HuggingFace и Liger-Kernel.
[Точная настройка Phi3-Vision]
[Llama3.2-Точная настройка зрения]
[Молмо Точная настройка]
environment.yaml
vision_model
при использовании LoRA. Установите необходимые пакеты, используя environment.yaml
.
environment.yaml
conda env create -f environment.yaml
conda activate qwen2
pip install qwen-vl-utils
pip install flash-attn==2.5.8 --no-build-isolation
Примечание. Вам следует установить flash-attn после установки других пакетов.
Для сценария требуется набор данных, отформатированный в соответствии со спецификацией LLaVA. Набор данных должен представлять собой файл JSON, каждая запись которого содержит информацию о разговорах и изображениях. Убедитесь, что пути к изображениям в наборе данных соответствуют предоставленному --image_folder
.
При использовании набора данных из нескольких изображений все токены изображений должны быть
, а имена файлов изображений должны быть в списке. См. пример ниже и следуйте форматированию данных.
[
{
"id" : " 000000033471 " ,
"image" : " 000000033471.jpg " ,
"conversations" : [
{
"from" : " human " ,
"value" : " n What are the colors of the bus in the image? "
},
{
"from" : " gpt " ,
"value" : " The bus in the image is white and red. "
},
{
"from" : " human " ,
"value" : " What feature can be seen on the back of the bus? "
},
{
"from" : " gpt " ,
"value" : " The back of the bus features an advertisement. "
},
{
"from" : " human " ,
"value" : " Is the bus driving down the street or pulled off to the side? "
},
{
"from" : " gpt " ,
"value" : " The bus is driving down the street, which is crowded with people and other vehicles. "
}
]
}
...
]
[ { "id" : " 000000033471 " , "image" : [ " 000000033471.jpg " , " 000000033472.jpg " ], "conversations" : [ { "from" : " human " , "value" : "n }, { "from" : " gpt " , "value" : " Yes, It the perspective of the camera is different. " } ] } ... ]n Is the perspective of the camera differnt? "
[
{
"id" : " sample1 " ,
"video" : " sample1.mp4 " ,
"conversations" : [
{
"from" : " human " ,
"value" : "
},
{
"from" : " gpt " ,
"value" : " A man is walking down the road. "
}
]
}
...
]
Примечание. Qwen2-VL использует видео как последовательность изображений.
Примечание. При использовании смешанного набора данных (например, некоторые данные в пакете содержат изображения, а некоторые нет) поддерживается только с нулем2.
Чтобы запустить сценарий обучения, используйте следующую команду:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
Этот скрипт выполнит точную настройку модели с использованием dtype модели 8bit-adamw и fp8. Если у вас кончилась оперативная память, вы можете использовать это.
Если вы хотите обучить с помощью LoRA только языковую модель и выполнить полное обучение модели видения:
bash scripts/finetune_lora.sh
Если вы хотите обучить с помощью LoRA и языковую модель, и модель видения:
bash scripts/finetune_lora_vision.sh
ВАЖНО: Если вы хотите настроить embed_token
с помощью LoRA, вам необходимо настроить lm_head
вместе. Примечание. Заморозка LLM будет работать только без LoRA (включая Vision_model LoRA).
--deepspeed
(str): путь к файлу конфигурации DeepSpeed (по умолчанию: «scripts/zero2.json»).--data_path
(str): путь к обучающим данным в формате LLaVA (файл JSON). (Необходимый)--image_folder
(str): путь к папке изображений, указанной в обучающих данных в формате LLaVA. (Необходимый)--model_id
(str): путь к модели Qwen2-VL. (Необходимый)--output_dir
(str): Выходной каталог для контрольных точек модели.--num_train_epochs
(int): количество эпох обучения (по умолчанию: 1).--per_device_train_batch_size
(int): размер обучающего пакета на один графический процессор на шаг пересылки.--gradient_accumulation_steps
(int): шаги накопления градиента (по умолчанию: 4).--freeze_vision_tower
(bool): возможность заморозить Vision_model (по умолчанию: False).--freeze_llm
(bool): возможность заморозить LLM (по умолчанию: False).--tune_merger
(bool): возможность настройки проектора (по умолчанию: True).--num_lora_modules
(int): количество целевых модулей для добавления LoRA (-1 означает все слои).--vision_lr
(float): скорость обучения для Vision_model.--merger_lr
(float): скорость обучения слиянию (проектор).--learning_rate
(float): скорость обучения языкового модуля.--bf16
(bool): вариант использования bfloat16.--fp16
(bool): вариант использования fp16.--min_pixels
(int): опция для минимального количества входных токенов.--max_pixles
(int): опция для максимального количества токенов.--lora_namespan_exclude
(str): исключить модули с диапазонами имен для добавления LoRA.--max_seq_length
(int): максимальная длина последовательности (по умолчанию: 32 КБ).--bits
(int): биты квантования (по умолчанию: 16).--disable_flash_attn2
(bool): отключить Flash Attention 2.--report_to
(str): инструмент создания отчетов (варианты: «тензорная доска», «wandb», «нет») (по умолчанию: «тензорная доска»).--logging_dir
(str): каталог журналирования (по умолчанию: «./tf-logs»).--lora_rank
(int): ранг LoRA (по умолчанию: 128).--lora_alpha
(int): LoRA альфа (по умолчанию: 256).--lora_dropout
(float): исключение LoRA (по умолчанию: 0,05).--logging_steps
(int): шаги протоколирования (по умолчанию: 1).--dataloader_num_workers
(int): количество рабочих загрузчиков данных (по умолчанию: 4). Примечание. Скорость обучения vision_model
должна быть в 10–5 раз меньше, чем language_model
.
Вы можете обучить модель, используя набор видеоданных. Однако Qwen2-VL обрабатывает видео как последовательность изображений, поэтому для обучения вам придется выбирать определенные кадры и обрабатывать их как несколько изображений. Вы можете установить конфигурации LoRA и использовать их также для LoRA.
bash scripts/finetune_video.sh
Примечание. При обучении с использованием видео оно аналогично многоизображению, поэтому вам следует настроить max_pixels
для максимального разрешения и fps
в зависимости от доступной видеопамяти.
Если у вас закончилась виртуальная память, вы можете использовать ноль3_offload вместо нуля3. Однако использование нуля3 предпочтительнее.
bash scripts/merge_lora.sh
Примечание. Не забудьте заменить пути в finetune.sh
или finetune_lora.sh
на свои конкретные пути. (Также в merge_lora.sh
при использовании LoRA.)
Модель поддерживает широкий диапазон входных разрешений. По умолчанию для ввода используется собственное разрешение. Для повышения производительности рекомендуется использовать собственные или более высокие числа пикселей, однако для больших изображений требуется слишком много памяти и времени вычислений. Таким образом, вы можете настроить для него количество пикселей. Модель разбивает изображение на token * 28 * 28
поэтому вы можете просто изменить часть token_num в скрипте.
Например:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
Примечание. Для видео вам не обязательно устанавливать такое разрешение, вы можете просто установить для него максимальное разрешение.
Could not load library libcudnn_cnn_train.so.8. Error: /usr/local/cuda-12.1/lib/libcudnn_cnn_train.so.8: undefined symbol: _ZN5cudnn3cnn34layerNormFwd_execute_internal_implERKNS_7backend11VariantPackEP11CUstream_stRNS0_18LayerNormFwdParamsERKNS1_20NormForwardOperationEmb, version libcudnn_cnn_infer.so.8
Для этой ошибки вы можете запустить unset LD_LIBRARY_PATH
. Вы могли видеть эту проблему
Примечание. При тренировках с LoRA следует использовать объединенный вес.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
С помощью этой команды вы можете запустить демонстрацию на основе градиента. Это также может установить некоторые другие конфигурации генерации, такие как repetition_penalty
, temperature
и т. д.
Этот проект распространяется по лицензии Apache-2.0. Подробности смотрите в файле ЛИЦЕНЗИИ.
Если вы найдете этот репозиторий полезным для вашего проекта, рассмотрите возможность указать и процитировать:
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
Этот проект основан на