{"course":{"slug":"ai-images","title":"Image Generation, in Practice","url":"https://addaly.com/learn/ai-images","level":"beginner","track":"create"},"lesson":{"slug":"what-the-files-are","title":"A model is four kinds of file, and mixing them up wastes an evening","url":"https://addaly.com/learn/ai-images/what-the-files-are","position":4,"of":69,"minutes":8,"answer":"A checkpoint, a VAE, a LoRA and an embedding are different file types with different sizes and different folders.","keyIdea":"A checkpoint, a VAE, a LoRA and an embedding are different file types with different sizes and different folders, and almost every \"it loaded but the image is grey mush\" problem is one of them in the wrong place."},"body":{"format":"markdown","text":"## The inventory on disk\n\nPeople say \"I downloaded the model\" as if a model were one thing. Locally it is a small family of files, and knowing which is which saves you the evening where everything loads and every image comes out as grey porridge.\n\n**The checkpoint** is the model proper: the denoising network plus, usually, the text encoder and VAE bundled in. It is the big file.\n\n- SD 1.5 checkpoint: 2 to 4 GB\n- SDXL checkpoint: about 6.6 GB\n- FLUX dev in bf16: about 23 GB; the fp8 version about 11 GB; a GGUF Q4 version about 6.5 GB\n\n**The VAE** is the decoder that turns the small latent image into pixels. Around 160 to 330 MB. Most checkpoints have one baked in. You only need a separate one when a checkpoint shipped with a broken or \"pruned\" VAE, and the symptom is unmistakable: correct composition, correct colours in the thumbnail preview, and a final image that is washed out, purple-tinged or covered in noise. Swap the VAE and it is fixed. This is the single most common \"the model is broken\" that is not.\n\n**A LoRA** is a small set of weight adjustments layered onto a checkpoint: a character, a style, a concept. 20 to 250 MB. A LoRA is built for a specific base: an SD 1.5 LoRA on an SDXL checkpoint either errors or does nothing useful. The mismatch is the second most common wasted evening.\n\n**A textual inversion or embedding** is smaller still, often 4 to 80 KB. It teaches the text encoder one new word rather than changing the model. Mostly used now for negative-prompt bundles.\n\nThere are also **ControlNet models** (1.4 GB each for SD 1.5, up to 2.5 GB for SDXL) and **IP-Adapter** files. These are conditioning modules, again base-specific.\n\n> Figure: The five kinds of file, and the evening each one costs you. Layers, top to bottom: Checkpoint: the model proper (2–23 GB. In the wrong folder, nothing loads at all.); VAE: the decoder to pixels (160–330 MB. A broken one gives grey mush or a purple cast.); LoRA: a difference from one checkpoint (20–250 MB. Wrong base: it errors, or quietly does nothing.); Embedding: one new word for the text encoder (4–80 KB. Mostly negative-prompt bundles now.); ControlNet and IP-Adapter: conditioning modules (1.4–2.5 GB. Base-specific, exactly like a LoRA.). Every one of them is base-specific, and almost every \"the model is broken\" report is one of them in the wrong folder or against the wrong base.\n\n## safetensors, not ckpt\n\nYou will see two extensions. A `.ckpt` file is a Python pickle, which means loading it executes code contained in the file. That is not a theoretical risk; malicious checkpoints have been distributed. A `.safetensors` file is a plain tensor container that cannot execute anything.\n\nThe rule is simple: **download safetensors**. If only a `.ckpt` exists and you need it, convert it in an isolated environment, or find another copy. No workflow is worth handing a stranger a shell on your machine.\n\n## Where they go\n\nFolder layouts differ between interfaces, but the shape is the same everywhere, and this is roughly what a Forge or A1111 install looks like:\n\n```text\nmodels/\n  Stable-diffusion/    <- checkpoints (.safetensors)\n  VAE/                 <- standalone VAE files\n  Lora/                <- LoRAs\n  embeddings/          <- textual inversions\n  ControlNet/          <- control models\n```\n\nComfyUI uses `models/checkpoints`, `models/loras` and so on, and has an `extra_model_paths.yaml` that lets a second interface read the same folders. Set that up on day one if you plan to use more than one front end. Storing a 6.6 GB checkpoint twice is how a disk fills.\n\n## The limitation worth stating\n\nA LoRA is trained against a specific checkpoint, but it is usually *used* on a different one: someone trains a character on base SDXL and you apply it to a heavily fine-tuned photographic checkpoint. It often works, which is why people do it. It also frequently degrades: colours shift, contrast rises, the face drifts toward the training checkpoint's house style.\n\nThe mechanism is that a LoRA encodes a *difference* from a particular set of weights. Applied to weights that have already moved, the difference lands somewhere else. This is why the same LoRA at strength 0.8 looks right on one checkpoint and plasticky on another, and why the answer is to lower the strength to 0.5–0.6 rather than to conclude the LoRA is bad.\n\n## Merges, and why your favourite checkpoint has no history\n\nA large share of the checkpoints people actually use are **merges**: two or more models averaged together, sometimes with a LoRA baked in, often by somebody who did it by feel in an afternoon. Merging is legitimate and some merges are excellent. It has three consequences you should hold in mind.\n\nThe first is that a merge inherits every licence in its ancestry, and the upload page frequently does not say what those were. If you are working commercially, a merge with an unclear lineage is a risk you are carrying without knowing its size.\n\nThe second is that merges drift toward a house look. Average several photographic checkpoints and you get the same glossy, slightly over-lit, slightly symmetrical face that everybody's images have. If your output looks generically \"AI\", the checkpoint is often more responsible than the prompt.\n\nThe third is practical: merges frequently ship a broken or non-standard VAE, which is why the grey-porridge and purple-cast problems cluster on community downloads rather than on official base models.\n\n## What to actually download first\n\nStart with one official base model and one well-documented fine-tune, and nothing else. A first shelf that works:\n\n- One base checkpoint appropriate to your VRAM.\n- Its matching official VAE, kept separately so you can swap it in when a merge misbehaves.\n- One upscaler model, a few tens of megabytes.\n\nAdd a LoRA only when you have a specific job for it. The usual failure of a new setup is fifteen checkpoints, ninety LoRAs, a full disk and no finished images."},"check":{"question":"An SDXL image has correct composition and correct framing but comes out washed out with a purple cast on every generation, regardless of prompt or seed. What is the most likely cause?","options":[{"text":"A LoRA trained against a different base model is being applied on top of this checkpoint and is corrupting the output as it is blended in.","correct":false,"tempting":"A base mismatch usually errors outright or produces incoherent content, not a consistent colour cast with intact composition."},{"text":"The VAE is broken or missing, so a correctly denoised latent is being decoded wrongly.","correct":true},{"text":"The guidance scale has been set too high for this checkpoint, which oversaturates the image and shifts the colour balance as it clips.","correct":false,"tempting":"High guidance does damage colour, but toward burnt contrast and clipping, and it would vary with the prompt rather than appearing identically on every generation."},{"text":"The checkpoint was downloaded as a .ckpt rather than a .safetensors, and that container stores its weights at a lower numeric precision.","correct":false,"tempting":"Confuses a container format with numeric precision; the two extensions store identical weights, and the difference is only whether loading can execute code."}]},"prev":{"slug":"hosted-or-local","title":"Three routes to a GPU, and the arithmetic for each","url":"https://addaly.com/learn/ai-images/hosted-or-local"},"next":{"slug":"picking-an-interface","title":"Four front ends, and which one deserves your learning time","url":"https://addaly.com/learn/ai-images/picking-an-interface"},"authorship":"Founder and series editor: Dr Mustafa Mun. Written by AI models to a written standard. Exam keys checked blind by a second model: 3,665 of 3,666 agreed. Academic review invited.","review":{"status":"Draft, open for academic review"},"cite":"Addaly (2026) 'A model is four kinds of file, and mixing them up wastes an evening', in Image Generation, in Practice. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/ai-images/what-the-files-are (Accessed: 13 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"A model is four kinds of file, and mixing them up wastes an evening","courseTitle":"Image Generation, in Practice","module":{"index":1,"slug":"the-kit","title":"The kit, and what each piece of it costs you"},"answer":null,"keyIdea":"A checkpoint, a VAE, a LoRA and an embedding are different file types with different sizes and different folders, and almost every “it loaded but the image is grey mush” problem is one of them in the wrong place.","hero":{"kind":"figure","figure":{"t":"figure","label":"Figure","figure":{"type":"stack","title":"The five kinds of file, and the evening each one costs you","layers":[{"label":"Checkpoint: the model proper","detail":"2–23 GB. In the wrong folder, nothing loads at all."},{"label":"VAE: the decoder to pixels","detail":"160–330 MB. A broken one gives grey mush or a purple cast."},{"label":"LoRA: a difference from one checkpoint","detail":"20–250 MB. Wrong base: it errors, or quietly does nothing."},{"label":"Embedding: one new word for the text encoder","detail":"4–80 KB. Mostly negative-prompt bundles now."},{"label":"ControlNet and IP-Adapter: conditioning modules","detail":"1.4–2.5 GB. Base-specific, exactly like a LoRA."}],"caption":"Every one of them is base-specific, and almost every “the model is broken” report is one of them in the wrong folder or against the wrong base."},"alt":"Figure: The five kinds of file, and the evening each one costs you. Layers, top to bottom: Checkpoint: the model proper (2–23 GB. In the wrong folder, nothing loads at all.); VAE: the decoder to pixels (160–330 MB. A broken one gives grey mush or a purple cast.); LoRA: a difference from one checkpoint (20–250 MB. Wrong base: it errors, or quietly does nothing.); Embedding: one new word for the text encoder (4–80 KB. Mostly negative-prompt bundles now.); ControlNet and IP-Adapter: conditioning modules (1.4–2.5 GB. Base-specific, exactly like a LoRA.). Every one of them is base-specific, and almost every “the model is broken” report is one of them in the wrong folder or against the wrong base."}},"blocks":[{"t":"h2","id":"the-inventory-on-disk","runs":[{"text":"The inventory on disk"}]},{"t":"p","runs":[{"text":"People say “I downloaded the model” as if a model were one thing. Locally it is a small family of files, and knowing which is which saves you the evening where everything loads and every image comes out as grey porridge."}]},{"t":"p","runs":[{"text":"The checkpoint","b":true},{"text":" is the model proper: the denoising network plus, usually, the text encoder and VAE bundled in. It is the big file."}]},{"t":"ul","items":[[{"text":"SD 1.5 checkpoint: 2 to 4 GB"}],[{"text":"SDXL checkpoint: about 6.6 GB"}],[{"text":"FLUX dev in bf16: about 23 GB; the fp8 version about 11 GB; a GGUF Q4 version about 6.5 GB"}]]},{"t":"p","runs":[{"text":"The VAE","b":true},{"text":" is the decoder that turns the small latent image into pixels. Around 160 to 330 MB. Most checkpoints have one baked in. You only need a separate one when a checkpoint shipped with a broken or “pruned” VAE, and the symptom is unmistakable: correct composition, correct colours in the thumbnail preview, and a final image that is washed out, purple-tinged or covered in noise. Swap the VAE and it is fixed. This is the single most common “the model is broken” that is not."}]},{"t":"p","runs":[{"text":"A LoRA","b":true},{"text":" is a small set of weight adjustments layered onto a checkpoint: a character, a style, a concept. 20 to 250 MB. A LoRA is built for a specific base: an SD 1.5 LoRA on an SDXL checkpoint either errors or does nothing useful. The mismatch is the second most common wasted evening."}]},{"t":"p","runs":[{"text":"A textual inversion or embedding","b":true},{"text":" is smaller still, often 4 to 80 KB. It teaches the text encoder one new word rather than changing the model. Mostly used now for negative-prompt bundles."}]},{"t":"p","runs":[{"text":"There are also "},{"text":"ControlNet models","b":true},{"text":" (1.4 GB each for SD 1.5, up to 2.5 GB for SDXL) and "},{"text":"IP-Adapter","b":true},{"text":" files. These are conditioning modules, again base-specific."}]},{"t":"h2","id":"safetensors-not-ckpt","runs":[{"text":"safetensors, not ckpt"}]},{"t":"p","runs":[{"text":"You will see two extensions. A "},{"text":".ckpt","code":true},{"text":" file is a Python pickle, which means loading it executes code contained in the file. That is not a theoretical risk; malicious checkpoints have been distributed. A "},{"text":".safetensors","code":true},{"text":" file is a plain tensor container that cannot execute anything."}]},{"t":"p","runs":[{"text":"The rule is simple: "},{"text":"download safetensors","b":true},{"text":". If only a "},{"text":".ckpt","code":true},{"text":" exists and you need it, convert it in an isolated environment, or find another copy. No workflow is worth handing a stranger a shell on your machine."}]},{"t":"h2","id":"where-they-go","runs":[{"text":"Where they go"}]},{"t":"p","runs":[{"text":"Folder layouts differ between interfaces, but the shape is the same everywhere, and this is roughly what a Forge or A1111 install looks like:"}]},{"t":"code","lang":"text","label":"Text","text":"models/\n  Stable-diffusion/    <- checkpoints (.safetensors)\n  VAE/                 <- standalone VAE files\n  Lora/                <- LoRAs\n  embeddings/          <- textual inversions\n  ControlNet/          <- control models"},{"t":"p","runs":[{"text":"ComfyUI uses "},{"text":"models/checkpoints","code":true},{"text":", "},{"text":"models/loras","code":true},{"text":" and so on, and has an "},{"text":"extra_model_paths.yaml","code":true},{"text":" that lets a second interface read the same folders. Set that up on day one if you plan to use more than one front end. Storing a 6.6 GB checkpoint twice is how a disk fills."}]},{"t":"h2","id":"the-limitation-worth-stating","runs":[{"text":"The limitation worth stating"}],"role":"limit"},{"t":"p","runs":[{"text":"A LoRA is trained against a specific checkpoint, but it is usually "},{"text":"used","i":true},{"text":" on a different one: someone trains a character on base SDXL and you apply it to a heavily fine-tuned photographic checkpoint. It often works, which is why people do it. It also frequently degrades: colours shift, contrast rises, the face drifts toward the training checkpoint’s house style."}]},{"t":"p","runs":[{"text":"The mechanism is that a LoRA encodes a "},{"text":"difference","i":true},{"text":" from a particular set of weights. Applied to weights that have already moved, the difference lands somewhere else. This is why the same LoRA at strength 0.8 looks right on one checkpoint and plasticky on another, and why the answer is to lower the strength to 0.5–0.6 rather than to conclude the LoRA is bad."}]},{"t":"h2","id":"merges-and-why-your-favourite-checkpoint-has-no-history","runs":[{"text":"Merges, and why your favourite checkpoint has no history"}]},{"t":"p","runs":[{"text":"A large share of the checkpoints people actually use are "},{"text":"merges","b":true},{"text":": two or more models averaged together, sometimes with a LoRA baked in, often by somebody who did it by feel in an afternoon. Merging is legitimate and some merges are excellent. It has three consequences you should hold in mind."}]},{"t":"p","runs":[{"text":"The first is that a merge inherits every licence in its ancestry, and the upload page frequently does not say what those were. If you are working commercially, a merge with an unclear lineage is a risk you are carrying without knowing its size."}]},{"t":"p","runs":[{"text":"The second is that merges drift toward a house look. Average several photographic checkpoints and you get the same glossy, slightly over-lit, slightly symmetrical face that everybody’s images have. If your output looks generically “AI”, the checkpoint is often more responsible than the prompt."}]},{"t":"p","runs":[{"text":"The third is practical: merges frequently ship a broken or non-standard VAE, which is why the grey-porridge and purple-cast problems cluster on community downloads rather than on official base models."}]},{"t":"h2","id":"what-to-actually-download-first","runs":[{"text":"What to actually download first"}]},{"t":"p","runs":[{"text":"Start with one official base model and one well-documented fine-tune, and nothing else. A first shelf that works:"}]},{"t":"ul","items":[[{"text":"One base checkpoint appropriate to your VRAM."}],[{"text":"Its matching official VAE, kept separately so you can swap it in when a merge misbehaves."}],[{"text":"One upscaler model, a few tens of megabytes."}]]},{"t":"p","runs":[{"text":"Add a LoRA only when you have a specific job for it. The usual failure of a new setup is fifteen checkpoints, ninety LoRAs, a full disk and no finished images."}]}],"check":{"question":[{"text":"An SDXL image has correct composition and correct framing but comes out washed out with a purple cast on every generation, regardless of prompt or seed. What is the most likely cause?"}],"options":[{"text":[{"text":"A LoRA trained against a different base model is being applied on top of this checkpoint and is corrupting the output as it is blended in."}],"correct":false,"tempting":[{"text":"A base mismatch usually errors outright or produces incoherent content, not a consistent colour cast with intact composition."}]},{"text":[{"text":"The VAE is broken or missing, so a correctly denoised latent is being decoded wrongly."}],"correct":true,"tempting":null},{"text":[{"text":"The guidance scale has been set too high for this checkpoint, which oversaturates the image and shifts the colour balance as it clips."}],"correct":false,"tempting":[{"text":"High guidance does damage colour, but toward burnt contrast and clipping, and it would vary with the prompt rather than appearing identically on every generation."}]},{"text":[{"text":"The checkpoint was downloaded as a .ckpt rather than a .safetensors, and that container stores its weights at a lower numeric precision."}],"correct":false,"tempting":[{"text":"Confuses a container format with numeric precision; the two extensions store identical weights, and the difference is only whether loading can execute code."}]}],"order":[3,1,0,2],"why":null},"prev":{"slug":"hosted-or-local","title":"Three routes to a GPU, and the arithmetic for each","minutes":9},"next":{"slug":"picking-an-interface","title":"Four front ends, and which one deserves your learning time","minutes":8}}}