本記事は,先日の記事「AUTOMATIC1111をPaperspace Gradientで実行し, Google Driveに画像を送る.」の修正点を整理したものです.
はじめに
Google Colabを用いてstable diffusionや機械学習で遊んでいたが,いつのまにかコンピューティングユニット制になっていたので,Paperspace Gradientに乗り換えてみた.
Paperspace Gradientには無料版,8ドル,39ドルのプラン(2023年2月現在)があり,使えるGPUや永久ストレージ(Persistent Storage)の容量等に違いがある.個人的に一番気になったのは,無料版だとプロジェクトが一般公開状態になることである.Paperspace Gradientは,Google Colabとは異なりGoogle Driveをマウントすることができない上に,永久ストレージの容量を超えると従量課金される点が怖い.そこで永久ストレージの容量の削減のために,Paperspace Gradient上で生成したデータをGoogle Driveに転送する方法を構築した.
環境
- Windows10 PC
- Google Chrome
- Paperspace Gradient Pro (8ドルのやつ)
- Google Cloud Platform (GCP.Google Drive APIの利用は無料)
方法
Paperspace Gradientの有料版の契約(必須)
- Paperspace Gradientの有料版を契約
私はPaperspace Gradientにサインアップして無料版のアカウントを作ってから,有料版にアップグレードした.サインアップおよびアップグレード時の注意点は特にないが,クレジットカードの登録時にAmexは使えなかった(私はMasterCardを登録した).珍しく,クレジットカードの登録内容に住所の登録欄があったが,Stateに都道府県,Cityに市区町村,Addressに残りの住所を書いたら問題なく登録はできた(念のため英語で住所は書いた).
これから紹介する手法は,認証に必要なファイルをPaperspace Gradientに配置するため,公開設定になってしまう無料版を使用することはNG.
pydrive2の設定
- pydrive2を用いてGoogle Driveにアップロードとダウンロードできる状態にする
GCPのGoogle Drive APIの利用時に,OAuth2.0認証ではなくサービスアカウントを用いて認証ファイルを生成し,その認証ファイルを用いてpyDrive2によりファイルのアップロードとダウロードを実現する方法を構築する.この方法であれば,OAuth2.0認証を通すための認証ファイルをローカル環境で生成する必要がなく,認証ファイルの生成がGCP上で完結する.
このサイトの「Googleの認証」の項目を参照して,Google Drive APIの認証ファイルであるservice_account.jsonを生成する.この認証ファイルにより,Google Drive APIを介したpydrive2によるファイルのアップロードとダウンロードが可能となる.
- Paperspace Gradientに認証ファイルをアップロード
上記で生成した認証ファイル(service_account.json)をPaperspace Gradient上の作業スペース(というより,セルの実行時のカレントディレクトリ)にアップロードする.AUTOMATIC1111の場合のアップロード先は後述する.
- 設定終了
以上で,pydrive2を用いてgoogle drive上のファイルを扱うことはできるようになった.
Automatic1111上と組み合わせる
Google Driveにアクセスできるようになったので,今流行ってるStable Diffusionのweb UIであるAUTOMATIC1111上で生成した画像をGoogle Driveにアップロードする方法を構築した.
- AUTOMATIC1111をPaperspace Gradient上にインストールする.
基本的には,このサイト(ここをクリック)通りにやればできる.プロジェクトのサイト(Github)を見ても良いかも.要は,GithubにあるPapserspace版AUTOMATIC1111のipynbファイルをNotebookにアップロードしてセルを実行していけば,インストールできる.
上記のサイトに書いてあるが,ターミナルを開いて「wget https://raw.githubusercontent.com/Engineer-of-Stuff/stable-diffusion-paperspace/master/StableDiffusionUI_Voldemort_paperspace.ipynb」を実行するか,ipynbファイルをダウンロードした後に直接アップロードするかをすれば,ipynbファイルをアップロードできる.
ipynbファイルをアップロードできたら,後の工程で認証ファイルをアップロードするためのディレクトリを作成しておきたいので,リポジトリをダウンロードする「Clone the WebUI repository」のセルまで実行する.
- Google Driveにファイルをディレクトリごとアップロードするコードを追記する.
先ほどアップロードしたipynbファイル(これ)の中に,Google Driveへのファイルのアップロード用のセルを挿入する.空のセルを挿入して,このサイト(ここをクリック)にあるアップロードスクリプトをコピペすればOK.WEBUIの使用後に画像を転送するので,私は「Launch the WebUI」セルの下に挿入した.その後,コピペしたコードの”pydrive”になっている箇所を”pydrive2″に修正した.
その後,service_account.jsonを読み込むコードを,アップロードスクリプトをコピペしたセル内に追記した.このサイトの「PyDriveの動作確認」の箇所を参考に,コードを修正した(以下のように修正した).
アップロードスクリプトをコピペしたセルの修正箇所
- pydrive2をインストールするセルを追記する.
元のipynbファイル(これ)は,Google Drive関連のコードの記述がないので,当然そのままではpydrive2がインストールされない.「!pip install pydrive2」と記入したセルを追記した.
- 2.で挿入したアップロードスクリプトのpathの値を修正する.
txt2imgで画像を生成した場合,「/notebooks/storage/stable-diffusion/stable-diffusion-webui/outputs/txt2img-images」ディレクトリに画像が生成されるため,pathにはこの値を設定する.parentidには,Google Drive上のアップロードしたいフォルダのフォルダIDを設定する.フォルダIDの取得方法に関しては,こちらのサイトなどを参考にする.
ちなみに,pathに「/notebooks/storage/stable-diffusion/stable-diffusion-webui/outputs」を設定すれば,txt2imgやimg2imgなどで生成した全てのファイルがGoogle Driveに転送できる.
しかしながら,先ほどコピペしたアップロードスクリプトの想定とフォルダ構成が異なるため,2重にコピーされる.
upload2googledrive()関数に引数を渡せるようにして,引数として”txt2img-images”,”txt2txt-images”,”txt2img-grid”,”txt2txt-grid”を渡し,生成されうるフォルダの数だけupload2googledrive関数を呼ぶ(この場合,4回呼ぶ),という無理やりな手段で解決できるが,センスは無い.気が向いたら,後日解決する.
- 「pydrive2の設定」で生成した認証ファイル service_account.jsonを,「/notebooks/stable-diffusion-webui」ディレクトリ直下に置く(以下の画像を参照).ちなみに,AUTOMATIC1111の実行時にこのディレクトリに移動しているため,認証ファイルをこのディレクトリに置いているだけである.要は,実行時のカレントディレクトリにservice_account.jsonを設置する.
- あとは,1.で紹介したサイトの通りにセルを実行していく.画像を生成し終わったら,AUTOMATIC1111を閉じて,実行中のセルを終了する.その後,2.で作成したセル(Google Driveにファイルをアップロードするセル)を実行することで,Google Drive上の指定したフォルダに画像がコピーされる.
- 容量の節約のために,「!rm -rf /notebooks/storage/stable-diffusion/stable-diffusion-webui/outputs/txt2img-images/*」 により,Paperspace上の生成した画像を全て削除する.ipynbファイル(これ)に削除用のセルが記載されていたが,私はそのコードではうまくファイルが消えなかった.
サービスアカウント上にファイルが残っているかも.
以下によると,サービスアカウントを介してファイルをやり取りした場合,ファイルがサービスアカウントに残るらしい.サービスアカウントのDriveの容量は15GBなので,ファイルがたまったら削除しないとダメかも.⇒rclone使って,サービスアカウントのGoogleDriveにアクセスして,消せた.
まとめ
Paperspace Gradient上でAUTOMATIC1111を実行し,生成した画像をGoogle Driveにコピーすることができた.
Paperspace Gradientは大きく分けると,「{system files}」(usr,var,tmpなど),「/storage」,「/notebook」,「/datasets」のディレクトリがある.
恐らく課金対象の永久ストレージ(Persistent Storage)領域は,「/storage」,「/notebook」,「/datasets」である.
サンプルプログラムでモデルをアップロードしたりする「/tmp」は「{system files}」の1つで,一時的な保存領域であり,Machineを止めるとデータは消えるため,一時的に使用するモデルや画像を入れ放題である(インスタンスのストレージ容量に依存してると思うので,最大は150GiBとか?).「/tmp」ディレクトリをうまく活用することで,大きなデータも扱えると思われるので,積極的に利用していきたい.
ターミナルでみると,ディレクトリ構造とパーミッションは以下のような感じらしい.「/notebooks」,「/storage」,「/datasets」, 「/tmp」の存在が確認できる.「/tmp」のパーミッションが777で,さらに一時領域だからサンプルコードで大きいモデルを置く感じ(?).(「/datasets」には,ProjectのメニューにあるDataでアップロードしたDatasetが置かれるのかと思ったらなぜか無いので,今のところ何なのか不明.Storageの容量を確認すると,アップロードしたデータセットの容量だけはきっちり食ってるみたいだが.)
参考サイト
・OAuth無しでpythonでGoogle Driveを操作する https://self-development.info/pydrive%E3%81%AB%E3%82%88%E3%82%8Apython%E3%81%8B%E3%82%89google%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%99%E3%82%8B%E3%80%90oauth%E4%BD%BF%E3%82%8F%E3%81%9A%E3%80%91/
・pyDriveを使ってGoogle Driveにフォルダをアップロード https://northshorequantum.com/archives/pydrive_upload
・paperspace版導入 https://wikiwiki.jp/sd_toshiaki/Paperspace%E7%89%88%E5%B0%8E%E5%85%A5
・paperspace版AUTOMATIC1111のGitHubリポジトリ https://github.com/Engineer-of-Stuff/stable-diffusion-paperspace
コメント