Z-Image-Turbo

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してから使うとよさそうである。