拡散モデルにプロンプトを与えることで、画像を生成することを確かめます。
関連
- ◯
- クラウドのコンテナで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)