Heronは、複数の画像/動画モデルと言語モデルをシームレスに統合するライブラリです。日本語のV&Lモデルをサポートしており、さらに様々なデータセットで学習された事前学習済みウェイトも提供します。
Heronでは、様々なモジュールを組み合わせた独自のV&Lモデルを構成することができます。Vision Encoder、Adopter、LLMを設定ファイルで設定できます。分散学習方法やトレーニングに使用するデータセットも簡単に設定できます。
git clone https://github.com/turingmotors/heron.git
cd heron
必要なパッケージのインストールには仮想環境を使用することを推奨します。グローバルにパッケージをインストールしたい場合は、代わりに pip install -r requirements.txt
を使ってください。
pyenvとPoetryの場合、次の手順で必要なパッケージをインストールしてください。
# install pyenv environment
pyenv install 3.10
pyenv local 3.10
# install packages from pyproject.toml
poetry install
# install local package
pip install --upgrade pip # enable PEP 660 support
pip install -e .
# for development, install pre-commit
pre-commit install
Anacondaの場合、次の手順で必要なパッケージをインストールしてください。
conda create -n heron python=3.10 -y
conda activate heron
pip install --upgrade pip # enable PEP 660 support
pip install -r requirements.txt
pip install -e .
# for development, install pre-commit
pre-commit install
Llama-2モデルを使用するには、アクセスの申請が必要です。 まず、Hugging FaceとMetaのサイトから、llama-2モデルへのアクセスをリクエストしてください。
リクエストが承認されたら、HaggingFaceのアカウントでサインインしてください。
huggingface-cli login
学習を行う場合、projects
ディレクトリ配下のyaml設定ファイルを使用します。
例えば、projects/opt/exp001.ymlの内容は次のようになっています。
training_config:
per_device_train_batch_size: 2
gradient_accumulation_steps: 4
num_train_epochs: 1
dataloader_num_workers: 16
fp16: true
optim: "adamw_torch"
learning_rate: 5.0e-5
logging_steps: 100
evaluation_strategy: "steps"
save_strategy: "steps"
eval_steps: 4000
save_steps: 4000
save_total_limit: 1
deepspeed: ./configs/deepspeed/ds_config_zero1.json
output_dir: ./output/
report_to: "wandb"
model_config:
fp16: true
pretrained_path: # None or path to model weight
model_type: git_llm
language_model_name: facebook/opt-350m
vision_model_name: openai/clip-vit-base-patch16
num_image_with_embedding: 1 # if 1, no img_temporal_embedding
max_length: 512
keys_to_finetune:
- visual_projection
- num_image_with_embedding
keys_to_freeze: []
use_lora: true
lora:
r: 8
lora_alpha: 32
target_modules:
- q_proj
- k_proj
- v_proj
lora_dropout: 0.01
bias: none
task_type: CAUSAL_LM
dataset_config_path:
- ./configs/datasets/m3it.yaml
training_config
では学習に関する設定を、model_config
ではモデルに関する設定を、dataset_config_path
ではデータセットに関する設定をそれぞれ行います。
model_type
に指定できるLLMモジュールとしては現在下記のものがサポートされています。今後も対応するモジュールを増やしていく予定です。
学習を開始する場合は、次のコマンドを実行してください。
./scripts/run.sh
学習にはGPUが必要です。Ubuntu20.04, CUDA11.7で動作確認をしています。
Hugging Face Hubから学習済みモデルをダウンロードすることができます: turing-motors/heron-chat-git-ja-stablelm-base-7b-v0
推論・学習の方法についてはnotebooksも参考にしてください。
import requests
from PIL import Image
import torch
from transformers import AutoProcessor
from heron.models.git_llm.git_llama import GitLlamaForCausalLM
device_id = 0
# prepare a pretrained model
model = GitLlamaForCausalLM.from_pretrained('turing-motors/heron-chat-git-ja-stablelm-base-7b-v0')
model.eval()
model.to(f"cuda:{device_id}")
# prepare a processor
processor = AutoProcessor.from_pretrained('turing-motors/heron-chat-git-ja-stablelm-base-7b-v0')
# prepare inputs
url = "https://www.barnorama.com/wp-content/uploads/2016/12/03-Confusing-Pictures.jpg"
image = Image.open(requests.get(url, stream=True).raw)
text = f"##Instruction: Please answer the following question concretely. ##Question: What is unusual about this image? Explain precisely and concretely what he is doing? ##Answer: "
# do preprocessing
inputs = processor(
text,
image,
return_tensors="pt",
truncation=True,
)
inputs = {k: v.to(f"cuda:{device_id}") for k, v in inputs.items()}
# set eos token
eos_token_id_list = [
processor.tokenizer.pad_token_id,
processor.tokenizer.eos_token_id,
]
# do inference
with torch.no_grad():
out = model.generate(**inputs, max_length=256, do_sample=False, temperature=0., eos_token_id=eos_token_id_list)
# print result
print(processor.tokenizer.batch_decode(out))
model | LLM module | adapter | size |
---|---|---|---|
heron-chat-blip-ja-stablelm-base-7b-v0 | Japanese StableLM Base Alpha | BLIP | 7B |
heron-chat-git-ja-stablelm-base-7b-v0 | Japanese StableLM Base Alpha | GIT | 7B |
heron-chat-git-ELYZA-fast-7b-v0 | ELYZA | GIT | 7B |
heron-preliminary-git-Llama-2-70b-v0 *1 | Llama-2 | GIT | 70B |
*1 アダプタの事前学習のみを実施したもの |
日本語に翻訳されたLLava-Instructデータセットです。
LLaVA-Instruct-150K-JA
Apache License 2.0 において公開されています。
- GenerativeImage2Text: モデルの構成方法の着想はGITに基づいています。
- Llava: 本ライブラリはLlavaプロジェクトを参考にしています。
- GIT-LLM