西川和久の不定期コラム

生成AI画像とLLMの熱い関係?LLMを併用するいろいろな生成AI画像環境のご紹介

 1年前の2023年6月、画像生成AIである「Stable Diffusion」はまだバージョン1.5。LLM(大規模言語モデル)は「GPT-4」などが既にあったものの、この時点では各々独立して動いており、同じAIと言ってもあまり関係がなかった。

 ところがSDXLなど生成AI画像側の理解度が“2Bクラス”に移り、両者の関係が急接近……というのが今回のお題だ。

なぜ生成AI画像にLLM⁉

 SD 1.5初期の頃、画像として描きたいものを指示する=Prompt(プロンプト)は、たとえば“1girl, camisole, shorts, at park, sitting on bench”と言った感じで、「タグ」と呼ばれるものをぶつ切りで入れる形式だった。これは学習時、それぞれの画像に多くのタグが付いており、該当するものを引っ張り出すキーワードとなるためだ。

 この記述方法は「SDXL」、先日リリースされた「SD3 Medium」、またStability AI以外が出しているモデルにも有効であり、英語(正しくは英文として書くこと)が苦手な筆者は、今でもこの方が楽だったりする(笑)。

 ただ、上記した内容程度であればこれでもいいのだが、ではその背景には何があって、上には何、下には何、服やアクセサリなどの詳細を書こうとすると、この形式では無理がある……つまり英文でちゃんと書く必要が出てくるのだ。

AUTOMATC1111を使いタグ区切りで内容をして、生成した画像(SD 1.5)

 SDXL系や比較的新しいSD 1.5系モデルでは、英文そのままでも理解するようになったのだが、それでも左右などの位置関係、指定した文字列のレンダリングなど表現できなかった。

 ところがSD3 Mediumや最近リリースされたStability AI以外のモデルは、2B程度の理解度と表現力があり(SDXLも理解度的には同じ。ただし表現力が乏しい)、潜在能力を引き出すには「英文での入力」が必要になってきたのだ。

 英文が普通に扱える人でも、Promptをかなり詳細に書くのはレアケース。ではどうすれば? と言うと、サクッと書いて、LLMを使いより詳細に書き出すことになる。これはUpscale(アップスケール)と呼ばれている。

 ということで、LLMと昨今の生成AI画像との関係が急接近。これを踏まえて3つほど生成AI画像+LLM環境などをご紹介したい。

Omost

 「Omost」は、ControlNet、Fooocus、stable-diffusion-webui-forgeを作った鬼才、lllyasviel氏の新プロダクトだ。少し前の記事で最近動きがなく……と書いたが、このためだったのか! という感じだ(笑)。

 OmostはSDXLがベースで、苦手とする上下左右など位置関係の書き分けにLLMを使用する。もちろん位置に関係なく、普通に入力してUpscaleだけするのにも有効。

 使用するLLMは3モデルから選べ、以下、Omost用にFine Tune(ファインチューン)しているものだが、ベースとしてはllama-3-8b、dolphin-2.9-llama3-8b、phi-3-mini-128k(3.8B)。

  • omost-llama-3-8b
  • omost-dolphin-2.9-llama3-8b
  • omost-phi-3-mini-128k

 このうち2つは本連載でも扱ったことがあるので、お! っと思った人も多いのではないだろうか。またVRAM環境が厳しい場合は、順に4bit/4bit/8bit版も使用できる。

 インストール方法は書き出すと長くなるので、今回はほか2つも含め省略するが、基本GithubもしくはHugging Faceの情報を元にしており、それ以上のことは行なっていない。

タグ形式で入力してUpscaleする方法もOK。上記と同じ“1girl, camisole, shorts, at park, sitting on bench”
出力画像

 “1girl, camisole, shorts, at park, sitting on bench”と入力、[Submit]ボタンを押し、いったん英文化した後、UpscaleされたPromptは以下のようになる。

A girl wearing a camisole and shorts, sitting on a bench at a park.

The image captures a serene moment at a park with a girl as the focal point. She is wearing a simple camisole and shorts, and is sitting comfortably on a wooden bench. The park is lush with greenery, featuring tall trees, blooming flowers, and a well-maintained grassy area. The bench is wooden, with a classic design, and it appears sturdy and inviting. The girl looks relaxed, perhaps lost in thought or enjoying the peaceful surroundings. The sky is clear with a few fluffy clouds, and the sunlight filters through the leaves, casting a gentle glow over the scene. There are a few other park visitors in the background, adding a sense of community and liveliness to the image.

 おそらく英文が得意な人でも、ここまでは書かないだろう的な内容になっている(笑)。LLMがあの少しのタグからこれだけのことを連想して生成しているというわけだ。この後、画像を生成する時は[Submit]ではなく[Render the Image!]のボタンを押す。なるほど、それっぽい絵が出てきた。

位置関係を指示したPrompt。“at summer, japanese 2girls, left is blue mini dress, right is red mini dress”
出力画像。左右に書き分けられている。これは従来のSDXLそのままでは不可能

 次は位置関係。Omostでは

  • center
  • left
  • right
  • top
  • bottom
  • top-left
  • top-right
  • bottom-left
  • bottom-right

と、画面をざっくり9分割して指示できる。加えてそれぞれのマス目をまた9分割して「slightly to the left」といった感じで指定可能。さらにそのサイズ/縦横比も「large square area」といった感じで指定できる(詳細はGitHub参照)。さすがにここまで細かく書くのも面倒なので、単純に左右に分けて出してみた。

“at summer, japanese 2girls, left is blue mini dress, right is red mini dress”

 ご覧の通りバッチリ出る。Seed違いの画像を生成したい時は、Seedを入力し、[Render the Image!]の方のボタンを押す。

 余談になるが、このクラスのLLMだと日本語での入力は可能(多くの場合、出力は英語)。Prompt=英語という固定概念があり、気づくのが遅くなったが、Promptを日本語で書くこともできる。

 内部的にはLLMが日本語で受け取り、英語へ翻訳、そしてOmostへとなるので、その翻訳精度によって出力も左右されるが、ややこしいことを英語を書くより、日本語で書く方が楽できる。

このクラスのLLMだとPromptは日本語でもOK。“日本人美女のポートレート撮影。服装はカラフルなサマードレス。背景に夏空。”
LLMが英語に翻訳後、Upscaleしたものを元に出力した画像

 “日本人美女のポートレート撮影。服装はカラフルなサマードレス。背景に夏空。”と書いたところ、直訳は”A portrait of a beautiful Japanese woman in a colorful summer dress with a summer sky as the background.”となっており、それをUpscaleしたものをPromptとして使っている。

おまけ。“強力なGPUを搭載したパソコンが散乱している研究室で生成AI画像を作る美女のイラスト”。”A powerful GPU-equipped computer scattered around a research lab, with a beautiful woman creating AI images.”と翻訳されると実写風になってしまう。が、雰囲気いいのでOK!

 位置関係を表現できないSDXLでも、LLMの力と独自のRegional Prompter(AUTOMATIC1111の拡張機能的な仕掛けを使って、表現可能にしたのが、このOmostというわけだ。加えて日本語もOKと嬉しい限り。

sd3-with-LLM / SD3 MediumのPromptをLLM使ってUpscale

 sd3-with-LLMは、あるふ氏が、SD3 Mediumを日本語で扱えるよう、LLMに「microsoft/Phi-3-mini-4k-instruct」を使ったWeb UIとなっている。UIを見れば分かるように、日本語でPromptを入れ[実行]ボタンで英語へ翻訳しつつ結果の画像と、元になっているUpscaleされた英文も表示される。SD3 Medium未体験の方もこれで簡単に試せるので是非!

sd3-with-LLM起動直後の画面。下には日本語Promptのサンプルもある
実行すると画像とUpscaleされた英文が表示される。この肉はなかなかすごい破壊力(笑)。しかしたったこれだけの日本語からよくこれだけの英文を考えるものだと感心する

 筆者はこのソースコード(Filesから取得可能)に少し手を入れローカルPCで生成可能にしている。変更点は表示の並びと、日本語PromptからUpscaleされた英文の固定だ。

 特に後者は実行のたび、毎回LLMを動かすと時間がかかるのと、Upscaleした英文も異なり、Seed違いの比較ができない。LLMをパスして、今ある英文で生成するチェックボックスを追加した。

ローカルPCで動作しているsd3-with-LLM(改)
改造版に加え、画像生成モデルをptx0/sd3-reality-mixにしたバージョン。“キャミソールの右側にSD3の文字。”と書いたのがバッチリ出ている

 SD3 Mediumの場合、左右をそのまま認識するので、Omostのように凝ったことをしなくてもPromptで普通に書けば出てくる。さらに(英語のみだが)文字も扱える。

 なお、コードを読める人が見れば分かると思うが、内部的には非常に簡単。LLM用と画像生成用のpipelineを2つ(t2iとupsampler)用意し、順番に実行しているだけ。従って、LLM側も画像生成側も容易にほかのモデルへ変更可能だ。

 ローカルPCの場合、どちらも同時に動かすにはVRAM 24GBでも厳しい状況。これが理由で、LLMは「leliuga/Phi-3-mini-4k-instruct-bnb-4bit」、つまり4bit版を使用している。少し前にご紹介したLM Studioが動いていればOpenAI APIも使えるので、それ用に書き換えるのもありだろう。加えてSD3 Mediumのマージモデル、ptx0/sd3-reality-mixも実行可能にした。

 これまで生成AI画像を楽しむには、AUTOMATIC1111などアプリをインストールして、いろいろ面倒な設定をした後で、使用可能になるが、初心者には難しいな項目ばかりが並ぶ。しかもPromptは英語。このように、日本語が使え、あまり面倒な設定をしなくともこれだけ出れば(自由度はあまりないにせよ)、こんな形もありではないだろうか。

Lumina-T2Xのt2i

 Lumina-T2Xは、テキストから画像、動画、音楽などが作れるマルチモーダルな生成モデルだ。この中のt2iがつい最近、ComfyUIのNodeとして公開されたので、早速使ってみたのだが、驚くことに、テキストエンコーダへGoogleのGemma-2b-LLMが統合されている。

Lumina-T2X/t2iのWorkflow。かなり長い英文だがしっかり描画している
Promptを日本語で入力しても理解して出力される

 タグ区切りでも英文でもPromptに入力すれば、それをUpscaleし絵が生成される。2Bなのでさすがに日本語は……と、ダメ元で日本語Promptを入力したところ見事にOK。これにはちょっとビックリ!

 余談になるが、Gemma-2b-LLMを日本語用にFine Tuneした「alfredplpl/gemma-2b-it-ja-poc-2」もあり、コードを一部書き換えれば動くと思うが、こちらは返事も日本語なので、今回の用途には向いていない。ただ2Bとコンパクトなので、VRAM容量の少ないPCでも日本語チャットを楽しめそうだ。


 以上、生成AI画像とLLMが融合している環境などを3つご紹介した。ご紹介したように生成AI画像単独で使うより(特に日本語の場合)便利なケースが多く、面白そう! と思った方も多いのではないだろうか? これまで筆者は別システムのLLMで日本語やタグ区切りを入力、それをUpscaleした英文をPromptへコピペしていたのだが、やはり生成側と一体化している方が使いやすい。

 ただ問題はビデオカードのVRAM容量だ。LLMをLoad、Upscale、Unload→生成画像用モデルをLoad、生成、Unloadすれば、同時にLoadするより使用容量は減るものの、動作自体が遅くなり、できればやりたくない。が、そうなるとVRAM 24GBでもギリギリだ。ローカルPCで試すにはかなりハードルが高くなってしまう。この点、円安とのダブルパンチ。何とかならないものだろうか……。