pokemon behave “magically,” (3) what went wrong in our SDXL LoRA
test harness, and (4) the concrete fixes + evidence that the LoRA is now actually applied.
The LambdaLabs “text-to-pokemon” release was primarily a full Stable Diffusion fine-tune (SD 1.4 era). That means the entire denoising model learns a Pokémon-biased image prior.
A key trick described in the blog is sampling from EMA weights (think “smoothed average”). This tends to reduce overfit artifacts and keeps the base model’s generality while injecting Pokémon-ness.
References: Justin Pinkney’s write-up and the LambdaLabs diffusers repo: blog, repo.
pokemon “just works”
Modern base models often already associate the word pokemon with a strong visual manifold.
That means a lot of “pokemonization” can come from the base model without any LoRA.
A made-up token like pk_mn usually has no meaning in the text encoder.
UNet-only LoRAs can’t reliably “invent meaning” for a token the encoder treats as near-noise.
If your goal is “LoRA-derived latent space,” the honest test is: does pk_mn do nothing when adapters are off,
and do something only when adapters are on?
unet...lora.up/down.weight).
lora_unet_...lora_up/down.weight).
Fix: we added automatic conversion + a preflight sanity run that proves scale affects output.
Prompt: toothbrush pokemon • Seed: 12345 • SDXL: steps=30 cfg=7.0 1024×1024
This is the corrected sweep (40 prompts × 6 scales × 4 images).
Note: the older gallery under pig/sdxl-sweep/dcf3d10403dd/ is not used for conclusions.
These captions are prompt strings (not an attempt to identify anyone in the images).
source .api-keys\n./.venv/bin/python - <<'PY'\nimport os, asyncio\nfrom app.providers.runpod import RunPodClient\nasync def main():\n c=RunPodClient(api_key=os.environ[\"RUNPOD_API_KEY\"])\n pods=await c.list_my_pods()\n running=[p for p in pods if str((p or {}).get(\"desiredStatus\") or \"\").upper()==\"RUNNING\"]\n print(\"pods_total\",len(pods),\"pods_running\",len(running))\nasyncio.run(main())\nPY
source .api-keys\n./.venv/bin/python scripts/execute_sdxltest.py \\\n --volume-id qqx2kgc5v7 \\\n --ckpt-name sd_xl_base_1.0.safetensors \\\n --output-name pokemon-sdxl-lora-en-v1 \\\n --sweep-steps 30 \\\n --sweep-cfg 7.0 \\\n --gpu-type-id \"NVIDIA H200\" \\\n --container-disk-gb 160 \\\n --skip-train
Internal docs / exact runbook: see restart_plan.md in the repo.