最強画像生成AIと話題のFLUX.1[dev]をローカル環境のDiffusersで使ってみた【Python】
PythonでFLUX.1 [dev]を使って、手元のPCを動かして画像生成してみました。
画像生成してみる
使用するコード
公式ページで紹介されているコードそのままでは認証の問題でうまく動作しないので、前回記事の通りアクセストークンを取得してから以下のコードを使用します。
import torch
from diffusers import FluxPipeline
from huggingface_hub import login
access_token = "hf_XXX" # 取得したアクセストークンを入力
login(token=access_token)
pipe = FluxPipeline.from_pretrained(
"black-forest-labs/FLUX.1-dev",
torch_dtype=torch.bfloat16,
use_auth_token=access_token
)
pipe.enable_model_cpu_offload()
prompt = "A cat holding a sign that says hello world"
image = pipe(
prompt,
height=1024,
width=1024,
guidance_scale=3.5,
num_inference_steps=50,
max_sequence_length=512,
generator=torch.Generator("cpu").manual_seed(0)
).images[0]
image.save("flux-dev.png")
公式で紹介されているコードに、HuggingFace認証を付け加えています。
※2回目以降の実行時は、初回実行時にモデルがダウンロード済みのためアクセストークン不要っぽいです。
生成結果とかかった時間
生成結果は以下の通りです。
非常に素晴らしい結果ではないでしょうか。
従来モデルでは難しかった、画像中の文字表示が実現できているのが驚きです。
上述したプログラムを使えば、seedを固定しているので、どの環境でも同じ画像が生成されるはずです。(といっても、OSやGPUによって若干の差異は生じてしまうようです)
環境によって変動はあると思いますが、今回はGeForce RTX 4070 Ti SUPER(VRAM 16GB)の使用で、生成完了までに約1時間半かかりました。
また、2回目以降は考慮しなくても良いとはいえ、FLUXモデル(合計20~30GB?)のダウンロード時間も合わせると、かなりの時間がかかりました。
そこそこ良いグラボを使っているはずですが、1枚の生成でこれだけ時間がかかるので、弱いグラフィックボードやCPUでの動作はどうなってしまうのか・・・全く勧められません。
同時発表の別モデルにFLUX.1 [schnell]というのがあり、こちらの方が軽量っぽいので、今度試してみようと思います。
簡単な解説
基本的にはDiffusionPipelineなどと書き方が同じですが、今回max_sequence_lengthというパラメータが出てきて、初めて見たので調べてみました。
結論としてはよくわからなかったのですが、TensorFlowで出てくる「明示的な最大シーケンス長」なるものらしく、恐らくプロンプトの最大長を指定しているのかな?と思われます。
今回のFLUX.1 [dev]モデルは、従来親しまれてきたモデルとは異なり、最大トークン数に制限がないため、一般的な長さのプロンプトであれば、max_sequence_lengthで最大長を指定してあげた方が良いでしょう。
別のプロンプトで生成
先ほどのサンプルを流用し、他の設定はそのままに"A cute girl in Japanese anime style"(「日本アニメ風のかわいい女の子」)というプロンプトに変えて生成してみました。
クオリティはかなり高いですが、生成時間などコストを考えると、アニメ風の画像はStableDiffusionやStableDiffusionXLモデルでも良いような気がします。
Fluxでアニメ風の画像生成を検討されている方は、FluxとSDXLでそれぞれ何枚か生成・比較してみた方が良いでしょう。
今後の展望
今回は公式で紹介されているサンプルコードを少しいじったものを回してみましたが、生成完了までに時間がかかりすぎるため、実務的には量子化等を検討するか、軽量版モデルのFLUX.1 [schnell]を試すなどしなければなりません。
ちなみにですが、FLUX.1ではNSFW画像の生成は困難であるようです。
NSFW設定で生成したい方は、SDやSDXLなどの制限解除可能なモデルで生成するのが無難かと思われます。
何はともあれ、無事に生成できて満足です。
以上です。
ディスカッション
コメント一覧
まだ、コメントがありません