Skip to main content
Managed supervised fine-tuning (SFT) and DPO no longer accept new jobs. Train on the Training API instead. Models and LoRA adapters from managed jobs stay in your account and stay deployable.

Clone an existing job

Rerun a managed job on the Training API with the same settings.

Start a new job

Pick the model, data and settings yourself, and get a price estimate first.
Bring your own copy of the training data. The Training API reads your training file directly: a local JSONL file, a directory of .jsonl shards, or a Google Cloud Storage path (gs://<BUCKET>/train.jsonl). It can’t read datasets stored in Fireworks (accounts/<ACCOUNT_ID>/datasets/<DATASET_ID>). Use the same file you uploaded for the managed job, and its evaluation file if it had one. The row format doesn’t change. For data in Amazon S3 or Azure Blob Storage, copy it to a local file or to Cloud Storage first.

Clone an existing job

Migration tool: migrate_managed_job.py in the Fireworks cookbook. It reads your old job’s settings, maps them onto the matching training recipe, runs it, and promotes the result to a new model. See the tool README for how each setting maps.
Paste this into Claude Code, Cursor, Codex or another coding agent, from the folder that holds your training data. Fill in the values in square brackets; the FAQ shows where to find your job name and account ID.
Set FIREWORKS_API_KEY in your shell before you start the agent, and never paste the key into the agent chat. See FAQ: “How do I keep my API key safe with a coding agent?”
Set up once.
  • Create an API key in the account that owns the job, in the dashboard or with firectl api-key create. The Training API rejects keys that can reach more than one account. If you belong to several Fireworks accounts, use a service account key created in the job’s account.
  • Install Python 3.11 or newer and uv.
Call the migration tool from Python, and review the plan before you train:
  • For a DPO or ORPO job, pass accounts/<ACCOUNT_ID>/dpoJobs/<JOB_ID>.
  • MigrationInputs also takes eval_dataset_path, mode ("auto", "serverless" or "dedicated"), tokenizer_model and max_seq_len.
  • plan.config is the recipe Config the run uses. The tool saves a resumable checkpoint every 20 steps, as managed training did.
Run, watch and resume
  • The training loop runs in your Python process for the whole job, not on Fireworks. If the process stops, training stops. For long runs, use a machine that stays on, such as a cloud VM, and keep the output in a log file: nohup python train.py > train.log 2>&1 &.
  • Watch the loss in the log, in Weights & Biases, or on the training dashboard.
  • If the run stops early, the tool prints how to continue it from its newest checkpoint, with the same log_path. Lost the output? See “My run stopped. How do I resume it?” in the FAQ.
  • A dedicated trainer stops after 60 minutes without activity. If your process dies, the trainer keeps billing until then.

Start a new job

Training recipes: sft_loop.py and dpo_loop.py in the Fireworks cookbook. Each one runs the whole job from your data to a deployable model. For step-by-step guides, see Cookbook: SFT and Cookbook: DPO.
Use this path if you have no managed job to clone, for example because you only used the dashboard, or if you want different settings. Paste this into your coding agent, from the folder that holds your training data. Fill in the values in square brackets. Leave a setting as [default] to let the agent choose it and show you its choice in the plan.
Set up as in Clone an existing job, then build the recipe Config and run it. These examples train a LoRA adapter on serverless training, which needs no provisioning and bills per token. Every setting is a field on the recipe’s Config.
  • serverless=True works only on the serverless models. For any other base model, remove it to train on a dedicated trainer; see “Should I use Serverless or Dedicated Training?” in the FAQ.
  • Always set lora_rank. The recipe default of 0 means full-parameter training, which needs a dedicated trainer.
  • tokenizer_model is the Hugging Face repo of the base model, such as Qwen/Qwen3-8B. A mismatch corrupts training.
  • For a gs:// dataset, also set dataset_loading_mode="stream", install google-cloud-storage, and sign in with gcloud auth application-default login.
  • For Weights & Biases charts, pass wandb=WandBConfig(entity="<WANDB_ENTITY>") (from training.utils) and set WANDB_API_KEY.
Run, watch and resume
  • The training loop runs in your Python process for the whole job, not on Fireworks. If the process stops, training stops. For long runs, use a machine that stays on, such as a cloud VM, and keep the output in a log file: nohup python train.py > train.log 2>&1 &.
  • Watch the loss in the log, in Weights & Biases, or on the training dashboard. For SFT the loss should fall over the first epoch. For DPO, dpo_loss starts near 0.69 and should fall while accuracy rises.
  • If a serverless run stops, rerun it with the same log_path and init_from_checkpoint="<ACCOUNT_ID>/<RUN_ID>/<CHECKPOINT>". “My run stopped. How do I resume it?” in the FAQ shows where to find each value.
  • On a dedicated trainer, reattach with trainer=TrainerConfig(job_id="<TRAINER_JOB_ID>") while the trainer is still running, or start a new trainer from the checkpoint. A dedicated trainer stops after 60 minutes without activity, and keeps billing until then if your process dies.
See Checkpoints and resume for details.

Deploy the new model

The run promotes its final checkpoint to accounts/<ACCOUNT_ID>/models/<NEW_MODEL_ID>. Deploy it from Models in the Fireworks app, or run:
See Deploying trained models for multi-LoRA deployments.

What keeps working

For managed SFT, DPO and ORPO jobs created before November 9, 2026:
  • Jobs that are queued or running finish normally.
  • You can get, list, cancel and delete them in the dashboard, with firectl, and through the API.
  • You can export DPO job metrics (firectl dpo-job export-metrics) and promote the checkpoints of existing jobs.
  • The models they produced stay in your account and deploy as before.

Troubleshooting

FAQ

The agent prompt and the migration tool need the full job name, such as accounts/<ACCOUNT_ID>/supervisedFineTuningJobs/<JOB_ID>.
  • Account ID: run firectl whoami, which prints Account ID: <ACCOUNT_ID>.
  • SFT job names: run firectl sftj list.
  • DPO and ORPO job names: run firectl dpoj list.
You can also find your jobs in the training dashboard. To see a job’s settings, run firectl sftj get <JOB_ID> or firectl dpoj get <JOB_ID>.
Set the key in your shell, then start the agent from that same shell so it inherits the variable:
  • Never paste the key into the agent chat. Chat messages can be logged and sent to the agent’s model provider.
  • The agent prompts on this page tell the agent the key is already set, and not to ask for it or print it.
  • If you pasted a key into a chat by mistake, delete it in the dashboard and create a new one.
Pick by what your managed job used:Serverless models. serverless=True works only on these base models. On any other model it fails with no eligible shared trainer found for base model:Train on a dedicated trainer instead. Remove serverless=True from the Config. The recipe then provisions a dedicated trainer on a validated training shape for the base model. Everything else in the examples stays the same:
A dedicated trainer uses your training GPU quota and bills per GPU hour while it runs. Without a reservation, it can wait in a queue for capacity, for up to 48 hours by default. The migration tool chooses serverless or dedicated for you.
These base models have no Training API shape. Train a suggested replacement instead:Models shows whether each replacement trains on Serverless Training, Dedicated Training, or both. A replacement is a different model, so evaluate it against your managed model before you move traffic.For any other base model with no Training API shape, including a base model you uploaded, contact your account team or support@fireworks.ai.
The training loop runs on your machine. If the laptop sleeps, the terminal closes or the connection drops, the run stops.Prevent it
  • For runs longer than a few minutes, use a machine that stays on, such as a cloud VM. Run under tmux, or with nohup and a log file, so the output survives a closed terminal:
  • Save checkpoints regularly: set dcp_save_interval=20, and checkpoint_interval_minutes=30 for LoRA SFT and DPO. The migration tool sets both. Without them, a stopped run has nothing to resume from.
Find the checkpointEvery resumable checkpoint is listed in dataloader.json inside the run’s log_path. The checkpoint names are its keys, newest last:
Resume
  • Serverless: find the run ID in the log line Serverless training session <SESSION_ID>, run <RUN_ID> (for example, grep "Serverless training session" train.log). Rerun with the same log_path and init_from_checkpoint="<ACCOUNT_ID>/<RUN_ID>/<CHECKPOINT>".
  • Dedicated, trainer still running: find the trainer job ID in the log (Created trainer job: <TRAINER_JOB_ID>). Rerun with the same log_path and trainer=TrainerConfig(job_id="<TRAINER_JOB_ID>") (from training.utils). The trainer stops after 60 minutes without activity.
  • Dedicated, trainer gone: rerun with the same log_path and init_from_checkpoint="<TRAINER_JOB_ID>:<CHECKPOINT>". This starts a new trainer from that checkpoint’s weights, and the dataset starts again from its first row.
  • Migration tool: pass the same log_path, plus init_from_checkpoint or trainer_job_id, to MigrationInputs.
  • Evaluation dataset. Pass your own copy: evaluation_dataset on the recipe Config, or eval_dataset_path in the migration tool. The run reports evaluation loss on it.
  • Automatic carve-out. eval_auto_carveout=True holds out part of the training data for evaluation: by default 10% of the rows, at most 20 examples. Change the size with eval_carve_ratio and max_eval_seqs. The migration tool turns it on for jobs that used it.
  • ORPO has no held-out evaluation in the cookbook, so its evaluation settings are ignored.
Evaluation loss is a training signal, not a quality check. When the run finishes, it promotes the final checkpoint to accounts/<ACCOUNT_ID>/models/<NEW_MODEL_ID>. Evaluate that model on your own prompts before you move traffic, and compare it with your managed model. Evaluating Trained Models covers sampling serverless checkpoints, loading a promoted LoRA onto serverless, and preemptible deployments.
Managed jobs saved a resumable checkpoint every 20 steps, and LoRA SFT and DPO jobs also saved one every 30 minutes. To keep that, set dcp_save_interval=20, and checkpoint_interval_minutes=30 for LoRA SFT and DPO.
  • A token-based batch_size from older jobs. Recipes batch by rows; use batch_size_samples → batch_size.
  • lora_target_modules, lora_dropout and tune_vision_encoder.
  • Datasets in Amazon S3 or Azure Blob Storage. Copy the data to a local file or to Cloud Storage first.
  • Region, accelerator and training shape. You don’t set these; the recipe picks a validated training shape.