Skip to content

同一バッチ内にながーいプロンプトがあると、生成結果が変わってしまう問題の修正 #1338

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

laksjdjf
Copy link
Contributor

他の長いプロンプトに合わせてパディングを行うと、生成結果が変わってしまいます。
このPRはパディングではなく、トークン列の複製によってトークン長を合わせています(ComfyUIと同じ方法)。

prompt_1,pad,pad,pad,pad,pad
pppppprooommmpptttttt2222222

↓修正

prompt_1, prompt_1, prompt_1
pppppprooommmpptttttt2222222

という感じです。

以下の二つのプロンプトリストで試しました。2つ目のプロンプトを適当に長くしています。

statue of liberty --d 4545
p, --d 4545
statue of liberty --d 4545
p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p,p, --d 4545

生成コマンドは以下の通りです。

python gen_img.py \
    --ckpt runwayml/stable-diffusion-v1-5 \
    --outdir outputs \
    --images_per_prompt 1 \
    --batch_size 2 \
    --max_embeddings_multiples 3 \
    --from_file "prompts/prompt.txt"

元のコードの結果です。右側は2つ目のプロンプトに合わせてパディングされています。
pre

修正後コードの結果です。右側は(ry
post

数学的にはトークン列が複製されても結果は変わらないはずですが、--fp16を利用すると精度の問題で少し異なる画像が生成されるようです。

全トークン長の最小公倍数まで複製するため、場合によってはトークン長が大きくなって、計算量が跳ね上がってしまいます。ComfyUIでは複製サイズが大きすぎる場合は結合せずに計算するようです。Cross Attentionをプロンプトごとに計算するのがわかりやすいのですかね。

@kohya-ss
Copy link
Owner

ありがとうございます。いい感じですね。openになるのをお待ちしています。

推論用のU-Netで、cross attentionだけバッチ分割した形状に対応すれば、計算速度の低下は抑えられそうですね。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants