Z-Imageという画像生成モデルが評判である。Qwenと同じAlibaba製だ。現在はZ-Image-Turboというモデルだけが公開されている。
PyTorchと最新のdiffusersをインストールしておく(pip install --upgrade torch diffusers)。あとは、サンプルコードを適宜書き直して使う。
Macでも今はbfloat16がなんとか使えるようだ。もしうまくいかなければfloat32にする。float16は数値の範囲が狭いのでうまくいかなかった。
import torch
from diffusers import ZImagePipeline
pipe = ZImagePipeline.from_pretrained(
"Tongyi-MAI/Z-Image-Turbo",
torch_dtype=torch.bfloat16, # または torch.float32
)
pipe.to("mps") # mps, cpu, cuda (Macはmps)
prompt = "A Japanese anime girl"
image = pipe(
prompt=prompt,
height=1024,
width=1024,
num_inference_steps=9,
guidance_scale=0.0,
generator=torch.Generator("mps").manual_seed(42),
max_sequence_length=1024, # default: 512 tokens
).images[0]
image.save("out.png")
モデルは自動でダウンロードされる。デフォルトでは ~/.cache/huggingface/hub/models--Tongyi-MAI--Z-Image-Turbo に入る。全部で33Gバイトほどあるので、メモリ48G〜64G以上のマシンが欲しい。Mac Studio M4 Maxでは1枚45秒(float32なら52秒)程度で生成できた。
プロンプトと乱数を変えながら次々に生成するために、次のようにしてみた。プロンプトは prompt.txt というファイルに書く。このファイルの1行目が空なら停止する。
import hashlib
import torch
from diffusers import ZImagePipeline
pipe = ZImagePipeline.from_pretrained(
"Tongyi-MAI/Z-Image-Turbo",
torch_dtype=torch.bfloat16,
)
pipe.to("mps") # mps, cpu, cuda (Macはmps)
while True:
with open("prompt.txt", "r") as f:
prompt = f.read()
if len(prompt) == 0 or prompt[0] == "\n":
break
hash = hashlib.md5(prompt.encode("utf-8")).hexdigest()[:8]
seed = torch.randint(0, 100000000, (1,)).item()
image = pipe(
prompt=prompt,
height=1024,
width=1024,
num_inference_steps=9,
guidance_scale=0.0,
generator=torch.Generator("mps").manual_seed(seed),
max_sequence_length=1024, # default: 512 tokens
).images[0]
image.save(f"img_{hash}_{seed:08}.png")
PROMPTING GUIDE にあるようにプロンプトはLLMでenhanceするとよい。Z-Image Prompt Enhancer に解説とprompt enhancerの英訳があるので、まずは簡単なプロンプトを自分で書いてから、何らかのLLMを使ってenhanceしてから使うとよさそうである。