FLUX 2 [klein] 9b Base Trainer

subject trainer

fal-ai/flux-2-klein-9b-base-trainer

The workhorse trainer for subjects and styles on FLUX.2 Klein 9B.

Trains a LoRA on the Klein 9B base model from a zip of images, with optional per-image captions. Three knobs do almost all the work: the dataset, steps and learning rate. This is the trainer behind every real example on this site.

What goes in the zip

Flat zip of images. Add a matching name.txt next to each image for captions; anything without a caption uses default_caption. 15 to 30 varied images is the sweet spot for one subject.

Good starting point

steps: 1000learning_rate: 0.00005

Parameters

Schema facts come straight from the fal API; the notes are ours.

Required

image_data_urlstringrequired

URL to a zip archive of your training images, optionally with matching .txt caption files.

In the atelier: The album you hand the painter. It is the single biggest factor in what the LoRA becomes.

Tip: 15 to 30 sharp, varied images beat 200 sloppy ones. Vary angle, lighting and background; keep the subject consistent.

Watch out: Duplicate or near-duplicate images push the LoRA toward memorizing instead of learning.

Raw schema description

URL to zip archive with images of a consistent style. Try to use at least 10 images, although more is better. The zip can also contain a text file for each image. The text file should be named: ROOT.txt For example: photo.txt This text file can be used to specify the edit instructions for the image pair. If no text file is provided, the default_caption will be used. If no default_caption is provided, the training will fail.

Optional

stepsintegerdefault: 100010010000

How many training iterations the model runs on your dataset. More steps means the LoRA sees your images more times.

In the atelier: Practice repetitions. Too few and the painter never picks up the skill. Too many and he stops learning and starts memorizing your exact photos.

Tip: Around 1000 is a solid default for a 15 to 30 image subject dataset. Small datasets need fewer steps, not more.

Watch out: If outputs start reproducing your training photos almost exactly (same pose, same background), you overtrained. Go back down.

Raw schema description

Total number of training steps.

learning_ratenumberdefault: 5e-5

How big each learning update is. Controls how aggressively the model changes per step.

In the atelier: The painter's eagerness. A high rate is frantic practice: fast but sloppy, and it can wreck habits he already had. A low rate is careful practice: slow, but precise.

Tip: Stay near the trainer's default unless you have a reason. If results look fried or oversaturated, lower it. If the subject barely shows after many steps, raise it slightly or add steps.

Watch out: Learning rate and steps trade off against each other. Doubling both at once is how datasets get burned.

Raw schema description

Learning rate applied to trainable parameters.

default_captionstring

Caption used for any image that has no .txt caption file in the zip.

In the atelier: The note the painter assumes when a photo in the album has no note attached.

Tip: For edit trainers this often carries the whole instruction, like 'turn this sketch into a finished painting'.

Raw schema description

Default caption to use when caption files are missing. If None, missing captions will cause an error.

output_lora_formatenumdefault: falfal | comfy

Naming scheme for the saved weights: 'fal' for fal inference endpoints, 'comfy' for ComfyUI workflows.

Tip: Use 'fal' if you plan to run the LoRA on fal endpoints. Pick 'comfy' only if your pipeline lives in ComfyUI.

Watch out: A LoRA saved in the wrong key format loads silently with no effect in some tools. If a LoRA seems to do nothing, check the format first.

Raw schema description

Dictates the naming scheme for the output weights

Call it

import { fal } from "@fal-ai/client";

const result = await fal.subscribe("fal-ai/flux-2-klein-9b-base-trainer", {
  input: {
    "image_data_url": "https://your-cdn.com/dataset.zip",
    "steps": 1000,
    "learning_rate": 0.00005
  },
  logs: true,
});
console.log(result.data);