이 저장소에는 HuggingFace 및 Liger-Kernel만 사용하여 Qwen2-VL을 교육하기 위한 스크립트가 포함되어 있습니다.
[Phi3-Vision Finetuning]
[Llama3.2-비전 미세 조정]
[몰모 파인튠]
environment.yaml
사용vision_model
미세 조정을 활성화합니다. 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은 비디오를 이미지의 연속으로 사용합니다.
참고: 혼합 데이터 세트의 경우(예: 배치의 일부 데이터에는 이미지가 있고 일부에는 그렇지 않음) zero2에서만 지원됩니다.
학습 스크립트를 실행하려면 다음 명령어를 사용하세요.
bash scripts/finetune.sh
bash scripts/finetune_8bit.sh
이 스크립트는 8bit-adamw 및 fp8 모델 dtype을 사용하여 모델을 미세 조정합니다. vram이 부족하면 이것을 사용할 수 있습니다.
LoRA로 언어 모델만 학습하고 비전 모델에 대한 전체 학습을 수행하려면 다음을 수행하세요.
bash scripts/finetune_lora.sh
LoRA를 사용하여 언어 모델과 비전 모델을 모두 훈련하려는 경우:
bash scripts/finetune_lora_vision.sh
중요: LoRA로 embed_token
조정하려면 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
(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): merge(프로젝터)에 대한 학습 속도입니다.--learning_rate
(float): 언어 모듈의 학습 속도입니다.--bf16
(bool): bfloat16을 사용하기 위한 옵션입니다.--fp16
(bool): fp16 사용 옵션입니다.--min_pixels
(int): 최소 입력 토큰에 대한 옵션입니다.--max_pixles
(int): 최대 최대 토큰에 대한 옵션입니다.--lora_namespan_exclude
(str): LoRA를 추가하려면 네임스팬이 있는 모듈을 제외합니다.--max_seq_length
(int): 최대 시퀀스 길이(기본값: 32K).--bits
(int): 양자화 비트(기본값: 16).--disable_flash_attn2
(bool): 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
(float): LoRA 드롭아웃(기본값: 0.05).--logging_steps
(int): 로깅 단계(기본값: 1).--dataloader_num_workers
(int): 데이터 로더 작업자 수(기본값: 4). 참고: vision_model
의 학습률은 language_model
보다 10배 ~ 5배 작아야 합니다.
비디오 데이터 세트를 사용하여 모델을 훈련할 수 있습니다. 그러나 Qwen2-VL은 비디오를 일련의 이미지로 처리하므로 훈련을 위해 특정 프레임을 선택하고 이를 여러 이미지로 처리해야 합니다. LoRA 구성을 설정하고 LoRA에도 사용할 수 있습니다.
bash scripts/finetune_video.sh
참고: 비디오로 훈련할 때는 다중 이미지와 같으므로 사용 가능한 VRAM을 기반으로 최대 해상도 및 fps
에 맞게 max_pixels
조정해야 합니다.
vram이 부족하면 zero3 대신 zero3_offload를 사용할 수 있습니다. 그러나 zero3을 사용하는 것이 좋습니다.
bash scripts/merge_lora.sh
참고: finetune.sh
또는 finetune_lora.sh
의 경로를 특정 경로로 바꾸십시오. (LoRA 사용시 merge_lora.sh
에도 있습니다.)
이 모델은 광범위한 해상도 입력을 지원합니다. 기본적으로 입력에 기본 해상도를 사용합니다. 더 나은 성능을 위해서는 기본 또는 더 높은 픽셀 수를 사용하는 것이 권장되지만 큰 이미지의 경우 메모리와 계산 시간이 너무 많이 걸립니다. 따라서 픽셀 수를 조정할 수 있습니다. 모델은 이미지를 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 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하세요.
이 저장소가 귀하의 프로젝트에 유용하다고 생각되면 다음을 제공하고 인용해 보십시오.
@misc { Qwen2-VL-Finetuning ,
author = { Yuwon Lee } ,
title = { Qwen2-VL-Finetune } ,
year = { 2024 } ,
publisher = { GitHub } ,
url = { https://github.com/2U1/Qwen2-VL-Finetune }
}
이 프로젝트는 다음을 기반으로 합니다.