MkItYs

MkItYs > AI・交渉・物語の自動生成 > 

images

プロンプトを与えて画像を生成させる(クラウドのコンテテで):Diffusers, Stable Diffusion, waifu-diffusion, NSFW, Ubuntu, Docker, GCP

images

- 2022.10.16

拡散モデルにプロンプトを与えることで、画像を生成することを確かめます。

関連


クラウドのコンテナでGPUを使う:GPC, Docker, nvidia-driver, cuda-toolkit
コンテナの各種メディアを、遠隔からあつかう(音声・画像・映像):Docker, ssh, rsync, sshfs, nginx, Tk (tkinter) , OpenCV, Jupyter Notebook

検証


OS:Ubuntu 20.04 (Docker Hub)
インタプリタ:Python 3.8
ライブラリ:Transformers 4.22.1
ライブラリ:Diffusers 0.3.0

設置


ここではいろいろなモデルをあつかえるフレームワーク「Diffusers 」から、各種拡散モデルを使ってみます:

https://github.com/huggingface/diffusers

コンテナの初期設定ファイルは、たとえば次のように記述します:

FROM ubuntu:20.04

RUN apt -y update
RUN apt -y upgrade
RUN apt -y install python3.8
RUN ln -s /usr/bin/python3.8 /usr/bin/python
RUN apt -y install pip
RUN apt -y install vim

コンテナを作成します:

$ docker build -t ${image} ${dockerfile_directory}

コンテナを起動します:

$ docker run -it --rm \
--gpus all \
--name ${container} \
${image}

コンテナ上で、次を実行します:

$ apt install git
Geographic area: 6
Time zone: 79

$ pip install ftfy # ユニコードをあつかうモジュール(必須ではありませんが、推奨です)
$ pip install scipy # 数値計算のためのモジュール(必須ではありませんが、推奨です)
$ pip install transformers
$ pip install diffusers

# ハギングフェイスのトークンを設置:

$ huggingface-cli login
token: ********
$ git config --global credential.helper store
$ cat /root/.huggingface/token

リモート側で、必要に応じてコミットします:

$ docker commit ${container} ${image}

利用


画像を生成するスクリプトは、たとえば次のようになります(引数にプロンプトを指定し、画像は標準出力に出力します):

スクリプト:genimg_dft.py:
#!/usr/bin/python

import sys
import torch
from diffusers import StableDiffusionPipeline

prompt=sys.argv[1]
numstp=50 # 推論の回数
numhgh=512 # 画像の大きさ:高さ
numwdh=512 # 画像の大きさ:はば
device="cuda"
nammdl="CompVis/stable-diffusion-v1-4"

pipeln=StableDiffusionPipeline.from_pretrained(nammdl,torch_dtype=torch.float16,revision="fp16")
pipeln=pipeln.to(device)
images=pipeln(prompt,height=numhgh,width=numwdh,num_inference_steps=numstp).images
images[0].save(sys.stdout.buffer,"png")

生成される画像を、リモート側でファイルに落としたい場合、次のように実行します:

$ docker run -i --rm --gpus all ${image} genimg_dft.py "${prompt}" > ${image_file}

自分のパソコンで表示させたい場合は、たとえば次のようにローカル側で実行します(これはmacOS のPreview で表示させるケースです):

$ ssh ${user}@${server} 'docker run -i --rm --gpus all ${image} genimg_dft.py "${prompt}"' | open -f -a Preview

利用:他の拡散モデルを使う


他の拡散モデルを試すには、モデルの指定を、たとえば次のように書き換えます:

nammdl="runwayml/stable-diffusion-v1-5"

nammdl="hakurei/waifu-diffusion"

利用:生成の制限(NSFW)を解除する


生成の制限(NSFW)を解除するには、パイプラインに、当該関数(safety_checker)の抑制を追加します:

pipeln.safety_checker=lambda images,**kwargs: (images,False)