ほーりーさんの日記

技術系なぶろぐ

大規模言語モデル

すごい久しぶりの更新

さて、大規模言語モデルというものです。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ってどうなんだろう?夢が広がる

 

0

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 で接続できます。

 

 

 

0

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

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 標準も追加したポリシーもグループポリシーエディタの配下に入ってくれます。

 

0

続・自家製アプコン

ずいぶん前に、Waifu2X を使った自家製アプコンの話を書いたんですが、そのアップデートです。

あの記事書いたのが2016年なんで、もう6年も前。そりゃぁ世の中で技術革新は進んでますよね。

Cupscaleというツールと、Real-ESRGANというツールです

 なお、Real-ESRGANは、このページで説明されているツールを使うと楽に使えます。

さて、では早速結果を見てみましょう。

画像は、左上がオリジナル、左下が Waifu2X でアップスキャンしたもの、右が Real-ESRGAN でアップスキャンしたものです。

 懐かしい新世紀エヴァンゲリオンのオープニングです。

え?懐かしくない?ついこの前、映画館でみた??ふっ、君はそれをLDで見たことあるかい?え?LDってなんですか?
いやまぁ、そう言われるわな・・・・

これは、1995年にテレビ放送された最初のエヴァンゲリオン、そのLDをキャプチャしたものです。LDが何かは・・・ググってくれ。CDに対するアナログレコード、DVDに対するLDみたいな位置づけですね。CDとかDVDがそろそろ通じなくなりつつある時代ではありますが。

というわけで、Real-ESRGAN を使えばいいんじゃないかな。を結論に終わってもいいんですが、それだけだとアレなので、もう少し比較してみましょう。

 Cupscaleの比較

Cupscaleには3個のモデルが搭載されています。そのモデルの結果を比較します。

左上が BSRGAN、右上が RealESRGAN-4xplus、下が RealSR_DF4K

RealSR は論外として、BSRGAN と RealESRGAN はいい勝負をしてるように見えますが、相対的に RealESRGAN のほうが綺麗に見えます。

CupscaleとReal-ESRGANの比較

二つツールがあるので、そっちも比較しましょう。Cupscale の realesrgan-4xplus と Real-ESRGAN です。これって同じモデルってことで・・・いいんですよね?

左が Cupscale の realesrgan-4xplus、右が Real-ESRGAN です。

Real-ESRGAN のほうが綺麗に見えます。同じモデルだけど、学習のさせ方とか実装がなにか違うんでしょうか。

GPU処理とCPU処理の比較

Cupscale は CPU モードを持ってるので、GPU を使わない、CPU 処理も比較してみましょう。
左がGPU処理、右がCPU処理です。これはさすがに同じに見えます。
ツールは Cupscale の BSRGAN です。というか、CPU モードで走るのはこのモデルのみです。

なんでこんな比較をしてるかというと、私としてはCPU処理を使いたいのです。だって仮想環境だとGPUができないから。いや、できないわけではないんですが、仮想環境でGPU使おうと思ったら、くっそ高い専用GPUカードとくっそ高い専用ドライバー使うか、PCIパススルー使うから vMotion を諦めないといけなくなるので、やりたくないんですよね。なので、CPU モードで使いたいんですが、BSRGAN しか使えないので、これで妥協するか、GPU 使える物理マシンで Real-ESRGAN をやるかですね。

結論

画質で Real-ESRGAN の勝利です。

動画にした結果も置いておきましょう。2016年にやった、AIR の DVD に入ってる ED から一部を取り出したものです。元動画は2016年の記事を参照してください。
あと、このリンク、ブラウザでは再生できないかもしれません。その場合はダウンロードして再生してください。少なくともVLCでは再生できるはずです。

最後にもひとつ、アプコン処理にかかる時間の問題が。

Cupscale、Real-ESRGAN どちらもめっちゃ時間がかかります。Waifu2X も相当時間かかりましたが、それよりはるかにかかります。

サンプル用に置いた AIR の動画、動画としては23秒程度の長さなんですが、これを1本処理するのに、Waifu2X で3、4時間くらいかかるのに対して、Cupscale、Real-ESRGAN は 1 日以上かかります。25分のアニメを1本処理するのに、単純計算で2か月以上かかることに。Waifu2X で2週間弱かかってたものが、けた違いに時間がかかることになります。

 

 

 

 

0

Fortigate で OSPF over IPsec

こんなネットワークを運用したい!

まぁ、天体撮影をするときのステラショットを動かすパソコンで使う話なんですけどね。

望遠鏡につながるパソコン、つまりステラショットを動かすマシンです。ステラショットさえ動けば良いという考え方もあるんですが、そうはいきません。

ステラショットをリモートで使いたいので、RDPします。RDPするためのIPアドレス管理どうする?んなもん、AD任せでしょ!

撮影後のデータは?とーぜんファイルサーバに置かないといけません。

つまり、普段のサーバサービスを受けられる環境にしないといけないのです。

  • 自宅ベランダで使うときは、家庭内LANにつなげばいい
  • 遠征時はモバイルルータ経由で家庭内LANにつなぎたい

これで出てくるのがサテライトネットワークです。

 サテライトネットワーク用のサテライトRouterは、家庭内LANにつないだらLocal Routerとして、モバイルルータにつなげばVPN Routerとして動作するわけです。

 

なお、この設定、すんごーく長くて面倒です。OSPF over IPsecをやりたいという方は覚悟して挑んでください。

Local Routerの設定

Local Routerとしての設定です。なお、サテライトRouterには、FortiWiFiを使ってます。無線が使えた方が便利ですからね。

なお、OSPFしゃべたり、DHCPでアドレスもらったりしますが、そんなのは家庭内LANで動いてて当たり前でしょうから、ここでは省略

インターフェースの設定

config system interface
    edit "wan1"
        set mode dhcp
        set allowaccess ping fgfm auto-ipsec
        set defaultgw enable
    next
    edit "internal"
        set ip 10.B.6.1 255.255.255.0
    next
    edit "wifi"

        set ip 10.B.7.1 255.255.255.0
    next
    edit "lo0"
        set ip 10.A.A.102 255.255.255.255
        set type loopback
    next
end

ポイントは

  • WAN1インターフェースをDHCPクライアントにすること
  • Loopbackインターフェースに有意なアドレスを振ること

Firewallポリシー

config firewall policy
    edit 1
        set srcintf "internal"
        set dstintf "wan1"
        set srcaddr "LAN"
        set dstaddr "all"
        set action accept
        set service "ALL"
    next
    edit 3
        set srcintf "wifi"
        set dstintf "wan1"
        set srcaddr "LAN"
        set dstaddr "all"
        set action accept
        set service "ALL"
    next
end

ここは特にポイントはないかと。サテライトルータの配下から通信を許可してるだけです。

OSPFの設定

config router ospf
        config area
            edit 0.0.0.0
            next
        end
        config network
            edit 1
                set prefix 10.C.C.0 255.255.255.0
            next
        end
        config redistribute "connected"
            set status enable
        end
    set router-id 10.A.A.102
end

これもごくふつーのOSPFの設定です。

Loopback インターフェースに有意なアドレスを振ったのは、OSPFのRouter IDとして使用するためですね。

はい、ここまでは準備

VPNルータとしての設定

さて、本題です。「サテライトRouter」と「VPN Router」間でIPsec VPNを結びます。

なお、IPsec VPNです。L2TP over IPsec はやりません。意味ないですからね。なんか世の中、IPsecはL2TPと組み合わせて使うもんだと思ってる人いるみたいですけど、そんなわけない。IPsecはIPsecだけで使うもんです。

インターフェースの設定

config system interface
    edit "wan2"
        set mode dhcp
        set defaultgw enable
    next
end

これはWAN2にモバイルルータをつなぐだけの話。これはサクッと流しましょう。

IPsecの設定

IPsecに関する設定です。これはPeer感で整合をとらないといけないので、サテライトRouterと、VPN Router両方の設定が必要です。

サテライトRouterの設定

config vpn ipsec phase1-interface
    edit "Satlite"
        set interface "wan2"
        set dhgrp 14
        set mode aggressive
        set proposal aes256-sha256
        set localid "Satlite"
        set remote-gw *.*.*.*
        set psksecret ***********
    next
end
config vpn ipsec phase2-interface
    edit "Satlite"
        set auto-negotiate enable
        set phase1name "Satlite"
        set dst-subnet 10.0.0.0 255.0.0.0
        set src-subnet 10.0.0.0 255.0.0.0
    next
    edit "Multicast-inbound"
        set auto-negotiate enable
        set phase1name "Satlite"
        set dst-subnet 10.0.0.0 255.0.0.0
        set src-subnet 224.0.0.0 255.0.0.0
    next
    edit "Multicast-outbound"
        set auto-negotiate enable
        set phase1name "Satlite"
        set dst-subnet 224.0.0.0 255.0.0.0
        set src-subnet 10.0.0.0 255.0.0.0
    next
end
config system interface
    edit "Satlite"
        set vdom "root"
        set ip 10.B.5.2 255.255.255.255
        set type tunnel
        set remote-ip 10.B.5.1
        set interface "wan2"
    next
end

※ SPFパラメータ等を省略してます。必要なパラメータは随時足してください。多分GUIで設定すれば入ります

さて、この設定にはいくつかポイントがあります。

  • Aggressiveモードをつかう
  • NAT Traversalを有効にする(上記Configには表れてませんが)
  • DPDを有効にする(上記Configには表れてませんが)
  • Phase-II に3個のルールを設定する
  • メイントラフィックを担うルールは 0.0.0.0/0 で設定しない
  • コマンドラインで操作するときは、トンネルインターフェースはIPsecの設定を行ったあとでしか設定できない

サテライト側をモバイルルータでつなぐんですから、当然アドレスは不定。なんで当然のようにAggressiveモード、NAT-Tを使わないといけないんですが・・・・

なぜか世の中には、ダイナミックアドレスなのに、Mainモードを使わせる製品があるんですよね。RFC読んで出直してこい。

 

VPN Routerの設定

config vpn ipsec phase1-interface
    edit "VPN"
        set type dynamic
        set keylife 1800
        set mode aggressive
        set proposal aes256-sha256
        set dpd on-idle
        set dhgrp 14
        set peerid "Satlite"
        set psksecret ***********
        set dpd-retryinterval 60
    next
end
config vpn ipsec phase2-interface
    edit "VPN"
        set phase1name "VPN"
        set src-subnet 10.0.0.0 255.0.0.0
        set dst-subnet 10.0.0.0 255.0.0.0
    next
    edit "outbound"
        set phase1name "VPN"
        set src-subnet 10.0.0.0 255.0.0.0
        set dst-subnet 224.0.0.0 255.0.0.0
    next
    edit "inbound"
        set phase1name "VPN"
        set src-subnet 224.0.0.0 255.0.0.0
        set dst-subnet 10.0.0.0 255.0.0.0
    next
end
config system interface
    edit "VPN"
        set vdom "root"
        set ip 10.B.5.1 255.255.255.255
        set type tunnel
        set remote-ip 10.B.5.2 255.255.255.255
    next
end

VPNセンタールータとしての設定ですね。

サテライト側に対応する設定です。

 

ちょっと解説

VPN関連はポイントがあるので、ちょこっと解説。

OSPF over IPsecをやりたいわけですから、当然ながらOSPFパケットをIPsecトンネル内を通します。OSPFはマルチキャストで通信するので、OSPFのマルチキャストアドレス 224.0.0.5 宛のパケットが飛び交います。

ここで注意しないといけないのが、IPsecの設定にあるアドレスセレクター。アドレスセレクタに 10.0.0.0/8 <--> 10.0.0.0/8 を設定すればわかりやすいのですが、アドレスの値としてみれば、マルチキャストアドレスは対象外になります。

ここでFortigateの仕様が関係してきます。Fortigateはアドレスセレクタから外れたパケットは遮断してしまうようです。何を当たり前のことを?と思う方もいらっしゃるでしょうが、これ、ルータの仕様によって動作が違います。アドレスセレクタから外れたパケットを投げ込んだ場合、遮断する製品、透過させる製品、通したいパケットに応じてPhase-IIネゴシエーションを開始する製品。しかも、こういう詳しい仕様はドキュメント化されてないことがほとんどです。Fortigateは遮断してしまうようです。

なので、メインのトラフィックを通すルール、マルチキャストのInbound / Outboundを各々通すルール、合わせて3個のルールが必要になります。

「じゃあ、0.0.0.0/0でルール作って、ルーティングで制御すりゃいいだろ」その通りと言いたいのですが、残念ながらそれもできません。これもFortigateの仕様ですが、FortigateのIPsecはSAが確立すると、セレクタに応じた静的経路を自動登録します。つまり、Default Routeを書き換えられてしまい、ISAKMPパケット、ESPパケットの通信経路が変わってしまいます。

Firewallポリシーの設定

config firewall policy
    edit 6
        set srcintf "wifi"
        set dstintf "Satlite"
        set srcaddr "LAN"
        set dstaddr "LAN"
        set action accept
        set service "ALL"
    next
    edit 8
        set srcintf "internal"
        set dstintf "Satlite"
        set srcaddr "LAN"
        set dstaddr "LAN"
        set action accept
        set service "ALL"
    next
    edit 9
        set srcintf "Satlite"
        set dstintf "internal"
        set srcaddr "LAN"
        set dstaddr "LAN"
        set action accept
        set service "ALL"
    next
end

サテライトRouter側のFirewallポリシー設定です。トンネル用のインターフェースを作ったんだから、新たなルールが必要です。Fortigate使ってるんだから、当たり前だろ?と思うんですが、これも注意ポイントの一つ。

このポリシーは必ず必要です。いや、そりゃそーだろって話なんですが、そうじゃなくて

IPsecの設定したら、まずはIPsecが繋がるかを試験して、それからポリシー設定しようか、って思いますよね。そうするとハマります。

これもFortigateの仕様っぽいんですが、FortigateはIPsecを設定しても、IPsecを通した通信が許可されるようFirewallが設定されてないと、ISAKMPのネゴシエーションが失敗します。その時にデバッグ画面で記録されるエラーがこれ。

ike Negotiate ISAKMP SA Error: ike 0:***************/0000000000000000:537: no SA proposal chosen

ちょっとまて、なんで no SA proposal chosen なんだよ!

そのエラーは、SAプロポーザルが食い違ってるときに出すもんだろ?!暗号アルゴリズムも、HASアルゴリズムも、DHグループも、SA寿命もいくら見直しても間違ってない。なのに、no proposal chosenと言われる。訳が分からないよ!!と叫びたい。

 OSPFの設定

最後にOSPFの設定。といっても、この記事がOSPF over IPsecをやる。って話なんで、これが本丸なんですが。

サテライトRouter

config router ospf
        config network
            edit 2
                set prefix 10.B.5.0 255.255.255.0
            next
        end
        config ospf-interface
            edit "OSPF-Satlite"
                set interface "Satlite"
                set mtu 1400
            next
        end
end

OSPFの設定を、ネットワークとインターフェース両方に対して入れないとダメみたいです。インターフェースはトンネルインターフェースがあるので、それを設定すればいいんですが、ネットワークも必要です。なので、トンネルインターフェースをNumberdで作って、そのアドレスに対してOSPFを設定する必要があります。

あと、ポイントが MTU の設定をすること。

OSPFはネゴシエーションの中でMTUを交換して、値があってないとネゴシエーションが進みません。OSFPのステータスが Exchange から進まない場合は、MTUがあってない可能性があります。

本来であれば、トンネルインターフェースのMUTを設定したいところですが、FortigateのトンネルインターフェースはMTU設定ができないようです。なので、OSPFのインターフェースでMTUを設定します。

以上!

長かった・・・・

 

0

VMware Player上の仮想マシンからホストにリモートデスクトップ接続する

リモート天体撮影するということ

リモートデスクトップの話ですが、起源は天体写真のための環境のお話です。

うちの天体撮影はこんな環境でやってます。

右上の望遠鏡と、そこにつながる小型パソコン・ルータをベランダに設置します。望遠鏡というか赤道儀の制御や、カメラのコントロール、撮影データの取り込みするため、シリアルケーブルやUSBを繋ぐ小型パソコンを望遠鏡の近くに置く必要があります。あ、別に小型でなくてもいいですけどね?

で、その小型パソコン上でステラショット2を動かすわけですから当然、小型パソコンのGUIを操作する必要があります。どうするか?コンソール端末からリモートデスクトップ接続します。

RDP接続なわけですから、とーぜんLAN経由ですね。なんでこんなことするのか?望遠鏡はベランダに置かないといけません。ベランダは夏暑くて、冬寒いです。でもコンソール端末はネットワークさえつながれば、どこへ置いても問題ありません。コタツの上でも、エアコンが効いた室内でも。

天体観測の最大の難点は屋外で暑い!寒い!!虫がでる!!!と屋外だからこその居住性。それを屋内からできるようになるのです。

リモートデスクトップとステラショット2の問題

さて、ここで問題がひとつ。ステラショット2のバグというか制限事項です。

これが普通にステラショット2を起動した状態。何も問題はありません。正常な状態です。でこの状態にしたまま、リモートデスクトップを切断(ログオフではなく、RDPの「切断」)をして、再度RDPを接続します。

すると、

この通り、星図が表示されなくなります。赤道儀制御とか撮影は問題なく動くんですが、星図だけが消えてしまうという。

アストロアーツ社に確認したところ、不具合として認識はしてるんだけど、DirectXの不具合だそうで、そう簡単には直らない制限事項だそうです。

まぁ、MSが原因なら、当分は直らんわな・・・・

んじゃどーするか?RDPを切らなければいい!そりゃそーだわな

だけど、なんとかしたい。だってコンソール機を移動したり、ステラショットに自動撮影させて、その間はコンソール接続を切ったりしたいわけですよ。

じゃあ、どうする?

こうします。リモートデスクトップ接続を2段階にして、ステラショット2からすると、セッションが切れてないように見せかけるわけです。

仮想デスクトップはどうやるか?VMware Workstation Playerです。せっかくパソコンがあるんですから、そこにVMware Player入れて、Windowsを起動してやれば、踏み台用の仮想デスクトップができる。完璧!と考えたわけです。

が・・・・・・

VMware Player上の仮想デスクトップからホストにRDP接続する

ここで問題がでます。

こんな風に、ステラショット2と、VMware Player上でWindowsを起動します。マシンリソースの都合でWin7を使ってます。サポート切れ?そうですね?はい。

そして、仮想デスクトップにRDPで接続して、さらに仮想デスクトップからホストにRDP接続します。

すると、

こんなことになっちゃいます。分かりにくいでしょうけど、Koronaというのがホストマシン、Hikari が仮想デスクトップです。ちなみに、天文関連のマシンのホスト名はほかにOrihime、Sayaが居ます。天文関連マシンですからね、「見上げてごらん、夜空の星を。」から名前をもらってます。

どうなるかというと、仮想デスクトップからホストへのRDPが安定しません。仮想デスクトップも動作が異常に遅くなり、まともに操作できなくなります。

なぜなのか?どうやらRDPに原因があるようです。RDPのセッションが繋がった瞬間から動きがおかしくなります。また、VNCを使って同じことをしても問題が出ません。ホストマシン上で別ユーザでVMware Playerを起動した場合も問題は出ません。

さーてどうしたもんか。そうだ、Windows のサービスとして仮想マシンを起動したら?

というわけで、サービスとして登録して起動します。ポイントはsexeを使ってサービス登録すること、登録したサービスを Local Administrator 権限で起動すること。なんでかよく分かりませんが、Local System アカウントではうまく動きませんでした。

あと、Shutdown時の注意。仮想デスクトップにログインしてShutdownをしてから、ホストをSutdownすること。ホストShutdown時に仮想マシンもShutdownしてくれるといいんですが、どうやらPower Downをしちゃうようで、仮想マシンが壊れることがあります。

 

 

0

VMware Player の起動が異常に遅くなったのでライブラリを掃除してみた

VMware Player です。無償版のお話です。

注意:独自研究の結果です。マネする場合は自己責任で!

いつのころからか、VMware Playerを起動すると異常に時間がかかるようになりました。

こんな感じで、「応答なし」の状態が数分続きます。

ただでさえ、この後にOSの起動があって、それなりに時間かかるんだから、こんなところで止まって欲しくない。なんでここで時間かかるんぢゃ??と思ってたんですが・・・

原因はこれ

スクロールバーの長さに注目。仮想マシンおおすぎ!!

しかも、vmx に接続できない仮想マシンもちらほら。

どーやら、VMware Player起動時にライブラリに登録されてる全仮想マシンのvmxファイルを読んで、ライブラリを再構築しようとしてるみたい。そんな中で開けないvmxがあったり、そもそも開くべきvmxが多かったら、そりゃぁ時間かかりますわな。

なわけで、ライブラリを整理しましょう。GUI画面で一個づつ「ライブラリから削除」をやっていってもいいんですが・・・・仮想マシンを1個削除すると、そのたびにライブラリ画面の再構築をしようするらしく、仮想マシンを1台登録解除するたびに数分かかる。やってられっか!

というわけで、仮想マシンライブラリの一括削除を考えます。

答えは、このファイル

C:\Users\<USERNAME>\AppData\Roaming\VMware\preferenceini

このファイルを編集します。

こんな大変なことになってるファイルをばっさりと、

こんな感じにばっさりと。

すると、

あっさり起動します。

 

0

一時ファイルの作成中にエラーが発生しました とか言い出して、仮想マシンが起動しない

仮想マシンをvMotionしようとしたら、一般的なエラーとか意味不明なエラーを出して移行できなくなった。

なんじゃ??と思って、VMをShutdownして、もう一回起動。そしたら、こんなエラーががががが

とーりあえず、仮想マシンをインベントリから削除して、再登録してみる。結果変わらず。

構成ファイルと同じところにできてる、vmware.log を確認してみる。なにやら、こんなエラーメッセージが

vmx| I120: FileIO_AtomicTempFile: Failed to create temporary file, The file already exists (3). errno: 17
vmx| I120: Msg_Reset:
vmx| I120: [msg.configdb.failcreatetemp] An error occurred while creating temporary file for /vmfs/volumes/5f883c54-1bd774f2-f870-f8db88fbe1d4/***/***.vmx: The file already exists

一時ファイルの作成に失敗とか言ってる。

VMware ってGUIに表示されるエラーと、本当のエラーが食い違ってることがたまにあって、GUIのエラーメッセージはあまり信用しないほうがいいんですが、どうやら今回は一致している模様。

さーて、一時ファイルと言ってもなぁ・・・・・

とりあえず、構成ディレクトリを見てみよう。

ん・・・??なんだこれ??

※ ホスト名が見えるところは、念のためマスクしてます

**.vmx~ ファイルってなんぞや?それがないって言ってるけど、ls にもともと出てないんだから、そりゃファイルはないわな?なんでわざわざ No Such file or directory と言う??

ただ、どうやら .vmx~ っていうファイルは、VMware のロックファイルで使うっぽい。となると、「ファイルがすでにあるから、一時ファイルが作れねぇ!」っていうメッセージと整合する。。。。ような気がする。

とーりあえず、これが原因かな?ってことで、対処してみる。

とはいえ、存在しないと言ってるファイルなんてどーやって消すんだよ?

消せないなら、そんな亡霊ファイルが見えなくなりゃそれでいいだろ。ってことで、こんな手順

  1. 仮想マシンをVMwareのインベントリから削除(決してディスクから削除ではない)
  2. ESXにSSHでログイン
  3. 仮想マシン構成ファイルのディレクトリ名を変更
  4. 仮想マシン構成ファイルディレクトリを新規作成
  5. 旧ディレクトリから、vmxとかvmdkとかその他仮想マシンを構成するファイルを新ディレクトリに移動
  6. 新ディレクトリに置いたvmxファイルを使って仮想マシン登録
  7. 仮想マシン起動!

無事起動しました。

今回問題になった仮想マシンが、iSCSI のファイルシステムにおいてたので、ESX 上の Shell で操作してます。NFSボリュームだったら、ほかのマシンからマウントして操作するとか、もうちょっとやりやすかったかも。

 

0