AUTOMATIC1111をPaperspace Gradientで実行し, Google Driveに画像を送る(認証にサービスアカウントを利用するVer.)

本記事は,先日の記事「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に転送する方法を構築した.

環境

方法

Paperspace Gradientの有料版の契約(必須)

  1. Paperspace Gradientの有料版を契約
     私はPaperspace Gradientにサインアップして無料版のアカウントを作ってから,有料版にアップグレードした.サインアップおよびアップグレード時の注意点は特にないが,クレジットカードの登録時にAmexは使えなかった(私はMasterCardを登録した).珍しく,クレジットカードの登録内容に住所の登録欄があったが,Stateに都道府県,Cityに市区町村,Addressに残りの住所を書いたら問題なく登録はできた(念のため英語で住所は書いた).
     これから紹介する手法は,認証に必要なファイルをPaperspace Gradientに配置するため,公開設定になってしまう無料版を使用することはNG 

pydrive2の設定

  1. pydrive2を用いてGoogle Driveにアップロードとダウンロードできる状態にする
     GCPのGoogle Drive APIの利用時に,OAuth2.0認証ではなくサービスアカウントを用いて認証ファイルを生成し,その認証ファイルを用いてpyDrive2によりファイルのアップロードとダウロードを実現する方法を構築する.この方法であれば,OAuth2.0認証を通すための認証ファイルをローカル環境で生成する必要がなく,認証ファイルの生成がGCP上で完結する.
     このサイトの「Googleの認証」の項目を参照して,Google Drive APIの認証ファイルであるservice_account.jsonを生成する.この認証ファイルにより,Google Drive APIを介したpydrive2によるファイルのアップロードとダウンロードが可能となる.
     
  2. Paperspace Gradientに認証ファイルをアップロード
     上記で生成した認証ファイル(service_account.json)をPaperspace Gradient上の作業スペース(というより,セルの実行時のカレントディレクトリ)にアップロードする.AUTOMATIC1111の場合のアップロード先は後述する.
     
  3. 設定終了
     以上で,pydrive2を用いてgoogle drive上のファイルを扱うことはできるようになった.
     

Automatic1111上と組み合わせる

 Google Driveにアクセスできるようになったので,今流行ってるStable Diffusionのweb UIであるAUTOMATIC1111上で生成した画像をGoogle Driveにアップロードする方法を構築した.

  1. 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」のセルまで実行する.
      
  2. Google Driveにファイルをディレクトリごとアップロードするコードを追記する.
     先ほどアップロードしたipynbファイル(これ)の中に,Google Driveへのファイルのアップロード用のセルを挿入する.空のセルを挿入して,このサイト(ここをクリック)にあるアップロードスクリプトをコピペすればOK.WEBUIの使用後に画像を転送するので,私は「Launch the WebUI」セルの下に挿入した.その後,コピペしたコードの”pydrive”になっている箇所を”pydrive2″に修正した.
     その後,service_account.jsonを読み込むコードを,アップロードスクリプトをコピペしたセル内に追記した.このサイトの「PyDriveの動作確認」の箇所を参考に,コードを修正した(以下のように修正した).

    アップロードスクリプトをコピペしたセルの修正箇所

     
     
  3. pydrive2をインストールするセルを追記する.
     元のipynbファイル(これ)は,Google Drive関連のコードの記述がないので,当然そのままではpydrive2がインストールされない.「!pip install pydrive2」と記入したセルを追記した.
     
  4. 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回呼ぶ),という無理やりな手段で解決できるが,センスは無い.気が向いたら,後日解決する.


     
  5. pydrive2の設定」で生成した認証ファイル service_account.jsonを,「/notebooks/stable-diffusion-webui」ディレクトリ直下に置く(以下の画像を参照).ちなみに,AUTOMATIC1111の実行時にこのディレクトリに移動しているため,認証ファイルをこのディレクトリに置いているだけである.要は,実行時のカレントディレクトリにservice_account.jsonを設置する

     
  6. あとは,1.で紹介したサイトの通りにセルを実行していく.画像を生成し終わったら,AUTOMATIC1111を閉じて,実行中のセルを終了する.その後,2.で作成したセル(Google Driveにファイルをアップロードするセル)を実行することで,Google Drive上の指定したフォルダに画像がコピーされる.
     
  7. 容量の節約のために,「!rm -rf /notebooks/storage/stable-diffusion/stable-diffusion-webui/outputs/txt2img-images/*」 により,Paperspace上の生成した画像を全て削除する.ipynbファイル(これ)に削除用のセルが記載されていたが,私はそのコードではうまくファイルが消えなかった.
     

サービスアカウント上にファイルが残っているかも.

以下によると,サービスアカウントを介してファイルをやり取りした場合,ファイルがサービスアカウントに残るらしい.サービスアカウントのDriveの容量は15GBなので,ファイルがたまったら削除しないとダメかも.⇒rclone使って,サービスアカウントのGoogleDriveにアクセスして,消せた

サービスアカウントを使って Google Drive(マイドライブ) に作成したファイルのオーナーはサービスアカウント

まとめ

 Paperspace Gradient上でAUTOMATIC1111を実行し,生成した画像をGoogle Driveにコピーすることができた.

 Paperspace Gradientは大きく分けると,「{system files}」(usr,var,tmpなど),「/storage」,「/notebook」,「/datasets」のディレクトリがある.

Paperspace Gradientのワークスペースのディレクトリ構造(公式サイトより引用)

恐らく課金対象の永久ストレージ(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

コメント

タイトルとURLをコピーしました