Skip to main content

CPU Machine Types

For lightweight workloads that don’t require GPU acceleration — routing, preprocessing, API proxies.

GPU Machine Types

Video encode/decode counts refer to hardware NVENC/NVDEC engines — dedicated hardware units that encode or decode video independently of the GPU’s compute cores. GPUs with encoders (RTX PRO 6000, L40) can output video frames without using GPU compute time. GPUs marked -- for encode have no hardware encoder and require software encoding on the CPU.

Choosing a GPU

By VRAM requirement — pick the smallest GPU that fits your model: By workload type:
  • Image generation: L40 or RTX PRO 6000 (good throughput, generous VRAM)
  • Video generation: RTX PRO 6000 (4 NVENC + 4 NVDEC, AV1 encode, more VRAM) or L40 (3 NVENC + 3 NVDEC)
  • LLM inference: H100 or H200 (high bandwidth, large VRAM)
  • Training: A100, H100, or H200 (depending on model size)
  • Largest models: B200, RTX PRO 6000, or multi-GPU H100/H200

Configuration

Set the machine type in your application:

Multiple Machine Types

Allow your app to use multiple machine types for a larger pool of available machines:
Machine types are tried in order. If the first type has no available capacity, the next is used.

Multi-GPU

For models that need more than one GPU:

Multi-GPU Workloads

Learn how to distribute inference across multiple GPUs

Changing Machine Types

Via Code: Update machine_type and redeploy:
Each fal deploy creates a new revision, so this moves your whole app onto the new machine type: the new revision’s runners come up on the new type, and fal drains the old revision’s runners as part of the deployment. See Rollout Strategies for how that transition is sequenced. Via CLI: Change the machine type on a running app without creating a revision:
This updates the app’s configuration right away, but only new runners come up on the new machine type. Existing warm runners keep serving on the old type until they shut down — so if your app keeps runners alive (via min_concurrency, keep_alive, or steady traffic), they can stay on the old type indefinitely. To move them, see Rolling Out Existing Runners below. Via Dashboard: You can also change the machine type from your app’s configuration panel in the dashboard. This behaves like fal apps scale: the change applies to the live app without creating a revision, and only new runners use the new type. Because existing runners would otherwise stay on the old type, fal asks what to do with them as soon as the change is saved (the GPU count and fallback types count as part of the machine type):
  • Yes, roll out starts a rollout, exactly as if you had run fal apps rollout. The cost and capacity notes in Rolling Out Existing Runners apply.
  • No, keep existing leaves them alone. They keep serving on the old machine type until they shut down.
Declining is not permanent. You can roll out later at any time from the CLI, without changing the machine type again.
machine_type is a code-specific parameter — it always comes from your code and resets on every deploy. A change made with fal apps scale or from the dashboard is temporary: the next fal deploy resets it to whatever your code specifies. Update your code to match if you want the change to survive redeploys. See Scaling Configuration for details.

Rolling Out Existing Runners

After changing the machine type with fal apps scale or from the dashboard, roll your existing runners onto the new type. From the dashboard, choose Yes, roll out on the prompt shown after you save. From the CLI:
fal starts replacement runners on the new machine type and drains each old runner only once a replacement has finished starting up, so traffic is not interrupted. Pass --force to terminate the existing runners immediately instead, dropping their in-flight requests. fal apps scale and fal apps rollout both target the main environment unless you pass --env or set FAL_ENV. See fal apps rollout for the full command reference and Rollouts for the other reasons to roll your runners. Replacements are started in parallel rather than one at a time, and they are provisioned on top of max_concurrency rather than within it, so during the transition your app can run close to double its usual runner count. Each runner is billed at its own actual machine type from the moment it begins setup(), so expect a temporary cost increase until the old runners finish draining.
A rollout needs temporary headroom for those extra runners. It stalls while your account’s GPU limits are fully consumed — including by your other apps — or while none of the app’s configured machine types has available capacity. In either case your existing runners keep serving in the meantime.
You do not need a rollout after a fal deploy. A rollout applies to your app’s current revision, so running one after a deploy recycles runners that are already on the new machine type and you pay the overlap cost above for no benefit. This is also why a rollout is a separate mechanism from the rollout strategies that fal deploy uses to move traffic between revisions.