このリポジトリには、HuggingFace と Liger-Kernel のみを使用して Qwen2-VL をトレーニングするためのスクリプトが含まれています。
[Phi3-Vision 微調整]
[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
と一致していることを確認してください。
マルチイメージ データセットを使用する場合、イメージ トークンはすべて<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 はビデオを一連の画像として使用します。
注:混合データセットの場合 (たとえば、バッチ内の一部のデータには画像があり、一部のデータには画像がありません)、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
(文字列): LLaVA 形式のトレーニング データ (JSON ファイル) へのパス。 (必須)--image_folder
(文字列): 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 をフリーズするオプション (デフォルト: False)。--freeze_llm
(ブール値): 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): 最大 maxmimum トークンのオプション。--lora_namespan_exclude
(str): LoRA を追加するためにネームスパンを持つモジュールを除外します。--max_seq_length
(int): シーケンスの最大長 (デフォルト: 32K)。--bits
(int): 量子化ビット (デフォルト: 16)。--disable_flash_attn2
(ブール値): フラッシュ アテンション 2 を無効にします。--report_to
(str): レポート ツール (選択肢: 'tensorboard'、'wandb'、'none') (デフォルト: 'tensorboard')。--logging_dir
(文字列): ログ ディレクトリ (デフォルト: "./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
の 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 }
}
このプロジェクトは、