Google Colaboratory
Colab 環境の Stable Diffusion で、日々遊んでおります。
10GB 以上のGPUをリソースとして無料で利用できるの、なんなんでしょうね。
神とまではいかないにしても、国,自治体レベルのサービス超えてきてますよね。税金払ってましたっけ?
GPU バックエンドに接続できません
ただ、がっつり遊んでいると、半日ぐらいで上のメッセージが出て、無料枠ではもう GPU 使わせないよとなります。
あなたはリソースを使いすぎてるよということだと思います。
Google はこの制限について、基準をあえて示していないみたいです。現在アクティブな利用者数、使用量など、いろいろな変数で、状況に応じて無料枠を調整しているのかなと想像できます。
で、このStableDiffusion旋風です。公式?のチュートリアルが Colab なので、当然、アクセスは増えますよねー。
先週は20時間かからずに再利用可能となったのですが、今日はそろそろ24時間過ぎたところなのですが、まだ接続できないです。。。(記事を書く原動力になっていますねw)
GPU RAM 使用率の確認方法
右上のほうにある ▼ から「リソースを表示」とすると、起動中いつも見えている「RAM」「ディスク」とは別に「GPU RAM」の利用をグラフで確認することができます。
この記事は、公式チュートリアルのコードなどをベースに、このグラフを見ながら、画像生成のコストに関わりそうなパラメータを変更し、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 の節約になっている。
記載中ですが、時間切れのため、一度アップしてしまいます。