技術系なぶろぐ
大規模言語モデル
すごい久しぶりの更新
さて、大規模言語モデルというものです。LLMともいわれます。
ChatGPT とか有名ですね。だけど、あれ、クラウドですよね。クラウド、いや!
だって、いつ消えるかわからんし。彼らが「やーめたっ」って言えば終わっちゃう。
なんで、ローカルで動かしたいんです。Stable Diffusoin もローカルで動くから遊ぶんです!
で、LLM。Command-R+ がすごいらしい。
104Bです!すごいんです!!って言ってもよくわからん。
とりあえず、お試ししてみましょう。huggingface にある、お試しサイトです。これはまぁ、クラウドですね。
リクエストはこれ
旧約聖書の世界を舞台にラブコメのあらすじを作って
そして出てきた出力が・・・・・
舞台は、旧約聖書の世界観をモチーフにした異世界。主人公は、ごく普通の高校生・神山光(かみやま ひかる)だが、ある日突然、この異世界に召喚されてしまう。
光がたどり着いたのは、天使と悪魔が対立し、日々激しい戦いが繰り広げられている世界だった。天使たちは「神の国」を、悪魔たちは「闇の国」を築き、両者は常に緊張状態にあった。
光は天使たちの長である大天使ミカエルに召喚されたことを知る。ミカエルは光に、この世界の救世主として選ばれたことを告げる。光の使命は、天使と悪魔の争いを終結させ、平和な世界をもたらすことだった。
しかし、光は争いごとが苦手な平和主義者。剣や魔法を使った激しい戦いよりも、話し合いや交渉で問題を解決したいと願っていた。
そんな光を支えるのが、2人のヒロイン、エリエルとルシフェル。エリエルは優しくて芯の強い天使の戦士で、光のよき理解者となる。ルシフェルは悪魔のプリンセスだが、美しい容姿とは裏腹に、好奇心旺盛で茶目っ気たっぷりのトラブルメーカー。光とエリエルをからかっては、楽しそうに笑う。
光はエリエルやルシフェルとともに、天使と悪魔の争いを鎮めるための旅に出る。さまざまな土地を訪れ、個性豊かな仲間たちと出会いながら、光は自身の持つ不思議な力を使って、争いを解決していく。
一方で、光たちは闇の国の王・サタンや、天使と悪魔の均衡を崩そうと企む謎の勢力とも対峙することになる。光は時に苦悩し、時にエリエルやルシフェルに支えられながら、この世界の平和のために奮闘する。
戦いを通じて、光とエリエル、ルシフェルの絆は深まっていく。やがて、光はエリエルとルシフェルのどちらかを選ばなければならない状況に陥る。天使と悪魔、光は2人のヒロインの間で葛藤する。
果たして、光は天使と悪魔の争いを終結させ、平和な世界をもたらすことができるのか。そして、光はエリエルとルシフェルのどちらを選ぶのか。旧約聖書×異世界転生ラブコメ、その結末は──。
「神山光と天使と悪魔のテトラグラマトン」──それは、旧約聖書をテーマにした異世界で繰り広げられる、青春と冒険、友情と恋の物語である。
おいマテ、ほんまにこれ、自動生成したんか?!けっこう本気で読みたいぞ。
しかもこれ生成するのに5秒かかってない。いや、すごいわこれ。
さてさて、じゃあそんな楽しそうなもの、ローカルで動かしたい!
というわけで、LM Studio の出番です。
LLMの統合環境みたいなツールですね。商用利用はライセンス外だそうです。
マシンはこんな感じ。
マシン:Proxmox上の仮想マシン
CPU:2 Core
Mem:32GB
GPU:GeForce RTX2080 Ti (VRAM 11GB)
モデル:lmstudio-community・c4ai command r v01 25B Q2_K GGUF
n_gpu_layers:20
そして、リクエストはこちら
古事記の世界を舞台にエロ小説のあらすじ作って
さて、出てきました。さすがに全モデルがGPUに乗っておらず、CPUでも動いてるので時間はかかります。5-10分くらい待ったでしょうか
日本初の歴史書である「古事記」の世界を舞台にしたら、確かに大変妖艶な物語になりそうですね。
例えば、天照大神と素戔嗟(すさのは)命が織りなす物語。
かつて、高天原に輝く光背の長い天照大神は、弟の神である素戔嗟命の行動が気まぐれで怒り、天岩戸に隠れてしまい、世界は闇に包まれます。そこに天照大神への信仰心を持つ一人の姫が現れます。彼女の名は、埀(うど)。神々しさが滲み出るほどに麗しい彼女でしたが、実は人間。
ある日、天岩戸の前に人影が見えたため、 curiousな姫は見に行くと、そこには素戔嗟命が一人、たたずんでいました。「わたしはあなたのような強さを持ち合わせてはいないけれど、ただひとすじに輝く光を慕ってるわ」と、埀は打ち明けます。その言葉に素戔嗟の心は揺れ、やがて二人は恋に落ちてしまいました。
しかし、そんな二人の間を、一神が裂こうとします。それは天照大神。彼は自分が放つ光のような、ただひたすら進む道ならいいが、寄り道する弟が許せないのです。素戔嗟命は埀に別れを切り出され、絶望した日々。そんな彼を天照大神の神殿で織物をする埀が見つけ、二人は神々しい情熱で抱き合います。「わたしはあなたの光に照らされるの」――そして、抱擁は深めていき、二人は一体となってしまいます。
それをきっかけに、素戔嗟命は天照大神のもとに戻り、兄弟関係は元通りになりました。しかし、それは二人の間の秘め事の始まりでした。夜な夜な、天岩戸からこっそり抜け出し、埀の元へ通う素戔嗟命。光と闇が交わる淫魔の様子は、高天原の誰にも知ることはできませんでした。
そして、二人の間に産まれた子どもの手取り次いで生まれたのは、光と闇に包まれた不思議な子――「月日」と「星」の兄弟でした。二人はそれぞれ成長すると、天岩戸を抜け出し、世界に光と希望をもたらすことでしょう。
如何に光が差し出すかはわからないけれど、確かに二人の間に生まれた輝きこそが、再び世界を照らすのです。
もう一声、エロエロにしてほしかったところですが、十分に面白そうです。
Command-R+ が 104B なのに対して、Command-R だと 35B。Command-R は Command-R+ の前身なので、規模が小さいんですよね。Command-R でこれだけできるんだから、Command-R+ を動かしたいところだが。
64GBのVRAM乗ったGPU?
NPU積んだCPUってどうなんだろう?夢が広がる
VELL-E X でしゃべってもらう
人工知能ネタです。VELL-E X を使ってみたいと思います。
ナニモノ?かというと、声真似でセリフをしゃべってくれます。
いわゆる音声合成ものですね。
もともとは Microsoft が公開したもので、当然その時はクラウドサービス。それの OSS 版のようです。
声真似はどうするかっていうと、マイクで聞かせるか、音声ファイルを読ませてそこから声の特徴を抽出してくれます。
しゃべる内容はテキストで入力するんですが、ひとつ大きな難点が。イントネーションの支持ができません。かといって棒読みかっていうと、案外そうでもないです。
つまり、イントネーションとか抑揚は何度も生成してみて、気に入ったものが出るまで試すしかないです。
インストール
さて、ではインストール方法です。
といっても、このサイトが非常にわかりやすくて、このページのコマンドをそのまんま流すだけでOK!
だとこのブログを書く意味がなくて、一か所だけハマりポイントがあります。
前提
Windowsマシンを準備します。GPUがあったほうがいいです。
VELL-E X は CPU でも動きますし、VMware上の仮想マシンでも動きます。だけど、やっぱり時間かかります。パススルーで仮想マシンからGPU使ってもいいですし、物理マシンでやってもいいです。
私は Stable Diffusionで使ってる、Tesla K80 でやります。
あと、Python。
インストールしておいてください。私の環境では、Stable Diffusion ために Ver.3.10.9 を入れてまして、これで動きました。
事前準備
Visual Studio Build Tools 2019 と、ffmpeg をインストールします。
Visual Studio Build Tools が必要なんですが、最新の 2022 ではダメです。2019 でないとうまくいきません。そんな状況なのに、相手は Microsoft。奴らは最新版以外を使わせないことに必死なのか普通の方法では、2022 しかダウンロードできません。
2019 をダウンロードするページもあるんですが、MS アカウントでのログインを要求した上、ダウンロードリンクが見つからないという嫌がらせをされました(2023/9/30現在)
なので、このサイトを参考に、直接リンクでダウンロードします。
インストールオプションはこんな感じ
このリンクもいつまで生きてるかな・・・・?というのはありますが。
なお、ここで取れるインストーラも、ダウンローダーなので、インストール自体、いつまで使えるかな?という心配もありますが。
VELL-E X デプロイ
git でデプロイします
git clone https://huggingface.co/spaces/Plachta/VALL-E-X
cd VALL-E-X
python -m venv venv
venv\Scripts\activate.bat
参考サイト、ほぼそのままです。
いちおー解説しときますと、1行目、git clone これはいいですよね。わからん人はググって
2,3,4 行目、python の仮想環境を構築して構築した仮想環境に移行します。
pip でライブラリをインストールしますので、VELL-E X 専用の環境を作って pip での環境を独立させます。
参考サイトでは、activate.ps1 を実行することで環境を切り替えてますが、私はバッチファイルでやってます。まぁ、どっちでもいいです。たんに ps1 の実行許可設定がメンド臭かっただけとも言いますが。
実行環境の構築
pip による各種ライブラリのインストールを行います。
事前準備で Visual Studio Build Tools をインストールしておいたのがここで効いてきます。
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install -r requirements.txt
この中の requirements.txt によるインストールの中に pyopenjtalk が指示されてるのですが、どうもこのモジュール、インストールの過程でコンパイルを行うようなんです。このコンパイルで Visual Studio Build Tools を使います。
なので、Visual Studio Build Tools が入ってなければ、当然失敗します。CMake が見つからないとか、C コンパイラが見つからないというエラーが出たら、Visuial Studio Build Tools が入ってません。
一方で、Visual Studio Build Tools 2022 をインストールしていると、ここでコンパイルエラーになります。コンパイラのエラーチェックが厳しくなったのかな?2022 でエラーになる環境でも、2019 に変えると通ります。
なお、一度 Visual Studio Build Tools 2022 でコンパイルを挑戦してしまうと、環境かなにかに取り込まれるらしく、追加で Visual Studio Build Tools 2019 をインストールしたり、環境変数 PATH を書き換えても 2022 を使おうとします。 Visual Studio Build Tools 2022 を Uninstall するか、git からやり直さないと、インストールが成功しません。
起動!
さぁ起動しましょう。
python app.py
起動が完了すると、http://127.0.0.1:7860 で接続できます。
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厘ですね。
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 領域がメモリを食いつぶしてるのではないかと思われます。ふつー、こういう起動不能なんて状態は致命的なんで、起こらないように制限とかかけてあるはずなんですが、パフォーマンスを出すためとか、そんな感じの理由で制限を外してるんでしょうね。
推論
おそらくこんなことが起こったのではないかと
- ZFS 領域になんらかの不整合が発生した
- TrueNAS の起動時に ZFS をマウントしようとする
- ZFS 領域が正常に Unmount されてないので、マウント時にチェック的なものが走る
- チェックが Kernel 内処理されていて、かつ、メモリ使用量が制限されていないので、全物理メモリを食いつぶす
- Userland が追い出されて、かつ復帰できないので死ぬ
- Kernel 処理もメモリ不足で止まる
- ハングアップ
対策
FreeBSD ともあろうものが、起動もできなくなって復旧処置ができなくなるようなものを作るか??
といういうわけで、これは TrueNAS の固有現象だろうと推測。つまり、オリジナルの FreeBSD Kernel なら正常に起動できるのでは?
というわけで、FreeBSD を起動してデータ領域をマウントしてみる。
実際には、別の HDD をつないで、そこにインストールしてやったんですが、LiveCD とか、インストールメディアの Shell でもできそう。
- なんとかして FreeBSD を起動する
- zpool import pool-Data
- pool-Data は TrueNAS で作ってた Pool 名
- import コマンドは1時間くらいかかる
- LiveCD の場合、マウントポイントが作れなくてマウントエラーになるので mount -t zfs pool-Data /mnt を実行
- マウントできてることを確認
こんな感じでファイルシステムにアクセスできるようにする。
この段階で ZFS 領域のチェック的なものは終わってるので、FreeBSD を reboot して、本来の TrueNAS を起動すれば、正常に起動できる。
念のため、Reboot する前に、データ領域のファイルを救出しておくべきでしょう。
あと、間違ってもここで電源を引っこ抜いたりしないように、FreeBSD から Unmount しないと、何のために復旧作業やったのかわからなくなります。
Sambaで構築したADにADMXを追加する
ADのグループポリシーで設定できる項目は、ADMXファイルをメンテナンスすることで項目を増やすことができます。
で、ふつーADサーバはWindowsServerで構築するわけで、ADMXファイルのインストールの方法なんて、WindowsServerでの説明しかありません。
Samba で AD を構築した場合は、どうするの?っていうお話です。
AD サーバを Samba で構築して、運用は Windows 上にインストールした RSAT を使うという環境です。samba-tool を使うことは考えてません。
単に Samba で AD サーバを構築してグループポリシーエディタで開くとこんな感じになります。
管理テンプレートの下にも、それなりに項目が入ってます。全部見たわけじゃないんですが、おーそらく WindowsServer で構築した AD の標準ポリシーくらいはインストールされてるんじゃないかなと。
だけど、ポリシーの追加をしたいわけですよ。Chrome のポリシーとか、Firefox のポリシーとか。
どうするのか?実は WindowsServer の場合と同じです。SYSVOL の下の PolicyDefinitions の下に配置するわけです。
Samba で構築したAD の場合、SYSVOL の実態は、/var/db/samba4/sysvol の下にあります。
※ Ports on FreeBSD で構築した場合。Linux 系だとどうかは知りません
Policies の下に PolicyDefinitions というディレクトリを作って、WindowsServer の場合と同様にadmx、admlファイルを配置します。
すると、
こんな感じで、配置した ADMX の設定項目がグループポリシーエディタに出てきます・・・・が!!!
もともと表示されてた項目、Windowsコンポーネントとかが消えてる!
というわけで、単純に欲しい ADMX を置くだけではダメなようで、じゃあどうするか?
必要な ADMX を全部配置します。
こんな感じで。
ファイルをどこから持ってきたか?というと、Windows7 とか、Windows10 とか、Windows11 から持ってきます。クライアントマシンの Windows には、C:\Windows\PolicyDefinitions 以下に admx、adml ファイルが置かれてますので、これを持ってきます。
すると、
こんな感じで Windows 標準も追加したポリシーもグループポリシーエディタの配下に入ってくれます。