見出し画像

Deforum Stable DiffusionをローカルGPUで使うまでの流れ

警告:素人が適当にやった例なので真似するとあなたのpython環境を破壊・汚染する恐れがあります。御了承下さい。安全な方法があれば教えてください。


これはDeforum Stable DiffusionのColab notebookを手持ちのGPUで実行するまでの流れを纏めてみようとしたものです。
備忘録でしかないのでそれ以上のものは期待しないでください。

なお、Deforum Stable Diffusion(=Deforum Diffusion)をColabで使うだけならこちらの方の説明が参考になります。

また、Colabを使わないlocal用のDeforumStableDiffusionLocalというのもあるので完全にlocalで実行したい場合はこっちが良いはずです。

今回やりたいのはこのDeforum Stable Diffusion公式のColabノートブックをローカルマシンのGPU・HDDを使って実行する事です。

素人なので1個ずつ確認しながらやっていきます。

Google Colabの説明のページをよみます。

これによると、
・ローカルマシンへのJupyterのインストール
・Jupyterへの拡張機能のインストール&有効化
・サーバーを起動&認証
・出てきたURLをコピーしておく
・実行したいColab notebookの右上、”接続”横のメニューを開いて”ローカルランタイムに接続”を選択
・バックエンドURLの項目に先程のURLを貼り付けて”接続”を選択
という流れのようです。

実際にやってみます。

Jupyterのインストール

ダウンロードはここから…と思いきやダウンロードじゃないんだね。
pipとかいうpythonお得意のやつです。
おそらくpythonの環境がちゃんとインストールしてれあれば書いてある通りに

pip install jupyterlab

とコマンドプロンプトで打ち込めば良いのだと思います。
StableDiffusionWebUIみたいな一括で実行してくれるパッケージしか使ってない場合はもしかしたら事前にpythonのインストールが必要かもしれません。
これどこにインストールされるのかよくわかってなかったんですが、どうもpythonのインストールフォルダ内のetc/jupyterなどにインストールされるようです。特に試しに起動したりせず次の項目へ。

jupyter_http_over_wsのインストール&有効化

これは説明にはgithubで手に入ると書いてあるけれど、気にせずコマンドプロンプトで

pip install jupyter_http_over_ws

でインストールし、

jupyter serverextension enable --py jupyter_http_over_ws

で有効化できました。
うまくいけば、

Enabling: jupyter_http_over_ws
- Writing config: $USER$/.jupyter
  -Validating…
    jupyter_http_over_ws 0.0.7 ok

のような表示がでます。

(備忘録として記録しているのでこの下の操作は失敗例です。以下を実施する前にjupyter notebookのコンフィグファイルを作成・編集してください。少し下に記載してあります)

サーバーを起動&認証

これまたコマンドプロンプトに

jupyter notebook \
  --NotebookApp.allow_origin='https://colab.research.google.com' \
  --port=8888 \
  --NotebookApp.port_retries=0

上記を4行纏めてコピーして貼り付けます。
なおコマンドプロンプトへはCtrl+Shift+vで貼り付けです。
貼り付けられない場合はコマンドプロンプトのウィンドウ左上のアイコンを右クリックして”規定値”を選び、オプションの編集オプションから設定しておきましょう。
一気に実行されてブラウザーが開きびびりました。
http://localhost:8888/tree
が表示され、ファイル一覧が表示されます。
コマンドプロンプトを見てみると
http://localhost:8888/?token=ほにゃらら
というのが表示されているのでこれをコピーします。

ローカルランタイムに接続

僕はここでつまづきました。Colab上のエラー表示からトラブルシューティングに行っても特に改善なし。

Blocking Cross Origin API request for /http_over_websocket.  Origin: https://colab.research.google.com, Host: localhost:8888

というようなエラーがコマンドプロンプトに表示されています。
とりあえずPCを再起動してみます。だめでした。
エラーをもとに解決策を探してみます。
エラーメッセージそのものの話ではないものの、JupyterでローカルGPUなどを使う話のページがありました。このページの内容そのものですね。

どうやらJupyterのコンフィグファイルの作成・編集が必要なようです。

jupyter notebook --generate-config

じゃあさっきのwriting %USER%/.jupyterはなんだったんだよというね…多分作成はされていて、編集がされていなかったのかな?確かめる前に上のコマンドを入れてしまったのでわかりません。
コンフィグファイルは$USER$/.jupyterフォルダにあるjupyter_noteboook_config.pyというファイルです。
2項目設定を有効にする必要があるとのこと

# c.NotebookApp.allow_origin = ''

という行を検索し、行頭の"# "をけしてコメントアウトを解除し、

c.NotebookApp.allow_origin = 'https://colab.research.google.com'

と値を設定します。
同様に、

# c.NotebookApp.port = 8888

も検索してコメントアウトを外します。
pythonの事を知らなかったのでびっくりしたのですが、行頭のインデントがエラーの原因になったりするらしいのでスペースはきっちり消しましょう。
コンフィグファイルを保存して今度こそ上手くいくはず。

jupyter notebook \
  --NotebookApp.allow_origin='https://colab.research.google.com' \
  --port=8888 \
  --NotebookApp.port_retries=0

をもう一度コマンドプロンプトにいれて、URLをコピーして…
使いたいノートブックの”接続”からローカルランタイムに接続を選んでURLを貼り付けて …できた!

DeforumStableDiffusion のノートブックを動かす

うまくいくと右上が接続済み(ローカル)の表示になります。
まずはSetupからNVIDIA GPUのところの再生ボタンをクリックしてGPU名がきちんと表示されていれば準備OKのはず。

次は利用する.ckptの指定と出力フォルダの指定です。
Model and Output Pathsの方にドライブ名から入力します。
自分の場合はC:/DSDlocal/modelsとC:/DSDlocal/outputです。
modelsフォルダ内に各所から貰ってきた.ckptファイルを置きます。
(StableDiffusion本家の.ckpt以外を使う場合は後でフルパス指定する必要があるので気をつけましょう。)
また、このmodelsフォルダ内に"dpt_large-midas-2f21e586.pt"というファイルが置いてある必要があります。
https://github.com/isl-org/DPT/ 
ここのSetupのMonodepthの2番めにあります。

mount_google_driveの方はチェックを外しました。
左の再生ボタンを押してエラーが出なければ次です。

次はSetup Environmentを押すだけですがだいぶ時間がかかります。コマンドプロンプトの方で頑張っている様子が見えるのでじっと見守りつつこの文を書いています。5分くらいかかったかな?227秒と出てますね。わざわざ数えてくれるとは。ここでprint_subprocessにチェックをいれなかったせいかどうかわかりませんがあとで動画作成に失敗しました。ffmpegをpathの通ったところに置いてあれば問題ないはずです。

次のPython Definitionsでまた躓きました。
import cv2というのが実行できないとのこと。上のSetupEnvironmentの中でcv2というパッケージ?をインストールしてくれなかったんでしょうか。なぜ…?
結局わからないながらもいくつかのパッケージを追加インストールしたら進みました。SetupEnvironmentのソースを見てend_time=time.time()の前の行にインデントを他と揃えて

!pip3 install opencv-python
!pip3 install pandas
!pip3 install scikit-image

の3つを追加して実行で通過。おそらくローカルランタイムに接続すると結局ローカルに環境を構築してしまうので、過去にインストールしたpythonが悪さをしているのだろうと思われます。本末転倒感が凄い… 雰囲気的にはここのエラーは他の人と同じではないんじゃないかなと思います。

で、どんどん進めて行きます。
Select and Load Modelの項目では使用するモデルの.ckptファイルを選択できます。標準のsd-v1-4-full-ema.ckptなどを使う場合はmodel_checkpointの項目から選択します。ほかのモデルを使いたいときはここでcustomを選び、2つ下のcustom_checkpoint_pathに.ckptファイルをフルパスで指定します。
load_on_run_allのチェックはオン、check_sha256のチェックはオフが良さそう。map_locationはcudaのままで。

Settings内のAnimation SettingsのAnimation項目、animation_modeをとりあえず2Dにしてmax_frameを30程度に(これが多いとむちゃくちゃ時間がかかる)。他のところはとりあえず触らずに次にいきます。Promptは各自なんかいれます。せっかくDeforumDiffusionなのでAnimationPromptの方になんか入れましょう。指定フレームでpromptを切り替えることもできます。
これで準備OKのはずがRunのところが実行できず。

NameError                                 Traceback (most recent call last)
Cell In [40], line 482
    480 # dispatch to appropriate renderer
    481 if anim_args.animation_mode == '2D' or anim_args.animation_mode == '3D':
--> 482     render_animation(args, anim_args)
    483 elif anim_args.animation_mode == 'Video Input':
    484     render_input_video(args, anim_args)

Cell In [40], line 305, in render_animation(args, anim_args)
    302     args.init_image = init_frame
    304 # sample the diffusion model
--> 305 sample, image = generate(args, return_latent=False, return_sample=True)
    306 if not using_vid_init:
    307     prev_sample = sample

Cell In [33], line 298, in generate(args, return_latent, return_sample, return_c)
    295 seed_everything(args.seed)
    296 os.makedirs(args.outdir, exist_ok=True)
--> 298 sampler = PLMSSampler(model) if args.sampler == 'plms' else DDIMSampler(model)
    299 model_wrap = CompVisDenoiser(model)
    300 batch_size = args.n_samples

NameError: name 'model' is not defined

modelが定義されていないというNameErrorが出てしまいました。
実は少し前のSelect and Load Modelの項目で正常に実行できていたように見えたのですが、
Please download model checkpoint and place in C:/dsdlocal/models/sd-v1-4-full-ema.ckpt
という実行結果が出力されておりckptファイルが読みこめていなかったようです。ひっそりとメッセージを出すだけなのでエラーに気づきにくい…
ファイル名を正しくしてSelect and Load Modelから順に実行し直していくと画像が生成できました。

無題/お城での幸せな生活

指定枚数の画像が生成されたらCreate video from framesから動画が作れるはずなのですが、ffmpegなんて当然どこからでも使えるようになってるでしょ?という仕様らしく失敗しました。ffmpegをpathの通ったところにインストールして、skip_video_for_run_allのチェックを外して再実行したら無事に完成です。


なんとnoteでは.mp4を自動再生してくれないんでしょうか。ダウンロードボタンが表示されました。悲しいですね…

ということで無事に手持ちのGPUや.ckptを使って無事にColab上のDeforumStableDiffusionを使うことができました。
Animationの細かい設定の話などははじめに紹介した先人のページを参考にするとよいと思います。

上手に動画を作るコツが全然わからないのでtipsらしきものがあれば教えてください。よろしくお願いします。

この記事が気に入ったらサポートをしてみませんか?