motif64

m64_67cfbdf8a0d8 / README.md

61 lines, 2.3 KBraw

kromoss-image

An image model inside a capsule: Kromoss (a MOSS-Image fine-tune, Apache-2.0) with its 8-step DMD2 LoRA, on diffusers. Text in, 1024x1024 PNG out, about 19 s per image on an NVIDIA GB10.

What it shows

  • The image.generate kind: m64's front lets POST /v1/images/generations through and only prompt and seed in its body. steps, guidance and the like get a 400 that names the field.
  • Big weights as [[artifacts]]: about 40 GB from one Hugging Face repo at a fixed commit, only the files the pipeline needs. The capsule folder stays a few KB.
  • [params]: the settings the server bakes in (size, steps, guidance, shift, LoRA), published in the manifest and returned as params_used with every image, so a result can be reproduced from its seed.
  • [routes] extra: one more path, /v1/config, let through by the front.
  • A Dockerfile on NVIDIA's PyTorch image, pinned by digest, with every pip package at an exact version.
  • Progress in $M64_STATUS: loading, warming (one short generation), ready.

Where the weights go

The first serve downloads them before the container starts. To do that ahead of time, without starting anything:

m64 install examples/kromoss-image

m64 checks each file against the repo's commit and mounts the folder read-only at /weights/kromoss; the container itself has no network. By default artifacts live under ~/.cache/m64. To keep them on a bigger disk or a NAS, shared by every capsule:

m64 config set models_dir /mnt/models

Run it

m64 check examples/kromoss-image
m64 examples/kromoss-image          # serve it and open /human/

Loading takes a few minutes (40 GB to read and move to the GPU). It needs about 40 GB of GPU memory: a GB10, or an x86 card with that much (then set platform and gpu in capsule.toml to what m64 doctor prints).

Try it

curl -s <url>/v1/images/generations \
  -H 'Content-Type: application/json' \
  -d '{"prompt": "a tabby cat holding a sign that says MOSS", "seed": 42}' \
  | python3 -c 'import sys,json,base64; d=json.load(sys.stdin); open("out.png","wb").write(base64.b64decode(d["data"][0]["b64_json"])); print(d["seed"], d["params_used"])'

The same prompt and seed give the same image, byte for byte.