高火力 DOK × Stable Diffusion ハンズオン

# はじめに

---

## Stable Diffusionとは？

Stable Diffusion（ステイブル・ディフュージョン）は、2022年に公開されたディープラーニング（深層学習）のtext-to-imageモデルになります。

1. テキストから画像を生成する
2. 追加学習が可能

# まずは試してみる

---

## 高火力 DOKにログインする

[さくらのクラウド](https://cloud.sakura.ad.jp/)にログインしてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/2a6f68ee-639a-472b-b285-5f1d252b2115.png)


---

## ログインする

ユーザーコード・会員ID・パスワードは指定したものを使ってください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/76d70cfc-81aa-477a-ad2e-c981506249fe.png)


---

## 高火力 DOKを選択する

デザインがレスポンシブなので、<font color="red">高火力 DOKのアイコンが下にある</font>かも

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/3557e3f9-8aab-41e4-baab-049d7e9e9aab.png)

---

## タスクを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/65b9b208-5bdc-444a-ade8-22dcca2bafa2.png)

---

## タスクの新規作成を選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/19cf9826-8f96-4dc3-8c57-f58fae81d528.png)

---

## 以下の通りに入力

環境変数は `+ 追加` ボタンを押して追加してください。

- イメージ  
dok-handson.sakuracr.jp/sdxl
- コマンド	
generate 'Top quality, 1 man drink coke, smiling'
- 環境変数
  - BATCH_SIZE = 25
  - SAMPLER = ddim
  - STEPS = 40

---

入力イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/12720b45-2d4b-4363-8186-08fa18a462f1.png)


---

入力が終わったら、 `作成` ボタンを押してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/74313c10-8107-42c8-b340-55d16a3fc1f5.png)

---

確認ダイアログが出るので、　`作成` ボタンを押してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/bae8e636-6aec-496c-be2c-5bcb5b7366bb.png)


---

実行中の画面です。 `状態` のところの文字で状況が判断できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/311138ae-ca9f-47f5-8a4b-a4f5bdd17fa0.png)

---

## DOKのタスクで行っていること

1. Dockerイメージの取得
1. コンテナの実行
1. コンテナの破棄

---

## メモ

- Dockerイメージの取得には、それなりに時間がかかります（10GB超えもざらなので…）
- コンテナ実行時にモデルを取得するものが多く、そこも時間がかかります
- HTTP URIは、タスク実行中にアクセスできるHTTPサーバーです  
スクリプト側でリクエストを受け取って処理できます

---

## 実行完了後

実行完了すると、 `アーティファクト` の項目に `ダウンロード` が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e548a6a7-63e2-4693-93c8-a3844e1fb373.png)

---

## tar.gzファイルの解凍

macOSの場合はダブルクリック。Windowsの場合はコマンドプロンプト、または[7-Zip](https://7-zip.opensource.jp/)を利用して解凍してください。

---

## タスクをコピーしてみましょう！

タスクをコピーして、いろいろな条件で実行してみましょう！

---

## 追加学習したモデルを試す

タスクの条件を以下のように変更してください。 `<lora:irasutoya:1>irasutoya` の部分が、追加学習したいらすとやさん風のモデルを指定する部分になります。 `LORA_URL` は、あらかじめアップロードしているURLです。

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

---

## 画像を追加学習する

画像を追加学習する際には、以下のステップが必要になります。

1. 画像を用意する
2. キャプションを用意する
3. 画像をアップロードする
4. 画像のURLを指定して、追加学習する
5. できあがったモデルをDLし、アップロードする
6. モデルを指定して、画像を生成する

---

### 画像を用意する

画像は任意ですが、同様のテイストのイラストや写真を用意する必要があります。自分だけが写っている写真や、[いらすとやさん](https://www.irasutoya.com/)などのフリーイラストを用意してください。

---

### キャプションを用意する

各画像についてキャプション付けを行います。これは[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)）

実行する際にはPythonが必要です。

```bash
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`）を任意の場所にアップロードします。

以下は、さくらのクラウドのオブジェクトストレージを利用する例ですが、ご自身で別なクラウドストレージを使ってもらっても大丈夫です

---

### オブジェクトストレージを選択する

さくらのクラウドのホームに戻ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/dfa6e2ab-15ac-4aad-9fd7-c10506236821.png)

---

### オブジェクトストレージを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/052c32eb-b167-4698-9509-3d927cbd6d54.png)

---

### サイトを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/4f659502-9230-45ff-9150-978a293d48a4.png)

---

### バケットを選択

さらに `バケットの追加` ボタンを押してください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/403cda92-cb9f-4e2a-8031-14240a0cb4e7.png)

---

### バケットの追加

分かりやすいものを設定してください

![FireShot Capture 541 - オブジェクトストレージ - secure.sakura.ad.jp.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/24cbf179-bff1-44a6-97f9-8628b2116f1a.jpeg)


---

### アップロード

作成したバケットを選んで、 `アップロード` ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/3e0070a1-e4d8-45c3-bc9c-3ee8e17a4752.png)

---

### アップロードする

`public-read` を付けておいてください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/a7d6bc4b-a66c-4f9d-87ed-5f513299c704.png)

---

アップロードしたら、以下のURLで画像ファイルにアクセスできるか確認してください。このURLを次の学習タスクで利用します。

```
https://s3.isk01.sakurastorage.jp/(バケット名)/images.tar.gz
```

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

---

### 画像のURLを指定して、追加学習する

DOKにて、学習を実行します。タスクを作成し、以下の情報を入力してください。

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

---

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

![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分程度かかります。

---

## タスクのコピー

一番最初に実行、完了したタスクを開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/64d53215-3635-4e19-85bb-2e4f88754a29.png)

---

### コピーする

`コピーして新規作成` を押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/7ccbae7d-091b-4bb4-a3f5-b54913699907.png)

---

### 追加学習したモデルを指定する

条件を若干変更して、タスクを実行してください。 `<lora:irasutoya:1>irasutoya` の部分が、学習したモデルを指定する部分になります。 `LORA_URL` は、アップロードしたURLを指定してください。

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

---

### タスクを再実行する

タスクを再度実行して、できあがった画像がいらすとやさん風になっているか確認してください。

---

# 一旦終了

ハンズオンの内容は以上になります。DOKの面白さとして「タスクをたくさん作成できる」点があります。ぜひタスクをコピーして、さまざまな条件で実行してください。

---

# ここからの流れ

ここからはDockerイメージの作成を行います。作成には1時間以上かかると思われますので、ハンズオン実施中には終わらないはずです。

---

# Dockerイメージの作り方

ここからはテクニカルな内容になります

---

## 必要なもの

- ターミナル

---

## オプショナル

- Docker

---

- 手元にDocker環境がある方は、ローカルでも構築可能です
- Docker環境がない場合は、さくらのクラウドを利用できます

---

## さくらのクラウドでサーバを立てる

さくらのクラウドのホームに戻り、 `さくらのクラウド（IaaS）` を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/c9c556f6-7d17-4585-8eac-c5fe16c716cf.png)

---

## 追加ボタンを押す

`サーバ` の `追加` ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/c72d9011-3eb7-491a-ab9b-a093f29e9e5d.png)

---

## 情報を入力する

サーバのスペックを以下のように設定してください

- 仮想コア  
4
- メモリ  
4GB
- 新規ディスクを作成
- アーカイブ  
Ubuntu Server 24.04.1 LTS 64bit
- ディスクサイズ  
100GB
- インターネットに接続
- 管理者のパスワード  
十分分かりづらいもの
- ホスト名  
分かりやすいもの（dokなど）
- 公開鍵  
必要であれば
- サーバーの名前  
分かりやすいもの（dokなど）


---

## サーバを追加

`作成` ボタンを押します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/f7be13e9-ae6b-4447-8653-739dc8702c73.png)

---

## 確認する

確認ダイアログが出るので、 `作成` ボタンを押してください

![スクリーンショット 2025-02-19 12.17.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/33d1672a-413e-4d4c-abd6-62ce2bfc8871.png)

---

## サーバを確認

少し待つと、サーバが立ち上がります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e922309c-07c1-47a1-9488-10f64f1b6394.png)

---

## サーバに接続する

サーバへは ssh で接続してください。ユーザー名は `ubuntu` です。

---

## サーバ内での作業

ここからはサーバ内（またはローカル）での作業になります

---

### Dockerのインストール

Dockerをインストールします

```
$ sudo apt-get update -y
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh ./get-docker.sh
```

---

## Dockerを試す

今のコマンドが通れば、Dockerはインストールされています

```
$ sudo docker run hello-world

Hello from Docker!
  :
For more examples and ideas, visit:
 https://docs.docker.com/get-started/
```

---

## ベースになるリポジトリ

ベースは[chibiegg/sd\-docker](https://github.com/chibiegg/sd-docker)を利用しています。実際の内容は上記リポジトリを参照してください。

```bash
git clone https://github.com/chibiegg/sd-docker.git
cd sd-docker
```

---

### コンテナレジストリの用意

Dockerイメージを登録するコンテナレジストリを作成します。さくらのクラウドのホームで、`さくらのクラウド` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e247a30c-bbc7-fb7e-136d-71ee2a795533.png)

---

左側のメニューの `グローバル` の中にある `コンテナレジストリ` を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/58707eb1-b602-437e-bfcc-2edcfa15c3e5.png)

---

`追加` を押して、コンテナレジストリを作成します。最低限、以下の入力が必要です。

| 項目                 | 設定                                                                      |
| -------------------- | ------------------------------------------------------------------------- |
| 名前                 | 分かりやすい、任意の名前を入力してください                                |
| コンテナレジストリ名 | ドメイン名に使われます。以下では、 `EXAMPLE.sakuracr.jp` として説明します |
| 公開設定             | Pullのみとします                                                          |

---

### ユーザーの作成

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

![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イメージのビルド

`EXAMPLE.sakuracr.jp` の部分は、作成したコンテナレジストリのドメイン名に置き換えてください。また、 `sd-docker` は任意の名前で大丈夫です（以下はその名称で読み替えてください）。

```bash
sudo docker build \
-f Dockerfile.sdxl \
-t EXAMPLE.sakuracr.jp/sd-docker:latest .
```

---

### コンテナレジストリへのログイン

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

```bash
sudo docker login EXAMPLE.sakuracr.jp
```

---

### イメージのプッシュ

作成したイメージをコンテナレジストリにプッシュします。イメージサイズが大きいので、数十分かかります。

```bash
sudo docker push EXAMPLE.sakuracr.jp/sd-docker:latest
```

---

##  DOKで実行する

リポジトリがプッシュできたら、一番最初に行ったようにDOKでタスクを実行します。

- イメージ  
EXAMPLE.sakuracr.jp/sd-docker
- コマンド	
generate 'Top quality, 1 man drink coke, smiling'
- 環境変数
  - BATCH_SIZE = 25
  - SAMPLER = ddim
  - STEPS = 40

---

# お片付け

忘れずに停止・削除をお願いします

- さくらのクラウドのサーバ
- オブジェクトストレージ

DOKについては、特に作業はありません