Correct Text in AI Images on a Local GPU
Headline-scale typography rendered clean on 4/4 seeds, while dense blocks hit roughly 1 in 4. How MOSS-Image SFT performs on an RTX 5060 Ti.

Key takeaways
- MOSS-Image SFT paired with a 0.7 strength DMD LoRA renders 896x1152 frames in 4-5 seconds on an RTX 5060 Ti 16GB.
- Headline-scale text succeeded on 4/4 seeds, while dense layout blocks succeeded on roughly 1 in 4 seeds.
- Updating the ComfyUI venv to torch 2.10.0 cu130 activated int8 CUDA kernels, cutting render latency from 22.4 to 4.1-5.1 seconds.
- Complex multi-box layouts such as magazine covers render in 27 seconds on turbo versus 110 seconds on the 25-step preset.
- The model carries no facial identity conditioning; character faces must be integrated downstream using the FLUX klein faceswap rail.
The local typography stack
Our text model is MOSS-Image SFT: a roughly 5B single-stream diffusion transformer under Apache-2.0, with a Qwen3.5-9B text encoder and the FLUX.2 small VAE. We use it for typography, exact layout boxes and region colour maps, not for faces.
Most modern open-weights diffusion architectures excel at rendering painterly backgrounds or photorealistic portraits, yet consistently degrade into melted glyphs when asked to spell real words. MOSS-Image SFT was engineered specifically around structured textual conditioning. By leveraging the large text comprehension capacity of the Qwen3.5-9B text encoder, it treats written language as geometric coordinates rather than accidental surface noise.
In our studio workflow, we isolate tasks by model competency. Rather than demanding that a single monolithic pipeline generate perfect skin, styled hair, atmospheric lighting, and accurate brand wordmarks in one pass, we assign typography and structural box planning directly to MOSS-Image SFT. Faces and talent identities are composited later.
Turbo performance and the torch cu130 upgrade
| Preset / Environment | Steps | Latency | Accuracy Note |
|---|---|---|---|
| Turbo (torch 2.7.1 cu128) | 8 | 22.4 s | int8 kernels inactive |
| Turbo (torch 2.10.0 cu130) | 8 | 4-5 seconds | Active int8 kernels, mean pixel diff 2-6 |
| Full preset (er_sde) | 25 | 24 s | Broke poster title twice on test seeds |
| Magazine layout (Turbo) | 8 | 27 seconds | All text exact across all layout boxes |
| Magazine layout (Full) | 25 | 110 seconds | 4x slower without accuracy benefit |
Our default preset 'turbo' is the SFT model with a DMD LoRA at strength 0.7, 8 steps, CFG 1, euler/simple. It renders 896x1152 in about 4 to 5 seconds on our RTX 5060 Ti 16GB, down from 22.4 seconds before we moved the ComfyUI venv to torch 2.10 cu130.
Moving the ComfyUI venv from torch 2.7.1 cu128 to torch 2.10.0 cu130 made the int8 CUDA kernels active: turbo went from 22.4 to 4.1-5.1 seconds. Mean pixel difference against forced-eager output was 2-6, so the fast path is not lossy; a seed that looked broken after the upgrade was simply a bad seed.
This speedup fundamentally transformed our design iteration cycle. At 4-5 seconds per generation, text generation operates in near-realtime on mid-tier hardware, enabling interactive layout exploration without cloud credits.
Text scale and the seed sweep rule
Headline-scale text (poster title, tagline, wordmark, cover lines) came out right on 4 of 4 seeds in our tests. Dense text (a five-step infographic, a billing block) came out right on about 1 seed in 4.
Our test poster for The Arrangement illustrates this operational boundary: the headline title and tagline render correctly, while the dense billing block text below is garbled into unreadable shapes. Because diffusion models synthesize text through progressive denoising, spatial scale dictates typographic reliability. Prominent characters occupying significant pixel area provide clear gradient signals to the denoising network, resulting in clean letterforms across repeated runs. When text shrinks to dense body copy or multi-line paragraphs, stochastic variations frequently introduce character transpositions or dropped letters.
So we sweep seeds instead of re-prompting: four seeds take about 16 seconds in total because the text encoder is cached after the first job. Billing blocks are always pseudo-text, so we composite real credits in Remotion or Photoshop.
When dense text fails on a given generation, re-engineering the prompt vocabulary is usually an inefficient approach. Generating a batch of four seeds across 16 seconds allows the artist to pick the run where all glyphs resolved cleanly. For legal copy or micro-typography, synthetic rendering is abandoned entirely in favor of post-production vector overlays.
Why the 25-step preset broke titles
The official 25-step er_sde setting broke a poster title twice ('THE A/RRANGEMENT', 'HOW A LENS I MADE') on seeds where the 50-step run and both turbo presets spelled it right. For text-critical frames we do not trust the full 25-step preset.
Standard diffusion intuition suggests that increasing step counts invariably improves fidelity. In our empirical testing with MOSS-Image SFT, the intermediate 25-step solver created destabilizing over-sharpening along character boundaries, inserting unwanted slashes and extra vowel glyphs into clean words. By contrast, the distilled 8-step turbo configuration and the extended 50-step run preserved correct spelling.
Preset 'full' (25 steps, CFG 2.5, 24 seconds) beat turbo on organic skin in our portrait tests, where turbo reads as polished and digital. We use full only for hero portraits without text.
When a shot requires organic human skin and complex background textures without written copy, the 25-step full preset remains viable. But the moment text enters the prompt, turbo is the safer and more reliable choice.
Layout boxes and complex compositions
Layout boxes are the reason we chose this model: an OMNI-style magazine cover with a masthead, two cover lines, a barcode and a character box came out with all text exact and every element inside its box, in 27 seconds on turbo. The same prompt on the 25-step preset took 110 seconds.
Beyond basic typographic rendering, MOSS-Image SFT demonstrates remarkable spatial compliance. When instructed to partition a vertical canvas into dedicated regions—such as a top masthead zone, flanking sidebar text blocks, and an isolated product panel—it respects the bounding boundaries without leaking graphics across demarcations.
Achieving this layout precision in 27 seconds on turbo allows creative directors to rapidly mock up packaging, posters, and editorial covers directly within a single generation step. The 110-second duration required by the unaccelerated preset offered zero measurable layout improvement.
Model variants, identity swaps, and logo grafting
We tested three variants and dropped two. Kromoss lost all 6 prompts to SFT, with muddy faces and gibberish 'EDITORIAL' copy added to portraits. The bf16 version against the int8 build went 2 wins, 2 losses and 4 ties over 8 blind pairs, at 10-12 seconds versus 4-5, so we kept int8.
The model has no identity conditioning. Persona faces have to be swapped in afterwards with the FLUX klein faceswap rail.
Combining typography models with secondary edit passes introduces downstream complications. Our FLUX klein EDIT rail garbled a small chest logo on a tee ('ÉTAT' came out as 'ROIT'). The fix that worked was to paste the logo back from the original image with a feathered mask, keeping the rest of the EDIT output.
When a generative swap pass overwrites sharp brand marks, relying on the edit model to reconstruct vector letterforms is futile. Masking out the logo region and compositing the pristine source typography back over the finished swap ensures total brand fidelity.



