ラベル Google Colaboratory の投稿を表示しています。 すべての投稿を表示
ラベル Google Colaboratory の投稿を表示しています。 すべての投稿を表示

2024年5月23日木曜日

日本語 LLaMA ベースのモデルを Google Colab 上で Fine-Turning してみた

日本語 LLaMA ベースのモデルを Google Colab 上で Fine-Turning してみた

概要

これまでいろいろと M2 mac mini 上で Fine-Tuning を試してきましたがメモリが足りなかったりスペックが低くて学習時間がとんでもなくかかったりと大変でした
なので今回は Google Colab を使ってスクラッチで日本語モデルの Fine-Tuning を試してみます

環境

  • Google Colab (T4 GPU)
    • Python 3

学習コード

コードブロックごとにコメントをつけているのでそれ単位で実行すると良いかなと思います

# 必要なライブラリのインストール
%%capture
%pip install accelerate peft bitsandbytes transformers trl

# 必要なモジュールとクラスのインポート
import os
import torch
from datasets import load_dataset
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
    TrainingArguments,
    pipeline,
    logging,
)
from peft import LoraConfig
from trl import SFTTrainer, DataCollatorForCompletionOnlyLM

# 今回使用する日本語言語モデルとデータセット名の定義
base_model = "elyza/ELYZA-japanese-Llama-2-7b-instruct"
dataset = "bbz662bbz/databricks-dolly-15k-ja-ojousama"
new_model = "elyza-2-7b-instruct-ojousama"

# データセットのロード
dataset = load_dataset(dataset, split="train")

# QLoRAを使ってFine-Tuningする、QLoRAにすることで低スペック環境でもFine-Tuningできるようにする
compute_dtype = getattr(torch, "float16")

quant_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=compute_dtype,
    bnb_4bit_use_double_quant=False,
)

# 日本語言語モデルのダウンロードと読み込み、quantization_config を指定して 4bit 量子化 (QLoRA) を設定
model = AutoModelForCausalLM.from_pretrained(
    base_model,
    quantization_config=quant_config,
    device_map={"": 0}
)
model.config.use_cache = False
model.config.pretraining_tp = 1

# モデルからトークナイザーの取得
tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

# LoRA 用のパラメータ設定
peft_params = LoraConfig(
    lora_alpha=16,
    lora_dropout=0.1,
    r=64,
    bias="none",
    task_type="CAUSAL_LM",
)

# 訓練に必要なハイパーパラメータの設定
training_params = TrainingArguments(
    output_dir="./results",
    num_train_epochs=1,
    # Gradient Accumulation 有効化 (メモリ削減テクニック1)
    per_device_train_batch_size=4,
    gradient_accumulation_steps=16,
    # Gradient Checkpointing の有効化 (メモリ削減テクニック2)
    gradient_checkpointing=True,
    optim="paged_adamw_32bit",
    save_steps=25,
    logging_steps=25,
    learning_rate=2e-4,
    weight_decay=0.001,
    fp16=False,
    bf16=False,
    max_grad_norm=0.3,
    max_steps=-1,
    warmup_ratio=0.03,
    group_by_length=True,
    lr_scheduler_type="constant",
    report_to="tensorboard"
)

# 学習データのフォーマットを行う
# 学習データは json 形式で質問 (instruction)、回答 (output)、入力 (input) などが用意されている
# 今回は質問と回答を使って学習用のデータを準備する
def formatting_prompts_func(example):
    output_texts = []
    for i in range(len(example['instruction'])):
        text = f"### Question: {example['instruction'][i]}\n ### Answer: {example['output'][i]}"
        output_texts.append(text)
    return output_texts

# 学習時に回答部分がどこから始まるか教えてるための区切り文字の準備
response_template = " ### Answer:"
collator = DataCollatorForCompletionOnlyLM(response_template, tokenizer=tokenizer)

# 学習を開始するためのオブジェクト作成
# ここで GPU メモリが上がる
trainer = SFTTrainer(
    model=model,
    train_dataset=dataset,
    peft_config=peft_params,
    formatting_func=formatting_prompts_func,
    data_collator=collator,
    max_seq_length=None,
    tokenizer=tokenizer,
    args=training_params,
    packing=False,
)

# 学習開始
# ここでも GPU メモリが上がるが 10GB 以上は上がらないようにチューニングしているので学習が開始される
trainer.train()

今回のハイパーパラメータで学習はだいたいX時間ほどかかりました

推論コード

prompt = "プログラミングについてはどうお考えですの?"
pipe = pipeline(task="text-generation", model=model, tokenizer=tokenizer, max_length=200)
result = pipe(f"<s>[INST] {prompt} [/INST]")
print(result[0]['generated_text'])

データセット

ベースモデル

Tips: GPU メモリ削減テクニック

Tips: This instance will be ignored in loss calculation. Note, if this happens often, consider increasing the max_seq_length. 対策

SFTTrainer の max_seq_length のデフォルト値は 1024 です
学習させるデータ内に 1024 文字以上ある文章が含まれている場合は少し増やしてもいいかもしれません

Tips: trainer/utils.py:141: UserWarning: Could not find response key

なぜが学習データがうまく読み込めないようです
トークナイザーが原因の可能性もあるようですが response_template などを変更するとうまくいくかもです

参考: https://github.com/huggingface/trl/issues/588

最後に

Google Colab 上で 日本語で事前学習済みの LLaMA ベースのモデルを Fine-Tuning してみました
作成したモデルで推論までできるので低スペックなマシンしかない人でもこの方法ならわりと大規模な言語モデルでも Fine-Tuning できるかなと思います

ただ Google Colab の無料枠だと一日の使用時間が短いので学習前にリソースが終了する可能性があります

参考サイト

2023年5月17日水曜日

Stable Diffusion でシード値を使って全く同じ画像を生成する方法

Stable Diffusion でシード値を使って全く同じ画像を生成する方法

概要

Stable-Diffusion で全く同じ画像を生成するにはシード値を使います
今回は PromptHero にある画像をシード値を使って生成する方法を紹介します

環境

  • GoogleColab (2023/05/03 時点)
  • stable-diffusion-webui 1.1.0
  • stable-diffusion 1.5 (pruned)

再現する画像

今回はこちらを生成してみます

ポイント

シード値は当然ですがそれ以外にもモデル、モデル用設定ファイル、プロンプトやネガティブプロンプト、ステップ数なども同一の値にする必要があります

特にモデルが大変でバージョンが違うだけで全然違う画像が生成されてしまうので必ず同一モデル+同一パラメータで生成する必要があります

コード

今回は stable-diffusion-v1.5 を使います
StableDiffusionWebUI はデフォルトで stable-diffusion-v1.5 を使いますが emaonly 版なので pruned 版を使うようにします

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
%cd stable-diffusion-webui

!wget https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned.safetensors -O /content/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned.safetensors
!wget https://huggingface.co/runwayml/stable-diffusion-v1-5/raw/main/v1-inference.yaml -O /content/stable-diffusion-webui/configs/v1-inference.yaml

!COMMANDLINE_ARGS="--share --gradio-debug --xformers --gradio-auth me:qwerty" REQS_FILE="requirements.txt" python launch.py

動作確認

今回は以下を同一の値に設定します

  • プロンプト -> (masterpiece:1.0), (best quality:1.4), (ultra highres:1.2), (photorealistic:1.4), (8k, RAW photo:1.2), (soft focus:1.4), 1 woman, posh, (sharp focus:1.4), (korean:1.2), (american:1.1), detailed beautiful face, black hair, (detailed open blazer:1.4), tie, beautiful white shiny humid skin, smiling
  • ネガティブプロンプト -> illustration, 3d, sepia, painting, cartoons, sketch, (worst quality:2), (low quality:2), (normal quality:2), lowres, bad anatomy, bad hands, normal quality, ((monochrome)), ((grayscale:1.2)),newhalf, collapsed eyeshadow, multiple eyebrows, pink hair, analog, analogphoto
  • シード値 -> 300563992
  • ステップ数 -> 35
  • サンプラー -> DPM++ 2M Karras
  • CFG -> 7.0

これで実行して同一画像が生成されることを確認しましょう

最後に

モデルのバージョンが違うと別の画像になることがあるのでモデルのバージョンとリビジョンも確認しましょう

2023年5月15日月曜日

StableDiffusionWebUIでLoraモデルを使用する方法

StableDiffusionWebUIでLoraモデルを使用する方法

概要

タイトルの通りです
Loraモデルを使う場合でも単純にモデルを入れ替える方法を使うだけで OK です

今回はこちらのモデルを使います

環境

  • GoogleColab (2023/05/03 時点)
  • stable-diffusion-webui 1.1.0
  • stable diffustion 2.0MeinaMix v9

注意点

今回の Lora モデルは「CHECKPOINT MERGE」という種類になります
これはすでにベースとなるモデルに対して追加で Lora モデルを足しているのでベースとなるモデルの指定が不要になります

対して「Lora 拡張」なモデルもありこの場合はベースとなるモデル (例えば stable-diffusion-v1.5 など) が必要になります

今回の方法は CheckPoint Merge なモデルなので普通にモデルを入れ替える方法で OK です

コード

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
%cd stable-diffusion-webui

# 今回は CheckPoint Merge なモデルなので Stable-diffusion 配下に直接配置する
!wget https://civitai.com/api/download/models/46137 --content-disposition -O /content/stable-diffusion-webui/models/Stable-diffusion/meinamix_meinaV9.safetensors
# CheckPoint Merge ではなく Lora 拡張の場合は拡張用の別のディレクトリ (models/Lora) に配置する
# !mkdir -p /content/stable-diffusion-webui/models/Lora/
# !wget https://civitai.com/api/download/models/63006 --content-disposition -O /content/stable-diffusion-webui/models/Lora/LowRA.safetensors

!COMMANDLINE_ARGS="--share --gradio-debug --xformers --gradio-auth me:qwerty" REQS_FILE="requirements.txt" python launch.py

!wget ... の部分が CivitAI というサイトから Lora モデルをダウンロードしている処理になります
ポイントは CheckPoint Merge な Lora モデルは /content/stable-diffusion-webui/models/Stable-diffusion/ に直接配置する点です

あとは普通に SD-WebUI を起動するだけです

動作確認

CheckPoint が Lora モデルになっていることを確認します
CheckPoint Merge の場合は普通にプロンプトに入力すれば OK です

最後の

Lora モデルを Stable Diffusion WebUI に導入する方法を紹介しました

CheckPointMerge の場合は Lora 拡張のみの場合で導入方法が少し異なるので注意しましょう

参考サイト

2023年5月12日金曜日

StableDiffusionWebUIでStableDiffusion2.0を使う方法

StableDiffusionWebUIでStableDiffusion2.0を使う方法

概要

HuggingFaceからStable Diffusion2.0モデルを取得して StableDiffusionWebUI で使ってみます

動作は Google Colab を使います

環境

  • GoogleColab (2023/05/03 時点)
  • stable-diffusion-webui 1.1.0
  • stable diffustion 2.0

コード

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
%cd stable-diffusion-webui

!wget https://huggingface.co/stabilityai/stable-diffusion-2/resolve/main/768-v-ema.ckpt -O /content/stable-diffusion-webui/models/Stable-diffusion/768-v-ema.ckpt
!wget https://raw.githubusercontent.com/Stability-AI/stablediffusion/main/configs/stable-diffusion/v2-inference-v.yaml -O /content/stable-diffusion-webui/models/Stable-diffusion/768-v-ema.yaml

!COMMANDLINE_ARGS="--share --gradio-debug --xformers --gradio-auth me:qwerty" REQS_FILE="requirements.txt" python launch.py

動作確認

参考サイト

2023年5月11日木曜日

StableDiffusionWebUIで使用するモデルを変更する方法

StableDiffusionWebUIで使用するモデルを変更する方法

概要

前回 Stable Diffusion WebUI を Google Colab 上で動作させました

今回は Stable Diffusion のモデルを変更する方法を紹介します
モデルは waifu-diffusion というモデルに変更します

環境

  • GoogleColab (2023/05/03 時点)
  • stable-diffusion-webui 1.1.0
  • waifu-diffusion 1.4.0

前回のコードにモデルをダウンロードするコードを追加

以下のコードを Stable Diffusion WebUI クローン後に追加します

!wget https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/wd-1-4-anime_e2.ckpt -O /content/stable-diffusion-webui/models/Stable-diffusion/wd-1-4-anime_e2.ckpt

コード全体

コード全体は以下のようになります

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
%cd stable-diffusion-webui

!wget https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/wd-1-4-anime_e2.ckpt -O /content/stable-diffusion-webui/models/Stable-diffusion/wd-1-4-anime_e2.ckpt

!COMMANDLINE_ARGS="--share --gradio-debug --gradio-auth me:qwerty" REQS_FILE="requirements.txt" python launch.py

動作確認

起動後にモデルが wd-1-4-anime_e2.ckpt に変わっていることを確認します

最後に

StableDiffusion WebUI もすでに models/Stable-diffusion 配下に何かしらのモデルがあるとデフォルトの runwayml のモデルは取得しないようです

なので runwayml もほしい場合は明記する必要があります (もしくは今回追加したコードを削除する)

参考サイト

2023年5月10日水曜日

GoogleColab で StableDiffusionWebUI が起動するか試す

GoogleColab で StableDiffusionUI を起動するか試す

概要

StableDiffusionUI が無料の GoogleColaboratory 上で動作するか試してみました

環境

  • GoogleColab (2023/05/03 時点)
  • stable-diffusion-webui 1.1.0

リポジトリの clone

!git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
%cd stable-diffusion-webui

実行

!COMMANDLINE_ARGS="--share --gradio-debug --gradio-auth me:qwerty" REQS_FILE="requirements.txt" python launch.py

実行ログ

Python 3.10.11 (main, Apr  5 2023, 14:15:10) [GCC 9.4.0]
Commit hash: 5ab7f213bec2f816f9c5644becb32eb72c8ffb89
Installing gfpgan
Installing clip
Installing open_clip
Cloning Stable Diffusion into /content/stable-diffusion-webui/repositories/stable-diffusion-stability-ai...
Cloning Taming Transformers into /content/stable-diffusion-webui/repositories/taming-transformers...
Cloning K-diffusion into /content/stable-diffusion-webui/repositories/k-diffusion...
Cloning CodeFormer into /content/stable-diffusion-webui/repositories/CodeFormer...
Cloning BLIP into /content/stable-diffusion-webui/repositories/BLIP...
Installing requirements for CodeFormer
Installing requirements
Launching Web UI with arguments: --share --gradio-debug --gradio-auth me:qwerty
2023-05-03 07:06:08.915792: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.
To enable the following instructions: AVX2 AVX512F FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-05-03 07:06:09.904251: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT
No module 'xformers'. Proceeding without it.
Downloading: "https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors" to /content/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors

100% 3.97G/3.97G [00:23<00:00, 180MB/s]
Calculating sha256 for /content/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors: 6ce0161689b3853acaa03779ec93eafe75a02f4ced659bee03f50797806fa2fa
Loading weights [6ce0161689] from /content/stable-diffusion-webui/models/Stable-diffusion/v1-5-pruned-emaonly.safetensors
Creating model from config: /content/stable-diffusion-webui/configs/v1-inference.yaml
LatentDiffusion: Running in eps-prediction mode
DiffusionWrapper has 859.52 M params.
Downloading (…)olve/main/vocab.json: 100% 961k/961k [00:00<00:00, 11.8MB/s]
Downloading (…)olve/main/merges.txt: 100% 525k/525k [00:00<00:00, 3.19MB/s]
Downloading (…)cial_tokens_map.json: 100% 389/389 [00:00<00:00, 2.52MB/s]
Downloading (…)okenizer_config.json: 100% 905/905 [00:00<00:00, 5.12MB/s]
Downloading (…)lve/main/config.json: 100% 4.52k/4.52k [00:00<00:00, 21.7MB/s]
Applying cross attention optimization (Doggettx).
Textual inversion embeddings loaded(0): 
Model loaded in 30.9s (calculate hash: 14.0s, load weights from disk: 0.3s, create model: 2.3s, apply weights to model: 4.4s, apply half(): 1.4s, load VAE: 7.9s, move model to device: 0.6s).
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://xxx.gradio.live

This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces

結果

普通に起動しました

メモリ不足で起動しない場合は StableDiffusionUI-Voldemort V1.3.ipynb ではなく素の stable-diffusion-webui から起動するといいかもしれません

参考サイト

2023年5月9日火曜日

GoogleColab超入門

GoogleColab超入門

概要

Google Colaboratory は Python の実行環境を提供してくれるサービスです
無料で GPU リソースも使えます
今回は超入門として簡単なスクリプトを実行してみます

環境

  • GoogleColab (2023/05/03 時点)
    • ハードウェアアクセラレータ None

アクセス

ノートブックを新規作成

モーダルが表示されるので「ノートブックを新規作成」をクリックします

コードの追加

import sys
print(sys.version)

コードの実行

  • 三角ボタンをクリック

GPU を使う

  • ランタイム -> ランタイムのタイプを変更 -> ハードウェアアクセラレータ -> GPU

GPU の状態を確認

  • !nvidia-smi

シェルコマンドの実行

  • !hostname

先頭にビックリマークを付けるとシェルコマンドが実行できます

最後に

こんな感じで簡単に Python を実行できます
無料で GPU リソースも使えます