見出し画像

プロンプト長さの限界と調べ方について(StableDiffusion)

特に描きたい絵は無いが、StableDiffusionをダシにしたPythonの勉強が楽しい。しかしごく初歩的な知識しかないので、表題のような話もソースを追って調べようとするとなかなか苦労する。というかまだ途中で躓いている。

なお答えは既にredditにある。
TIL that SD silently eats up too long prompts : StableDiffusion
すなわち、プロンプトはCLIPTokenizerによってトークン化(tokenize)されたあと、ベクトルに変換されてノイズ除去のガイドに使用される。そのトークンが、文頭から77個75個(後述のAkashic Records等により訂正)を超えた分は切り捨てられて(truncate)無視されるということだ。

コメントにあるとおり、下記のコードでトークン化されたプロンプトをチェックすることができる。

from transformers import CLIPTokenizer

tokenizer = CLIPTokenizer.from_pretrained("openai/clip-vit-large-patch14") 
prompt = "prompt"
print(tokenizer.tokenize(prompt)[0:tokenizer.model_max_length-3])

トークン化までならモデルのロードは不要なので、colab上でも大した時間をかけずに動く。頭に

!pip install transformers
!pip install ftfy regex

を付けて必要なパッケージをインストールすればよい。

具体的にどれくらいの長さの文章をトークン化すると75個を超えるかについては、気が向いたら追記しよう。取り急ぎ手元にあった拾い物のプロンプトを入れたところ、スペースを除いて257字までであった。実際にそれ以降の文章を削除したり全く違う単語に変えてみたが、全く同じ画像が生成された。

多分気の利いたフォークなら警告を出してくれるようになってるんじゃないかと思うけど、ご参考まで。

ちなみに

Stable Diffusion Akashic Records に、StableDiffusion関連の情報が結構まとまっている。上記の話もサラッと書いてある。

Your prompt must be 75 tokens or less, anything above will result in "prompt truncated after tokenization"

https://github.com/Maks-s/sd-akashic

また、例えばhlky版フォークのwebui.cmdであれば、下部のCopy-paste generation parametersの欄にWarningが出力される。

Warningの下の行が切り捨てられた文字列(17トークン)

ヘッダー画像はカントの定言命法。格言で検索すると文字画像がいっぱいでてくるので、謎の文章を生成するのに便利かもしれない。

この記事が気に入ったらサポートをしてみませんか?