.safetensors back on your own
machine. This is P4 — the cloud sequel to
the local LoRA trainer (P1) — and it runs the exact same
train_* tools, just pointed at rented hardware.
How much VRAM does FLUX LoRA training need?
FLUX.1-dev LoRA training is greedy. Even with quantization on, a real character run wants roughly 24 GB of VRAM — RTX 4090 class. That’s the wall a lot of people hit the moment they read P1: the flow is a conversation, the trainer is proven, the handoff is honest… and their local card is a 12 GB laptop GPU that can’t fit the model. Training simply doesn’t start. Buying a 4090 to train a handful of LoRAs is a bad trade. Which leaves the obvious question P1 promised to answer next.RunPod LoRA training cost and GPU requirements
A cloud GPU costs per GPU-hour. A character LoRA — 10–30 varied images, 1500–3000 steps — is roughly an hour of training on a 4090-class card. You spin a pod up, train, pull the file down, and shut it off. You pay for the run, not for owning the silicon, and the LoRA is yours forever after — a.safetensors
sitting in models/loras/ that loads on any GPU big enough to infer with it
(far less than training needs).
comfyui-mcp already knows how to talk to RunPod: it’s the same pods the
RunPod connector uses for remote rendering, and the same
RUNPOD_API_KEY you set once in the panel’s API-Keys card.
P4 teaches the trainer to borrow that hardware for a training run.
How the pod bootstrap works
Two new pieces made this possible. First, the trainer grew a dockerless native driver — it can run ai-toolkit directly against a Python venv instead of only inside the GPU Docker image from P1. Second, an SSH transport that stands that native driver up on a remote pod. The bootstrap on the pod is idempotent — safe to re-run, it skips whatever’s already done:- Clone ai-toolkit at a pinned git ref (same ref P1’s image pins, so runs are reproducible across local and cloud).
- Create a venv under the training root on the pod.
- Install torch cu128, then the ai-toolkit requirements.
run.py, same
presets. It’s the transport that’s new, not the trainer.
Since this post was published, 0.50.0 consolidated the eighteen
train_* tools into
three action-parameterized ones, so the names below are the tools as they shipped
at the time. The work is unchanged; the calls moved. Preflight and setup are now
train_doctor with action: "doctor" / "build_image" / "bootstrap". Job
lifecycle and discovery are train_start with action: "start" / "status" /
"cancel" / "delete" / "list_flows" / "job_config" / "preview_config".
Datasets are train_prepare_dataset with action: "prepare" / "list" /
"detail" / "update" / "delete" / "file" / "caption_image" /
"caption_dataset". Same services, same behaviour — the rest of the post still
applies.How to train a FLUX LoRA on RunPod
This is the part that matters: there is no separate “cloud training” surface to learn. It’s the same seven tools from P1 —train_doctor, train_build_image, train_prepare_dataset, train_start,
train_status, train_cancel, train_list_flows — backed by the same
crash-safe job registry. “Train on a pod” is the same conversation as “train
locally,” just pointed at rented iron:
train_doctorpreflights the pod instead of your local Docker: is the SSH endpoint reachable, is the bootstrap complete, isHF_TOKENpresent (FLUX.1-dev is gated — the first run downloads it)?train_prepare_datasetstages your images with captions and a trigger word exactly as before (validate-everything-first, then atomic swap; your originals are copied, never touched).train_startlaunches the run on the pod and returns a job id immediately.train_statusstreams step/loss/sample progress back the same way — and because job records are refreshed from disk on every read, status still works cross-process: your phone can poll a pod run your desktop kicked off.train_cancelstops the remote trainer withpkilland confirms it’s actually dead viapgrepbefore it dares report success — the same “don’t claim a cancel you can’t prove” rule P1 is built on.
Dataset up, safetensors back
The mechanics of getting bits to and from the pod:- Dataset up. The SSH transport resolves the pod’s SSH endpoint — RunPod
exposes container port 22 as a public
ip:port— and rsyncs your staged dataset up to the training root. rsync means a re-send only moves what changed. - Training runs over SSH, streaming the same step/loss ticks P1 parses, so the progress you watch is real training progress (a step count is only trusted when it arrives with a loss reading — dataset-scan progress bars never do).
- Safetensors back. When the run finishes, the finished LoRA comes home and
lands in ComfyUI’s
models/loras/, catalogued with its trigger keyword and base model — identical to the local handoff. Load it in a Flux workflow with the trigger word in your prompt and it’s yours.
Cost and honesty
The honest notes, because rented GPUs come with real trade-offs:- You pay per GPU-hour while it trains. A smoke test is minutes; a real character run is an hour or two. Stop the pod when you’re done — an idle pod you forgot about still bills.
- The job registry is crash-safe, and recovery only ever triggers when the owner process is provably dead. A run keyed on its final save, not on intermediate checkpoints — checkpoints prove a run reached a step, not that it finished.
- Your dataset leaves your machine. It goes up to the pod over rsync/ssh. That’s inherent to renting someone else’s GPU; if that’s a dealbreaker for a given dataset, train it locally instead.
RunPod FLUX LoRA training setup
- Install comfyui-mcp and the
Panel. Set your
RUNPOD_API_KEYonce in the panel’s API-Keys card — the same key the RunPod connector already uses. - Make sure an
HF_TOKENwith FLUX.1-dev access is in the MCP server env (FLUX.1-dev is gated; the pod downloads it on the first run). - Ask: “train a character LoRA from these photos on a RunPod pod.” The agent
runs
train_doctoragainst the pod, bootstraps ai-toolkit if needed, walks you through dataset and trigger-word choices, rsyncs the dataset up, launches the run, and streams progress until your.safetensorsis sitting inmodels/loras/.