ほーりーさんの日記

2023年7月の記事一覧

Stable Diffusionを動かすハードウェアの話

Stable Diffusion です。最近話題の生成系 AI とかいうやつ。AI 絵師がどうとか揉めてもいるやつ。

何が良いって、Stable Diffusion はクラウドフリーで使えること!規制とかメンドクサイ話が聞こえなくもないこの世界、クラウドだとサービス停止とかありえる話なわけで、オンプレで持っておくに限りますよね!

さて、どんな構成にすれば、どれくらいの速度で描けるんだろ?ということを比較してみます。

  • 物理マシン (Express5800/T110h-S / E3-1220V5 / Mem 16GB)
  • 仮想マシン (16 vCore 38.4GHz / Mem 32GB)
  • Tesla K80 搭載マシン (Express5800/T110h)
  • Tesla P40 搭載マシン (Express5800/T110h)

自作パソコンとかでやってもいいんですが、GPU のファンがうるさいので、マシンはデータセンターに閉じ込めます。となると、リモートで電源が入れられないと困りますよね。なもんで、IPMI を持ってるサーバ筐体を使ってます。

で、どんなのを書いてもらうかというと、

まず、512 x 512 サイズで描いてもらいます。いいですよね!競泳水着!!

そして、img2img でワイドに変換します。896 x 512 です。いいですよね!!競泳水着!!

使用モデルは ACertainThing

Positive Prompt

(high resolution, masterpiec, ultra-detailed, super fine illustration,highly detailed beautiful face and eyes, beautiful hair:1.10),
dynamic angle, cowboy shot,
(blue sky:1.4)
(kawaii girl:1.20), (16 years old, teenage,loli:1.15)
(mesh hair,silver hair, long hair, twinkle eyes, tareme,medium breasts1.21),
(one girl wearing swimming race suit, competition swimsut,one-peace swimsuit,high leg swimsut,wet swimsut:1.15),
(brown skin:1.1),(shiny clothes:1.2), (Oil highlights:1.16),(cameltoe:1.13),
lean back, sunlight filtering through trees,(big eyes:1.2)
cinematic lighting, side braid, light smile, blush, skindentation

Negaitive Prompt

(EasyNegative:1.5), (Bad-Hands-3, bad-hands-5,badhandv4:1.15),bad_prompt_version2
flat color, flat shading, signature, watermark, username, artist name, bad fingers, bad anatomy, missing fingers, retro style, poor quality, garter belt, (Jersey:1.5), (long sleeve:1.5),(arm cover:1.5),(name tag:1.4),
training room, handrail, dumbbell,
name plate, name tag on swimsute, white cloth on chest, socks,peace sign,bikini,spats,water splash,sleeve,turtleneck,wood deck,handrail, horn, fox ears,arm cover
short pants, forest,Audience seats
(gray eyes, bad anatomy, text, simple background, no background:1.1),
(ahoge, french braid, crown braid, halo, NSFW, drill hair, wavy hair, animal ears, 3d:1.2),
midriff, naval

Seed値 2092163728

さて、この処理にどれだけ時間がかかるのか。

青が txt2txt で 512x512 の画像を生成する時間、赤が生成された 512x512 画像を 896x512 のワイドにする時間です。GPU、すげー!

Ai 関連の話って必ず GPU の話が出てきますが、これを見れば、当たり前ですね。一回 GPU 使ってしまうと、もう CPU だけには戻れません。

なお、グラフじゃよくわかりませんが、Tesla P40 使った場合、512x512 の画像を txt2img するのにかかる時間は 9秒です。Tesla K80 でも42秒で終わるので十分に早いんですが P40、世界が違います。

 

さらにもう一歩

縦横を2倍して大きい画像にします。いいですよね!!!競泳水着!!!

MultiDiffusionというプラグインを使って拡大をします。この処理が重い。

GPU の性能がもろにでます。 CPU でもできるんでしょうけど、やってません。単純比例で 1 時間くらいかかるんじゃないでしょうか。

 

ちなみに、Stable Diffusion を GPU なし、すなわち CPU で動かすには、起動オプションにこれを付けます

--skip-torch-cuda-test --precision full --no-half

まぁ、測定結果を見れば、やる意味あるの?ってレベルですけどね。

 

あと、もう一つ気になるのが消費電力

Tesla P40 搭載の Express5800 の BCM でとった電力グラフです。

-8min 付近は OS のみが起動してる状態、-4min 付近が Stable Diffusionが起動している状態、-1min から 0min までが画像生成が走ってる状態。130Wくらい使ってますね。

9 秒で生成できるとすると、画像1枚あたり、0.33Wh。関西電力の電気料金が 1kWh あたり 28.7円なので、画像一枚あたり 0.0095 円、9.5厘ですね。

0

TrueNAS が起動しなくなった

TrueNAS が起動しなくなりました!!

failed to reclaim memory というメッセージを出して、プロセスが死んでしまいます。Kernel は生きてるらしく、Ping には応答するんですが、sh すら起動しないので、なーんにもできません。

この TrueNAS、VMware  のストレージにしてるので、仮想マシンの構成ファイルを抱き込んだまま起動できなくなるとかいう、最悪な状態。

さーて、どうしたもんか。

何が起こってる?

試行錯誤する中で、物理メモリが食いつぶされてることがわかりました。

TrueNAS のダッシュボードにある、メモリ使用率の画面です。物理メモリ 16GB を積んでるんですが、全容量が Services で食いつぶされてます。Cache だったらまだわかるんですが、Services で食いつぶす。はて?

この Services、ってなんじゃらほい?ということなんですが・・・・・よくわかりません。おそらくは Kernel とか Userland とかのシステム領域かな?と思います。そんなもんが 12GB も??異常ですね

ちなみに、この画面を表示したあと、Web サービスも死んでしまい、計測できなくなりました。

考察

エラーメッセージ、failed to reclaim memory ってなんじゃらほい?そのまま訳すと「メモリを取り戻すことに失敗しました」

メモリ不足でプロセスが死ぬときは、out of swap というエラーが出るはず。ということは、Swap を含めてメモリ容量を食いつぶしてるわけではない?

どうやら、Swap を含めたメモリ容量を使いつぶしたわけではなく、物理メモリが食いつぶされてる状態で Userland プロセスを動かしたいから、Swap 領域からメモリを戻そうとしたんだけど、物理メモリを奪い取れないからどうしようもなくプロセスが死んだ。とそんなシナリオではないかと。

はて?Swap があるんだから、どーしても必要なプロセスを動かすには、ほかの領域を Swap に追い出して必要なプロセスを走らせるのでは??

そういう動作をしないってことは、Swap 不可な領域ばっかりになってるってことか?

Swap 不可な領域ってことは、おそらく Kernel のメモリ領域。ZFS か!

ということで、ZFS の Kernel 領域がメモリを食いつぶしてるのではないかと思われます。ふつー、こういう起動不能なんて状態は致命的なんで、起こらないように制限とかかけてあるはずなんですが、パフォーマンスを出すためとか、そんな感じの理由で制限を外してるんでしょうね。

推論

おそらくこんなことが起こったのではないかと

  1. ZFS 領域になんらかの不整合が発生した
  2. TrueNAS の起動時に ZFS をマウントしようとする
  3. ZFS 領域が正常に Unmount されてないので、マウント時にチェック的なものが走る
  4. チェックが Kernel 内処理されていて、かつ、メモリ使用量が制限されていないので、全物理メモリを食いつぶす
  5. Userland が追い出されて、かつ復帰できないので死ぬ
  6. Kernel 処理もメモリ不足で止まる
  7. ハングアップ

対策

FreeBSD ともあろうものが、起動もできなくなって復旧処置ができなくなるようなものを作るか??

といういうわけで、これは TrueNAS の固有現象だろうと推測。つまり、オリジナルの FreeBSD Kernel なら正常に起動できるのでは?

というわけで、FreeBSD を起動してデータ領域をマウントしてみる。

実際には、別の HDD をつないで、そこにインストールしてやったんですが、LiveCD とか、インストールメディアの Shell でもできそう。

  1. なんとかして FreeBSD を起動する
  2. zpool import pool-Data
    • pool-Data は TrueNAS で作ってた Pool 名
    • import コマンドは1時間くらいかかる
  3. LiveCD の場合、マウントポイントが作れなくてマウントエラーになるので mount -t zfs pool-Data /mnt を実行
  4. マウントできてることを確認

こんな感じでファイルシステムにアクセスできるようにする。

この段階で ZFS 領域のチェック的なものは終わってるので、FreeBSD を reboot して、本来の TrueNAS を起動すれば、正常に起動できる。

念のため、Reboot する前に、データ領域のファイルを救出しておくべきでしょう。

あと、間違ってもここで電源を引っこ抜いたりしないように、FreeBSD から Unmount しないと、何のために復旧作業やったのかわからなくなります。

0