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してから使うとよさそうである。
[2026-01-28] 上位バージョン?の Z-Image も出た。
import torch
from diffusers import ZImagePipeline
# Load the pipeline
pipe = ZImagePipeline.from_pretrained(
"Tongyi-MAI/Z-Image",
torch_dtype=torch.bfloat16,
# low_cpu_mem_usage=False,
device_map="mps"
)
# pipe.to("mps")
# Generate image
prompt = "两名年轻亚裔女性紧密站在一起,背景为朴素的灰色纹理墙面,可能是室内地毯地面。左侧女性留着长卷发,身穿藏青色毛衣,左袖有奶油色褶皱装饰,内搭白色立领衬衫,下身白色裤子;佩戴小巧金色耳钉,双臂交叉于背后。右侧女性留直肩长发,身穿奶油色卫衣,胸前印有“Tun the tables”字样,下方为“New ideas”,搭配白色裤子;佩戴银色小环耳环,双臂交叉于胸前。两人均面带微笑直视镜头。照片,自然光照明,柔和阴影,以藏青、奶油白为主的中性色调,休闲时尚摄影,中等景深,面部和上半身对焦清晰,姿态放松,表情友好,室内环境,地毯地面,纯色背景。"
negative_prompt = "" # Optional, but would be powerful when you want to remove some unwanted content
image = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
height=1280,
width=720,
cfg_normalization=False,
num_inference_steps=50,
guidance_scale=4,
generator=torch.Generator("mps").manual_seed(42),
).images[0]
image.save("example.png")