Stable Diffusion を使用した Text2Image
この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues
reComputerでローカル LLM テキストから画像生成を実行する方法
はじめに
テキストから画像生成モデルは、テキスト記述から画像を生成する人工知能(AI)モデルの一種です。これらのモデルは、シーンを説明する文章や段落のようなテキスト入力を受け取り、その記述に基づいて画像を生成します。
これらのモデルは、テキスト記述と対応する画像のペアを含む大規模なデータセットで訓練され、テキスト情報と視覚情報の関係を理解することを学びます。
テキストから画像生成モデルは近年大きな進歩を遂げていますが、高品質で多様な画像を生成し、テキスト記述に正確に一致させることは、AI研究における課題の一つとして残っています。
概要
このチュートリアルでは、ローカル LLM テキストから画像生成をデプロイして実行するいくつかの方法を探ります:
- 仮想環境を作成する(TensorFlow と PyTorch の両方)
- 1.1. Keras Stable Diffusion を使用した例を作成
- 1.2. Hugging Face で利用可能なモデルの1つを使用した例を作成
- 1.3. Keras と Hugging Face の両方で API を呼び出して画像を生成する小さな Python API を作成
- Nvidia コンテナを使用
トラブルシューティング
開始する前に、利用可能なメモリを増やすために取れるいくつかの手順を以下に示します。
デスクトップ GUI を無効化します。Jetson を SSH 経由で使用できます。これにより約 800MB のメモリを節約できます。
ZRAM を無効化し、Swap を使用します。
これらのヒントとその実装方法については、Nvidia Jetson AI Lab を参照してください。
必要条件
このチュートリアルでは、Nvidia Jetson Orin NX 16GB が必要です。

また、TensorFlow と PyTorch がインストールされていることを確認する必要がありますが、ここではその手順を説明します。
ステップ 1 - 仮想環境を作成する
Keras は TensorFlow または PyTorch をバックエンドとして使用できます。Hugging Face は主に PyTorch を使用します。
TensorFlow と PyTorch をインストールしましょう。
Jetson Orin NX 用の TensorFlow と PyTorch のインストール方法は Nvidia のウェブサイト に記載されています。
TensorFlow と PyTorch をグローバルにインストールするか、仮想環境にインストールすることができます。このチュートリアルでは仮想環境を使用します。
仮想環境を使用することで、プロジェクトやパッケージのバージョンが混在するリスクを回避できます。
これは最良の方法ですが、Nvidia のサイトではグローバルメソッドを推奨しています。
TensorFlow
仮想環境を作成します(Keras の例で使用するため、名前を kerasStableEnvironment
にしています。他の名前を使用しても構いません)。
sudo apt install python3.8-venv
python -m venv kerasStableEnvironment
作成後、仮想環境をアクティブ化します。
source kerasStableEnvironment/bin/activate
アクティブ化されると、プロンプトの前に仮想環境の名前が表示されます。

仮想環境に入ります。
cd kerasStableEnvironment
PIP をアップグレードし、いくつかの依存関係をインストールします。
pip install -U pip
pip install -U numpy grpcio absl-py py-cpuinfo psutil portpicker six mock requests gast h5py astor termcolor protobuf keras-applications keras-preprocessing wrapt google-pasta setuptools testresources
Jetpack 5.1.1 用の TensorFlow をインストールします。
JetPack のバージョンを確認するには、以下のコマンドを実行します。
dpkg -l | grep -i jetpack
結果として JetPack バージョンが表示されます。

pip install --extra-index-url https://developer.download.nvidia.com/compute/redist/jp/v511 tensorflow==2.12.0+nv23.05
他の JetPack バージョンを使用している場合は、正しい URL を Nvidia のウェブサイト で確認してください。
次に、TensorFlow のインストールを確認します。
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
以下のような行が返されるはずです。
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
PyTorch
いくつかの依存関係をインストールします。
sudo apt install libopenblas-dev
次に、JetPack 5.1.1 用の PyTorch をインストールします。
pip install --no-cache https://developer.download.nvidia.com/compute/redist/jp/v511/pytorch/torch-2.0.0+nv23.05-cp38-cp38-linux_aarch64.whl
インストールと CUDA が利用可能かどうかを確認します。
python -c "import torch; print(torch.cuda.is_available())"
True と表示されるはずです。
これで TensorFlow と PyTorch の両方がインストールされましたので、Keras をインストールして画像を作成しましょう。
1.1 Keras
PyTorch と TensorFlow をインストールした後、テキストプロンプトから画像を作成する準備が整いました。 仮想環境がまだアクティブであることを確認してください。
KerasCV には、Stability.ai のテキストから画像生成モデル Stable Diffusion の実装(他にもいくつかの実装があります)が含まれています。
KerasCV 実装を使用することで、XLA コンパイルや混合精度サポートなどのパフォーマンス向上の利点を活用できます。
Keras とその依存関係をインストールします。ここでは、インストール済みの TensorFlow(または PyTorch)バージョンと互換性のあるバージョンを使用します。
pip install keras-cv==0.5.1
pip install keras==2.12.0
pip install Pillow
お好みのエディタを開き、以下の例を入力します。
vi generate_image.py
import keras_cv
import keras
from PIL import Image
keras.mixed_precision.set_global_policy("mixed_float16")
model = keras_cv.models.StableDiffusion(
img_width=512, # 他のサイズも選択可能ですが、128の倍数である必要があります
img_height=512, # 上記と同様
jit_compile=True
)
prompt = "a cute magical flying dog, fantasy art, golden color, high quality, highly detailed, elegant, sharp focus, concept art, character concepts, digital painting, mystery, adventure"
image = model.text_to_image(
prompt,
num_steps=25, # 画像の品質
batch_size=1 # 一度に生成する画像の数
)
Image.fromarray(image[0]).save("keras_generate_image.png")
スクリプトを実行中の統計情報は以下の通りです。

しばらくすると、以下のような結果が得られます。

ステップ 1.2 - Hugging Face
Hugging Face は、機械学習のための GitHub のような存在です。開発者が ML モデルを構築、デプロイ、共有、トレーニングできるプラットフォームを提供します。
Hugging Face は、ML モデルのダウンロードやトレーニングを簡単にする Transformers Python ライブラリでも知られています。
利用可能なモデルをいくつか試してみましょう。 Hugging Face にアクセスし、モデルを確認します。
左側には、どの種類のモデルを表示するかを選択できるフィルターがあります。

多くのモデルが利用可能ですが、ここではテキストから画像を生成するモデルに集中します。
仮想環境
上記と同様に仮想環境を作成し、Hugging Face を使用してパッケージのバージョンを混乱させたり、不要なパッケージをインストールしたりしないようにします。
python -m venv huggingfaceTesting
source huggingfaceTesting/bin/activate
仮想環境を作成した後、環境に入ります。 上記の手順に従って PyTorch をインストールします。
cd huggingfaceTesting
モデル
Hugging Face には多くのテキストから画像へのモデルがあります。理論的にはこれらは Jetson で動作するはずですが、実際には動作しません。
stable-diffusion-v1-5
Runaway の stable-diffusion-v1-5 をテストします。
モデルカードには、モデルを使用するために必要なすべての情報が記載されています。

Hugging Face の diffusers ライブラリを使用します。 仮想環境内(かつアクティブな状態)で依存関係をインストールします。
pip install diffusers transformers accelerate
すべての依存関係をインストールしたら、モデルを試してみましょう。 お好みのエディタを使用して、以下のコードをコピーします(モデルカードページにも記載されています)。
from diffusers import StableDiffusionPipeline
import torch
model_id = "runwayml/stable-diffusion-v1-5"
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16)
pipe = pipe.to("cuda")
prompt = "a master jedi cat in star wars holding a lightsaber, wearing a jedi cloak hood, dramatic, cinematic lighting"
image = pipe(prompt).images[0]
image.save("cat_jedi.png")
モデルを試してみましょう。
python stableDiffusion.py
注意: これは多くのストレージを消費します。モデルのチェックポイントがダウンロードされますが、これは一度だけ行われます。

しばらくすると、以下のような結果が得られます。

SDXL-Turbo
別のモデルも試してみましょう。Stability AI の SDXL Turbo です。 以下のコードをコピーします。
from diffusers import AutoPipelineForText2Image
import torch
pipe = AutoPipelineForText2Image.from_pretrained("stabilityai/sdxl-turbo", torch_dtype=torch.float16, variant="fp16")
pipe.to("cuda")
prompt = "full body, cat dressed as a Viking, with weapon in his paws, battle coloring, glow hyper-detail, hyper-realism, cinematic"
image = pipe(prompt=prompt, num_inference_steps=1, guidance_scale=0.0).images[0]
image.save("sdxl-turbo.png")
このプロンプトは Daria Wind による Medium 記事から引用されています
このモデルは画像生成が非常に高速です。スクリプトの実行から終了まで約 30 秒しかかかりません。 以下が結果です。

アニメやサイバーパンクに特化したモデルなど、他のモデルも試すことができます。
一部のモデルが動作しない場合があります。これは、メモリ、利用可能なCPU、またはSwapメモリなど、いくつかの要因による可能性があります。
ステップ 1.3 - 小さなAPIを作成する
次に、Flaskを使用して小さなAPIを作成し、プロンプトを与えて画像を生成し、それを呼び出し元に返すAPIを作成します。
Jetsonが稼働していると仮定し、APIを呼び出して画像を生成できるようにしたいとします。つまり、個人用のLLM画像生成APIです。
これを実現するプロジェクトはすでに存在しています(後で紹介します)が、自分で作成することに勝るものはありません。
新しい仮想環境を作成します。
python -m venv imageAPIGenerator
環境をアクティブ化してその中に入ります。
source imageAPIGenerator/bin/activate
cd imageAPIGenerator
ここではFlaskを使用します。FlaskはPythonで書かれたWebアプリケーションフレームワークで、今回の目的には十分な軽量さです。
Flaskをインストールします。
pip install Flask
インストール後、必要なその他の依存関係をインストールします。デモ目的で、依存関係が最も少ないKerasを使用します。
TensorFlowをインストールします。上記の手順に従ってください。 次に、Kerasをインストールします。
pip install keras-cv==0.5.1
pip install keras==2.12.0
pip install Pillow
では、アプリケーションの記述を開始しましょう。
vi app.py
Flaskが何であるか、または何をするのか知らない方のために、簡単な例を試してみましょう。
from flask import Flask
app = Flask (__name__)
@app.route("/generate_image")
def generate_image_api():
return "<h2>Hello World !</h2>"
if __name__ == "__main__":
app.run(host='',port=8080)
実行するには、Pythonスクリプトを実行します。
python app.py
以下のような出力が表示されるはずです。

次に、ブラウザを開き、8080ポートでJetsonデバイスにアクセスしてみてください。


ここで行ったことは、Flaskクラスをインポートすることです。
import Flask
次に、Flaskクラスのインスタンスを作成しました。
app = Flask(__name__)
次に、ルートデコレーターを作成して、どのURLが関数をトリガーするかをFlaskに伝えます。
@app.route("/generate_image")
URLでgenerate_imageを使用すると、関数がトリガーされます。
def generate_image_api():
return "<h2>Hello World !</h2>"
また、curlを使用してAPIにアクセスすることもできます。
curl http://192.168.2.230:8080/generate_image

vi app.py
そしてコードを貼り付けます。
from flask import Flask, request, send_file
import random, string
import keras_cv
import keras
from PIL import Image
#define APP
app = Flask (__name__)
#option for keras
keras.mixed_precision.set_global_policy("mixed_float16")
# generate custom filename
def generate_random_string(size):
"""指定されたサイズのランダムな文字列を生成します。"""
return ''.join(random.choices(string.ascii_letters + string.digits, k=size))
"""
これは画像を生成し、
ランダムに作成されたファイル名で保存する関数です。
"""
def generate_image(prompt):
model = keras_cv.models.StableDiffusion (
img_width=512, # 別のサイズを選択できますが、128の倍数である必要があります
img_height=512, # 上記と同じ
jit_compile=True
)
image = model.text_to_image (prompt,
num_steps = 25,
batch_size = 1
)
# 画像ファイル名
filename = generate_random_string(10) + ".png"
Image.fromarray(image[0]).save(filename)
return filename # クライアントに送信するためにファイル名を返します
#define routes
# プロンプトを取得するために使用します。GETを使用して受け取ります。
@app.route("/generate_image", methods=["GET"])
def generate_image_api():
# プロンプトを取得
prompt = request.args.get("prompt")
if not prompt:
# デフォルトのプロンプトを定義します
prompt = "A cinematic shot of a baby racoon wearing an intricate italian priest robe."
image_name = generate_image(prompt)
return send_file(image_name, mimetype='image/png')
if __name__ == "__main__":
app.run(host='0.0.0.0',port=8080)
注意: このコードはインターネット向けに準備されたものではありません。セキュリティ対策は一切ありません。
これを実行します。
ブラウザでURL http://jetsonIP:8080/generate_image を入力して待ちます。
プロンプトを指定しない場合、設定したデフォルトのプロンプトが使用されます。
CLIでは画像が生成されている様子が確認できます。

ブラウザでは、しばらくすると画像が表示されます。

画像が送信されたことも確認できます。

curlを使用して画像を取得し保存することもできます。

プロンプトを指定する場合(推奨)、URLは以下のようになります。 http://jetsonIP:8080/generate_image?prompt=<your_prompt>
私たちはこの例を拡張して、ユーザー入力用のテキストボックスや美しい背景などを備えたより良いページを作成することができます。しかし、これは別のプロジェクトのためのものです。
ステップ 2 - Nvidia LLM
Stable Diffusion v1.5
Jetson Containersプロジェクトを使用して、AUTOMATIC1111によるstable-diffusion-webuiを実行できます。
Jetson ContainersプロジェクトはNVIDIA社員のDusty Franklinによって運営されています。
NVIDIAには、機械学習に関する多くのチュートリアルを提供するNVIDIA Jetson Generative AI Labプロジェクトがあります。
ここでは、Stable Diffusionのチュートリアルを使用します。
GitHubリポジトリをクローンし、リポジトリに入り、依存関係をインストールします。
git clone https://github.com/dusty-nv/jetson-containers
cd jetson-containers/
sudo apt update; sudo apt install -y python3-pip
pip3 install -r requirements.txt
必要なものがすべて揃ったので、stable-diffusion-webui autotagを使用してコンテナを実行します。
./run.sh $(./autotag stable-diffusion-webui)
これによりコンテナが実行されます。
しばらくすると、互換性のあるコンテナが見つかったことが表示され、続行するかどうか尋ねられます。
Found compatible container dustynv/stable-diffusion-webui:r35.3.1 (2024-02-02, 7.3GB) - would you like to pull it? [Y/n]
コンテナのダウンロードが開始されます。

ダウンロードが完了すると、モデルがダウンロードされ、ポート7860でサーバーが実行されます。
ここでは、最初はうまく動作しませんでした。チェックポイントが表示されず、リフレッシュボタンを何度押しても選択できませんでした。

調べてみると、ディスク容量が100%使用されていました。
feiticeir0@JetsonOrin:~$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/nvme0n1p1 79G 79G 0 100% /
none 7,4G 0 7,4G 0% /dev
tmpfs 7,6G 0 7,6G 0% /dev/shm
tmpfs 1,6G 19M 1,5G 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 7,6G 0 7,6G 0% /sys/fs/cgroup
/dev/loop0 162M 162M 0 100% /snap/chromium/2797
/dev/loop2 128K 128K 0 100% /snap/bare/5
/dev/loop1 70M 70M 0 100% /snap/core22/1125
/dev/loop3 65M 65M 0 100% /snap/cups/1025
/dev/loop4 92M 92M 0 100% /snap/gtk-common-themes/1535
/dev/loop6 162M 162M 0 100% /snap/chromium/2807
/dev/loop5 483M 483M 0 100% /snap/gnome-42-2204/174
/dev/loop7 35M 35M 0 100% /snap/snapd/21185
tmpfs 1,6G 4,0K 1,6G 1% /run/user/1000
他のモデルをテストしていたため、すべてのスペースが占有されていました。
もしこれが発生した場合は、ホームディレクトリの隠しキャッシュディレクトリに移動し、huggingfaceディレクトリを削除してください。
cd ~/.cache
rm -rf huggingface
これでスペースが確保されます。または、より大きな容量の新しいドライブを購入してください。:)
モデルのダウンロードが開始されます。


ブラウザを開き、JetsonのIPアドレスとポートにアクセスして、AUTOMATIC1111のStable Diffusion webguiを実行します。
http://JetsonIPAddress:7860

これで遊ぶことができます。
以下はデフォルトモデルで作成された画像です。


Stable Diffusion XL
AUTOMATIC1111は他のモデルもサポートしています。Stable Diffusion XLを試してみましょう。このモデルは66億のパラメータを持っています。
別のモデルを追加し、ダウンロードを簡単にするために、いくつかの変数を定義し、権限を変更してモデルをダウンロードします。
これはNVIDIAのチュートリアルからの例です。
CONTAINERS_DIR=<where_jetson-containers_is_located>
MODEL_DIR=$CONTAINERS_DIR/data/models/stable-diffusion/models/Stable-diffusion/
sudo chown -R $USER $MODEL_DIR
次に、モデルをダウンロードします。
wget -P $MODEL_DIR https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors
wget -P $MODEL_DIR https://huggingface.co/stabilityai/stable-diffusion-xl-refiner-1.0/resolve/main/sd_xl_refiner_1.0.safetensors
モデルがダウンロードされたら、コンテナが実行中の場合はチェックポイントのドロップダウンをリフレッシュするか、再度コンテナを起動します。
これで、さらに2つのモデルが利用可能になります。

以下はXLモデルで生成された例です。プロンプトは以下の通りです:
ポートレート、未来的な服を着たファッショナブルなモデル、サイバーパンクの屋上環境、ネオンライトの街の背景、鮮やかな都市の輝きに照らされた後光、ファッション写真

他のモデルの追加
さらに多くのモデルを追加することも可能です。Hugging Faceに加えて、Civitaiは選択肢が豊富なもう一つのモデルハブです。ただし、Civitaiには一部NSFW(成人向け)のモデルが含まれているため、注意してください。
使用したいモデルを選択し、チェックポイントをダウンロードして以下のディレクトリに配置してください。
/home/<user>/<jetson-containers-location>/data/models/stable-diffusion/models/Stable-diffusion/
私はDreamShaper XLというモデルをダウンロードして試してみます。

ただし、一部のモデルは動作しない場合があります。
設定を調整し、モデルカードを読んで最適な設定を確認する必要があります(動作する場合に限ります)。
例えば、このモデルカードには以下のように記載されています:
- サンプリングステップは4~8
- サンプリング方法はDPM++ SDE Karras
モデルのチェックポイントをダウンロードし、上記のディレクトリに追加してください。
リフレッシュ後、モデルが選択可能になります。 選択すると、AUTOMATIC1111がモデルを最適化します。
もしプロセスが停止したりエラーが発生した場合は、ストレージ容量を増やしてください。私の場合も容量を増やした後、すべて正常に動作しました。
以下のプロンプトを使用しました:
holding a staff, orbstaff <lora:orbstaff:0.60>, ,(by Gabriel Isak and Adam Elsheimer:1.20), (by Jon Whitcomb and Bayard Wu and Malcolm Liepke0.80),8k , professional fashion shot
この画像から、ネガティブプロンプトなしで以下の結果を得ました。

以下の設定で生成しました:

以前、Stable Diffusion XLモデルを使用してサイバーパンクの女の子を生成するプロンプトを覚えていますか?
同じプロンプトを使用し、DreamShaper XLモデルと上記の設定で新しい画像を生成しました。

ご覧の通り、パラメータを調整することで素晴らしい画像を生成することができます。:)
私は、大きな画像の方がより良い結果を生むことを学びました。
Nvidia Jetson NX 16GBを使用して画像を生成する方法や、オンデマンドで画像を生成するサーバーとしての使い方を学んでいただけたら幸いです。
✨ コントリビュータープロジェクト
- このプロジェクトはSeeed StudioのContributor Projectによって支援されています。
- Brunoの努力に感謝します。あなたの作業は展示されます。
技術サポートと製品ディスカッション
弊社製品をお選びいただきありがとうございます!お客様が弊社製品をスムーズにご利用いただけるよう、さまざまなサポートを提供しております。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。