ぐるのなんか

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

Fork(Gitクライアント)買いました

タイトルの通り、ようやっと買いました。

無料だった時期から使い続けて、なんか昔記事書いた時期から見ても4年以上は使ってます。

有償化してからは$50という価格に若干尻込みし、
一応アクティベートせずに使えるのに甘えて無料で使ってるうちにえらい円安になって割高になってしまい、
またちょっと円高になるまで待とっかなーと思ってたら3月から値上げだそうで。

もう$50分は使ったやろということで買いました。

個人的にはSourceTreeにない(orどうアクセスするかわからない)機能が色々あって捗るのでおすすめです。
禊がてら、この辺良いなーって思ったとこを軽く紹介。

  1. マージする際にスカッシュマージが選択肢に出てくる

    しょうもないコミットが連続してるブランチなんかを綺麗にしたい時とかに使える。

  2. マージ、チェリーピックの際に即座にコミットしない選択肢があり、かつボタンひとつでマージ、チェリーピックを中断できる

    別ブランチの内容を検証のために取り込みたいけど、コミットされるといちいちリセットするのが面倒って時に便利。
    その内容をワンボタンでなかったことにできるのもいい。

  3. マージ元のコミットを隠して履歴をたどりやすくできる
    複数人で作業してると履歴がごちゃごちゃするので非常に助かる。

  4. ブレイム機能でソース全体を通して誰がどこをいつ変更したのか見通せる
    git blameの機能はSourceTreeにもあったらしいけどなくなってる?
    ログの表示のことであればこっちのほうが見やすい。

  5. (多分)SourceTreeよりかは軽い

基本的にSourceTreeかForkぐらいしか使ってないので、他のクライアントでは当たり前にできるよ!とかあるかもしれませんが。

難点としては文字コードの変更ができない、ドル決済、日本語非対応あたり。
特に英語そこまでやしGitもあんまわからん!て人には使いづらいと思うので、
SourceTreeでGitそのものの用語とか使い方に慣れてからでもいいと思います。
まあ慣れる頃には$60になって余計導入のハードル上がるかもですが…。

Paperspaceで使うファイルの置き場を変えてみた

相変わらずよくわからんまま追加学習させてます。
LoRAとかにも手を出したみたんですけど、sd_dreambooth_extensionのLoRAは実装が壊れてるのか画像生成時にうまく適用できないみたいですね。
今んとここの拡張機能を使わせてもらってます。
github.com

とりあえずファイル置き場を作る

前回の反省

さてタイトルの件ですが前回の記事で学習モデルやらなんやらをGoogleDriveから引っ張ってくる話をしました。
なんかAPI使ったり認証情報保存してアップロードしたりと七面倒なことを書いてましたが、公式のドキュメント見たら「gdownってライブラリ使いなー」って書いてありました。
docs.paperspace.com
めっちゃ簡単そうですね。
ただこれGoogleDriveの方のファイルを共有リンクからアクセス可能にしないと駄目っぽいのでそれもそれでどうなん?となってました。
そもそも無料で使ってると上限15GBなのでちょっと欲張るとすぐいっぱいになりますね。

新しい寄生先の作成

で、無料で使えてアクセス制限もかけられる都合の良いサービスないかなと探してたら、HuggingFaceで普通にできるっぽいです。*1
Stable Diffusionのモデル落としてくるためにしか使ってなかったので全く気づきませんでした。上っ面の部分しか触れてないとこういうことありますよね。

画面右上のユーザーのアイコンクリックしたとこのここ

上からNew Model=学習モデル置く場所、New Dataset=学習用データセット置く場所、New Space=paparspaceみたいなクラウドサービス動かす場所、を作れるようです。

ただ一番下はともかく、New ModelとNew Datasetでできるものは実体としてはGitリポジトリっぽいので、公開しないなら使い分け意識しなくてもいいかなって感じです。
とりあえずNew Modelをクリックすると下みたいな画面が開くので適当に名前つけてPrivateを選択、

Create Modelをクリックでリポジトリが作成されます。

Create Model Cardってボタンがあるので、New Model、New Datasetはそれぞれ学習モデル、データセットを公開するための雛形も一緒に作ってくれるって感じですね。

リポジトリができたら好きなGitクライアントでローカルにクローン、クローンしたフォルダにアップロードしたいファイル置いてコミット→プッシュ、でOK。
Privateの場合だけかも知れませんがクローンのタイミングでGit Credencial ManagerからHuggingFaceの認証情報を求められます。

普通にHuggingFaceのログインに使ってる情報を入れればOKです。

Paperspace側に持ってくる

HuggingFace側の準備

アップロードが出来たらそのファイルを使いたい環境に持ってくるわけで、curlコマンドとかでダウンロードできるんですが、
リポジトリをPrivateにしているので認証も通してやる必要があります。

認証の仕方は色々あるんですが、とりあえずHuggingFaceの方で参照用のトークンを作成し、curlコマンド内にトークンも入れ込んでしまう形にしました。(あんまり詳しくはない)
とりあえずトークンを作成する画面へはSettings>Access Tokens>New Token

適当な名前つけてRoleのとこをダウンロード用ならread、アップロード用ならwriteを選択、

作成されたトークンを右端のボタンでコピー。

あと作成したリポジトリ内のアップロードしたファイルのページを開いて

downloadボタンを右クリックしてリンクをコピー。

Paperspace側でダウンロード

ファイルをダウンロードするためのノートブックに以下のようなコマンドを記載。

%%bash
cd (ファイルをDLしたいディレクトリ)

token=(コピーしたトークン)
url=(コピーしたリンクのファイル名除いたURL)
file_name=(ファイル名)
curl -K<(builtin echo "-u :${token}") -Lo $file_name $url$file_name

これを実行すればファイルがダウンロードされてくるはず。
やたら変数切ってるのは複数ファイル落としたい場合に備えてで、最後の2行だけ繰り返すか、file_name2とか作って

curl -K<(builtin echo "-u :${token}") -Lo $file_name $url$file_name -Lo $file_name2 $url$file_name2 ... 

って感じでいけると思います。
※2023/08/23追記
ちょっと前からこのコマンドでダウンロードができなくなってたんですが、公式のドキュメントとか見てcurlコマンドのところを以下に書き換えたらうまいこといきました。

curl -K <(builtin echo "-H \"Authorization: Bearer ${token}\"") -Lo $file_name $url$file_name

BASIC認証んとこにトークン書いてたのをHTTPリクエストのヘッダーにトークン書き込むように変えた感じです。
そういやなんかのコマンド実行したときにBASIC認証廃止するよみたいなメッセージが出てたかもしれない。
追記ここまで

そのまま使う人がいるか分かりませんが、使う場合は自己責任でお願いします。
トークンの値をpaperspace上に置いとくのはどうなんだと自分でも思いますが、
まあそれを見られるということはそもそも非公開にしているノートブックを覗かれてるわけで、
その時点でだいぶ終わってるので気にするべきは別のとこかなと。
おすすめの方法があれば教えてください。

一応builtin echoの部分は下記の記事を参考にして多少気を使った結果です。
qiita.com

おわり

ということで、やってる事自体はあんま変わらんのでストレージ周りに関係する話だけ書きました。
まあでもDreamboothじゃなくてLoRA使うならモデルサイズもそこまで気にする必要もないかなぁと思ったり。
バカでかいサイズのデータセット作ったりしたらヘビーに使うかもしれません。
何にせよGoogleDriveは他の用途でも使うので追加学習関連を切り分けられて良かったです。
おわり。

*1:>

無制限ってことでいいんだよな…?

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イラストで遊べるようになるので、興味持ってくれる人が知り合いに増えればなぁと思ってます…。

Stable Diffusionのオプションメモ

前回の記事の続きです。
今回はスクリプト実行時に使えるオプションについての使用感なんかを書いていければ。

いきなり横道にそれますが、Stable Diffusionのカスタム版がどんどん増えてるようで、ついにグラボでなくCPUで動かせるものが出てきたみたいですね。 github.com zenn.dev またひとつハード的なハードルが下がったようですばらしいですね。

話を戻してオプションの話。
Stable Diffusionのtxt2imgやimg2img、さらに低負荷版のoptimized_txt2imgやoptimized_img2imgには、実行時に--promt--seedなどのオプションを設定できます。
ただひとつひとつが何を意味するのか、どういう効果をもたらすのかというのがいろいろな解説サイト巡らないと網羅できないので、ざっくりと一覧を作りたいなという感じです。
(よくわかってないのも含みます)
ちなみに使用可能なオプションはtxt2img.py --helpという感じで--helpオプションを付けて実行したときの一覧を元に解説します。

txt2img(本家版 テキストから画像を生成するスクリプト

オプション一覧

optional arguments:
  -h, --help            show this help message and exit
  --prompt [PROMPT]     the prompt to render
  --outdir [OUTDIR]     dir to write results to
  --skip_grid           do not save a grid, only individual samples. Helpful when evaluating lots of samples
  --skip_save           do not save individual samples. For speed measurements.
  --ddim_steps DDIM_STEPS
                        number of ddim sampling steps
  --plms                use plms sampling
  --laion400m           uses the LAION400M model
  --fixed_code          if enabled, uses the same starting code across samples
  --ddim_eta DDIM_ETA   ddim eta (eta=0.0 corresponds to deterministic sampling
  --n_iter N_ITER       sample this often
  --H H                 image height, in pixel space
  --W W                 image width, in pixel space
  --C C                 latent channels
  --f F                 downsampling factor
  --n_samples N_SAMPLES
                        how many samples to produce for each given prompt. A.k.a. batch size
  --n_rows N_ROWS       rows in the grid (default: n_samples)
  --scale SCALE         unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty))
  --from-file FROM_FILE
                        if specified, load prompts from this file
  --config CONFIG       path to config which constructs model
  --ckpt CKPT           path to checkpoint of model
  --seed SEED           the seed (for reproducible sampling)
  --precision {full,autocast}
                        evaluate at this precision
-h, --help

上記のオプション一覧を表示する。

--prompt [PROMPT]

いわゆる呪文をこのオプションの引数という形で設定する。
改行ができないので呪文の量が増えてくるとすごく見づらい。

--outdir [OUTDIR]

生成した画像を出力するフォルダを指定する。
--outdir "./outputs/sample"

--skip_grid

デフォルトでは生成した画像をタイル状に並べてまとめた画像を生成するが、それを生成しないように指定する。
引数を渡す必要はなく、このオプションを記載するだけでいい。

--skip_save

do not save individual samples. For speed measurements.

と書いてある通り、生成した画像を保存しないオプションらしい(画像が目的なので使ったことない)。

--ddim_steps

画像の精度に関わるオプション。
ものによっては50ぐらいでも十分なこともあるが、アニメ絵みたいなのを生成する場合100以上は欲しい。
この値を上げれば上げるほど1枚生成するのに時間がかかるし、VRAMの使用量も増える。
うちの環境では250より大きくするとメモリ不足で落ちる。

--plms

よくわからんが使ってるオプション。
PLMSサンプラーという言葉がコマンド実行中のログに流れるので、学習した画像から要素引っ張ってくるときの手法かなんか?
とりあえずつけとけばいい感。

--laion400m

よくわからんので使ってないオプション。
ググるとLAION-400-MILLION OPEN DATASETというのが引っかかるので、4億枚の画像を参考画像かなんかに使う感じだろうか。

--fixed_code

よくわからんので使ってないオプション。
すべてのサンプルで同じ開始コードを使う?同じシード値を使うとかではない?
それなら同scaleでのばらつきとかが比較できて有用かも。

--ddim_eta

よくわからんので使ってないオプション。
ETAと聞くと思い浮かぶのはEstimated Time of Arrival(到着予定時刻)なので処理完了までの時間を指定するオプションに思えるけど、
GUI版では値の範囲が0.00~1.00なのでよくわからん。

--n_samples

一回の生成処理で何枚の画像を生成するかを指定する。
--n_samples 3とすれば一回の処理で3枚生成される。
とはいえ枚数を増やせばその分時間がかかるし、このオプションの値を上げると消費メモリが増える。
本家の方では欲張らず1を指定するのが無難。

--n_iter

画像生成処理を何回繰り返すかを指定する。
--n_iter 10とすれば10回繰り返される。
n_samplesオプションとの組み合わせで合計生成枚数が決まるので、
--n_samples 3 --n_iter 10という指定をすると30枚生成される。

--H

画像の高さ。
値は64刻みで指定しないとエラーが出る。
本家の方ではあまり欲張れないので256とかにしがち。

--W

画像の幅。
他は高さと同じ。

--C

よくわからんので使ってないオプション。
latent channelsが潜在チャンネルという意味で、
Stable Diffusionが確か潜在拡散(latent diffuision)モデルというのを利用しているらしいので、
結構大事なオプションなんじゃないかと思うけど…。

--f

よくわからんので使ってないオプション。
機械学習関連の用語とは思うけど使わなくても何とかなってるので調べてない…。

--n_rows

生成した画像をグリッドにまとめるときに何行にするかというオプション。
そもそもグリッドいらないので使ってない。

--scale

生成される画像をどれだけ呪文の内容に沿ったものにするか、というオプションらしい。
0~50の範囲で指定できるが、50にしておけば呪文通りのものができるかというとそうでもない。
逆にバケモンが生まれたりもするので、7.5~20あたりがいいかも。

--from-file

呪文をファイルから読み込むオプション。
よさげなオプションに見えるけどあんま使ってない。

--config

よくわからんので使ってないオプション。
「モデルを構築するための設定ファイルへのパス」とのことなので、下手にいじらん方がいいんじゃないかと思う。

--ckpt

.ckptファイルのパスを指定するオプションっぽい。
Stablediffusionの派生型とかも使いたいってなったときに.ckptファイルあちこちコピペすんのめんどいし重い場合は使いそう。

--seed

シード値。
生成される画像を見ると、なんかしら大本になった画像があってそこにいろんな要素くっつけた感じなので、その大本の画像を指定するものかも。
scaleだけ変えたりして結果を比較したいときにシード値固定すると便利。
ただ画像の大きさや呪文の最初の方変えてしまうと、同じシード値でも結果ががっつり変わるので注意。

--precision {full,autocast}

よくわからんので使ってないオプション。
グラボがGTX16XXとかだと画像が単色になっちゃう現象があるらしく、その場合これを指定すると直るという記事を見た。

img2img(本家版 画像から画像を生成するスクリプト

オプション一覧

optional arguments:
  -h, --help            show this help message and exit
  --prompt [PROMPT]     the prompt to render
  --init-img [INIT_IMG]
                        path to the input image
  --outdir [OUTDIR]     dir to write results to
  --skip_grid           do not save a grid, only individual samples. Helpful when evaluating lots of samples
  --skip_save           do not save indiviual samples. For speed measurements.
  --ddim_steps DDIM_STEPS
                        number of ddim sampling steps
  --plms                use plms sampling
  --fixed_code          if enabled, uses the same starting code across all samples
  --ddim_eta DDIM_ETA   ddim eta (eta=0.0 corresponds to deterministic sampling
  --n_iter N_ITER       sample this often
  --C C                 latent channels
  --f F                 downsampling factor, most often 8 or 16
  --n_samples N_SAMPLES
                        how many samples to produce for each given prompt. A.k.a batch size
  --n_rows N_ROWS       rows in the grid (default: n_samples)
  --scale SCALE         unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty))
  --strength STRENGTH   strength for noising/unnoising. 1.0 corresponds to full destruction of information in init
                        image
  --from-file FROM_FILE
                        if specified, load prompts from this file
  --config CONFIG       path to config which constructs model
  --ckpt CKPT           path to checkpoint of model
  --seed SEED           the seed (for reproducible sampling)
  --precision {full,autocast}
                        evaluate at this precision

txt2imgと被るものは省略

--init-img

元となる画像を指定するオプション。
--init-img "./outputs/sample/001.png"

--strength

--init-imgで指定した画像をどれだけ改変するかを指定する。
0~1の範囲で指定でき、0だと何もかわらない、1だと元画像の面影なし。
txt2imgとかで生成した画像の調整がしたいなら低い値で、
ざっくりとしたイメージだけ手書きした画像とかからなら高い値で、という使い分けになる。
ちなみに0に近い値の方が処理速度が上がる。 追記 低負荷版の動作中のログ見て気付いたけど、 実際に処理してるddim_stepsの値が引数で指定したddim_step×strengthに一致してる。

optimized_txt2img(低負荷版 テキストから画像)

オプション一覧

optional arguments:
  -h, --help            show this help message and exit
  --prompt [PROMPT]     the prompt to render
  --outdir [OUTDIR]     dir to write results to
  --skip_grid           do not save a grid, only individual samples. Helpful when evaluating lots of samples
  --skip_save           do not save individual samples. For speed measurements.
  --ddim_steps DDIM_STEPS
                        number of ddim sampling steps
  --fixed_code          if enabled, uses the same starting code across samples
  --ddim_eta DDIM_ETA   ddim eta (eta=0.0 corresponds to deterministic sampling
  --n_iter N_ITER       sample this often
  --H H                 image height, in pixel space
  --W W                 image width, in pixel space
  --C C                 latent channels
  --f F                 downsampling factor
  --n_samples N_SAMPLES
                        how many samples to produce for each given prompt. A.k.a. batch size
  --n_rows N_ROWS       rows in the grid (default: n_samples)
  --scale SCALE         unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty))
  --device DEVICE       specify GPU (cuda/cuda:0/cuda:1/...)
  --from-file FROM_FILE
                        if specified, load prompts from this file
  --seed SEED           the seed (for reproducible sampling)
  --unet_bs UNET_BS     Slightly reduces inference time at the expense of high VRAM (value > 1 not recommended )
  --turbo               Reduces inference time on the expense of 1GB VRAM
  --precision {full,autocast}
                        evaluate at this precision
  --format {jpg,png}    output image format
  --sampler {ddim,plms}
                        sampler

txt2imgと変わらないものは省略

--outdir [OUTDIR]

オプションの名前こそ変わらないものの、低負荷版では呪文の内容でフォルダが切られる処理が入っており、
実際にはこのオプションで指定されたフォルダに呪文ごとのフォルダが切られ、その下に画像が生成される。
この影響で呪文の最初の方にフォルダ名に使えない記号とかが入ってるとエラーになるので注意。

--H --W

機能的には全く変わらないが、低負荷になってるので大きめのサイズを指定しても動くようになった。
画像のサイズで生成される画像が大きく変わるのでいろいろ試すことが可能に。

--device

よくわからんので使ってないオプション。
というか説明を見る限りグラボが複数ある場合にどれを使うか指定するオプションっぽいので、
大概の人にとって関係のないオプションに思える。

--unet_bs

よくわからんので使ってないオプション。
説明を翻訳すると「推論時間を若干短縮するが、VRAMが高負荷になる」なので、
特にいじる必要がないように思える。

--turbo

ちょっと高負荷にして時間短縮にするオプション。
本家は重すぎたけどこっちは軽すぎてスペックに余裕がありすぎる…て場合につける。
VRAMが8GBのうちはつけてる。

--format

説明の通り画像をjpgかpngか選べる。

--sampler

よくわからんが使ってるオプション。
多分本家版の--plmsに相当する。
ただREADMEとかを読むと何も設定しなくてもデフォルトがplmsになってるっぽい。

optimized_img2img.py(低負荷版 画像から画像)

オプション一覧

optional arguments:
  -h, --help            show this help message and exit
  --prompt [PROMPT]     the prompt to render
  --outdir [OUTDIR]     dir to write results to
  --init-img [INIT_IMG]
                        path to the input image
  --skip_grid           do not save a grid, only individual samples. Helpful when evaluating lots of samples
  --skip_save           do not save individual samples. For speed measurements.
  --ddim_steps DDIM_STEPS
                        number of ddim sampling steps
  --ddim_eta DDIM_ETA   ddim eta (eta=0.0 corresponds to deterministic sampling
  --n_iter N_ITER       sample this often
  --H H                 image height, in pixel space
  --W W                 image width, in pixel space
  --strength STRENGTH   strength for noising/unnoising. 1.0 corresponds to full destruction of information in init
                        image
  --n_samples N_SAMPLES
                        how many samples to produce for each given prompt. A.k.a. batch size
  --n_rows N_ROWS       rows in the grid (default: n_samples)
  --scale SCALE         unconditional guidance scale: eps = eps(x, empty) + scale * (eps(x, cond) - eps(x, empty))
  --from-file FROM_FILE
                        if specified, load prompts from this file
  --seed SEED           the seed (for reproducible sampling)
  --device DEVICE       CPU or GPU (cuda/cuda:0/cuda:1/...)
  --unet_bs UNET_BS     Slightly reduces inference time at the expense of high VRAM (value > 1 not recommended )
  --turbo               Reduces inference time on the expense of 1GB VRAM
  --precision {full,autocast}
                        evaluate at this precision
  --format {jpg,png}    output image format
  --sampler {ddim}      sampler

上記3つと完全にかぶるので省略

締め

ざっと上記の感じです。
本家の方では使い道がわからんオプションが多かったので、
そのうち勉強して更新できたらいいなと思いつつ、
実際問題わからなくても使えてるのでモチベーションはそんなにないです。

オプションとは関係ない話

NSFW

本家版ではNSFWな画像が弾かれるチェックが行われてそういう画像が出せないのですが、 低負荷版は画像生成の処理にかなり手を加えているらしく、
その過程でNSFWな画像を弾く処理が省かれた結果全部駄々洩れになります。
本家の方でも、NSFWチェックが負荷かかる(建前?)ので
チェックしないオプションを追加するプルリクが上がってるとか。

GUI

低負荷版の方に手加えてGUIを追加してる人がいて、ものによってはboothやらなんやらで売ってたりもしますが、
GUIは欲しいけどお金出してまではなぁ…ほかにいろいろ入れんのものなぁ…という場合は、
python optimizedSD/txt2img_gradio.py python optimizedSD/img2img_gradio.py
とコマンド叩けばブラウザで動くGUI版が起動するので、ブラウザでhttp://localhost:7860にアクセスすれば使えるようになります。
あと本家は知りませんが、低負荷版ではコマンドのログが残るようになったので、
ブラウザ閉じちゃったとかで設定が飛んでもログを見て設定入れなおすことが可能に。
時々Gitのフェッチかけてみたりとかリモートリポジトリの方覗いたりすると面白いかもですね。

Python何も知らん人間が Stable Diffusionの環境作った

話題の画像生成AIのStable Diffusionのローカル環境作ってみたので備忘録的に書きます。
わからん人向けの説明なのに専門用語が出てきたりしますが参考程度に。
細かい説明は読み飛ばして、「〇〇をする」というとこだけ実行してもらえばOKです。

筆者は三流プログラマです。

環境

  • OS:Windows11 Home 21H2
  • GPU:RTX 3070 8GB(PC新調したばっかなのに推奨環境に足りてない)

はじめに

Stable Diffusionと一口に言っても、既に何個かバリエーションがあるようです。(2022/08/29現在)

  1. 本家github.com
  2. 高負荷すぎて並のPCじゃ動かない本家をフォークして低負荷にしたやつgithub.com
  3. 必要なもの全部入り+独自のGUIが加えられたものgrisk.itch.io
  4. (2022/09/03追記)グラボじゃなくてCPUとメモリで動かせるやつgithub.com

環境構築とかめんどくさい、とにかくAI触ってみたいんやという人は3でいいんじゃないかな。
ただ全部入りなのでファイルサイズがでかい+本家の方に更新が来るたびにDLし直しになるかも?
勉強がてら構築してみるか、という人は1か2を使うことになります。
以降は1,2用の解説です。

導入手順

基本的にはこちらの記事を参考にしました。
zenn.dev

Gitインストール

参考記事には書いてないですが、とりあえずGitをインストールしましょう。
SourceTreeとかGithub DesktopみたいなGUIクライアントでなく、Gitそのものです。
エンジニア的には既に入ってたりするかもですが、そうでない人は多分入ってないし、入ってないとうまくいかない(後述)。
公式サイトまでいってインストーラを落としてきてもいいですが、
Win11や10には標準でwingetというツールがついてるっぽいのでこっちを使う方が楽です。
docs.microsoft.com
Winキー押して「poweshell」と入力すると「Windows PowerShell」というアプリが表示されるのでこれを起動。

開いた画面で 以下のように入力してEnter

winget install Git.Git


あとは適当に許可したりすればインストール完了です。
それはそれとしてGUIのクライアントを持っておくと更新とかが楽なので適当に入れておくのがおすすめ。

condaインストール

次はStable Diffusionの公式で使ってるよって書かれてるcondaをインストールします(表現おかしいかも)。
docs.conda.io
詳しくないのでconda何するものぞという感じなんですが、
パッケージマネージャであると共に仮想環境的なものを作って実行環境の切り分けができるみたいですね。
これがうまいこと動いてくれれば環境構築もだいぶ楽になります。
インストーラは画面左のメニューからUser guide>Installation>Installing conda on a ~ >Installing on Windowsから取得します。

ここにきてMinicondaとAnacondaどっち欲しいのよと聞かれますが、よくわからんのでMinicondaにしました。
さらに飛んだ先でダウンロードリンクが並んでるので自分の環境にあったやつを選べばインストーラがDLされます。

インストーラを起動してNext Agreeと進めるとインストールをログイン中のユーザ用にするか全ユーザ用にするか出ますがお好みで、インストール先もお好みで、特に難しいとこはなかったはずです。

ここまで終わってようやっと参考記事のスタート地点です。
参考記事の方ではAnacondaを使ってるようですが、この手順の中ではさほど違いなさそうです。

CUDA

正直なんなのかよくわかってないですが、参考記事のリンクからインストーラ落としてインストールするだけなんで割愛。

conda環境の構築

参考記事のセットアップのあたりです。
コマンドを入力して進めていくのですが、ここで使うのは先ほどインストールしたMinicondaに付属する「Anaconda Prompt(Miniconda3)」です(以下コンソール)。

git clone (Stable DiffusionのリポジトリのURL)

というコマンドを打つことで本体がクローン(≒DL)されてくるのですが、コンソールを開いてすぐの状態だとユーザーフォルダの直下にクローンしてしまうので、気になる場合は好みのディレクトリにcdコマンドで移動しましょう。

実際打つコマンドですが、PCスペックに余裕がある場合は

git clone https://github.com/CompVis/stable-diffusion

余裕がない場合は

git clone https://github.com/basujindal/stable-diffusion

になります。
どちらを打ってもこの後の作業は変わりません。
この後下記の3つのコマンドを打つことになります。

cd stable-diffusion
conda env create -f environment.yaml
conda activate ldm

いったん説明のためにDドライブ直下のreposフォルダ内にクローンしてきたとすると、
reposフォルダ内には「stable-diffusion」というフォルダができているので、そのフォルダに移動します(1行目)
フォルダ内にある「environment.yaml」という設定ファイルを元に環境を自動で構築します(2行目)
その設定ファイル内の記述により「ldm(LDM)」という環境が作成されているので、この環境を有効化します(3行目)

少し話が戻りますが、「はじめに」のGitインストールが行われていない場合、この2行目の処理の途中でエラーになります。
というのも、「environment.yaml」の中にはStable Diffusionが使用するライブラリ等の情報が記載されており、
この情報を元にGitの機能を使って必要な諸々をDLする処理が2行目のコマンドで実行されるのですが、
Gitにパスが通っていないとGitの機能が使えず、DLも行えない、という状態になります。
筆者はこれがなってなかった(新調したばかりなのでGitがインストールされてなかった)のでここで躓きました。
「パスが通っている」の上手い説明が思いつきませんが、「はじめに」のGitのインストールで「パスを通した」と認識してもらえればとりあえずOKです。

ここで躓いたけど環境作り直しもめんどい、という場合は、environment.yamlの「pip」の下の「albumentations」とかをひたすらpip installすればなんとかなるかもしれません。
例)

pip install albumentations==0.4.3
pip install opencv-python==4.1.2.30
pip install pudb==2019.2
...

学習データの取得

ここまでできればStable Diffusionというシステムのプログラムを動かす準備は整いましたが、
AIが使う「学習データ」なるものがまだありませんので、これもGitを使ってクローンしてきます。

その前に以下のコマンドでひとつ上のフォルダに移動しましょう。

cd ../

https://huggingface.co/ へのユーザ登録と規約への合意を行えば、下記のコマンドで学習データがクローンできます。

git clone https://huggingface.co/CompVis/stable-diffusion-v-1-4-original

ただこのコマンドがすぐに終了した場合、学習データ自体はまだPC上に存在しないかもしれません。
学習データはGB単位のファイルサイズなのでDLしてくるのに相当時間がかかるのですが、そんな気配が無かった場合、この学習データのコミットログ(変更の履歴みたいなもの)だけ存在している可能性があります。
この場合「学習データのファイルが削除された」という「変更」が行われた扱いになっているので、
Git用のツールなりでこの「変更」を取り消すことで正常に学習データが復元されます(時間はかかります)。
(このあたりはGitの知識がないとややこしいのでググるなりなんなり…)

repos>stable-diffusion-v-1-4-originalフォルダの下に「sd-v1-4.ckpt」というファイルが存在する状態になったら「stable-diffusion-v-1-4-original」フォルダをコピー&貼り付けで複製し、
複製した方のフォルダ名を「stable-diffusion-v1」、その中の「sd-v1-4.ckpt」というファイル名を「model.ckpt」に変更し、フォルダごとrepos>stable-diffusion>models>ldmフォルダにぶち込みます。

ここまでできればあとはコマンドをごにょごにょして好きな画像を生成するだけです。
お疲れ様でした。
各機能の使い方なんかは多分後日…。

ForkでSJIS(CP932)のファイルが文字化けする

GitのGUIクライアントとしてForkを愛用してるんですが、
SJISで書かれたファイルの扱いがどうにもならなくて四苦八苦した際の備忘録的なやつです。

Forkとは?

チェコ共和国で開発されているらしいGit用GUIクライアントです。
fork.dev
リポジトリをフォークするのとはそんなに関係ないはず。
モダンなUIで負荷も軽め、面倒な登録なんかも不要で、コミットに載せるメールアドレスと名前を訊かれるだけです。

また私的利用・商用利用ともに無料で使えるありがたいツールです。

This Freeware License Agreement (the "Agreement") is a legal agreement between you, the end-user,
and Danil Pristupov for the use of this software product ("Software"). Commercial as well as non-commercial use is allowed, free of charge.

*1*2

環境

OS:Windows10 Home 1909
Fork:1.45.0.0

本題

問題

そんなありがたいツールであるForkですが、リポジトリ内で扱う文字コードをFork内の設定で変えられないという問題があります。
というのもGitの標準がUTF8らしいので、SJISなんかで書かれたファイルを扱うと画面上で化けます。

f:id:devgruHT:20200224021725p:plain
ふが.txt
f:id:devgruHT:20200224021756p:plain
化けました
普段から文字コードをUTF8に設定するように心がけていれば問題とも言えないようなことですが、
仕事の都合上なんかでどうしてもUTF8以外の文字コードで書かれたファイルを扱わなければいけない時にしんどいですね。
SourceTreeなんかでは使用する文字コードSJISに変更したりできるんですが、あれはコミットコメントなんかもSJIS扱いになってしまったような…試したのはだいぶ前の話なのでうろ覚えですが

解決策

Gitの設定を変えてSJISで書かれたものをUTF8に変換して表示するようにします。
といってもコンソールの扱いに慣れていないため、設定ファイルを直に書き換えていきます。
参考にしたのはこちら
qiita.com

設定ファイルどこにあるの

Forkは内蔵Gitの設定ファイルを参照しているようなので、ユーザー単位で一括で変更を適用したい場合は以下のパスの設定ファイルを弄ります。

C:\Users\%USERNAME%\AppData\Local\Fork\gitInstance\2.24.1\etc

「2.24.1」は内蔵Gitのバージョンを示しているので、Forkのバージョンによっては変わるかも知れません。
リポジトリ単位で設定変えたい場合は、下記のgitconfig節の内容をリポジトリ直下の.git\configファイルに、
gitattributes節の内容をリポジトリ直下に.gitattributesファイルを作ってそこに記述します。

gitconfig

以下の内容を追記します。
SJISとか上で書いてますが正確にはCP932で書いたファイルなので、ここでの文字コードの指定はCP932です。

[diff "cp932"]
	textconv=iconv -f cp932 -t utf-8

f:id:devgruHT:20200224025735p:plain
gitconfig
ググってるとiconvはGit Bash for Windowsに含まれるのでそれをインストールして~とか出てきたんですが、
Forkの内蔵GitはGit Bashを含んでるので気にしなくていいです。

gitattributes

以下の内容を追記します。

*.(変換したいファイルの拡張子)   diff=cp932

f:id:devgruHT:20200224025744p:plain
gitattributes

結果

Forkの画面を見てみましょう。
f:id:devgruHT:20200224030344p:plain
git diffで取得してきたと思しき内容がちゃんと化けずに表示されました。

課題

化けずに表示出来てめでたしめでたしという訳ではなく、
参考記事にも書かれていますが課題が残っています

git add -p

Forkでは「git add -p」コマンドのように変更箇所の一部だけstage、unstageできるんですが、
上記の対応を行った後だとStageボタン押したときにエラーになります。
f:id:devgruHT:20200224033812p:plain
この記事書こうと思い至った時に出たエラーと、記事書くために作ったリポジトリとでエラーの内容が違ってアレッとなったのでここに詳しくは書きませんが、とりあえずGUI上からはまともにstageできない状態です。
最悪コンソール上での文字化け対応をして、コンソール上でgit add -pコマンド使って対応って感じでしょうか(これだとエラーにならない)。

結論

面倒くさいことになりたくなかったらUTF8で書こうな!

*1:https://fork.dev/license

*2:記事書いてる途中で調べものしてて気付いたんですが有償化するらしいですね どうすっかな github.com