DOKを使ってStable Diffusionをファインチューニングする

[DOK](https://www.sakura.ad.jp/koukaryoku-dok/)はコンテナー型のGPUサービスで、NVIDIA V100やH100を実行時間課金で利用できるサービスです。

[コンテナー型GPUクラウドサービス 高火力 DOK（ドック） | さくらインターネット](https://www.sakura.ad.jp/koukaryoku-dok/)

今回はこのDOKを使って、Stable Diffusionに対して[いらすとやさん](https://www.irasutoya.com/)の画像をファインチューニング、出力してみました。

## 結果

結果は以下のようになっています。覚えさせる画像によって、結果は大きく影響を受けそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/ddc58129-678c-d748-2f61-62299f64611a.png)


## 初級編：とりあえず試す

学習済みのデータを使って実行してみたい方は、DOKにて新しいタスクを作成し、以下の情報を入力してください。

| 項目     | 設定                                                                              |
| -------- | --------------------------------------------------------------------------------- |
| イメージ | dok-handson.sakuracr.jp/sdxl                                                      |
| コマンド | generate 'Top quality, 1 man drink coke, smiling, <lora:irasutoya:1>irasutoya' 10 |
| 環境変数 | BATCH_SIZE = 25<br />LORA_URL = https://s3.isk01.sakurastorage.jp/mg-sd-demo/irasutoya.safetensors<br />SAMPLER = ddim<br />STEPS = 40                                                                                  |

`<lora:irasutoya:1>irasutoya` が、いらすとやさんを使った学習データを利用する指定になります。また、その学習結果データを `LORA_URL` として指定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/5f007e7d-4c7c-7531-92f5-d10bbcaf1701.png)


## 中級編：学習データの作り方

上記タスクで利用したDockerイメージ、学習データの作成方法は以下の通りです。ベースとしては、[chibiegg/sd\-docker](https://github.com/chibiegg/sd-docker)を使っています。

### 学習データを用意する

学習データは[いらすとやさん](https://www.irasutoya.com/)から拝借しています。人物一人、顔がアップになっているものだけをピックアップしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/7310efb5-ebbc-9846-3338-2b895ab26d00.png)


### キャプションを作成する

各画像についてキャプション付けを行います。これは[kohya\-ss/sd\-scripts](https://github.com/kohya-ss/sd-scripts)にある `finetune/make_captions.py` を利用しています。（via [Google Colab で BLIP とやらで自動キャプショニングを試してみる \- ジャコ Lab](https://zako-lab929.hatenablog.com/entry/20240730/1722343919)）

```py
python finetune/make_captions.py --batch_size 10 /path/to/images
```

実行すると、同じフォルダ内に `*.caption` というファイルが生成されます。内容は `the cartoon girl is writing a book` のようなものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/1e9befef-79b3-2d13-f0ae-453fd5e6e9de.png)


### 圧縮する

画像とキャプションファイルを圧縮します。

```sh
cd /path/to/images
tar cvfz images.tar.gz *
```

### ファイルをアップロード

圧縮したファイル（`images.tar.gz`）を任意の場所にアップロードします。たとえば、さくらのクラウドのオブジェクトストレージなどになります。たとえば、 `YOUR_BUCKET_NAME` というバケットを作ってアップロードすれば、以下のようなURLになります。ファイルは公開設定にしておきます。

```
https://s3.isk01.sakurastorage.jp/YOUR_BUCKET_NAME/images.tar.gz
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2bd78848-b1a1-9437-b2bf-0f747db00c76.png)

### タスクを作成する

学習を実行します。以下の情報を入力してください。

| 項目     | 設定                                                                              |
| -------- | --------------------------------------------------------------------------------- |
| イメージ | dok-handson.sakuracr.jp/sdxl                                                      |
| コマンド | learning https://s3.isk01.sakurastorage.jp/YOUR_BUCKET_NAME/images.tar.gz irasutoya irasutoya |
| 環境変数 | BATCH_SIZE = 10<br />MAX_TRAIN_EPOCHS = 10 |

結果として、 *.tar.gz のファイルがダウンロードでき、解凍すると `irasutoya.safetensors` といったファイルが取得できます。これを任意のWebサーバーなどにアップロードし、 `LORA_URL` にて指定して実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/460c189f-e930-cfed-edaa-7d6f248e0a63.png)

なお、学習はV100の場合は30〜40分程度、H100の場合は10分程度かかります。

## 上級編：イメージの作成

`dok-handson.sakuracr.jp/sdxl` にて指定したDockerイメージの作成方法です。

### コンテナレジストリの作成

さくらのクラウドのLAB機能として提供しているコンテナレジストリにて、新しいコンテナレジストリを作成します。情報は以下の通りです。作成するコンテナを `YOUR_CONTAINER_REGISTRY.sakuracr.jp` としますが、実際には任意の名前を指定してください。

| 項目                 | 設定                    |
| -------------------- | ----------------------- |
| 名前                 | 任意の名称です          |
| コンテナレジストリ名 | YOUR_CONTAINER_REGISTRY |
| 公開設定             | Pullのみ                |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/81730a56-78dd-5e1d-f68c-3bc395dbf28a.png)

#### ユーザーの作成

コンテナレジストリを作成したら、作成したコンテナレジストリを一覧でダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/6425f493-0ce1-db62-f322-64a51867ce58.png)

詳細表示にて、ユーザータブをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/79bdc51c-ea66-8d8f-c801-8f54346cf960.png)

追加ボタンを押し、ユーザーを作成します。 `YOUR_USER_NAME` と `PASSWORD` は任意のものを指定してください。

| 項目           | 設定           |
| -------------- | -------------- |
| ユーザー名     | YOUR_USER_NAME |
| パスワード     | YOUR_PASSWORD  |
| ユーザ権限設定 | All            |

### Dockerイメージの作成

DockerイメージはLinuxサーバー上で行います。今回はUbuntu 24.04を使っています。Dockerが使える環境であれば、Windows + WSL2でも問題ありません。macOSの場合、アーキテクチャが異なるので動かせないかも知れません（未検証です）。

内容は[chibiegg/sd\-docker](https://github.com/chibiegg/sd-docker)にあるものを利用しています。

```bash
git clone https://github.com/chibiegg/sd-docker.git
cd sd-docker
export IMAGE=YOUR_CONTAINER_REGISTRY.sakuracr.jp/sdxl:latest

docker build -t ${IMAGE} -f Dockerfile.sdxl .
```

### イメージのアップロード

作成したイメージをアップロードします。まず、先ほどのコンテナレジストリにログインします。ログインIDとパスワードが求められるので、作成したものを入力してください。

```bash
docker login YOUR_CONTAINER_REGISTRY.sakuracr.jp
```

その後、イメージをプッシュします。イメージサイズが大きいので、数十分かかります。

```bash
docker push ${IMAGE}
```

### タスクの作成

タスクはさくらのクラウドのDOKにて作成します。これまでの書いてきたタスクで、イメージを `YOUR_CONTAINER_REGISTRY.sakuracr.jp/sdxl:latest` と指定して実行してください。

## まとめ

今回はStable Diffusionを使って、いらすとやさんの画像をファインチューニングしました。まずは実行できるのみ、次に学習データの作成、そしてDockerイメージの作成と段階的に進められるようにしています。ぜひ、試してみてください。

DOKはタスクを多数立ち上げて、後は結果を待つのみと言った使い方ができます。ぜひAI・機械学習に活用してください。

[コンテナー型GPUクラウドサービス 高火力 DOK（ドック） \| さくらインターネット](https://www.sakura.ad.jp/koukaryoku-dok/)