2022年12月7日水曜日

初心者でもWindowsパソコンでStableDiffusionで画像生成する簡単なやり方

最近、画像生成AI StableDiffusionが話題だが

「なんか英語ばっかりで難しくて諦めた」とか

「プログラミングみたいな話が出てきて全然分かんなかった」みたいな反応も多く

「結局ウェブサイトとかLINE Botで何度か試してみたけど、調整とか出来ないから飽きちゃった」という人も多い。

今回は初心者でも簡単に自分のWindowsパソコン上に『自分だけの無料で使い放題の画像生成AI環境』を作る方法を紹介しよう。

すごく簡単だし、多機能。この記事の通りにやれば英語もプログラミングの知識も不要。

GPU(グラボ・グラフィックボード・ビデオカード)が無いパソコンでも、時間はかかるがCPUで画像生成してくれるソフトだ。

もちろんゲーミングPCなどGPUを搭載しているパソコンならGPUを活用して高速に画像生成が出来る。

また本家StableDiffusionよりVRAM(GPUメモリ)の使用率が少ないのでロー・ミドルの4GBや6GB程度のVRAMのGPUでも画像生成が出来る。

それがこのStable Diffusion UIと言うソフトだ。※もちろん無料

https://github.com/cmdr2/stable-diffusion-ui

なんと自動でStableDiffusionの準備をして画像生成の環境を起動してくれる。便利なソフトだ。

ちなみに結構な容量、最低でも20GBくらいになるので、ハードディスクとか空き容量に余裕があるドライブに解凍するのがお勧めだ。

まずhttps://github.com/cmdr2/stable-diffusion-uiにアクセスしてDownload for Windowsをクリックしよう。

クリックすると同ページ内のココに移動するので for Windowsをクリックする。

stable-diffusion-ui-windows.zipと言うファイルがダウンロードされるので、空き容量に余裕があるドライブに移動して解凍しよう(解凍:右クリックして”全て展開”を選ぶ)

すると、こういうフォルダとファイルが出てくるので(これは構築したあとの画像なので、もっと少ないが)”Start Stable Diffusion UI.cmd”と言うWindowsコマンドファイルをダブルクリックして開こう。

するとこういう画面が出て来て自動で必要なファイルをネットからダウンロードしてStableDiffusionの環境を構築してくれる。

回線速度やパソコンの性能によって変化するが、初めて起動した時は色んなデータをダウンロードするので数十分かかることも有る。
焦って閉じたりしないで放っておこう。
もちろんその間、パソコンは他のことに使っていても大丈夫だ。

なおStableDiffusionの準備が完了すれば、次回からは1分程度で起動するので安心して良い。
※但し何時間経っても止まってる様に見える時は1回閉じて開き直すのも手だ。

しばらく経ってStableDiffusionの準備が完了したら自動で普段使っているブラウザが立ち上がる。

最初はテストを兼ねて”a photograph of an astronaut riding a horse”「馬に乗る宇宙飛行士の写真」と記入されているので 紫色の大きいボタン”Make image”を押してみよう。
しばらく待てば下記のように画像が生成されるはずだ。

ちなみに作りたい画像の文章をPrompt(プロンプト)と言う。
さっきの”a photograph of an astronaut riding a horse”がProntoに当たる。

次は翻訳ソフトなどを使って作りたい画像を英語にしてみよう。

試しに「美しい公園の中心に有る噴水」を翻訳してみた。
そして翻訳された「Fountain in the center of a beautiful park」をStableDiffusionのEnter Promptに入力してMake Imageボタンを押す

一発目から思ってたより良いのが生成できた。
でも想像していたのと違うなら、Image Setting内のNumber of Image(total)の値を変えるのがおすすめだ。


例えばココを8に変えるとMake 8 Imageに変わる。放っといても同じPromptで8枚連続で画像生成してくれるわけだ。

しばらくすれば色んな噴水画像が出てくる。
いざ生成された画像を見てみると「そういえば右下みたいな噴水も有るなあ」とか「左下の画像は水は出てないけど、こういう落ち着いた噴水の写真も良いなあ」とか色んな印象を得られるので、
そこから更にPromptを調整して想像に近づけたり。気に入った出来の画像を生成し直したり、高解像度化したりする応用機能も搭載されている。

ちなみに残りの4枚はこれだ。これらも個性があって良いね。

ちなみにタスクマネージャーでモニタリングしてみたところ
VRAMは最大でも、たったの2.7GBしか使っていなかった。
今回はGTX1060 6GBで実行したが、これなら3GBのグラボの人でも大丈夫そうだ。

次に「私のPCはゲーミングPCのじゃないからグラボとか載ってないよ」という人向けの解説だ。
上のSettingタブを押して下記の画像のUse CPU (not GPU)にチェックを入れ、ページ下部のSAVEボタンを押そう。これでGPUが載ってないパソコンでも画像生成ができる。
但し「warning: this will be *very* slow」と書いてある通り時間はかかる。

そしてさっきと同じ公園の噴水画像生成を今度はCPUで行おう。

クオリティは同等だが掛かった時間は309秒
さっきGPUで実行した時は43秒だったのでCPUでは7倍も時間がかかってしまった。
しかもCPUはcorei5 12400Fと言う、割りと新しくて、性能も良いCPUだ。

つまり画像生成はCPUよりGPUの方が遥かに向いていると言う事。
GPUを持っている人は是非GPUを活用してみて欲しい。

ついでに便利な機能としてパソコンに搭載している複数にGPUの中から、どのGPUを使うか選ぶSettingも有る。

実は私はGTX1660TIも持っていてGTX1060より高性能なのだが、StableDiffusionと相性が悪く、正常に画像が生成されなかったり、余計に多くVRAMを消費する問題が有る。
なので、最近使ってなかったGTX1060を引っ張り出してきて、開いているPCIExpressスロットに増設した。と言う訳だ。

自作PCをやっている人なら古いパーツを持っていたり、
ゲーミングノートPCの人はCPU内臓GPUとディスクリートグラフィックスのGPUが混載していたりする。

なので「StableDiffusionは起動したのに何故か画像生成が出来ない」と言う時は、このSettingで「使用するGPU」を手動で指定してからSAVEボタンを押そう。
そうすればStableDiffusionは指定したGPUで画像生成を行ってくれる。

あと私みたいにサブのGTX1060に画像生成をさせることでメインのGTX1660tiが使われていない状態ならば、GTX1660tiでPCゲームなどをしても問題ないということだ(多少パフォーマンスは落ちるが問題ない)
こうやってGPUを使い分ければ「ゲームしてる間にバックグラウンドで画像を何十枚も生成する」と行ことも出来る。

さて無事にStableDiffusionで画像生成は出来ただろうか?
今回は基本的な使い方と、簡単な設定の仕方を紹介したので、是非、思い思いの画像生成を楽しんでみて欲しい。

今回は初心者向けなので、他の機能や応用は、今後、別の記事で紹介していきたいと思う。

2022年10月26日水曜日

WSL2でTensorflowのGPUが実行できない?初心者が詰まりやすいポイントを紹介

機械学習を始めて当初はWindows版のanacondaを使っていたのでTensorflowのGPU実行は当たり前のように出来ていた。

しかし相性の問題かanacondaは稀にフリーズするし動作も遅いし悩まされていた。
pip Packageとconda Packageが混在するのもトラブルの元だったし、肥大化したせいかanaconda自体が調子悪くなってきたので、トラブルシューティングとしてanacondaの再インストールを試みた所、遂にanaconda自体が起動しなくなってしまった。

そこで、古いPCパーツを活用してLinuxマシンを組み上げ、Ubuntu20.04を入れ、VScodeでTensorflowを使うとGPUが全然利用されない、使用率も消費電力も温度も上がらないしCPU使用率は100%に近い。
PytorchならGPUが正常に稼働するが、Tensorflowは、どのコードも駄目だ。

ドライバーの問題か?CUDAToolkitのバージョンや相性だろうか?
検索しても事例が出てこないし、導入の仕方やanacondaがオススメだとか、DockerDesktopの紹介ばかりだ。

その後Windows環境に戻りVScodeにWSL2をリンクしてWindowsからLinuxを利用できるようにした。

そしたらLinuxPCと全く同じで、PytorchならGPUが使えるがTensorflowだとGPUが動かない。

そこで、今まで良くわからないからすっ飛ばしていた事を、ちゃんとやることにした。
cuDNNの導入だ。
デバイスドライバーやCUDAToolkitと違って、NVIDIAのDeveloper登録が必要だし、検索しても環境変数とか面倒な情報ばっかりだったので、放おって置いたのだが、真面目に導入してみることにした。


今考えると、これが原因なのだが、初心者からすれば「PytorchならGPUで機械学習が動いているのだから別にcuDNNは必須では無いのだろう」と思いこんでいた。

ちなみにanacondaはconda installで簡単にcuDNNが実装できるので動いていたと言うわけだ。

やってみると意外と簡単だ。
NVIDIAのDeveloper登録だが下記のサイトから行う

普通にDownload cuDNN>をクリックすれば良い。
次にJoin nowでユーザー登録を行う
メールアドレスを入れてNextを押すと
後はパスワードを作成してI am human、メール認証で登録完了だ。
無事にログインできたらCUDAバージョンに合わせたcuDNNをダウンロードしよう。

さて、ここからが本題だ。
・ダンロードしたファイルをどこに入れれば良いのか?
・どうやってインストールすれば良いのか?

まず、ダウンロードしたdebファイルをWindowsだったら7ZIPなどの圧縮解凍ソフトで開く。

そしたdata.tarを更に開いていく。
この階層に有る
libcudnn8_8.6.0.163-1+cuda10.2_amd64.debがcuDNNのインストーラーパッケージだ。※今回は10.2を使っているので、このファイル名だが、もちろんバージョンによって異なる。

該当のファイルをWSLの/home/ユーザー名フォルダにコピーする。

次にターミナルでsudo dpkg -i libcudnn8_8.6.0.163-1+cuda10.2_amd64.debを実行※sudoが必要なことに注意
これでcuDNNがバッチリ入る。

Tensorflowのチュートリアル機械学習コードで試してみると見事にGPUで機械学習が出来ていることが確認できる。

同様にUbuntuをインストールしたLinuxPCでも全く同様の手順でcuDNNはインストールできる。
機械学習をしようと調べるとanacondaやらDockerDesktopの話ばっかり出てきて、色んなものをインストールしてストレージを逼迫したり、重くなるのが嫌でLinuxやWSL2でシンプルにTensorflowをGPU実行したい人は参考になれば幸いだ。

2022年10月3日月曜日

OpenAIのWhisperを試してみたらRuntimeError: “slow_conv2d_cpu” not implemented for ‘Half’ と表示されたので修正してみた

2022年9月の末に人工知能を研究する非営利団体OPENAIがwhisperと言うAI文字起こしを公開した。

今どきスマホでも音声検索や文字起こしアプリは有るがwhisperは何が凄いのだろう?GitHubで見てみようまずはその誤認識率

https://github.com/openai/whisper


日本語が6.4%と驚異的な低さだ(低いほど良い)ちなみにスペイン語が突出して低いがAIはスペイン語が得意なのだろうか?発音が認識しやすいのかな?とても自分には聞き取れないが。

OPENAIの公式ブログを見ると「Whisperは、ウェブから収集した68万時間に及ぶ多言語・マルチタスク教師付きデータで学習させた自動音声認識(ASR)システムである。」

68万時間!データセットを作るのに、どれだけ莫大な計算能力と時間がかかったのだろう。さすが、かの有名なGPT-3を作ったOPENAIだ。

早口言葉や、スポーツの実況、K-POPの歌詞や、多人数での会話まで文字起こし出来るらしい。

さっそくローカル環境で動かしてみることにした。


しかし早速エラーが

RuntimeError: “slow_conv2d_cpu” not implemented for ‘Half’

ハーフつまり浮動小数点演算精度 半精度 FP16のことだろう。

そこで該当のPythonファイルdecoding.pyを調べる


どうやら100行目にuse fp16 for most of the calculation(計算の大部分にfp16を使用)と、いかにもなコメントを発見

TrueからFalseへ変更して保存。Notebookを再起動して実行!果たして…

見事に文字起こし成功!精度も素晴らしい。しかし40秒もかかっている…

このwhisper学習モデルが選べるのだが、下記の表の通り、モデルが大きくなれば処理に時間がかかりVRAM使用量も増える。私のGPUはGTX1660Ti 6GBだから~5GBのmediumで試したのだが、標準のbaseに比べたら8倍も時間がかかるようだ。よし、ここは素直に標準のbaseで試そう。



baseにした所、時間は10倍以上短縮されたが、「whisper」が「ビスパー」になってるし「文字起こし」は「文字を越し」

これでは『最新の凄い文字起こしAI』とはいえない。最近のスマホ以下だろう。やはり圧倒的な精度で実行したい。

そこで違和感に気がつく、さっきのランタイムエラー

“slow_conv2d_cpu”・・・CPU?

GTX1660Tiを使っていたから、いつも通りGPUのせいかと思ったら、これCPU実行じゃん!タスクマネージャーでもnvidia-smiでもVRAM全然使ってない!

かと言ってコードに不審な点もない。

そこでPIP LISTでTorchバージョンを見たところ、やはりCPUバージョンのTorchが入っていた。最近あまり使っていないconda環境だからPytorchのバージョンを忘れていたのが原因だった。

pip3 uninstall torch torchvision torchaudioで現状インストールされているPytorchを全て消し。

pip3 install torch torchvision torchaudioでCUDAバージョンのPytorchを入れた。

さあ、これでwhisperの真の実力がわかる!いざmediumモデルで実行!


11.7s!! CPUで実行した際の40.1秒から4倍近く早くなった!文字起こしの精度も完璧だ!

ちなみに、なんでこんな事になったかというとubuntu 20.04だと上手くGit installが出来ず、WSL2でubuntu 18.04を開くもPython3.7や3.6だとtransformerの互換性エラーが出てしまう。

そこで以前Stable Diffusionのときに作ったconda環境のPython3.85をTerminalで開いて

pip install git+https://github.com/openai/whisper.git

と打ったらあっけなくinstall出来たので、そのまま使っていた(どのPytorchを入れていたかは忘れていた。)と言うわけだ。

Stable DiffusionもFP16を使うのでGPUがエラーを起きた際にCPUで動かしたりしたのだろう。その後Stable Diffusionは別の方法で解決したので※別の記事で解説 CPUバージョンのPytorchのままだったのかもしれない。

最近はWSL2 DockerDesktop anaconda3と簡単に様々な仮想環境を作成出来るので、それぞれの詳細なSitePackageまでは把握しきれない。

ただ、フレームワークやライブラリの確認は開発の基本だから今後は気を付けたい。

ちなみにOPENAIのwhisperは、あらゆるフォーマットに対応するffmpegを利用するのでmp3でもAACはもちろん。mp4の動画でも、ファイルを指定すれば文字起こししてくれる。

一度ローカル環境を作ってしまえば、何度でもすぐに使える今日現在最高に便利な文字起こしAIなので、みなさんも是非試してみてはいかがだろうか。

【AI向けで高コスパなGPU RTX3060 12GB】

2022年9月25日日曜日

GTX1660TiとGTX1060 VRAM6GBのGPUでstable diffusionを動かした方法

 現在、巷で話題のstable diffusionをローカル環境で動かしてみた。

しかしエラーに継ぐエラー、私の環境はGTX1660TiとGTX1060両方共VRAM6GBしかない。stable diffusionはVRAM10GBの環境を想定しているそうだ。

しかし今現在、一般的なGPUのVRAMは4GBから8GB程度。Steamでも未だに主流のGPUはGTX1060 6GB。 stable diffusionの掲げる「AIの民主化」を実現するならば、主流のGTX1060 6GBや同じく6GBのGPUで動かせてこその「AIの民主化」だ。

よって色んな試行錯誤を経てVRAM6GBのGPUのローカル環境でstable diffusionを使えるようにした手段を書いていく。

まず私がメインで使っているのはGTX1660Ti VRAMは6GB。最新のPCゲームでも、解像度1600×900なら案外、最高設定で結構動いてくれる代物だ。

その理由は特殊な設計に有る。Turing世代なのにRT CoreもTensor Coreも無いTU116ベースのGPU。Tensor Coreを持たない代わりにFP16専用の演算器を32基載せ、FP32とINT32に関しては、それぞれ16基載せたレアというか”変り者”仕様だ。

だからFP32の演算能力は5.5TFLOPSだがFP16なら11TFLOPS出る。

しかもFP32とINT32のオーバーラップ実行。だから新しめのゲームなら先代Pascal仕様のGTX1060が100命令かかるのにGTX1660Tiなら62命令で済む。

古いゲームなら先代の上位機種GTX1070に少し及ばないか、同等。

新しいゲームならGTX1070を超え、更に上位のGTX1070Tiに迫る実力だ。

しかも先代のPascalはFP16でもFP32でも演算能力が変わらない(GTX1060 6GBなら、どちらも4.4TFLOPS)

そして機械学習において浮動小数点演算精度を下げて演算能力やGPUメモリ使用量を減らすのは、もはや定石だ。この時点で私は過去にGTX1660Tiを買ったことをラッキーだと思っていた。

しかしstable diffusionにおいてfloat値、float16にしても思ったような結果が出ない。

VSCodeはfloat値でエラーを吐きまくるし、float値を標準に戻して解像度を下げても緑色の画像。


そこで、GTX1660シリーズとstable diffusionで検索してみたところstable diffusionとGTX1660シリーズのFP16演算は相性問題が発生しているらしくグリーンの画像しか出ないらしい。

なんてこった!せっかく武器になると思っていたGTX1660シリーズのFP16演算器が邪魔になっていたなんて、浮動小数点演算精度を半精度のFP16にすればVRAM6GB以下でも動かせるし、演算精度も2倍になることを期待していたのに!

ならばとfloat値をFP32に固定すれば当然VRAM不足だ。

仕方がない、解像度を下げようPythonコードの解像度指定値を探して512×512からピクセル数4分の1の256×256でやっと画像が出力できた。



しかし何だこれは、サンプルで良く見る「馬に乗る宇宙飛行士」の画像に比べて、ずいぶんしょぼいじゃないか。

deviceをCPUに指定すれば、まともな画像は出せるが、CPUは第12世代corei5を使っているのに5分以上かかる。でもGPUなら数十秒に短縮できる。なら、どうしてもGPUで実行したい。

なら先代のGTX1060はどうだ?GTX1660のFP16演算器は相性問題があるが、サブで使っているGTX1060なら相性問題が無い。

しかも演算精度も単精度FP32なら4.4TFLOPSと、5.5TFLOPSのGTX1660Tiと大差ない。

FP16も4.4TFLOPSなのは残念だがFP16ならVRAM6GBでもメモリ不足にならずにディフォルトの512×512で出力できるはずだ。

そこで最新のStable_Diffusion_with_🧨_diffusers.ipynbのコードを編集した。場所は「Next, let’s move the pipeline to GPU to have faster inference.」の下「pipe = pipe.to(“cuda”)」を「pipe = pipe.to(“cuda:1”)」に編集してセカンダリGPU GPU:1(GTX1060)を指定。


結果、見事に「馬に乗る宇宙飛行士」の画像が512×512でVRAM6GBのGPUで出力できた!

かかった時間も、およそ56秒強程度。

GTX1660なら40秒程度、FP16が使えれば20秒程度に短縮できそうだが、FP16との相性問題で緑色の画像しか出力できないなら仕方がない。今後stable diffusion側が対応してくれるまで待つしか無い。

しかしこれで枚数制限もなくローカル環境で数十秒でAI画像生成が可能になった。

私と同じ様にGTX1600シリーズをメインで使っているが相性問題でstable diffusionが実行できない人は試しに古いグラフィックボードを引っ張り出してみてはいかがだろうか?おかげで私は出費0円でstable diffusionが実行できた。

両方共コスパの良いグラボで大いに売れたから未だに所持しており、似たような構成が可能な人も多いんじゃないだろうか?

ところで自作PCに詳しい人ならGPUの2本差しはPCIExpressのレーン数を消費してプライマリGPUのPCIExpressレーン数が8になるのを懸念する人も多いだろう。

ならGTX1060はマザーボードの下の方。PCIExpressの4X レーンにでも挿せば良い。そうすればプライマリのGTX1660はCPU直結の16Xレーンのままだ。

GTX1060は4X レーンでもstable diffusionなどの機械学習やビデオエンコードやNVIDIA PhysXを任せれば、むしろプライマリのGTX1660に余裕が生まれる。

消費電力だってアイドル時は7W程度でLED電球程度。PC全体から見れば微々たるものだ。


機械学習の為に最新のVRAM豊富なGPUを買うのも良いが、多くの人は毎回毎回高価なグラボを買い替えるわけにもいかないだろう。しかも円安の今、国外生産のPCパーツは割高だ。

案外古くて持て余してるPCパーツが試行錯誤と工夫によって役に立つかもしれない。しかも、それは自身の経験や知識になる。

参考になれば幸いだ。

【AI向けで高コスパなGPU RTX3060 12GB】

AIミステリー小説 第2章

俺は情報提供の準備を進め、信頼性のある報道機関に証拠を届けるための手段を探った。 メディアに証拠を提供することで、事件を世間に知らせ、製薬会社の闇を暴露するための力を高めることが不可欠だと考えていた。 その準備の過程で、俺は元アナウンサーで現在はジャーナリストとして活躍している久...