Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Stable Diffusionの使い方と 追加学習によるLoRAの作成 ~GPUコンテナサー...

Stable Diffusionの使い方と 追加学習によるLoRAの作成 ~GPUコンテナサービス “高火力 DOK” の活用~ @ 2024-06-29 OSC2024 Hokkaido / Stable Diffusion and Creating LoRA with Additional Training ~ with 'Koukaryoku DOK' ~

chibiegg

June 29, 2024
Tweet

More Decks by chibiegg

Other Decks in Technology

Transcript

  1. © SAKURA internet Inc. Stable Diffusionの使い⽅と 追加学習によるLoRAの作成 ~GPUコンテナサービス “⾼⽕⼒ DOK”

    の活⽤~ 2024-06-29 @ OSC2024 Hokkaido さくらインターネット 技術推進統括担当 執⾏役員 / CIO / CISO 江草 陽太 ※ ⾼⽕⼒ DOK Stable Diffusion による⽣成画像
  2. 江草 陽太 【所属】 • さくらインターネット株式会社 執⾏役員 技術推進統括担当 兼 CISO 兼

    CIO • BBSakura Networks株式会社 取締役 【経歴】 • ヴィアトール学園 洛星中学・⾼等学校 • ⼤阪⼤学⼯学部電⼦情報⼯学科情報通信⼯学専攻 • 個⼈事業主 (⼤学⽣時代に開業) • ⼤阪⼤学⼤学院⼯学研究科中退 【外部】 • U-22プログラミングコンテスト実⾏委員⻑ など 【趣味】 旅⾏/温泉/写真/電⼦⼯作/プログラミング/かわいい服 2 @chibiegg
  3. © SAKURA internet Inc. • 参考情報: さくらのクラウド GPUプラン における Docker環境の構築

    • Stable Diffusion のDockerイメージ作成 • 「⾼⽕⼒ DOK」での Stable Diffusion デモ • 画像⽣成 (推論) • ⾃分の画像を使ったLoRAの作成 (学習) • LoRAを使った画像⽣成 (推論) 今⽇の流れ
  4. © SAKURA internet Inc. Nvidia V100 でのDocker環境構築 1. Linuxカーネルの更新 (先に済ませて再起動する必要がある)

    2. cuda-driverのインストール (再起動が必要) 3. Dockerのインストール 4. nvidia-container-toolkit のインストールと適⽤ CUDAドライバ/Docker/Nvidia Container Toolkit が必要
  5. © SAKURA internet Inc. Nvidia V100 でのDocker環境構築 $ sudo apt

    update $ sudo apt upgrade ‒y $ sudo reboot # kernelの更新があった場合だけで良い 1. Linuxカーネルの更新
  6. © SAKURA internet Inc. Nvidia V100 でのDocker環境構築 $ sudo apt-get

    install linux-headers-$(uname -r) $ sudo apt-key del 7fa2af80 $ wget https://developer.download.nvidia.com/compute/cuda/repos/u buntu2204/x86_64/cuda-keyring_1.1-1_all.deb $ sudo dpkg -i cuda-keyring_1.1-1_all.deb $ sudo apt-get update $ sudo apt-get install cuda-drivers $ sudo reboot 2. cuda-driver のインストール https://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html#ubuntu
  7. © SAKURA internet Inc. Nvidia V100 でのDocker環境構築 $ curl -fsSL

    https://get.docker.com/ | sh 3. Docker のインストール
  8. © SAKURA internet Inc. Nvidia V100 でのDocker環境構築 $ curl -fsSL

    https://nvidia.github.io/libnvidia-container/gpgkey | ¥ sudo gpg --dearmor ¥ -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg ¥ && curl -s -L https://nvidia.github.io/libnvidia- container/stable/deb/nvidia-container-toolkit.list | ¥ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container- toolkit-keyring.gpg] https://#g' | ¥ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list $ sudo apt-get update $ sudo apt install -y nvidia-container-toolkit $ sudo nvidia-ctk runtime configure --runtime=docker $ sudo systemctl restart docker 4. nvidia-container-toolkit のインストール https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#installing-with-apt
  9. © SAKURA internet Inc. Nvidia V100 でのDocker動作確認 $ sudo docker

    run -it --rm --runtime=nvidia --gpus all nvidia/cuda:12.5.0-devel-ubuntu22.04 nvidia-smi ========== == CUDA == ========== CUDA Version 12.5.0 Container image Copyright (c) 2016-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved. This container image and its contents are governed by the NVIDIA Deep Learning Container License. By pulling and using the container, you accept the terms and conditions of this license: https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience. Fri Jun 28 01:50:27 2024 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 555.42.02 Driver Version: 555.42.02 CUDA Version: 12.5 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 Tesla V100-PCIE-32GB Off | 00000000:00:04.0 Off | 0 | | N/A 31C P0 25W / 250W | 1MiB / 32768MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+
  10. © SAKURA internet Inc. Stable Diffusionとは • Stability AI 社によって提供されている画像を⽣成するソフトウェ

    アとそのモデル • モデルには SD 1.5 や SDXL 、SD 3 Mediumなどがある • モデルを拡張する形で追加の学習をさせることができ、学習した モデルが公開されている • txt2img、img2img、inpaint などができる
  11. © SAKURA internet Inc. Stable Diffusionの実⾏⽅法 • Stable Diffusion Web

    UIなどのGUIを利⽤する • Pyhtonのコードからライブラリとして利⽤する • sd-scripts のようなスクリプトを利⽤する
  12. © SAKURA internet Inc. sd-scripts が利⽤できるイメージを作る • Nvidia公式のCUDAイメージをベースにすると良い • nvidia/cuda:12.5.0-devel-ubuntu22.04

    など • sd-scriptsと利⽤するモデルを含めておく • 使いやすいようにエントリーポイントとなるシェルスクリプトを含 めておくと良い https://github.com/chibiegg/sd-docker
  13. © SAKURA internet Inc. Dockerfile FROM nvidia/cuda:12.5.0-devel-ubuntu22.04 ENV DEBIAN_FRONTEND=noninteractive ENV

    PYTHONUNBUFFERED=1 RUN apt update && apt upgrade -y RUN apt install -y wget bzip2 build-essential git git-lfs curl ca-certificates libsndfile1-dev libgl1 python3 python3-pip python3-dev git wget curl WORKDIR /opt RUN git clone https://github.com/kohya-ss/sd-scripts.git WORKDIR /opt/sd-scripts RUN pip3 install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121 RUN pip3 install --upgrade -r requirements.txt RUN pip3 install xformers==0.0.23.post1 --index-url https://download.pytorch.org/whl/cu121 COPY default_accelerate_config.yaml /root/.cache/torch/accelerate/default_config.yaml RUN mkdir /sd-models RUN wget -O /sd-models/sd_xl_base_1.0.safetensors ¥ https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors RUN wget -O /sd-models/sd_xl_refiner_1.0.safetensors ¥ https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors RUN wget -O /sd-models/sdxl_vae.safetensors ¥ https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/resolve/main/sdxl_vae.safetensors ADD lora_config.toml.tmpl /opt/lora_config.toml.tmpl ADD entrypoint.sh /opt/entrypoint.sh ENTRYPOINT ["/opt/entrypoint.sh"]
  14. © SAKURA internet Inc. entrypoint.sh (part 1) (省略) function gen_image

    () { PROMPT="$1" NUM_IMAGES=1 if [ -n "$2" ]; then NUM_IMAGES="$2" fi (省略) EXTRA_ARGS="" if [ -n "${LORA_URL}" ]; then LORA_FILENAME=`basename "${LORA_URL}"` curl -o "/opt/${LORA_FILENAME}" "${LORA_URL}" EXTRA_ARGS="--network_module networks.lora --network_weights /opt/${LORA_FILENAME}" fi (省略) python3 sdxl_gen_img.py ¥ --ckpt ${MODEL_FILE} ¥ --vae /sd-models/sdxl_vae.safetensors ¥ --images_per_prompt ${NUM_IMAGES} ${EXTRA_ARGS} ¥ --sampler ${SAMPLER} --steps ${STEPS} --batch_size ${BATCH_SIZE} ¥ --outdir ${SAKURA_ARTIFACT_DIR} --xformers --fp16 --prompt "${PROMPT}" }
  15. © SAKURA internet Inc. entrypoint.sh (part 2) function gen_lora ()

    { DATA_URL="$1" OUTPUT_NAME="$2" CLASS_TOKENS="$3" (省略) mkdir -p /opt/data curl ${DATA_URL} | tar zxvf - -C /opt/data eval "echo ¥"$(cat /opt/lora_config.toml.tmpl)¥"" > /opt/lora_config.toml (省略) accelerate launch --num_cpu_threads_per_process ${NUM_PROCESS} sdxl_train_network.py ¥ --pretrained_model_name_or_path="${MODEL_FILE}" ¥ --dataset_config='/opt/lora_config.toml' ¥ --output_dir="${SAKURA_ARTIFACT_DIR}" ¥ --output_name="${OUTPUT_NAME}" ¥ --save_model_as=safetensors --prior_loss_weight=1.0 --resolution=1024,1024 ¥ --train_batch_size=1 --train_batch_size=${BATCH_SIZE} -- max_train_epochs=${MAX_TRAIN_EPOCHS} ¥ --learning_rate=1e-4 ¥ --xformers --mixed_precision="fp16" --cache_latents ¥ --gradient_checkpointing --network_module=networks.lora --no_half_vae }
  16. © SAKURA internet Inc. entrypoint.sh (part 3) nvidia-smi TASK=$1 case

    "${TASK}" in "generate" ) gen_image "$2" "$3" ;; "learning" ) gen_lora "$2" "$3" "$4" ;; esac
  17. © SAKURA internet Inc. DockerイメージをV100またはH100で実⾏できるサービス • コンテナレジストリに置いたイメージが利⽤できる • 実⾏時の引数・環境変数などの指定ができる •

    実⾏時の標準出⼒、⽣成されたファイルのダウンロードができる • コンテナ実⾏時間秒数だけの課⾦ • APIでシステムと連携ができる ⾼⽕⼒ DOK とは
  18. © SAKURA internet Inc. 推論 (画像⽣成) ※DOKの使い⽅はイメージ等を指定するだけなので、 今回のデモで使うイメージの使い⽅の説明が中⼼。 第⼀引数 “generate”

    第⼆引数 プロンプト (sd-scripts仕様) 第三匹数 ⽣成枚数 LORA_URL 利⽤するLoRAファイルのURL BATCH_SIZE バッチサイズ SAMPLER サンプラ (ddim, dpmsolver++, k_dpm_2 など) STEPS ステップ数 SEED シード値 環境変数 コマンドライン イメージ名 opendemo.sakuracr.jp/y-egusa/sd15 イメージ
  19. © SAKURA internet Inc. 推論 (画像⽣成) ※DOKの使い⽅はイメージ等を指定するだけなので、 今回のデモで使うイメージの使い⽅の説明が中⼼。 第⼀引数 generate

    第⼆引数 'Top quality, High resolution, 1 cute cat --n EasyNegative' 第三匹数 10 BATCH_SIZE 10 SAMPLER ddim STEPS 50 環境変数 コマンドライン イメージ名 opendemo.sakuracr.jp/y-egusa/sd15 イメージ
  20. © SAKURA internet Inc. 学習 (DreamBooth による LoRAの作成) class+identifier⽅式 •

    全ての画像ファイルについて同じ単語を紐付ける⽅式 • 画像内にある個別の邪魔な要素について指定することが難しい • 画像ファイルを⽤意するだけでできる キャプション⽅式 • 画像ファイル毎に異なるキャプションを⽤意して学習に利⽤する⽅式 • 画像内にある個別の邪魔な要素を排除して学習できる可能性がある • キャプションファイルを⽤意するのが⼤変 https://github.com/bmaltais/kohya_ss/blob/master/docs/train_README-ja.md
  21. © SAKURA internet Inc. キャプション⽅式 単語に紐づけたくない要素も説明することで、 学習させたい単語 “hinatan01” の特徴を絞り込む hinatan01,1girl,solo,long

    hair,looking at viewer,smile,open mouth, bangs,black hair,school uniform, upper body,teeth,serafuku, black eyes,blurry background,zipper,realistic hinatan01,1girl,solo,long hair,looking at viewer,bangs,brown hair, black hair,long sleeves,school uniform,parted lips,serafuku, indoors,sailor collar,blurry,black eyes,lips,depth of field, blurry background,desk,realistic,classroom,school desk hinatan01,1girl,solo,long hair,looking at viewer,bangs,black hair, holding,brown eyes,jacket,upper body,parted lips,blunt bangs, black eyes,lips,blurry background,red jacket,track jacket,realistic ※画像からテキストを⽣成するソフトウェアで 効率的にキャプションを⽣成することも可能
  22. © SAKURA internet Inc. 追加学習 (LoRAの作成)※DOKの使い⽅はイメージ等を指定するだけなので、 今回のデモで使うイメージの使い⽅の説明が中⼼。 第⼀引数 “learning” 第⼆引数

    画像とキャプションをtar.gzにまとめたもののURL 第三引数 保存ファイル名 第四引数 クラストークン (キャプションがない場合に画像に紐付ける⽂字列) BATCH_SIZE バッチサイズ MAX_TRAIN_EPOCHS 最⼤エポック数 環境変数 コマンドライン イメージ名 opendemo.sakuracr.jp/y-egusa/sdxl イメージ
  23. © SAKURA internet Inc. 追加学習 (LoRAの作成)※DOKの使い⽅はイメージ等を指定するだけなので、 今回のデモで使うイメージの使い⽅の説明が中⼼。 第⼀引数 learning 第⼆引数

    https://example.com/hinatan01.tar.gz 第三引数 hinatan01 第四引数 hinatan01 BATCH_SIZE 10 MAX_TRAIN_EPOCHS 10 環境変数 コマンドライン イメージ名 opendemo.sakuracr.jp/y-egusa/sdxl イメージ
  24. © SAKURA internet Inc. LoRAを使った推論 (画像⽣成) 第⼀引数 generate 第⼆引数 Top

    quality, 1 beautiful woman, <lora:hinatan01:1>hinatan01' 第三引数 10 LORA_URL https://example.com/hinatan01.safetensors BATCH_SIZE 25 SAMPLER ddim STEPS 40 環境変数 コマンドライン イメージ名 opendemo.sakuracr.jp/y-egusa/sdxl イメージ
  25. © SAKURA internet Inc. LoRAを使った推論 (画像⽣成) 第⼀引数 generate 第⼆引数 'Top

    quality, 1 beautiful woman, <lora:hinatan01:1>hinatan01, school uniform, serafuku, sailor suit --n worst quality,ugly,bad anatomy,jpeg artifacts' 第三引数 25 LORA_URL https://example.com/hinatan01.safetensors BATCH_SIZE 25 SAMPLER ddim STEPS 40 環境変数 コマンドライン イメージ名 opendemo.sakuracr.jp/y-egusa/sdxl イメージ