Repositori ini berisi skrip untuk melatih Qwen2-VL dengan hanya menggunakan HuggingFace dan Liger-Kernel.
[Penyempurnaan Visi Phi3]
[Penyempurnaan Visi Llama3.2]
[Penyempurnaan Molmo]
environment.yaml
vision_model
saat menggunakan LoRA. Instal paket yang diperlukan menggunakan 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
Catatan: Anda harus menginstal flash-attn setelah menginstal paket lainnya.
Skrip memerlukan himpunan data yang diformat sesuai dengan spesifikasi LLaVA. Kumpulan data harus berupa file JSON yang setiap entrinya berisi informasi tentang percakapan dan gambar. Pastikan jalur gambar dalam kumpulan data cocok dengan --image_folder
yang disediakan.
Saat menggunakan kumpulan data multi-gambar, semua token gambar harus
, dan nama file gambar harus ada dalam daftar. Silakan lihat contoh di bawah ini dan ikuti format data Anda.
[
{
"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. "
}
]
}
...
]
Catatan: Qwen2-VL menggunakan video sebagai rangkaian gambar.
Catatan: Dengan kumpulan data campuran (misalnya beberapa data dalam kumpulan memiliki gambar sementara beberapa tidak) Ini hanya mendukung zero2.
Untuk menjalankan skrip pelatihan, gunakan perintah berikut:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
Skrip ini akan menyempurnakan model dengan dtype model 8bit-adamw dan fp8. Jika Anda kehabisan vram, Anda bisa menggunakan ini.
Jika Anda hanya ingin melatih model bahasa dengan LoRA dan melakukan pelatihan penuh untuk model visi:
bash scripts/finetune_lora.sh
Jika Anda ingin melatih model bahasa dan model visi dengan LoRA:
bash scripts/finetune_lora_vision.sh
PENTING: Jika Anda ingin menyetel embed_token
dengan LoRA, Anda perlu menyetel lm_head
secara bersamaan. Catatan: Pembekuan LLM hanya akan berfungsi tanpa LoRA (termasuk vision_model LoRA).
--deepspeed
(str): Jalur ke file konfigurasi DeepSpeed (default: "scripts/zero2.json").--data_path
(str): Jalur ke data pelatihan berformat LLaVA (file JSON). (Diperlukan)--image_folder
(str): Jalur ke folder gambar sebagaimana direferensikan dalam data pelatihan berformat LLaVA. (Diperlukan)--model_id
(str): Jalur ke model Qwen2-VL. (Diperlukan)--output_dir
(str): Direktori keluaran untuk pos pemeriksaan model--num_train_epochs
(int): Jumlah periode pelatihan (default: 1).--per_device_train_batch_size
(int): Melatih ukuran batch per GPU per langkah penerusan.--gradient_accumulation_steps
(int): Langkah akumulasi gradien (default: 4).--freeze_vision_tower
(bool): Opsi untuk membekukan vision_model (default: False).--freeze_llm
(bool): Opsi untuk membekukan LLM (default: False).--tune_merger
(bool): Opsi untuk menyetel proyektor (default: True).--num_lora_modules
(int): Jumlah modul target yang akan ditambahkan LoRA (-1 berarti semua lapisan).--vision_lr
(float): Kecepatan pembelajaran untuk vision_model.--merger_lr
(float): Kecepatan pembelajaran untuk merger (proyektor).--learning_rate
(float): Kecepatan pembelajaran untuk modul bahasa.--bf16
(bool): Opsi untuk menggunakan bfloat16.--fp16
(bool): Opsi untuk menggunakan fp16.--min_pixels
(int): Opsi untuk token masukan minimum.--max_pixles
(int): Opsi untuk token maksimum maksimum.--lora_namespan_exclude
(str): Kecualikan modul dengan rentang nama untuk menambahkan LoRA.--max_seq_length
(int): Panjang urutan maksimum (default: 32K).--bits
(int): Bit kuantisasi (default: 16).--disable_flash_attn2
(bool): Nonaktifkan Perhatian Flash 2.--report_to
(str): Alat pelaporan (pilihan: 'tensorboard', 'wandb', 'none') (default: 'tensorboard').--logging_dir
(str): Direktori logging (default: "./tf-logs").--lora_rank
(int): Peringkat LoRA (default: 128).--lora_alpha
(int): LoRA alfa (default: 256).--lora_dropout
(float): LoRA putus sekolah (default: 0,05).--logging_steps
(int): Langkah-langkah pencatatan (default: 1).--dataloader_num_workers
(int): Jumlah pekerja pemuat data (default: 4). Catatan: Kecepatan pembelajaran vision_model
harus 10x ~ 5x lebih kecil dari language_model
.
Anda dapat melatih model menggunakan kumpulan data video. Namun, Qwen2-VL memproses video sebagai rangkaian gambar, jadi Anda harus memilih bingkai tertentu dan memperlakukannya sebagai beberapa gambar untuk pelatihan. Anda dapat mengatur konfigurasi LoRA dan menggunakannya untuk LoRA juga.
bash scripts/finetune_video.sh
Catatan: Saat berlatih dengan video, ini hanya multi-gambar sehingga Anda harus menyesuaikan max_pixels
untuk resolusi dan fps
maksimum berdasarkan VRAM yang tersedia.
Jika Anda kehabisan vram, Anda dapat menggunakan zero3_offload alih-alih zero3. Namun, menggunakan zero3 lebih disukai.
bash scripts/merge_lora.sh
Catatan: Ingatlah untuk mengganti jalur di finetune.sh
atau finetune_lora.sh
dengan jalur spesifik Anda. (Juga di merge_lora.sh
saat menggunakan LoRA.)
Model ini mendukung berbagai masukan resolusi. Secara default, ini menggunakan resolusi asli untuk input. Untuk kinerja yang lebih baik, disarankan menggunakan jumlah piksel asli atau lebih tinggi, namun hal ini memerlukan terlalu banyak memori dan waktu komputasi untuk gambar besar. Jadi Anda bisa menyesuaikan jumlah pikselnya. Model membagi gambar menjadi token * 28 * 28
sehingga Anda cukup mengubah bagian token_num di skrip.
Misalnya:
min_pixels = 256 * 28 * 28
max_pixels = 1280 * 28 * 28
Catatan: Untuk video tidak perlu diatur seperti ini, Anda cukup mengatur resolusi maksimalnya saja.
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
Anda dapat menjalankan unset LD_LIBRARY_PATH
untuk kesalahan ini. Anda bisa melihat masalah ini
Catatan: Anda harus menggunakan beban gabungan saat berlatih dengan LoRA.
pip install gradio
python -m src.serve.app
--model-path /path/to/merged/weight
Anda dapat meluncurkan demo berbasis gradio dengan perintah ini. Ini juga dapat mengatur beberapa konfigurasi generasi lain seperti repetition_penalty
, temperature
, dll.
Proyek ini dilisensikan di bawah Lisensi Apache-2.0. Lihat file LISENSI untuk detailnya.
Jika Anda merasa repositori ini berguna dalam proyek Anda, mohon pertimbangkan untuk memberikan dan mengutip:
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
Proyek ini didasarkan pada