Rent a GPU, Run Image and Video AI

A learning guide · Version 3 · 23 October 2026

Rent a GPU. Run image and video AI. Keep your files safe.

A course for hobbyists who are comfortable in a terminal and new to AI. You will learn how models work, how to match their parts, how to split work between a permanent controller and a disposable GPU, and how to shut it all down cleanly.

This guide takes you from zero to a reproducible image and a short video clip, generated on a GPU you rent, with your files kept safe and the rental shut down cleanly. It assumes you are comfortable in a terminal and with SSH, and that you know nothing about machine learning.

It has two tiers. The core path is everything outside the boxes marked Deep dive; read it in order and you can complete every lab. Deep dives are optional sidebars for readers who want the mechanism, the math, or the edge cases. Skipping them costs you nothing in the labs.

Part Sections Question it answers
1. Understand 3 to 7 What is the whole system, and how does text become a picture?
2. Choose and match 8 to 11 Which open models, adapters, and formats can I combine, and what fits in memory?
3. Operate 12 to 15 How do I split work between a permanent controller and a disposable GPU, and run a first workflow?
4. Extend 16 How do I add short video?
5. Protect and finish 17 to 19 What is encrypted, where, how do I shut down, what does it cost, and what breaks?

Three conventions repeat throughout. Lab blocks end with a pass test, so you know when you are done. Misconception lines name one common wrong belief and correct it. Deep dive blocks are skippable.

Two more conventions run through the whole guide. Real examples name actual products, files, and providers wherever a technical term appears, so each idea has something concrete attached. Callbacks appear in brackets and remind you of a part's first job, such as (outbound role: words to numbers), whenever it returns later in the story. Section 3 explains the round trip that makes callbacks possible. An appendix at the end compares connection options and lists other setups.

The facts in this guide about drivers, model releases, licenses, and provider billing were checked on 23 October 2026 against the sources listed in section 19. Where a source is a community page or a tracker, the text says so. They change fast. Pin the versions you install, and treat any model name here as an example of a category, not a recommendation that will stay current. No live deployment was run to write this guide; your first lab is the real test.

Part 1

Understand

What the whole system is, and how text becomes a picture.

3The whole system on one page

A generative image system is four parts that cooperate: an operator who writes the job, a controller that keeps permanent state, a rented GPU worker that does the computing, and a model that turns text into pixels. Only the controller needs to survive between sessions.

"Local" here means you run inference on a machine you operate instead of calling a hosted model API. That machine can be your own PC or a GPU rented by the hour. A rented host's administrator can still reach your data while it is processed, so running your own software does not by itself give privacy from the host. Section 17 returns to this.

The cast, with real examples

Role What it is Real examples
Operator You, plus the interface you submit jobs from ComfyUI's browser interface on port 8188, or a Python script calling ComfyUI's API
Controller A small, always-on machine holding the cache, ledger, and archive A home server or NAS, a single-board computer, a small rented VPS, or simply your own laptop
Connection The private path between controller and worker An SSH tunnel, Tailscale (built on WireGuard), or plain WireGuard
GPU worker The rented machine that does the computing An RTX 4090 (24 GB), RTX 5090 (32 GB), RTX 6000 Ada (48 GB), H100 (80 GB), or RTX PRO 6000 Blackwell (96 GB), rented from Vast.ai, RunPod, or Lambda
Model The learned parts that turn text into pixels Chroma1-HD (8.9B parameters, Apache 2.0), Qwen-Image 2.1 (7B), Wan 2.2 14B for video

Products named in this guide illustrate each category. They are examples, not endorsements or a complete list.

prompt, seed,size, settingsOperatorController, always onApproved model cacheChroma1-HD, T5-XXL, VAEJob ledgerqueued, running, doneEncrypted archivePNG, MP4, LoRA filesGPU worker, disposableComfyUI workflowComfyUI on port 8188Model and adapterloaded onto an RTX 4090Outputs, temporarycopied back, then erasedsubmitweights + joboutputsSolid border: persists between sessions. Dashed border: destroyed at teardown.
Figure: system overview, 3 actors and 2 persistence zones

The operator submits a job. The controller checks it, stages approved weights, and sends both to the worker. The worker computes and returns outputs. The controller verifies and archives them before the worker is destroyed.

The round trip: every part that goes out has a partner on the way back

A job is a round trip, and the second half mirrors the first. The same pairs of ideas appear on the way out and on the way back. Keeping the pairing in mind makes every later section easier, because a part's job on the return leg is almost always the reverse of its job on the outbound leg.

Forward journey: words and weights go inReturn journey: results come back, read right to left1 Send jobweights checked2 Encode wordstokenizer, encoder3 Encode imageVAE encoder, if used4 Denoise loopstarts as noise5 Loop endslatent is clean6 Decode imageVAE decoder7 Review resultcompare with prompt8 Bring backdigests checkedDashed lines join mirror pairs. Tinted boxes are the two translators: words in, pixels out.
Figure: round trip, 8 moves with 4 mirror pairs

1. Send the job. The controller validates the job and stages approved weights on the worker. It checks each file's digest, for example with sha256sum, against the value recorded when you approved the file.

2. Encode the words. The tokenizer and text encoder turn your prompt into numbers. For Chroma1-HD that encoder is T5-XXL, for Qwen-Image 2.1 it is Qwen3-VL-8B, and for Wan 2.2 it is umt5-xxl.

3. Encode an image, if you brought one. In image editing or image-to-video, the VAE's encoder squeezes your input picture into a latent. Plain text-to-image skips this move.

4. Denoise. The denoiser starts from seeded noise and refines it, steered by the numbers from move 2. This is the expensive stage, and it is where a GPU's memory type and capacity matter (sections 4 and 11).

5. The loop ends. The final update leaves a clean latent. Still no picture exists.

6. Decode. The VAE's decoder, the partner of the encoder in move 3, turns the latent into pixels. In ComfyUI the same VAE file feeds both the VAEEncode and VAEDecode nodes, so the file used going in must be the file used coming out: ae.safetensors from FLUX for Chroma1-HD, the Qwen-Image 2.1 VAE for that model, a Wan VAE for Wan.

7. Review. You compare the image with your original words, the human counterpart of move 2. In Qwen-Image 2.1 editing, community encoder cards say the Qwen3-VL-8B encoder keeps its vision tower because version 2.1 needs it for editing, so that one model can appear on both sides of the journey.

8. Bring it back. A save node writes a PNG or MP4 on the worker. The controller copies it back through the same private connection that carried the job, then verifies its digest the way the weights were verified in move 1. Only then is it archived, and only after that is the worker destroyed.

Outbound role Return partner Real example
Tokenizer and text encoder turn words into numbers You read the result against the words T5-XXL, Qwen3-VL-8B, umt5-xxl
VAE encoder compresses an input image into a latent VAE decoder expands the final latent into pixels ae.safetensors (FLUX and Chroma), sdxl-vae-fp16-fix (SDXL), wan_2.1_vae (Wan 2.1)
Weights verified by digest on the way out Outputs verified by digest on the way back sha256sum -c
Private connection carries the job The same connection carries the files SSH tunnel, Tailscale, WireGuard
Ledger moves from queued to running Ledger moves from archiving to completed A plain text or CSV log
GPU rented and prepared GPU destroyed and confirmed gone A Vast.ai, RunPod, or Lambda console

Where each handoff usually fails

Handoff Typical failure Covered in
Send A corrupt or wrong weight file; digest mismatch Sections 10 and 14
Encode words Wrong encoder, quietly weaker prompt adherence Section 10
Denoise Out of GPU memory Section 11
Decode Mismatched VAE, odd colors, or a memory spike at decode Sections 10 and 11
Bring back Archive not mounted, or a file never copied Section 17

Start with one measurable goal. Produce a reproducible image of a ceramic teapot. Before touching hardware, write down four things: what an acceptable image looks like, the longest time you will wait, a cost ceiling, and what data you permit to leave your machine. Keep one official workflow working before you add adapters, editing, or video.

How to read the rest of this guide. Every later section is one stop on this round trip. When a part comes back into the story, a bracket reminds you of its first job, written like this: (outbound role: what it did on the way out). Real product names, such as GPUs, memory types, VAEs, and providers, appear at each technical mention so that every idea has something concrete attached to it.

4The layers, from silicon to saved file

Seven layers sit between your prompt and a saved image, and many first-time failures come from the lower layers, not from the model.

LayerWhat it doesHow it typically failsWorkflowthe graph: which steps, in what ordera node is not wired, so nothing savesApplicationComfyUI loads parts and runs the grapha custom node is missing or brokenModel filesdenoiser, text encoder, VAE, adaptermismatched files give noise or errorsFrameworkPyTorch and the Python packagesthe CUDA build does not match the driverDriver + CUDAlets software talk to the GPUthe driver is too old for the frameworkGPUdoes the math; VRAM holds the modelout of memory during samplingRented hostdisk, network, billing, other tenantsslow downloads; a stopped disk still billsYou choose and editYou install and must matchThe provider owns
Figure: layer stack, 7 layers with typical failure
Layer Real examples
Workflow The official ComfyUI templates for Chroma1-HD, Qwen-Image 2.1 (text to image and image edit), and Wan 2.2 image to video
Application ComfyUI; Hugging Face Diffusers (for example ChromaPipeline); LightX2V, an inference framework for Wan 2.2 speed-up models
Model files Chroma1-HD with T5-XXL and the FLUX VAE; Qwen-Image 2.1 with Qwen3-VL-8B and its own VAE; Wan 2.2 with umt5-xxl
Framework PyTorch, with the Hugging Face diffusers and transformers libraries
Driver and CUDA NVIDIA driver 580 or newer for CUDA 13.x; 525 or newer, below 580, for CUDA 12.x
GPU RTX 4090, RTX 5090, RTX 6000 Ada, H100, RTX PRO 6000 Blackwell
Rented host Vast.ai (a marketplace of independent hosts), RunPod (Secure Cloud in data center facilities, plus a Community tier), Lambda (its own data centers)

What the GPU layer is made of. The number that decides what fits is VRAM capacity. The memory type decides how fast the denoiser can read its weights at every step. Consumer and workstation cards use GDDR chips placed around the GPU. Data center cards such as the H100 use HBM, stacks of memory dies on the same package. HotHardware notes that HBM costs more than GDDR, which is why it stayed in data center cards, where AI work depends on memory bandwidth.

GPU VRAM Memory type Bus and bandwidth Chip maker, only where a source confirms it
RTX 4090 24 GB GDDR6X 384-bit, about 1 TB/s Micron. NVIDIA and Micron announced Micron's second-generation 16 Gb GDDR6X for this card
RTX 5090 32 GB GDDR7 512-bit, about 1.8 TB/s Samsung, according to leaks and trade reports; I found no official NVIDIA confirmation
RTX 6000 Ada 48 GB GDDR6 with ECC 384-bit, 960 GB/s Not confirmed in the sources I checked
RTX PRO 6000 Blackwell 96 GB GDDR7 Not sourced here Not confirmed in the sources I checked
H100 80 GB HBM3 5120-bit SK hynix, which announced it would supply HBM3 for the H100; its stated peak is 819 GB/s per HBM3 stack

Chip makers can change between production runs and board partners, so treat the chip column as the supplier reported at launch, not a guarantee about the card you rent. Marketplace hosts such as Vast.ai rent cards from many board makers.

Debug from the bottom up. Confirm in this order: the GPU is visible (nvidia-smi), the framework can use it (torch.cuda.is_available() returns true), the model files load, the workflow runs, and an output file is saved. The first failing check is your problem; nothing above it can be trusted yet.

Deep dive driver and CUDA compatibility

The CUDA driver and the CUDA toolkit are separate installs. NVIDIA documents that a CUDA 13.x toolkit needs driver 580 or newer for minor-version compatibility, and CUDA 12.x needs 525 or newer, below 580. This lets a newer toolkit run on an older driver within the same major family, with limits: a reduced feature set, and newer compiled instructions (PTX) that an older driver cannot translate. Pick a framework build that matches your host driver, then run a real GPU calculation rather than trusting a version string. Details are in the sources at the end.

5Model anatomy: five parts that must match

A diffusion model is a bundle of five cooperating parts, and each part can only be swapped for one built for the same model family. A file named "VAE" or "CLIP" is not interchangeable just because of its label.

Part Job Real example Common wrong belief
Tokenizer Splits text into model-specific tokens, often word fragments, and maps them to integers The tokenizer ships with its text encoder; for Chroma1-HD that is T5-XXL's All models understand the same prompt syntax
Text encoder Turns tokens into contextual vectors called embeddings Chroma1-HD: T5-XXL only. Qwen-Image 2.1: Qwen3-VL-8B Any file labelled CLIP will work
Denoiser Predicts how to update a noisy latent, given the noise level and the text features Chroma1-HD: 8.9B FLUX-derived transformer. Qwen-Image 2.1: 7B transformer. Wan 2.2 14B: two experts Every denoiser is a UNet
Scheduler and solver Choose the noise levels and calculate each next latent Set per family in the official template Sampling settings transfer freely between families
VAE Compresses pixels into a compact latent and decodes the final latent back to pixels Chroma uses the FLUX VAE. Qwen-Image 2.1 ships its own Identically named VAE files are interchangeable

The first two parts run once per prompt. The denoiser and solver run at every sampling step, which is why they dominate run time. Memory is a separate question, because the text encoder can be the largest single file (section 11). The VAE decodes once at the end.

Text encoders in common model families. The text encoder is the part most often mismatched, so name it for every model you use.

Model family Text encoder
SDXL Two fixed encoders: CLIP ViT-L and OpenCLIP ViT-bigG
FLUX.1 T5-XXL plus CLIP-L
Chroma1-HD T5-XXL only
Qwen-Image 2.1 Qwen3-VL-8B
Wan 2.2 umt5-xxl

VAEs you will meet by name. The VAE is a matched encoder and decoder pair, shipped as one file. Use the file your model's official template names.

VAE file Used with Notes
vae-ft-mse-840000-ema-pruned Stable Diffusion 1.x A fine-tuned decoder; about 335 MB
sdxl_vae (stabilityai) SDXL Can produce NaN (not-a-number) values when decoded in fp16
sdxl-vae-fp16-fix (madebyollin, MIT license) SDXL The same VAE fine-tuned to decode in fp16 without NaNs
ae.safetensors FLUX.1 and Chroma1-HD Published in the FLUX.1-schnell repository; about 320 MB
Wan2.2-VAE Wan 2.2 5B High-compression design from the Wan team, 4x16x16
wan_2.1_vae Wan video models Wan 2.1 VAE file; check the template for your Wan variant
qwen_image_vae Qwen-Image, earlier release Seen in a ComfyUI workflow file; Qwen-Image 2.1 uses its own file
qwen_image_2.1_vae_bf16 Qwen-Image 2.1 Ships in the Comfy-Org repack

Solvers and schedules you will meet by name: Sampler names such as euler, euler ancestral ("Euler a"), and DPM++ 2M appear beside schedule names such as simple, sgm_uniform, and Karras. A published FLUX workflow uses euler with simple, and a Hyper-SD workflow uses ddim with sgm_uniform. Which pairing works depends on the model family, so start from the official template.

Three terms are often mixed up, and mixing them makes failures hard to describe:

Term What it is Example
Diffusion A family of generative methods that build output by repeatedly removing noise The general idea. Newer models such as Stable Diffusion 3 train with rectified flow, a close relative that runs the same refine-and-repeat loop
Diffusers A Python library that implements many pipelines Hugging Face's ChromaPipeline
ComfyUI A node-based application that loads parts and runs graphs The interface you will use in the labs

A checkpoint stores learned numbers. A wrapper such as ComfyUI or Diffusers supplies the code that runs them. When something fails, say which layer you mean.

Deep dive prompt enhancers

Some templates add an optional second text model that rewrites your prompt before encoding. Qwen-Image 2.1's ComfyUI repack lists enhancer models for text-to-image and image-to-image, used through a separate text-generation node. The enhancer is a separate stage and does not replace the base text encoder. Treat it as optional and test with and without it.

6How an image is made, and how it becomes a file

An image is built by starting from random noise in a compressed space and refining it many times, guided by your text, then decoding the result into pixels. The numbers below match the diagram.

Once per promptRepeats at every sampling stepOnce, at the end1 Promptyour text2 Tokenizertext to token IDs3 Text encodertokens to vectors4 Conditioningguides every step5 Seed + shaperandom start6 Noisy latentcompressed noise7 Denoiserpredicts the update8 Solvernext latent9 VAE decoderlatent to pixels10 Pixelsa decoded image11 Save + reviewfile plus settingstext featuresrepeat until the last stepafter the final step
Figure: generation pipeline, 11 steps with one loop
  1. Prompt. You supply text, a seed, dimensions, and sampling settings. An optional enhancer may rewrite the text first.
  2. Tokenizer. Text becomes token IDs, often word fragments, drawn from that model's vocabulary.
  3. Text encoder. Token IDs become contextual vectors. In context, "blue" can attach to "teapot" instead of standing alone.
  4. Conditioning. The vectors, plus any masks the model needs, are packaged as conditioning. They are usually encoded once and reused at every step.
  5. Seed and shape. The seed starts a pseudo-random generator that fills a latent of the right size with noise. Same seed, same settings, same environment gives the same start.
  6. Noisy latent. A latent is a compact numerical stand-in for the image, not the pixels themselves.
  7. Denoiser. At each step it receives the current latent, the noise level, and the conditioning, then predicts the update its training taught it. Attention layers let regions of the latent draw on relevant words, so an emerging teapot can use the features for "blue". Adherence is likely, not guaranteed. When guidance is on, it makes a second prediction without the prompt or with a negative prompt, and the update blends the two.
  8. Solver. It turns the prediction and the scheduled step size into the next latent. Steps 6 to 8 repeat.
  9. VAE decoder. After the last update, the matching VAE turns the latent into pixels.
  10. Pixels. The decoded image exists only in memory until something saves it.
  11. Save and review. A save node writes the file. You then check it against your acceptance rule, and the controller copies it off the worker and verifies it. In ComfyUI, SaveImage is an output node that writes to the output directory and PreviewImage only shows temporary previews, so the graph needs an output node you have actually connected.

The same journey, three real models.

Step Chroma1-HD Qwen-Image 2.1 Wan 2.2 14B image to video
2 to 3. Text encoder (outbound role: words to numbers) T5-XXL Qwen3-VL-8B umt5-xxl
7. Denoiser 8.9B FLUX-derived transformer 7B transformer Two 14B-class experts, high noise then low noise
9. VAE decoder (return partner of the encoder in move 3) FLUX ae.safetensors qwen_image_2.1_vae_bf16 A Wan VAE
Typical step count 28, with guidance 4.0, in one community bundle's example About 40 by default in community listings; one note says 20 to 30 works 4 with the LightX2V speed-up LoRAs; the higher-quality tutorial workflow runs without them
11. File out PNG PNG MP4

What changes what. Changing the prompt changes the conditioning; it never retrains the model. The seed changes only the starting noise. A LoRA adapter, covered in section 9, changes some of the model's learned weights. They are three different routes into the same process.

Deep dive why latents

Working in a latent is cheaper. For a teaching VAE that compresses each side by eight, a 1024 by 1024 image becomes a 128 by 128 latent grid: 16,384 positions instead of 1,048,576 pixels, which is 64 times fewer. The cost is that fine detail the latent never kept cannot be recovered by adding steps. Real compression factors and channel counts differ by model.

7UNet, DiT, and how video adds time

The denoiser comes in two main designs, and the design decides which weights, conditioning, and memory behavior you get. Do not infer it from a loader's name.

UNetcommon in earlier Stable Diffusion modelsDiT, diffusion transformerused by Chroma1-HD and Qwen-Image 2.1Down 1fine detailDown 2mid detailBottleneckmost contextUp 2mid rebuildUp 1fine rebuildskip linksUNets can also contain attention layers.Noisy latentcut into patchesTransformer blocksattention over tokensUpdatesame shape as inputText + timefeatures join hereMultimodal versions let image and texttokens attend to each other.
Figure: UNet vs DiT, two denoiser designs

A UNet gathers context by shrinking the latent, then rebuilds spatial detail by growing it again, with skip links carrying fine detail across. A DiT cuts the latent into patches and treats each patch as a token, the way a language model treats words, then runs transformer blocks over all of them. Multimodal DiTs let text tokens and image tokens interact directly.

Real cases. Chroma1-HD is an 8.9B-parameter model built on the FLUX.1-schnell transformer and licensed Apache 2.0. Its documented setup uses the T5-XXL text encoder and the FLUX VAE; do not add CLIP-L just because a related model uses it. Qwen-Image 2.1 is a 7B transformer conditioned by Qwen3-VL-8B.

Denoiser Design Size License
Chroma1-HD DiT, FLUX-derived 8.9B Apache 2.0
Qwen-Image 2.1 DiT 7B Qwen Research License
Wan 2.2 A14B DiT with two experts About 14B each (27B total, 14B active per step) Check the model card
SDXL UNet Check the model card Check the model card

SDXL uses a UNet of about 2.6B parameters. Stability AI describes Stable Diffusion 3 as a multimodal diffusion transformer (MMDiT). Chroma1-HD, Qwen-Image 2.1, and Wan 2.2 A14B are transformer designs, according to their model pages.

Video adds time. Video models add a time axis to the latent, so work grows with width, height, and frames together, and attention makes the growth steeper than linear. A still-image workflow that fits in memory proves nothing about video.

Wan 2.2 A14B illustrates a second twist. Its 14B workflows use two models, a high-noise expert for the early steps and a low-noise expert for the late steps, with a switch step you can set. The Wan team switches experts when the signal-to-noise ratio falls to half its starting minimum. These labels describe the sampling stage, not scene lighting. Community 4-step speed-up recipes exist for specific Wan 2.2 variants and load as extra LoRAs for both experts. Use a recipe only with the variant it documents; do not apply it to original weights on a guess.

Part 2

Choose and match

Which models, adapters and formats fit together, and what fits in memory.

8Open source: weights, licenses, and where files come from

"Open" in image AI means the trained weights are published so you can run them. It does not mean one blanket permission: every file carries its own license, and derivatives inherit the terms of what they came from.

Open base releaseweights, license, model cardRepack or quantizationsame model, new file formatGGUF, FP8, INT8 copies;Comfy-Org repacksFine-tune or retrainnew weights from oldChroma1-HD, built onFLUX.1-schnellAdapter (LoRA)small add-on filestyle or identity LoRAsfor one exact base modelA license travels with the file. Check the base, the adapter, and every component.
Figure: derivative tree, 3 kinds of derivative
Term Meaning Real example
Open weights The trained numbers are downloadable; the license may still limit use Qwen-Image 2.1, released 20 September 2026, uses the Qwen Research License. Reports of its LICENSE file say it allows use, copying, and derivative works for non-commercial research or evaluation only, and requires a separate commercial license for anything else. Read the file yourself before any commercial use
Permissive license Broad rights to use, modify, and build on Chroma1-HD is Apache 2.0
Hub A site hosting files with a model card describing source and license Hugging Face
Repack The same weights reorganized for one application Comfy-Org's Qwen-Image 2.1 files for ComfyUI
Quantization A copy stored at lower numeric precision GGUF or FP8 versions of Chroma1-HD

Two cautions come straight from real repositories. First, a repack can rename internal tensors. A community note on Qwen-Image 2.1 warns that quantizing from the original Hugging Face layout produces keys ComfyUI never finds, so the model loads "successfully" and emits noise. Second, licenses can differ between look-alike files. FLUX.1-schnell is Apache 2.0 and FLUX.1-dev carries a non-commercial license. The FLUX VAE file ae.safetensors is published in the FLUX.1-schnell repository, and one third-party bundle card lists a re-hosted FLUX VAE under the dev license beside an Apache 2.0 Chroma model. Confirm which repository your copy came from, and check every component, not just the headline model.

Where files come from

Source What it is Real example
Hugging Face Hub Hosts model repositories, each with a model card lodestones/Chroma1-HD, Qwen/Qwen-Image-2.1, Comfy-Org/Qwen-Image-2.1
Civitai A community site for checkpoints, adapters, and VAEs; quality and licensing vary Community LoRAs and checkpoints
GitHub Source code for applications and trainers ComfyUI, LightX2V, DiffSynth-Studio
Provider template libraries Prebuilt environments you launch on a rented GPU Vast.ai templates, RunPod Hub

Licenses you will meet by name

License Typical meaning Example
Apache 2.0 Broad use, modification, and redistribution Chroma1-HD, and FLUX.1-schnell which it builds on
MIT Very permissive sdxl-vae-fp16-fix
Qwen Research License Research and evaluation; derivatives non-commercial, per reports of the LICENSE file and community cards Qwen-Image 2.1
Non-commercial licenses No commercial use FLUX.1-dev, under the FLUX.1 [dev] Non-Commercial License

Before you download anything, answer four questions:

  • Which base model is this derived from, and is that the base my workflow uses?
  • What does each license allow for the files and for the images they produce?
  • Which exact revision is it, and does a trusted digest exist to verify the download?
  • Who published it, and is this the official repository or a copy?

9Adapters and training your own LoRA

A LoRA is a small add-on file that nudges a frozen base model. It is the practical way a hobbyist teaches an open model a style, a character, or a product without retraining the whole network.

Inputlayer inputBase weights Wfrozen, never edited during trainingMatrix Anarrow, trainedMatrix Bwidens, trained+Outputnext layerscale sThe inner size of A and B, the rank r, is small, so they hold far fewer numbers than W.Tinted boxes are trained. Everything else stays fixed.
Figure: LoRA structure, frozen base plus low-rank path
FormulaW_{\text{new}} = W + s\,B\,A

The base weights W never change. A and B are two small matrices whose shared inner size, the rank, is low, and s is a scale set at load time or in training. Fewer trainable numbers mean less optimizer memory, but the base network's computation and activations still need a capable GPU.

How an adapter relates to the open base. It only works with the architecture it was trained for, on the modules it targets, through a loader that supports it. It also inherits the base license: a community adapter for Qwen-Image 2.1 states plainly that it carries the base model's non-commercial restriction, and that its outputs do too.

Two real adapters, side by side.

Adapter What it does Facts from its page
LightX2V 4-step LoRAs for Wan 2.2, such as wan2.2_i2v_A14b_high_noise_lora_rank64_lightx2v_4step_1022 Cuts sampling to 4 steps Rank 64; one file for the high-noise expert and one for the low-noise expert
"Deckbuilder Card Art Style" LoRA for Qwen-Image 2.1 Teaches a flat, vector-like card-art style Rank 32, alpha 32, 598 training images, captions written by Qwen3-VL-8B-Instruct, trained on Kaggle with two T4 GPUs using DiffSynth-Studio; non-commercial

Notice the second row. Qwen3-VL-8B encoded prompts on the outbound journey in section 3. Here the same model family does a third job as a captioner, describing training images so the adapter learns to bind its style to a trigger phrase. Trainers you will meet include AI Toolkit and DiffSynth-Studio.

You change It alters Where it acts
Prompt The conditioning Before sampling
Seed The starting noise Before sampling
LoRA Selected learned weights Inside the denoiser
Denoise value (image-to-image) How much of an input image is kept At the start of sampling

Whose likeness may you train on? Use a synthetic adult character, or an adult subject whose written permission covers training and distribution. Keep that evidence privately. Never embed real names or identifying metadata in an adapter you share.

  1. Choose a trainer example that explicitly supports your exact base model. Record the trainer revision and license, and use a separate environment from inference.
  2. Curate consistent images across views, poses, lighting, and settings. Remove duplicates and artifacts, and reserve held-out views and prompts.
  3. Write accurate captions for what varies. Use a nonpersonal trigger word. Inspect the real training crops.
  4. Run a short trial: loss stays finite, an adapter file is saved, and a sample image generates.
  5. Train with periodic checkpoints, a bounded duration, and local logging only.
  6. Compare each checkpoint with base-only output on fixed held-out prompts and seeds. Choose for identity, controllability, and low memorization, not by loss alone.
  7. Reload the chosen adapter in a fresh environment, then archive it before the GPU is destroyed.
Setting How to decide
Rank and alpha Start from a supported example; test capacity and scaling
Learning rate Use a conservative baseline for that model family
Steps Evaluate checkpoints; do not trust loss alone
Batch and accumulation Record the effective batch and image presentations
Resolution buckets Inspect cropping and memory cost
Target modules Match the architecture and the inference loader

For scale: 32 images, batch size one, no accumulation, and 1,600 optimizer steps show each image about 50 times. Repeats and distributed training change that figure, so no universal step count exists.

If identity drifts, check in this order: adapter loaded without warnings, correct base, conditioning, strength. Then inspect the dataset. An outfit that keeps appearing signals confounding in the data. Repeated training frames signal memorization. Try an earlier checkpoint before retraining everything, and review results with human eyes, since similarity scores need calibration.

Trainer configuration formats change often. Adapt the example shipped with the revision you select instead of copying a configuration from a blog post.

10Compatibility: build a bill of materials first

Write a bill of materials before you download a single file. File names are clues, not proof of compatibility. For every item record the model family, task, exact revision, precision, loader, license, and a trusted digest. Include the application and any custom-node revisions.

Item Must agree with Worked example: Chroma1-HD Worked example: Qwen-Image 2.1
Denoiser Architecture, release, task Chroma1-HD checkpoint, placed in the diffusion models folder qwen_image_2.1_bf16 or the INT8 variant in the Comfy-Org repack
Text encoder Tokenizer, encoder variant T5-XXL only Qwen3-VL-8B (bf16, INT8, or W4A8 files)
VAE Latent channels, compression, scaling FLUX VAE Qwen-Image 2.1 VAE
Adapter Base architecture, target modules, loader None in the baseline None in the baseline
Sampling Scheduler, solver, guidance, shapes The official template's defaults The official template's defaults
Application Model support Native in current ComfyUI Needs a ComfyUI build that includes Qwen-Image 2.1 support
License What you plan to do Apache 2.0 for the model; check the VAE Research license; read it

The model details come from the Hugging Face model cards and repacks listed in the sources. Sampling recipes differ: one community note says the non-distilled Qwen-Image 2.1 looks good at roughly 20 to 30 steps and soft at few-step settings. Treat such notes as hints and follow the official template first.

How wrong parts fail. A wrong text encoder may fail on dimension errors or quietly weaken prompt adherence. A wrong VAE may fail outright or distort colors. An adapter may load only partly. Always read load warnings, and test against a known-good baseline before blaming the model.

Mismatches reported in the wild

  • Adding CLIP-L to Chroma1-HD, which documents T5-XXL only.
  • Decoding SDXL in fp16 with the original sdxl_vae, which can produce NaNs; sdxl-vae-fp16-fix exists for this.
  • Quantizing the Qwen-Image 2.1 text encoder from its original Hugging Face layout; ComfyUI never finds the renamed keys and the model loads yet outputs noise.
  • Running a ComfyUI build older than Qwen-Image 2.1 support, which one community card says merged after 14 September 2026.

Encoders are not all alike. Text encoders, vision encoders, VAE encoders, and captioning models do different jobs. A conditioning repack is not automatically a conversational vision-language model; captioning generally needs an instruction model, a processor, a tokenizer, and a compatible runtime.

11Formats, quantization, and the memory budget

Model weights need roughly 2 GB per billion parameters at 16-bit, half that at 8-bit, and a quarter at 4-bit. Everything the workflow keeps loaded at the same time must fit in GPU memory (VRAM), with room left for working memory.

Qwen-Image 2.1 (7B), 16-bit: 14.0 GB14.0 GB16-bitQwen-Image 2.1 (7B), 8-bit: 7.0 GB7.0 GB8-bitQwen-Image 2.1 (7B), 4-bit: 3.5 GB3.5 GB4-bitQwen-Image 2.1 (7B)Chroma1-HD (8.9B), 16-bit: 17.8 GB17.8 GB16-bitChroma1-HD (8.9B), 8-bit: 8.9 GB8.9 GB8-bitChroma1-HD (8.9B), 4-bit: 4.5 GB4.5 GB4-bitChroma1-HD (8.9B)14B-class model, 16-bit: 28.0 GB28.0 GB16-bit14B-class model, 8-bit: 14.0 GB14.0 GB8-bit14B-class model, 4-bit: 7.0 GB7.0 GB4-bit14B-class model24 GB GPU memoryWeight memory in GB = parameters × bits ÷ 8, before activations and other overhead
Figure: ideal weight payload, computed from parameter counts in the model cards
Formula\text{payload (GB)} = \frac{\text{parameters (billions)} \times \text{bits}}{8}

The formula tracks real files. Community listings report Qwen-Image 2.1's 7B denoiser at about 14.2 GB in bf16 and Chroma1-HD at about 17.8 GB, close to the 14 and 17.8 the formula gives. The surprise is the text encoder: Qwen3-VL-8B is reported at about 17.5 GB in bf16, larger than the denoiser it feeds. Budget the whole stack, not the headline model. Real allocations also add overhead, so treat the formula as a floor.

What fits where, using real file sizes. These are weights only, before activations, using the community-reported sizes above plus the T5-XXL fp16 file (about 9.1 GB) and the FLUX VAE (about 0.3 GB) that one Chroma bundle lists.

Stack, all resident at 16-bit Weights RTX 4090, 24 GB RTX 5090, 32 GB RTX 6000 Ada, 48 GB H100, 80 GB
Chroma1-HD: 17.8 GB denoiser, 9.1 GB T5-XXL, 0.3 GB VAE About 27.2 GB No Tight, little room for activations Yes Yes
Qwen-Image 2.1: 14.2 GB denoiser, 17.5 GB Qwen3-VL-8B, plus a VAE Over 31.8 GB No No Yes Yes

All-resident is the worst case. The text encoder runs once, so supported offload can park it in system RAM after it has produced the conditioning (its outbound role from section 3) and then load the denoiser. A 24 GB RTX 4090 can therefore still run both models, at the cost of transfer time, or by using the smaller files below.

Real quantized files.

Scheme Real file Size Notes
GGUF Q4_K_S Chroma1-HD-Q4_K_S.gguf 5.1 GB The 8.9B denoiser at about 4.6 bits per parameter
GGUF Q4_K_M Chroma1-HD Q4_K_M 5.17 GB A slightly larger 4-bit variant
FP8 scaled Wan 2.2 14B ..._fp8_scaled files Not listed A tutorial runs these on an RTX 4090
INT8 convrot qwen_image_2.1_int8_convrot and qwen3vl_8b_int8_convrot Encoder 8.71 GB In the Comfy-Org repack; the encoder size is from a community derivative
W4A8 qwen3vl_8b_w4a8 5.88 GB The smallest CUDA build of that encoder, per a community card
NVFP4 Qwen3-VL-8B NVFP4 5.87 GB Built for Blackwell cards such as the RTX 5090, which have native FP4 tensor cores
GGUF Q4_K_M with mmproj Qwen3-VL-8B GGUF 4.68 GB Loaded through ComfyUI-GGUF nodes

Four separate layers hide behind the word "format": the container (how tensors are stored), the numeric representation (the precision), the quantization scheme (how values are compressed), and runtime support (whether your software can use it). A file can be fine in the first three and still fail the fourth.

Choice Benefit Constraint
Safetensors Stores tensors without arbitrary object loading, so it is safer to open Says nothing about model quality, license, or the safety of adjacent code
GGUF One file with metadata and many precisions, supported by some diffusion loaders The loader must support that architecture and quantization type; it does not guarantee speed
BF16 or FP16 The familiar baseline Same storage; different numeric range
FP8 or INT8 Smaller weights Kernel support and quality vary by GPU and model
4-bit schemes Smallest weight payload Conversion and runtime overhead; accuracy needs checking
CPU offload Less GPU-resident state More system RAM and transfer delay
Tiled VAE decode Lowers the decode memory peak Needs a supported implementation; inspect for seams

Order of attack when memory is short:

  1. Start with the official supported precision.
  2. Reduce batch size and image size.
  3. Unload unrelated models.
  4. Use supported offload.
  5. Only then consider a quantized variant, and compare it with the original on the same fixed prompts and seeds, measuring quality, time, and peak memory.
  6. Avoid converting already-quantized weights again. Record the original revision and every conversion step.
Part 3

Operate

A permanent controller, a disposable GPU, and your first private workflow.

12The two-state control plane

Split every session into two states: a persistent state you protect, and a disposable state you can recreate. The rule that makes this work is that nothing only the worker holds is allowed to matter.

Controllerpersistent statealways on: cache, job ledger, encrypted archiveGPU workerdisposable stateexists only during a session1 stage weights2 return outputs3 verify, destroyrent and preparegeneratedestroyedtime, not to scale
Figure: two-state control plane, controller vs worker over time

In this guide the persistent state lives on a controller, which can be a small always-on server, a home machine, or your laptop. It is cheap, and it should stay up between sessions. The disposable state lives on a rented GPU worker that exists for one session and is destroyed afterward. The GPU is the expensive part, so you want it alive only while it earns its keep.

Real controller options.

Option Good for Watch for
Your laptop or desktop Starting out at no extra cost It sleeps, travels, and is also your daily machine
A home server, a NAS, or a single-board computer Always on, with the archive under your own roof Your home upload speed, and an off-site backup
A small rented VPS Always on and independent of your home connection A monthly bill, and a rented disk that you should encrypt

The job ledger can be as plain as a text or CSV log with one line per job and its state.

Persistent state (controller) Disposable state (GPU worker)
Holds Approved weight cache, job ledger, encrypted archive, adapters and checkpoints, manifests The environment, the running application, temporary copies, outputs not yet returned
Lifetime The whole project One session
If lost Days of work, or a re-download of large files Rebuild from the manifest; anything not yet copied back is gone
Protect by Backups and an encrypted archive Never trusting it with the only copy

The job ledger is how the controller tracks work, so a crashed session is never a mystery.

State Meaning Moves on when
Queued Job validated and waiting Weights and workflow are staged on the worker
Running The worker is generating An output file exists
Reviewing You check results against your acceptance rule Each output is accepted or rejected
Archiving The controller copies outputs back Sizes and digests match on the archive
Completed or failed Archive verified; worker destroyed The provider confirms the worker is gone

Operating rules. Give every job an identifier and a deadline. Retry a bounded number of times. After a timeout, inspect the queue before resubmitting, because the first attempt may still be running. If you expose this as a service, accept validated inputs for a fixed list of workflows, never arbitrary graphs from the public.

13The GPU lifecycle: spin up, work, spin down

A rented GPU passes through four states, and only destroying it ends every charge. The states below follow Vast.ai's documentation; other providers use different words for the same ideas, so confirm them before you rely on this.

Loadingimage downloadsRunningyou work hereStoppedGPU detachedDestroyeddata erasedreadystopdestroydestroyrestart, a GPU may not be freeWhat you pay in each stateno charge yet(Vast docs)GPU + disk +bandwidthdisk only,still billednothing billed;data is goneHighlighted: the state people forget. States and billing shown follow Vast.ai documentation; check your provider.
Figure: rental states and billing, per Vast.ai documentation

Where to rent, and how each provider works.

Provider Model Billing Time to launch, as the provider states it Notes
Vast.ai A marketplace of independent hosts, with a Secure Cloud option on SOC 2 Type II environments Per second; on-demand, interruptible, or reserved; $5 minimum balance About 60 seconds Prices and reliability vary by host; a stopped instance's disk keeps billing
RunPod Pods in Secure Cloud data center facilities; a Community Cloud tier exists but RunPod stopped onboarding new hosts to it in February 2026 Per second, no egress fees About 30 seconds Container disk $0.10 per GB per month; volume $0.10 running and $0.20 idle; network volume $0.07 under 1 TB
Lambda Its own data centers; no spot tier Per minute, no egress fees Ready in minutes Single-GPU H100 PCIe and A10 offered; the A100 80 GB is sold only inside 8-GPU instances

Hyperscalers such as AWS, Google Cloud, and Azure are the usual contrast. A May 2026 tracker put AWS at about $6.88 and Azure's ND H100 v5 at about $12.29 per H100 per hour on demand, and they charge for egress.

Hourly rates seen in October 2026. RunPod's column is from its own page, updated 27 August 2026. Lambda's is from trackers citing its page. Vast.ai prices change by host and by hour, so its column is a range from trackers, which disagree with each other by two to three times. Treat every cell as a snapshot, and check the live page before you rent.

GPU VRAM Vast.ai RunPod Lambda
RTX 4090 24 GB About $0.14 (spot) to $0.72 $0.89 Not offered
RTX 5090 32 GB About $0.39 (spot) to $1.18 $1.19 Not offered
RTX 6000 Ada 48 GB Not sourced $0.99 Not offered
L40S 48 GB Not sourced $1.09 Not sourced
A100 80 GB Not sourced $1.79 $2.79 per GPU, 8-GPU instances only
H100 80 GB From $0.90 on Vast's own page; trackers show roughly $1.5 to $2.3 $2.89 PCIe, $3.99 SXM $3.29 PCIe, $3.99 to $4.29 SXM
RTX PRO 6000 Blackwell 96 GB Not sourced $2.49 Not sourced

Third-party numbers age fast. Earlier trackers listed an RTX 4090 at $0.34 on RunPod's Community Cloud and $0.69 on Secure Cloud. RunPod's own page now shows $0.89.

Which GPU for which job in this guide

Job A sensible starting GPU Why
Chroma1-HD at 16-bit RTX 5090 (tight) or RTX 6000 Ada (comfortable) About 27 GB of weights
Chroma1-HD or Qwen-Image 2.1 on a budget RTX 4090 with a 4-bit or 8-bit file, or offload Fits in 24 GB by shrinking or swapping
Qwen-Image 2.1 at 16-bit RTX 6000 Ada, 48 GB Over 31.8 GB before activations
Wan 2.2 14B video RTX 4090 with fp8 files One tutorial reports about 26 minutes per high-quality clip on a 4090
Style or identity LoRA on a 7B model A 24 GB card at minimum; 32 GB is more comfortable AI Toolkit's guide recommends 24 GB or more for Qwen-Image LoRA training and 32 GB for comfort; one public Qwen-Image 2.1 LoRA reports training on two T4 GPUs

Spin up

  1. Choose the offer. Match GPU memory to your budget from section 11, the driver to your framework from section 4, and disk to your total need. On Vast, container disk is fixed at creation and cannot be resized, so estimate generously. Marketplace prices vary by host, and interruptible offers are often over 50% cheaper but can be taken away.
  2. Create and load. The machine downloads your container image. With a cached image this takes about 30 seconds; with a large image on a slow host it can take hours. Check the host's network speed before you rent.
  3. Connect and verify. SSH in and run nvidia-smi. If the GPU, driver, or disk is not what you paid for, destroy the instance and rent another.
  4. Stage. Pull only the weights this session needs from the controller and verify their digests.

Work. Run jobs through the ledger from section 12. Copy outputs back as they finish instead of at the end.

Spin down, in this order

  1. Stop accepting new jobs.
  2. Let running jobs finish writing.
  3. Copy outputs, adapters, checkpoints, and manifests to the controller.
  4. Verify: compare file lists, sizes, and digests, and reopen representative files.
  5. Make any second backup you require.
  6. Remove transient data and revoke tokens and keys used on the worker.
  7. Destroy the instance.
  8. Confirm in the provider's console that it shows as destroyed and no storage is still billing.

Three traps, all from provider documentation

  • Stopped is not free. A stopped Vast instance keeps your data and keeps billing for its disk, often at a higher storage rate than while running. Only destroying ends it.
  • Running out of credit does not clean up. When the balance hits zero, Vast stops your instances but does not destroy them, and storage keeps billing, even at a negative balance. If no payment method is on file, instances and data are scheduled for deletion. Do not treat an empty balance as your shutdown plan.
  • You cannot count on a restart. A stopped instance that tries to restart can sit waiting for its GPU, because another renter may have taken it. Treat "stop and resume tomorrow" as unreliable and copy your data off.

Also, a closed SSH port does not prove the machine is destroyed. Look at the provider's authoritative state. Ordinary deletion gives no proof of physical erasure, which matters for sensitive data (section 17).

Idea Vast.ai term Ask your provider
GPU attached, billing fully Running What exactly bills while running?
GPU detached, data kept Inactive or stopped Does disk still bill? At what rate?
Waiting for a GPU to return Scheduling Is a restart guaranteed?
Everything removed Destroyed Can I see proof of the final state?
Storage that outlives an instance Volume, tied to one host Can it move between machines?

14Lab D: your first private workflow on a rented GPU

The goal is one official template that renders "a ceramic teapot on a plain studio table, soft side lighting", with the image, seed, workflow, component list, and runtime saved. You need a bill of materials from Lab B, approved weights on your controller, a funded provider account, and an SSH key pair. Commands are for Linux and Bash.

Your workstationbrowser at localhost:8188SSH tunnelGPU workerComfyUI, localhost onlyencrypted, key authenticationno listening portPublic internetConfirm with ss -ltnp that the app listens on localhost only.
Figure: private access to a rented GPU over an SSH tunnel

1. Rent and verify. Choose an offer that meets your memory, driver, and disk plan. Record the offer, driver version, and hourly price. SSH in and run nvidia-smi. If it does not match what you chose, destroy it and pick another.

2. Build the environment. Take the repository and a full commit hash from ComfyUI's official installation documentation; they are your inputs, not values this guide supplies.

mkdir -p ai-lab/{models,manifests,archive}
cd ai-lab
read -r -p 'Reviewed ComfyUI Git source: ' COMFY_SOURCE
read -r -p 'Reviewed full commit: ' COMFY_COMMIT
git clone "$COMFY_SOURCE" ComfyUI
cd ComfyUI
git checkout --detach "$COMFY_COMMIT"
python3 -m venv ../inference-env
source ../inference-env/bin/activate
python -m pip install --upgrade pip
# Install the officially supported GPU framework build here.
python -m pip install -r requirements.txt
python -m pip check
python -m pip freeze > ../manifests/packages.txt

Keep separate environments for inference, training, and any quality-check tools. Resolve package conflicts instead of deleting framework requirements to make an error go away.

3. Prove the GPU does real math. A version string is not proof.

import torch
assert torch.cuda.is_available()
print(torch.__version__, torch.version.cuda)
print(torch.cuda.get_device_capability())
x = torch.ones((256, 256), device='cuda')
y = x @ x
torch.cuda.synchronize()
assert y[0, 0].item() == 256

4. Place and verify the model files. Put only the files your template requires in its expected folders, pinned to the revisions in your bill of materials. Verify bytes against trusted digests with sha256sum -c. Download gated models on the controller where practical, and do not leave long-lived tokens on a disposable worker.

5. Start ComfyUI privately and tunnel to it. gpu-worker is an SSH alias you configure from your provider's connection details.

# On the GPU worker, inside the active inference environment:
python main.py --listen 127.0.0.1 --port 8188

# On your workstation, in a separate terminal:
ssh -N -L localhost:8188:localhost:8188 gpu-worker

Open http://localhost:8188 in your own browser. ComfyUI's documented default is to listen on 127.0.0.1 only, so the flag above makes the default explicit. Passing --listen with no address would open it to all interfaces. Treat custom nodes as executable software: review them and pin their revisions.

Choosing how to connect. The SSH tunnel above works anywhere. Two mesh-VPN options make repeat sessions easier.

Method How it works Good for Watch for
SSH tunnel Forwards a local port over an SSH connection with key authentication One-off sessions; nothing extra to install Reconnect after drops; one tunnel per port
Tailscale A mesh VPN built on WireGuard. A coordination server introduces your devices, and helps them connect across NATs and firewalls, directly when possible. Adds private addresses, MagicDNS names, access control lists, and Tailscale SSH Reaching a fresh worker by name each session, and joining controller, laptop, and worker in one private network Some container platforms provide no TUN device; Tailscale's userspace mode works there at lower performance. Use tagged, ephemeral auth keys, which are removed automatically when the node goes offline
WireGuard (plain) A fast, minimal VPN where you manage keys and endpoints yourself A fixed controller with a reachable UDP port You exchange public keys yourself and need at least one reachable UDP endpoint (51820 is the usual default); check which ports your rental exposes
Provider web portals A button or proxy URL from the provider's console; Vast.ai's Open button launches the web UI Quick tests Traffic passes through the provider, so protect the app with authentication

Tailscale's documentation covers auth keys, ephemeral nodes, tags, and installing through cloud-init, which is how a disposable worker joins and later disappears on its own. Tailscale's server setup guide gives the tailscale up flags used below, and its Azure App Service guide shows the userspace-networking and SOCKS5 flags used where no TUN device exists. A SaladCloud guide describes Tailscale on GPU containers.

# On the worker, using a tagged, ephemeral auth key you created in the admin console:
# Install Tailscale first, following its documentation for your operating system
tailscale up --auth-key="$TS_AUTHKEY" --ssh --hostname=gpu-worker

# If the container has no TUN device, run the daemon in userspace mode first:
#   tailscaled --tun=userspace-networking --socks5-server=localhost:1055 &

# On your workstation, once both are on the tailnet, reuse the same tunnel idea:
ssh -N -L localhost:8188:localhost:8188 gpu-worker

Keep ComfyUI bound to localhost and forward the port over the tailnet, rather than listening on the Tailscale address. In your access control list, allow only your controller and laptop to reach the worker tag on the ports you need, and expire the worker's key when the session ends.

6. Render the baseline. Load one official template, keep its default recipe, enter the teapot prompt, and run it. Save the image, seed, workflow file, component inventory, runtime, and environment record.

7. Prove it reloads. Reopen the saved image and reload the saved graph.

If downloads stall: the Hugging Face Hub now runs entirely on its Xet storage backend, and the old HF_HUB_ENABLE_HF_TRANSFER setting is deprecated. Disabling Xet with HF_HUB_DISABLE_XET=1 is a diagnostic, not a standard setup step; Hugging Face asks users who need it to file an issue.

Deep dive dev vs runtime images

If an extension must be compiled on the worker, use a development image that includes the compiler toolchain. Prebuilt, supported kernels often work in a smaller runtime image. Pick based on what your template actually needs.

15Read and debug the workflow graph

A workflow is a program, so debug it like one: start at the Save node and trace backward through decoded pixels, sampled latents, the modified model, the conditioning, and the starting latent. Nothing counts that is not on a path leading back from Save.

Wrong: the LoRA is loaded but bypassedModelLoRASamplerVAE decodeSavethe sampler gets the base model onlyRight: the model wire passes through the LoRAModelLoRASamplerVAE decodeSaveTrace backward from Save: every wire must lead to a model, an encoder, and a starting latent.
Figure: workflow wiring, wrong vs right LoRA placement

Change one variable at a time, and keep the official recipe as your control.

Control What it changes How to test it
Seed The starting noise Repeatability inside one recorded environment
Steps Refinement iterations Quality against time, across several fixed seeds
Guidance How strongly the text steers each update Adherence against artifacts, using that model's own convention
Denoise (image-to-image) How much of the input image is kept Preservation against change
LoRA strength How much the adapter alters the model Separate from denoise; test zero and nonzero

Strong guidance can introduce artifacts, and negative prompts only matter when the active conditioning path actually uses them.

Real node names and settings. In ComfyUI the parts from section 5 appear as nodes. CLIPLoader loads a text encoder (with the type set to qwen_image for Qwen3-VL-8B), UNETLoader loads a denoiser, KSampler runs the loop from section 6, VAELoader and VAEDecode perform the decode (the return partner of any encode move), LoraLoaderModelOnly applies an adapter, ModelSamplingSD3 sets the sampling shift, and SaveImage writes the file. Wan 2.2 community notes suggest a shift of 1 for still images. Real starting values from model pages: Chroma1-HD at 28 steps with guidance 4.0 in one bundle's example; Qwen-Image 2.1 around 20 to 40 steps, with guidance optional; Wan 2.2 at 4 steps when both LightX2V LoRAs are loaded. Treat these as starting points and change one at a time.

Two graph formats. A UI export holds layout and widget values. An API export holds executable nodes and named inputs. Prefer the application's supported API export for automation. Hand-converting one to the other breaks on node identifiers, widget order, dropdown values, and UI-only notes.

Talking to the server. The /object_info route describes every node's schema. Posting to /prompt returns either a queued job identifier or validation errors. Track completion through history or events, then inspect the saved output. Submission is not delivery. Use deadlines, bounded retries, and job identifiers, and after a timeout check the queue before you resubmit.

Part 4

Extend

Add a short video clip.

16Add short video

Generate video only from a still you have already accepted, and keep the first clip to one object and one modest motion, such as a slow turn with a fixed camera. Defects in the starting image become moving defects, and every extra frame multiplies the cost.

1 frames: 1x attention work, 1x tokens1×1 frame1× the tokens2 frames: 4x attention work, 2x tokens4×2 frames2× the tokens4 frames: 16x attention work, 4x tokens16×4 frames4× the tokens8 frames: 64x attention work, 8x tokens64×8 frames8× the tokens16 frames: 256x attention work, 16x tokens256×16 frames16× the tokensRelative work if every token attends to every other token. An illustration; real models differ.
Figure: illustrative scaling of full attention with frame count, computed

Use the exact official task and variant template. Wan 2.2's 14B image-to-video models use two experts and the umt5-xxl text encoder. The separate 5B model is a single dense model with a high-compression VAE, so do not mix files between them. Keep the supported dimensions, frame constraints, VAE, expert switch, and sampling recipe. As one real data point, a community tutorial reports about 26 minutes on an RTX 4090 for a higher-quality Wan 2.2 first-last-frame workflow that does not use the speed-up LoRAs. Plan your rental time on a figure like that, not on the fastest recipe.

A real Wan 2.2 14B image-to-video file list, from a community tutorial, shows what a bill of materials for video looks like:

File Role Folder
wan2.2_i2v_high_noise_14B_fp8_scaled.safetensors High-noise expert, the early sampling steps diffusion_models
wan2.2_i2v_low_noise_14B_fp8_scaled.safetensors Low-noise expert, the late steps diffusion_models
umt5_xxl_fp8_e4m3fn_scaled.safetensors Text encoder (outbound role: words to numbers) text_encoders
wan2.2_i2v_lightx2v_4steps_lora_v1_high_noise.safetensors 4-step speed-up for the high-noise expert loras
wan2.2_i2v_lightx2v_4steps_lora_v1_low_noise.safetensors 4-step speed-up for the low-noise expert loras
A Wan VAE Decodes frames (return partner of the image encode) vae

Tools around the clip: ffprobe and ffmpeg to inspect and convert files, and frame-interpolation models such as RIFE or FILM to add in-between frames; both are repackaged for ComfyUI. For automated quality checks, a local vision-language model such as Qwen3-VL-8B-Instruct can flag defects, with the limits described below. Its model family is also the text encoder behind Qwen-Image 2.1, so the family that read your prompt on the way out can review the result on the way back.

Frames, rate, and duration. Playback duration is frames divided by frame rate. For 81 frames at 16 frames per second, that is about 5.06 seconds of playback, or exactly 5 seconds from first frame to last, because 80 intervals divided by 16 is 5.

You change Duration Motion
More frames and a higher playback rate About the same Smoother
More frames, same playback rate Longer Existing action slows down
Interpolation between frames About the same Adds estimated in-between frames, may add warping or ghosting
A new meaningful action Longer Needs new motion content; interpolation cannot invent it

There is no universal 81-frame limit across every variant and engine. Use documented lengths or a supported continuation method, then inspect for drift at the seams.

ffprobe -v error -select_streams v:0 \
  -show_entries stream=width,height,avg_frame_rate,nb_frames \
  -show_entries format=duration -of json clip.mp4

Some containers omit the frame count; if so, count decoded frames. Check real file properties instead of assuming your requested settings were honored.

Five acceptance gates. Define the hard failures before you render.

  1. Technical completion: the file exists, decodes, and has the expected size and length.
  2. Visual structure: no melting shapes, flicker, or broken anatomy.
  3. Brief compliance: it does what you asked.
  4. Provenance and permissions: you hold the rights to every input and to what you publish.
  5. Operational completion: archived, verified, and the GPU destroyed.

Test several prompts on fixed seeds and keep permitted failures as evidence, not only winners. A local vision-language model can flag defects but can also miss or invent them, and without a reference it cannot confirm identity. Even with a reference, calibrate against human review. Keep its dependencies in their own environment and budget its memory.

Report accepted work, not raw speed. Track attempted and accepted counts, warm and cold run time, peak memory, and total cost. A workflow making 60 samples an hour at 30% acceptance yields 18 accepted per hour; one making 36 an hour at 75% yields 27.

Part 5

Protect and finish

Security, cost, troubleshooting and sources.

17Security: what is protected, where, and when

Three protections cover three situations. A tunnel protects data in motion, encrypted storage protects data at rest, and neither protects data being processed on a machine whose administrator you do not control.

Controller diskProtected byencrypted volume, kept lockedNot protected frommalware while it is unlockedNetwork pathProtected bySSH tunnel, key loginNot protected fromwhat either end can readRented worker in useProtected byprovider trust and policyNot protected fromthe host administratorData is plaintext while a job runs, so a locked disk and a tunnel do not hide it.Choose hardware and provider trust before you upload anything sensitive.
Figure: protection zones, at rest, in transit, in use

Access. Use key authentication and a dedicated controller account with narrow permissions. Before you change a firewall or SSH setting, open a second session so a mistake cannot lock you out. If you use a mesh VPN, it still needs least-privilege access rules, and retired devices should be removed from it.

How much to trust the host. Match the hardware to the sensitivity of your data before you rent.

Tier Real examples What to know
Your own hardware Your PC or a home server You control it end to end
Vetted data center RunPod Secure Cloud, Lambda Data center facilities run by the provider or its partners. RunPod's data center partners cite SOC 2, HIPAA, and ISO 27001 compliance
Marketplace host Vast.ai standard hosts; RunPod Community Cloud Independent hosts of varying quality. RunPod says Community Cloud hosts generally cannot meet certifications such as HIPAA or SOC, and one review site advises against sensitive data on that tier
Marketplace with isolation Vast.ai Secure Cloud Vast describes SOC 2 Type II environments with isolated instances and optional private VPN access

Key-based SSH login is the baseline for access. ssh-keygen creates a key pair; see your OpenSSH manual for key types. On a mesh VPN, Tailscale's access control lists restrict which devices may reach which ports (its role on the outbound journey was carrying the job, in section 14; on the return journey it carries your files back).

Credentials. Prefer gated downloads on the controller, or short-lived credentials on the worker. Interactive login may still save a token to disk; for the Hugging Face Hub the default location is under the Hugging Face home folder, so know where it is and who can read it. Keep credentials out of logs, prompts, screenshots, public manifests, and diagnostics. If one leaks, revoke it. Deleting the text does not un-leak it.

The encrypted archive. An archive must actually be mounted before you write to it. A directory can exist over an unmounted volume, and copying into it silently puts plaintext on the underlying disk. Check the mount source, capacity, and permissions first:

mountpoint -q ~/ai-lab/archive || { echo 'archive not mounted'; exit 1; }
findmnt --target ~/ai-lab/archive

Setting up encryption involves destructive storage operations. Follow the documented procedure for your tool, on a verified target, with a backup in hand.

LUKS through cryptsetup on Linux is the tool this guide assumes. The cryptsetup manual also lists limited support for opening VeraCrypt, TrueCrypt, and BitLocker volumes, which helps if an archive was created elsewhere.

Delivery: copy, then verify, then delete. Pull only the files the session needs. Bring outputs, adapters, required checkpoints, and manifests into a staging folder on the verified archive. Stop writes. Compare relative file lists, sizes, and cryptographic digests, and reopen representative files. Make a second copy where you require one. Only then remove worker copies, scoped to that one job.

# On the worker, after writes have stopped:
(cd outputs && find . -type f -print0 | sort -z | xargs -0 sha256sum) > outputs.sha256

# On the controller, after copying outputs/ and outputs.sha256 into staging:
cd ~/ai-lab/archive/job-001/outputs && sha256sum -c ../outputs.sha256

Retirement. In cloud storage the physical media is abstracted away from you, which is why NIST revised its media sanitization guidance (SP 800-88 Rev. 2, September 2025) to cover cloud and virtual storage. Ordinary deletion therefore gives you no proof of physical erasure. If that matters for your data, choose different hardware instead of trusting a delete button.

Publishing what you made. Share a curated derivative, not the working folder. Audit text, code, captions, images, filenames, metadata, and archive members. Exclude personal identities, addresses, account values, private paths, secrets, source prompts, and anything private. Check the visible pixels as well as the metadata, and scan the actual final file formats, not only the source document. Pattern scans help, but they cannot guarantee complete de-identification.

18Cost, throughput, and session budgeting

Budget the whole session, not the hourly rate. The expensive mistakes are idle time and an instance that is stopped but never destroyed.

0 h4 h8 h12 h16 h20 h24 hsession ends at 2 hLeft running: 30.0 after 24 hLeft running 30.0Stopped, forgotten: 3.6 after 24 hStopped, forgotten 3.6Destroyed: 2.5 after 24 hDestroyed 2.5Cumulative cost in currency units over 24 hours. Rates are hypothetical, chosen to show the shape.
Figure: hypothetical cumulative cost over 24 hours, computed from rates

The chart assumes a hypothetical 1.20 units per hour for the GPU and 0.05 per hour for disk, a 2-hour session, and then three behaviors: leave the machine running, stop it and forget it, or destroy it. A real provider's numbers differ, and a stopped instance's disk may bill at a higher rate than a running one, but the shape holds: only the third line stops.

The same arithmetic at real rates. These use the October 2026 rates from section 13, which are snapshots.

Scenario Rate Cost
A 2-hour teapot session on an RTX 4090, RunPod $0.89 per hour $1.78 plus storage
The same session on an RTX 4090, Vast.ai About $0.14 to $0.72 per hour About $0.28 to $1.44 plus storage
The same session on a Lambda A10, 24 GB $1.29 per hour $2.58
The same session on an H100 PCIe, RunPod $2.89 per hour $5.78
One 26-minute Wan 2.2 clip on an RTX 4090, RunPod $0.89 per hour About $0.39
37 minutes on a Lambda A100 40 GB, billed per minute $1.99 per hour About $1.23
A 100 GB weights cache on a RunPod volume $0.10 per GB per month running, $0.20 idle $10 or $20 per month

The last row is the argument for a controller. Keeping the weights cache on a disk you already own removes a monthly charge, and the gap between running and idle storage on a rented volume shows why an idle rental is expensive.

What a session costs. Include setup, transfer, generation, retries, quality checks, idle time, storage, and egress. A worked example in hypothetical units: 100 minutes at 1.20 per hour costs 2.00. Add 0.40 for storage and transfer and the session costs 2.40. If it produced twelve accepted results, each cost 0.20. Cost per accepted result, not cost per hour, is the number that tells you whether a workflow is good.

Size four resources separately: GPU memory, system RAM, disk, and bandwidth. Disk must cover environments, temporary downloads, training checkpoints, and outputs. Bandwidth can dominate short jobs: moving 30 GB at a sustained 20 MB per second takes about 25 minutes before overhead, and that time bills if the GPU is already running.

Budget line Estimate Actual
Hours rented, including setup and idle
Hourly rate
Disk, transfer, and egress
Attempted outputs
Accepted outputs
Cost per accepted output

Set four limits before you start: a maximum duration, a cost allowance, a cutoff after which no new jobs begin, and a cleanup deadline. Reserve time to archive, because an abrupt shutdown timer can destroy training progress that was not copied back. If a session produces nothing, record zero accepted outputs. Hiding failures corrupts the next estimate.

19Troubleshooting, capstone, glossary, and sources

When something breaks, find the symptom, run the first check, and take the controlled action. Change one thing at a time, and keep one known-good environment and graph to roll back to.

Symptom First check Controlled action
Download stalls Disk space, authentication, the actual file route, client logs Retry a bounded number of times; test another backend. The main website working does not prove the storage route works
Unsupported GPU kernel Driver, runtime, framework, and extensions together Restore a compatible combination
Missing node Startup import errors and the node schema Fix the supported dependency or restore the baseline
Noise output or shape error Exact encoder, denoiser, VAE, and recipe Restore the matched component set; check repack key layout
Out of memory while sampling Image size, active models, peak usage Reduce the workload or use supported offload
Out of memory while decoding VAE and output size Supported tiled decode, or a smaller output
Nothing saved Output wiring and job history Connect the Save node; rerun a small test
Identity drift in a LoRA Loading, base, strength, then data Isolate one cause; compare checkpoints
Video flicker The baseline recipe and motion complexity Simplify the motion; inspect context limits
Archive output missing The real mount and the transfer manifest Verify files on the host before deleting anything
Instance stuck loading Host network speed and image size Try a faster host; loading is not billed on Vast
Restart stuck on scheduling Whether another renter took the GPU Copy data to a new instance
Unexpected bill State of every instance in the console Destroy what you do not need; confirm none is stopped

After any package or extension change, rerun the GPU arithmetic and the baseline render. When you stop a process, use its exact process ID, since a broad pattern can match your own shell.

Real messages worth searching for. A "driver too old" message can mean a CUDA 12.x driver is running software built for CUDA 13.x. CUDA_ERROR_UNSUPPORTED_PTX_VERSION, error 222, was observed in one project's notes when a driver in the 580 range met compiled instructions from a newer toolkit than it understands. NaN or black images from an SDXL decode point to the fp16 VAE problem fixed by sdxl-vae-fp16-fix. A model that loads but outputs noise points to a mismatched or renamed-key file, as with a Qwen-Image 2.1 encoder quantized from the original layout.

Capstone. Another operator should be able to reproduce your still and your short clip, understand every component, recover required artifacts after an interruption, and confirm that cleanup happened. Hand over the component inventory, environment revisions, workflow, seeds and settings, acceptance results, cost, archive evidence, and the final resource state.

Glossary

Term Plain meaning
Noise Random numerical variation used to corrupt training examples and to start generation
Latent A learned compact numerical form of an image or video, not the visible pixels
Token A model-specific text unit, often a word fragment, stored as an integer
Embedding A vector of learned features representing a token or other input
Conditioning Features that guide generation, such as encoded text, an image, or a pose
Attention A learned mechanism that connects relevant features across positions or modalities
Denoiser The network that predicts the update to the current noisy state
Velocity or flow field A direction-and-rate style prediction; definitions differ between diffusion and flow-matching models
Sampler, solver, scheduler The overall procedure, the update rule, and the noise-level sequence that together run the loop
VAE Variational autoencoder: the matching encoder and decoder between pixels and latents
Seed The number that starts the pseudo-random generator; one part of reproducibility
Checkpoint A file of learned numbers; not a complete application
LoRA A small add-on of low-rank matrices that adjusts a frozen base model
Quantization Storing weights at lower numeric precision to save space
Controller and worker The persistent and the disposable halves of the two-state design

What was verified, and what was not

Checked on 23 October 2026 against the pages named below. For the Vast.ai, NVIDIA, and Hugging Face items I read the official documentation pages as returned by search, not a full download of each. The model facts rest on model cards, Comfy-Org's repack, and community pages, since I did not open every primary repository. Later passes added sources and removed claims I could not source. No live deployment, training, or benchmark was run for this guide.

Claim Status Source
CUDA 13.x minor-version compatibility needs driver 580 or newer; 12.x needs 525 or newer, below 580 Confirmed NVIDIA CUDA minor version compatibility, CUDA release notes
Stopped Vast instances keep billing storage; destroying ends it Confirmed Vast billing, Vast storage
Zero balance stops, not destroys; no payment method means scheduled deletion; restart can wait on a GPU; loading is not billed Confirmed Vast instance management, Vast pricing
Hub transfers run on Xet; the HF_HUB_ENABLE_HF_TRANSFER setting is deprecated; HF_HUB_DISABLE_XET exists as a diagnostic Confirmed Hugging Face environment variables
Chroma1-HD: 8.9B, FLUX.1-schnell based, Apache 2.0, documented with T5-XXL and the FLUX VAE Confirmed on model-card copies and guides, not the primary page Chroma1-HD card copy, ComfyUI Wiki, Chroma local guide
Qwen-Image 2.1: 7B transformer, Qwen3-VL-8B encoder, own VAE, optional prompt enhancers Confirmed on the ComfyUI repack and community listings Comfy-Org repack, community listing
Qwen-Image 2.1 license restricts derivatives to non-commercial use Reported by community adapter cards and by outlets that read the LICENSE file; read the license text yourself adapter card, encoder card
Wan 2.2 14B uses a high-noise and a low-noise model; 4-step speed-up variants exist for both Confirmed on community tutorials and release pages Wan 2.2 tutorial, Wan 2.2 distilled models
About 26 minutes for a high-quality Wan 2.2 workflow on an RTX 4090 One tutorial's figure Wan 2.2 first-last frame tutorial
Model file sizes quoted in section 11 Community-reported community listing

Added in the examples revision

Claim Status Source
RunPod rates, per-second billing, no egress fees, storage prices, 30-second launch claim Read from the provider's own page, updated 27 August 2026 RunPod cloud GPUs
Vast.ai per-second billing, $5 minimum, H100 from $0.90, Secure Cloud on SOC 2 Type II, 60-second launch claim Read from the provider's own page Vast.ai GPU cloud
RunPod stopped onboarding new Community Cloud hosts in February 2026 Provider blog post RunPod announcement
Lambda rates, per-minute billing, no egress fees, no spot Trackers citing the provider's pages, September to October 2026 Lambda pricing, September snapshot, H100 prices on 19 October
Vast.ai RTX 4090 and RTX 5090 ranges Trackers that disagree with each other GPU rental index, RTX 4090 listings
RTX 4090 uses Micron GDDR6X Confirmed by Micron Micron and NVIDIA
RTX 5090 uses Samsung GDDR7 Reported, not officially confirmed Guru3D report
RTX 6000 Ada: 48 GB GDDR6 with ECC, 960 GB/s Confirmed by NVIDIA; chip maker not found NVIDIA RTX 6000
H100 uses SK hynix HBM3 Confirmed by SK hynix's announcement SK hynix announcement, HotHardware
sdxl-vae-fp16-fix and SD and SDXL VAE names Model pages and community file listings fp16-fix discussion, VAE listing
Tailscale is built on WireGuard, with auth keys, ephemeral nodes, tags, and SSH Tailscale documentation menus and a SaladCloud guide Tailscale SSH docs, SaladCloud and Tailscale
PTX error 222 with driver 580 and a CUDA 13.3 toolchain Project documentation that observed it cuda-oxide notes

Not verified in this guide: the memory chip makers for the RTX 6000 Ada and RTX PRO 6000 Blackwell, which I could not find; the RTX 5090's Samsung chips, which are reported but not officially confirmed; trainer configuration formats, which change often; and every Vast.ai and Lambda price, which came through trackers and will have moved. The Qwen-Image 2.1 license is described from reports of its LICENSE file, so read the file itself before relying on it.

Second verification pass. I removed or reworded claims I could not source: named VPS vendors and a single-board computer model, archive tools other than cryptsetup, SwarmUI, the SD3 and HunyuanVideo VAE rows, general-knowledge notes on encoders and interpolation tools, an unsourced SSH key type, a GPU-for-speed recommendation, and a claim that one card suffices for LoRA training. I also corrected the ComfyUI listen flag and the FLUX VAE license note.

Claim Status Source
Wan 2.2 A14B has two experts of about 14B each, 27B total and 14B active, switched by signal-to-noise ratio; it uses a UMT5 text encoder; the 5B model uses the Wan2.2-VAE at 4x16x16 compression Confirmed Wan 2.2 readme, DeepLearning.AI
SDXL uses a UNet of about 2.6B parameters and two fixed text encoders, OpenCLIP ViT-bigG and CLIP ViT-L Confirmed SDXL model card text, SDXL FP8 page
Stable Diffusion 3 is a multimodal diffusion transformer using rectified flow Confirmed Stability AI
FLUX.1 loads T5-XXL plus CLIP-L, and ae.safetensors as its VAE Confirmed ComfyUI FLUX guide
FLUX.1-schnell is Apache 2.0; FLUX.1-dev is non-commercial Confirmed Black Forest Labs repository
ComfyUI listens on 127.0.0.1 by default, accepts an address after --listen, and defaults to port 8188 Confirmed ComfyUI startup flags
ComfyUI nodes KSampler, VAEEncode, VAEDecode, SaveImage, LoraLoaderModelOnly, CLIPLoader, VAELoader, UNETLoader Seen in published workflows and a third-party node reference Hyper-SD workflow, node reference
Tailscale: tailscale up with --auth-key, --hostname, --ssh, tags, ephemeral keys, and userspace networking Confirmed Tailscale server setup, Azure App Service guide, Docker parameters
WireGuard sends IP packets over UDP, authenticates peers by public key, roams between addresses, and defaults to port 51820 Confirmed WireGuard, Thomas-Krenn wiki
RTX 5090: 32 GB GDDR7, 512-bit, 28 Gbps, 1,792 GB/s Confirmed on spec sheets Notebookcheck
Qwen-Image 2.1 license terms and 20 September 2026 release Reported from the LICENSE file OrcaRouter, DataNorth
RIFE and FILM exist and are packaged for ComfyUI Confirmed Practical-RIFE, ComfyUI Wiki
cryptsetup manages LUKS and has limited support for VeraCrypt volumes Confirmed cryptsetup manual
AI Toolkit and DiffSynth-Studio train LoRAs; AI Toolkit VRAM guidance Confirmed; the VRAM guide is third-party RunComfy AI Toolkit guide, DiffSynth-Studio
NIST SP 800-88 Rev. 2 was revised to cover cloud and virtual storage Confirmed NIST SP 800-88 Rev. 2, NIST FAQ

Full-book audit. A final pass read every section and checked the remaining claims. The format table in section 11 and the memory methods it names rest on the sources below.

Claim Status Source
Safetensors avoids pickle's arbitrary code execution; GGUF offers several quantization levels such as Q4_K_M and Q8_0 Confirmed; the GGUF comparison is third-party PyTorch Safetensors page, format comparison
Diffusers pipelines offer model CPU offload, sequential CPU offload, and VAE tiling Confirmed SDXL FP8 page, Chroma1-HD card copy

Background reading named in Version 2, not re-verified: the Latent Diffusion Models, Diffusion Transformer, Flow Matching, and LoRA papers, which I did not re-read.

Appendix

Beyond the core path

Compare connection options, see other setups, and keep a one-page session sheet.

AConnection options, and other setups and workflows

A. SSH tunnel, WireGuard, and Tailscale compared

Choose by who must reach whom, and how often the worker changes. For one session, an SSH tunnel is enough. For a fixed controller you manage yourself, plain WireGuard is a good fit. For repeat sessions across several devices and disposable workers, Tailscale removes the most manual work.

SSH tunnel WireGuard, plain Tailscale
What it is An encrypted forwarded port over SSH A VPN protocol that sends IP packets over UDP A mesh VPN built on WireGuard, with a coordination server
Setup An SSH key and the provider's connection details A key pair per peer, allowed address ranges, and an endpoint Install, then join with a login or an auth key
Keys SSH keys You exchange public keys, much like SSH keys The service introduces devices; auth keys can be tagged and ephemeral
Behind NAT Needs the provider to expose an SSH port on the worker; nothing to open on your side Needs a reachable endpoint on at least one side; a keepalive setting helps clients behind NAT, per one setup guide Designed to traverse NATs and firewalls
Access control Whoever holds the key Allowed address ranges per peer (cryptokey routing) Access control lists, tags, and MagicDNS names
Disposable workers Nothing to clean up You remove the peer yourself Ephemeral nodes are removed automatically when they go offline
Best for One-off sessions A fixed controller you run Repeat sessions across several devices

WireGuard's own description is useful here. It aims to be as easy to configure as SSH, authenticates peers by public key, and can roam between IP addresses. Its default UDP port is 51820. Tailscale builds on that protocol and adds the coordination, naming, and policy layer. In every case, keep ComfyUI bound to 127.0.0.1 and forward its port, as in section 14.

B. Other setups and workflows

Setup When it fits Pieces Watch for Source
Your own GPU, no rental You generate often and already own a 24 GB or larger card Sections 5 to 11 and 15 to 18 apply; sections 12 to 14 mostly do not The memory table in section 4 decides what fits This guide
Disposable session on a marketplace GPU Occasional work under a cost ceiling A Vast.ai or RunPod instance, an SSH tunnel, a controller archive Destroy the instance; a stopped one still bills its disk Vast.ai billing
Prebuilt template You want a fast start Vast.ai templates or RunPod Hub templates Check what the template installs and pin versions Vast.ai, RunPod
Pay per second of active work Bursty requests RunPod Serverless bills per second of active compute; Vast Serverless auto-scales instances with no extra pricing tier Hourly rates are higher than Pods (one tracker lists an RTX 4090 at $1.10 serverless against $0.69 for a Pod), so check your utilization RunPod pricing review, Vast.ai pricing
Hosted ComfyUI You want ComfyUI without managing a GPU Comfy Cloud, which meters GPU time at a published rate The provider runs your jobs, so the privacy reasoning in section 17 applies Comfy.org
LoRA training session You want a style or subject adapter AI Toolkit or DiffSynth-Studio on a 24 GB or larger card, with checkpoints archived VRAM and disk; archive the adapter before teardown RunComfy guide, DiffSynth-Studio
Faster Wan 2.2 video You want shorter render times The 4-step LightX2V LoRAs in ComfyUI, or the LightX2V framework, which its page says is about twice as fast as ComfyUI Use files that match your Wan variant LightX2V models

C. A one-page session sheet

  1. Before renting: bill of materials complete, digests recorded, cost ceiling and duration set (sections 10 and 18).
  2. Rent: pick the GPU by memory need (sections 4, 11, 13), confirm the driver with nvidia-smi.
  3. Connect: SSH tunnel, or join the worker to your tailnet with an ephemeral, tagged key (section 14).
  4. Stage: copy only the needed weights and verify digests.
  5. Run: one job at a time through the ledger; copy outputs back as they finish.
  6. Close: verify the archive, remove tokens, destroy the instance, and confirm the console shows no remaining storage (sections 13 and 17).