ぐるのなんか

多分ゲームのプレイ日記とか

Stable Diffusion Web UIをPaperspaceで使ってみた

久しぶりのブログです。

前の記事を書いたときが9月頭なので3ヶ月ぶりです。
この3ヶ月の間にクライアントはStable Diffusion Web UIに乗り換えました。
最適化版?の方も良かったのですが、やはり機能の充実ぶりが段違いだったので…。
Web UIについては情報はゴロゴロ転がってるので割愛します。

さてこのWeb UI、特定の画風やキャラクターの特徴を学習させる機能があり、
うまく使えば簡単に好みのイラストを生成できるのですが、いかんせん必要なVRAMが大き過ぎます。
12GBくらいは最低でもほしいところですが、ゲームするだけなら十分な今のグラボに追加で買うというのも散財が過ぎます。

ちょっと手が出ないなぁ、なんとかならんかなぁと思いながら試行錯誤して448×640で学習させる方法を見出したりしてましたが、
ほんのちょっとの高解像度化のために涙ぐましい努力をするのに嫌気が差して、ついにGPUクラウドに手を出しました。

※2022/12/15 Google Drive利用の項にセキュリティ上の注意を追記しました。

GPUクラウドとは

自分も詳しくないのですが、イメージとしては世界のどこかにつよつよグラボが刺さったサーバーがあって、
そのグラボに色々処理をしてもらい、使った時間に応じて料金を払う、という感じです。

有名どころではGoogle Colabなんかがあり、Stable Diffusionが公開された当初から
Google Colabで環境作ればグラボ弱くてもAIイラストで遊べるやん!」という記事とかツイートを見かけてました。

そしてこのGoogle Colabの料金体系やシステムが、
「手軽に高性能GPUを長時間ぶん回してガンガン学習!」という用途に向かなくなったため、
代替サービスとして紹介されていたのがPaperspaceでした。

Cloud computing, evolved | Paperspace

使い方のイメージとしてはクラウド上で仮想マシンを立てて、そのマシンが使用するGPUをどれにするかを選択できる、という感じです。
ちょっと容量が少ないですがストレージもある程度付与されるので、マシン上で全て完結させることも可能です。
使用できるGPUとストレージは料金体系によって変わってきます。

料金体系(自分は真ん中)

料金体系としては大まかに無料、Pro($8/月)、Growth($39/月)の3プランで、プランごとに無料で使えるGPUがあり、別枠で従量課金制のGPUがあります。
従量課金で使えるGPUもプランによって差があるのですが、ちょっと細かいので割愛。
ストレージに関しては最低でもProの15GBはないと、Web UIのインストールと学習モデルで5GBは多分超えてしまいます。
無料でやってくなら色々と工夫が必要そう。

あと無料GPUを使用している場合は連続使用6時間ぐらいで強制シャットダウンされるようです。
追加料金なしなので枠を空けるために仕方なしって感じですね。
従量課金の方は連続1週間ぐらいいけるらしい?まあ趣味で使う分には無料の方でよさげです。

値段感としてはお得なんじゃないでしょうか。
Proプランで使える一番いい性能の無料GPUがRTX A4000なんですが、Amazonで調べると執筆時点でリファレンスモデルっぽいのが14万円です。

執筆時点のレートで$8≒¥1,100なので、10年強サービスを使ってようやくトントンぐらいです(Growthの方も確かそんぐらいでトントン)。
10年もすれば今の最新機種は化石みたいなもんだと思うので、まあお得でしょう。クラウドサービス故の制約とかはありますが。

ちなみに紹介キャンペーンがあるらしく、下記のリンクからサイトに飛んで登録すると、登録者に$10分のクレジットが付与されるらしいです。
このクレジットは説明を見る限り従量課金の支払いには使えるけど月額課金の方には使えなさそうです。
Paperspace Console

Paperspace登録から使用開始するまで

何はなくともユーザー登録からですが、全部英語であること以外は特に問題ないと思います。
自分はクレジットカードの登録のとこで、海外式の住所の書き方でだいぶ引っかかりましたが…。

ちなみにクレジットカード以外でもVプリカやKyashも使えるようです。
自分はクレカはちょっとな…となったのでKyashを登録しました。

登録が終わったら環境構築ですが、自分は下記の記事を参考に構築しました。
追記あり【Novel AI】stable diffusionの追加学習をpaperspaceで月額たった8ドルで行う為のweb-ui導入方法【DreamBooth】 | オンラインゲーマー日記

「paperspace_web-ui_onlinegamernikki.ipynb」というファイルが肝心で、
このファイルに書かれてるコマンドを適宜書き換えて実行するだけで基本的な環境構築ができます。

モデルのダウンロードに関してはプレーンなStable Diffusion以外のものを使ってる人もいると思うので、その場合に関しては後述。

注意点としては「web-uiの起動」と書かれたセルのところに「--gradio-auth test:password」という記述がありますが、
「test:password」はWeb UIにアクセスするためのユーザー名、パスワードの組み合わせなので変えておきましょう。
「--share」というオプションによって基本的にWeb UIはネットに公開されている状態です。
ローカル環境で動かしている場合は不要なオプションですが、
クラウドで実行している都合上公開しないと自分もアクセスできないので、
せめてパスワードぐらいは強いのにしましょう。
試したわけではありませんが、アクセス制限を強固にしておかないと悪用されるかも…。

上記のことができていれば後はいつもどおりWeb UIを使うだけです。
学習中の画面の更新がしばらくすると止まったり、画像の表示に時間がかかったりと、
ローカル環境とは勝手が違うところもありますが、基本的には一緒です。

でかいファイルをGoogle Driveから持ってくる

※2022/12/15追記
ふと思い出して大慌てで追記してます。
paperspaceを無料プランで使ってる場合、ノートブック(ファイルやらなんやら)が公開されるとプラン説明に記載があります。
その場合、下記の手順で認証関係のファイルとかを配置しちゃうのは非常にまずい(誰でもあなたのGoogle Driveにアクセスできるようになる)ので、試すなら有料プランでお願いします。

追記ここまで

上の項でモデルのダウンロードについて触れましたが、
ネット上に公開されているモデルを使ってる分には多分問題ないのですが、
Web UIにはモデルのマージ機能があるので自前で何かしら作ってる人もいるかも知れません。
または学習に使うデータセットとかをネットから持ってくる必要があるかも知れません。
その辺のことについて触れているのが下記の記事です。

ゼロから始めるPaperspace Gradient【Google Colab代替サービス】 - Qiita

この記事ではAWSからデータを持ってきていますが、Google Driveからデータを持ってこられれば無料でいいよね、でもエラーで上手いこといかなかったよ、としています。

自分もこの記事で紹介されている記事(と更にそこで紹介されている記事)を参考に、
Google DriveAPI利用設定とOAuthの設定をして見ましたがエラーとなりました。
ログを残してないのでアレですが、「OAuth クライアント ID の作成」で選択したアプリケーションの種類が「ウェブアプリケーション」なのが問題なのか?と当たりをつけて「デスクトップアプリ」で再作成しました。
その状態でコマンドを実行するとエラーとはならないのですが、「ブラウザを開いたから認証手続き進めてね」的なメッセージとURLが表示されました。
URL自体はアクセスできるし認証手続きもできるのですが、その後localhostのURLにリダイレクトされてうんともすんとも言わない。

まあ認証を求めてるのはPaperspaceのノートブックなのに認証を自分のPCでやっちゃってるので上手いこといかないんでしょうね。
PyDrive2の説明とかもローカルマシンからGoogle Driveに繋ぐための説明でPaperspaceとは前提から違う。
コマンドラインで動かすマシンでブラウザとか開くわけないしどうせえっちゅうねんとなってましたが、
調べてたら認証結果をファイルに保存する方法があるのがわかりました。
PythonでGoogleドライブを操作するパッケージPyDrive2の認証まわり - Qiita

これを読んで「ローカルマシンで認証通してその結果のファイルをノートブックに上げたらいけんじゃね?」と思ったのでやってみたらいけました。

ローカルで認証通した時のファイル構成は以下の通り

auth.py

from pydrive2.auth import GoogleAuth
from pydrive2.drive import GoogleDrive

gauth = GoogleAuth()
gauth.LocalWebserverAuth()

drive = GoogleDrive(gauth)

file_list = drive.ListFile({'q': "'root' in parents and trashed=false"}).GetList()
for file1 in file_list:
    print('title: %s, id: %s' % (file1['title'], file1['id']))

setting.yaml

client_config_file: my_client_secrets.json

save_credentials: True
save_credentials_backend: file
save_credentials_file: saved_credentials.json

get_refresh_token: True

my_client_secrets.jsonはデスクトップアプリ用の認証情報のファイルです。

この状態でauth.pyを実行するとブラウザが立ち上がるので認証手続き、認証が成功すると「saved_credentials.json」というファイルが生成されます。
ついでにGoogle Driveのファイル名とかがズラッと表示されるので確認が取れるはずです。

ここまでできたらノートブック側にGoogle DriveからファイルをダウンロードするためのPythonファイルと、
同じディレクトリに「saved_credentials.json」「settings.yaml」を配置してやれば上手いこと動くと思います。
(このやり方がセキュリティ的にOKなのかはわかりません)

おわり

以上、PaperspaceでつよつよGPUにテンション上がったまま書き散らかした記事となります。
あとネットでパッと解決法が出てこなかった問題の共有もちょっとしたかった。
まあ最近出たサービスでもないので今更かもしれませんが。

個人的にはこのままサービス内容が改悪されなければ他の支出削ってGrowthプラン登録しよっかなと思うぐらいにはいい感触です。
金銭的には手軽にAIイラストで遊べるようになるので、興味持ってくれる人が知り合いに増えればなぁと思ってます…。