Slide 1

Slide 1 text

© SAKURA internet Inc. Stable Diffusionの使い⽅と 追加学習によるLoRAの作成 ~GPUコンテナサービス “⾼⽕⼒ DOK” の活⽤~ 2024-06-29 @ OSC2024 Hokkaido さくらインターネット 技術推進統括担当 執⾏役員 / CIO / CISO 江草 陽太 ※ ⾼⽕⼒ DOK Stable Diffusion による⽣成画像

Slide 2

Slide 2 text

江草 陽太 【所属】 • さくらインターネット株式会社 執⾏役員 技術推進統括担当 兼 CISO 兼 CIO • BBSakura Networks株式会社 取締役 【経歴】 • ヴィアトール学園 洛星中学・⾼等学校 • ⼤阪⼤学⼯学部電⼦情報⼯学科情報通信⼯学専攻 • 個⼈事業主 (⼤学⽣時代に開業) • ⼤阪⼤学⼤学院⼯学研究科中退 【外部】 • U-22プログラミングコンテスト実⾏委員⻑ など 【趣味】 旅⾏/温泉/写真/電⼦⼯作/プログラミング/かわいい服 2 @chibiegg

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

© SAKURA internet Inc. • 参考情報: さくらのクラウド GPUプラン における Docker環境の構築 • Stable Diffusion のDockerイメージ作成 • 「⾼⽕⼒ DOK」での Stable Diffusion デモ • 画像⽣成 (推論) • ⾃分の画像を使ったLoRAの作成 (学習) • LoRAを使った画像⽣成 (推論) 今⽇の流れ

Slide 5

Slide 5 text

※AIによる⽣成

Slide 6

Slide 6 text

© SAKURA internet Inc. Nvidia V100 を直接使う場合

Slide 7

Slide 7 text

© SAKURA internet Inc. Nvidia V100 でのDocker環境構築 1. Linuxカーネルの更新 (先に済ませて再起動する必要がある) 2. cuda-driverのインストール (再起動が必要) 3. Dockerのインストール 4. nvidia-container-toolkit のインストールと適⽤ CUDAドライバ/Docker/Nvidia Container Toolkit が必要

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

© 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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

© 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

Slide 12

Slide 12 text

© 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 | +-----------------------------------------------------------------------------------------+

Slide 13

Slide 13 text

© SAKURA internet Inc. Stable Diffusion

Slide 14

Slide 14 text

© SAKURA internet Inc. Stable Diffusionとは • Stability AI 社によって提供されている画像を⽣成するソフトウェ アとそのモデル • モデルには SD 1.5 や SDXL 、SD 3 Mediumなどがある • モデルを拡張する形で追加の学習をさせることができ、学習した モデルが公開されている • txt2img、img2img、inpaint などができる

Slide 15

Slide 15 text

© SAKURA internet Inc. Stable Diffusionの実⾏⽅法 • Stable Diffusion Web UIなどのGUIを利⽤する • Pyhtonのコードからライブラリとして利⽤する • sd-scripts のようなスクリプトを利⽤する

Slide 16

Slide 16 text

© SAKURA internet Inc. sd-scripts が利⽤できるイメージを作る • Nvidia公式のCUDAイメージをベースにすると良い • nvidia/cuda:12.5.0-devel-ubuntu22.04 など • sd-scriptsと利⽤するモデルを含めておく • 使いやすいようにエントリーポイントとなるシェルスクリプトを含 めておくと良い https://github.com/chibiegg/sd-docker

Slide 17

Slide 17 text

© 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"]

Slide 18

Slide 18 text

© 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}" }

Slide 19

Slide 19 text

© 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 }

Slide 20

Slide 20 text

© 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

Slide 21

Slide 21 text

© SAKURA internet Inc. ⾼⽕⼒ DOK での実演

Slide 22

Slide 22 text

© SAKURA internet Inc. DockerイメージをV100またはH100で実⾏できるサービス • コンテナレジストリに置いたイメージが利⽤できる • 実⾏時の引数・環境変数などの指定ができる • 実⾏時の標準出⼒、⽣成されたファイルのダウンロードができる • コンテナ実⾏時間秒数だけの課⾦ • APIでシステムと連携ができる ⾼⽕⼒ DOK とは

Slide 23

Slide 23 text

© SAKURA internet Inc.

Slide 24

Slide 24 text

© SAKURA internet Inc.

Slide 25

Slide 25 text

© 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 イメージ

Slide 26

Slide 26 text

© 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 イメージ

Slide 27

Slide 27 text

© SAKURA internet Inc. 推論 (画像⽣成)

Slide 28

Slide 28 text

© SAKURA internet Inc. 学習 (DreamBooth による LoRAの作成) class+identifier⽅式 • 全ての画像ファイルについて同じ単語を紐付ける⽅式 • 画像内にある個別の邪魔な要素について指定することが難しい • 画像ファイルを⽤意するだけでできる キャプション⽅式 • 画像ファイル毎に異なるキャプションを⽤意して学習に利⽤する⽅式 • 画像内にある個別の邪魔な要素を排除して学習できる可能性がある • キャプションファイルを⽤意するのが⼤変 https://github.com/bmaltais/kohya_ss/blob/master/docs/train_README-ja.md

Slide 29

Slide 29 text

© SAKURA internet Inc. class+identifier⽅式 全ての画像を“hinatan01”という単語として学習させる 服や背景、ポーズや表情など、 「学習してほしい特徴」ではない要素も単語に紐づいてしまう

Slide 30

Slide 30 text

© 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 ※画像からテキストを⽣成するソフトウェアで 効率的にキャプションを⽣成することも可能

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

© 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 イメージ

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

© SAKURA internet Inc. 推論 (画像⽣成)

Slide 35

Slide 35 text

© SAKURA internet Inc. LoRAを使った推論 (画像⽣成) 第⼀引数 generate 第⼆引数 'Top quality, 1 beautiful woman, 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 イメージ

Slide 36

Slide 36 text

© SAKURA internet Inc. 推論 (画像⽣成)

Slide 37

Slide 37 text

© SAKURA internet Inc. ⾼⽕⼒ DOK を利⽤することで、決まった処理をパラメータを変えな がら何度も実⾏したり、API連携でシステムに機械学習を簡単に導⼊す ることができる。

Slide 38

Slide 38 text

© SAKURA internet Inc. ありがとうございました