พื้นที่เก็บข้อมูลนี้มีสคริปต์สำหรับการฝึก 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
ที่ให้ไว้
เมื่อใช้ชุดข้อมูลแบบหลายภาพ โทเค็นรูปภาพทั้งหมดควรเป็น <image>
และชื่อไฟล์รูปภาพควรอยู่ในรายการ โปรดดูตัวอย่างด้านล่างและปฏิบัติตามรูปแบบข้อมูลของคุณ
[
{
"id" : " 000000033471 " ,
"image" : " 000000033471.jpg " ,
"conversations" : [
{
"from" : " human " ,
"value" : " <image> 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" : " <image> n <image> n Is the perspective of the camera differnt? "
},
{
"from" : " gpt " ,
"value" : " Yes, It the perspective of the camera is different. "
}
]
}
...
]
[
{
"id" : " sample1 " ,
"video" : " sample1.mp4 " ,
"conversations" : [
{
"from" : " human " ,
"value" : " <video> n What is going on in this video? "
},
{
"from" : " gpt " ,
"value" : " A man is walking down the road. "
}
]
}
...
]
หมายเหตุ: Qwen2-VL ใช้วิดีโอตามลำดับรูปภาพ
หมายเหตุ: ด้วยชุดข้อมูลแบบผสม (เช่น ข้อมูลบางส่วนในชุดมีรูปภาพ ในขณะที่บางชุดไม่มี) รองรับเฉพาะกับศูนย์ 2 เท่านั้น
หากต้องการรันสคริปต์การฝึกอบรม ให้ใช้คำสั่งต่อไปนี้:
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
สคริปต์นี้จะปรับแต่งโมเดลด้วย 8bit-adamw และ fp8 model dtype หาก vram หมดคุณสามารถใช้สิ่งนี้ได้
หากคุณต้องการฝึกฝนเฉพาะโมเดลภาษาด้วย 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): ขนาดแบตช์การฝึกอบรมต่อ GPU ต่อขั้นตอนการส่งต่อ--gradient_accumulation_steps
(int): ขั้นตอนการสะสมไล่ระดับสี (ค่าเริ่มต้น: 4)--freeze_vision_tower
(บูล): ตัวเลือกในการตรึง Vision_model (ค่าเริ่มต้น: เท็จ)--freeze_llm
(bool): ตัวเลือกในการตรึง LLM (ค่าเริ่มต้น: False)--tune_merger
(บูล): ตัวเลือกในการปรับแต่งโปรเจ็กเตอร์ (ค่าเริ่มต้น: True)--num_lora_modules
(int): จำนวนโมดูลเป้าหมายที่จะเพิ่ม LoRA (-1 หมายถึงทุกเลเยอร์)--vision_lr
(float): อัตราการเรียนรู้สำหรับ Vision_model--merger_lr
(float): อัตราการเรียนรู้สำหรับการควบรวมกิจการ (โปรเจ็กเตอร์)--learning_rate
(float): อัตราการเรียนรู้สำหรับโมดูลภาษา--bf16
(บูล): ตัวเลือกสำหรับการใช้ bfloat16--fp16
(บูล): ตัวเลือกสำหรับการใช้ fp16--min_pixels
(int): ตัวเลือกสำหรับโทเค็นอินพุตขั้นต่ำ--max_pixles
(int): ตัวเลือกสำหรับโทเค็นสูงสุดสูงสุด--lora_namespan_exclude
(str): ยกเว้นโมดูลที่มีเนมสแปนเพื่อเพิ่ม LoRA--max_seq_length
(int): ความยาวลำดับสูงสุด (ค่าเริ่มต้น: 32K)--bits
(int): บิตการหาปริมาณ (ค่าเริ่มต้น: 16)--disable_flash_attn2
(บูล): ปิดการใช้งาน Flash Attention 2--report_to
(str): เครื่องมือการรายงาน (ตัวเลือก: 'tensorboard', 'wandb', 'none') (ค่าเริ่มต้น: 'tensorboard')--logging_dir
(str): ไดเรกทอรีการบันทึก (ค่าเริ่มต้น: "./tf-logs")--lora_rank
(int): อันดับ LoRA (ค่าเริ่มต้น: 128)--lora_alpha
(int): LoRA อัลฟา (ค่าเริ่มต้น: 256)--lora_dropout
(ลอย): LoRA ออกกลางคัน (ค่าเริ่มต้น: 0.05)--logging_steps
(int): ขั้นตอนการบันทึก (ค่าเริ่มต้น: 1)--dataloader_num_workers
(int): จำนวนพนักงานโหลดข้อมูล (ค่าเริ่มต้น: 4) หมายเหตุ: อัตราการเรียนรู้ของ vision_model
ควรน้อยกว่า language_model
10x ~ 5x
คุณสามารถฝึกโมเดลได้โดยใช้ชุดข้อมูลวิดีโอ อย่างไรก็ตาม Qwen2-VL ประมวลผลวิดีโอเป็นลำดับภาพ ดังนั้นคุณจะต้องเลือกเฟรมที่ต้องการและถือเป็นหลายภาพสำหรับการฝึก คุณสามารถตั้งค่าการกำหนดค่า LoRA และใช้สำหรับ LoRA ได้เช่นกัน
bash scripts/finetune_video.sh
หมายเหตุ: เมื่อฝึกด้วยวิดีโอ ก็เหมือนกับหลายภาพ ดังนั้นคุณควรปรับ max_pixels
สำหรับความละเอียดสูงสุดและ fps
ตาม VRAM ที่มีอยู่
หาก vram ของคุณหมด คุณสามารถใช้ zero3_offload แทน zero3 ได้ อย่างไรก็ตาม แนะนำให้ใช้ศูนย์ 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
คุณสามารถเปิดการสาธิตที่ใช้ gradio ด้วยคำสั่งนี้ นอกจากนี้ยังสามารถตั้งค่าการกำหนดค่ารุ่นอื่น ๆ เช่น 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 }
}
โครงการนี้มีพื้นฐานมาจาก