0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Google Colaboratory 環境で Stable Diffusion - GPU RAM 節約術(考察)

Posted at

Google Colaboratory

Colab 環境の Stable Diffusion で、日々遊んでおります。

10GB 以上のGPUをリソースとして無料で利用できるの、なんなんでしょうね。
神とまではいかないにしても、国,自治体レベルのサービス超えてきてますよね。税金払ってましたっけ?

GPU バックエンドに接続できません

ただ、がっつり遊んでいると、半日ぐらいで上のメッセージが出て、無料枠ではもう GPU 使わせないよとなります。
あなたはリソースを使いすぎてるよということだと思います。

Google はこの制限について、基準をあえて示していないみたいです。現在アクティブな利用者数、使用量など、いろいろな変数で、状況に応じて無料枠を調整しているのかなと想像できます。

で、このStableDiffusion旋風です。公式?のチュートリアルが Colab なので、当然、アクセスは増えますよねー。
先週は20時間かからずに再利用可能となったのですが、今日はそろそろ24時間過ぎたところなのですが、まだ接続できないです。。。(記事を書く原動力になっていますねw)

GPU RAM 使用率の確認方法

右上のほうにある ▼ から「リソースを表示」とすると、起動中いつも見えている「RAM」「ディスク」とは別に「GPU RAM」の利用をグラフで確認することができます。

image.png

この記事は、公式チュートリアルのコードなどをベースに、このグラフを見ながら、画像生成のコストに関わりそうなパラメータを変更し、GPU RAM どうなるの?という検証と、つたない考察をしていきます。(本職は機械学習やpythonなどあまり縁がなく、バックボーンがぺらぺらなので、間違いの指摘や、こっちのほうがいいよ!といったコメント大歓迎です。)

ちなみに、先にも述べていますが、Google は「GPU バックエンドに接続できません」処置の詳細について、基準など明確にしていません。なので、そもそも GPU RAM を節約したからといって、無料枠が有利に利用できるかどうかは全くわかりません。あしからず。

【節約術 その1】RAM そのまま使いっぱなし問題

まずグラフを見ながら画像生成させると、すぐに気づくのですが、(メモリだからでしょうね、)一度画像を生成するとずっと使用率が上昇したままになります。

すぐに次の施行を流すなら問題ないような気もしますが、プロンプトを考えたり、パラメータ変更したり、いろいろやる間、ずっと使用中っぽくなるのは、あまりいいような気がしないです。

対策

以下のように、仕事の後にtorch.cuda.empty_cache()を入れると、仕事前の状態(パイプライン初期化?の状態)まで戻ります。

with autocast("cuda"):
  image = pipe(prompt)["sample"][0]
torch.cuda.empty_cache()

【節約術 その2】半精度?

パイプライン初期化?のところにある2つのパラメータrevision="fp16" torch_dtype=torch.float16 と、
画像生成するときのwith autocast("cuda"):
この2か所の記述で、軽いほうのモデルを利用しますよということなのか?

いくつかのチュートリアル記事では、これらのパラメータ、コードを利用していないことがあり GPU RAM の利用量が違ってくる。
下のコードコメント部分(# の行)がない状態で動かしている場合は、適宜追加すると節約できます。(当然、精度が下がるの?なんの精度?)(調査します)

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", 
                                               # revision="fp16",
                                               # torch_dtype=torch.float16,
                                               use_auth_token=True).to("cuda")
# with autocast("cuda"):
  image = pipe(prompt)["sample"][0]

【節約術 その3】複数画像生成

promptを配列で複数枚生成するより、ループで複数枚作ったほうが GPU RAM の節約になっている。

記載中ですが、時間切れのため、一度アップしてしまいます。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?