5.1

Read the run from its signals

Eight signals in the log tell you in a few minutes if a run is healthy.

The reward is the signal everyone reads first, and it is the slowest to tell you that something is wrong. Seven other signals show a broken run earlier.

When you finish this section, you can decide if a run is healthy from its logged signals. You can also tell which changes need action.

The eight signals

These are the ranges over all 48 steps of our three baseline seeds. The runs trained Qwen3-0.6B on GSM8K, with 32 prompts of 8 answers each and a limit of 1,024 tokens.

SignalLog nameRange in our runsA healthy run
rewardrollout/raw_reward0.53 to 0.87 per steprises over the run, with swings from step to step
answer lengthrollout/response_lengths396 to 787 tokensfalls as the model learns shorter answers
cut sharerollout/truncated0.02 to 0.43falls with the length
gaptrain/train_rollout_logprob_abs_diff0.0136 to 0.0164stays flat
KL to the enginetrain/train_rollout_kl0.00063 to 0.00076stays flat
gradient normtrain/grad_norm0.35 to 4.95stays in one range, with rare spikes
clip fractiontrain/pg_clipfrac0stays at 0 with one update per rollout
rollout timeperf/rollout_timevaries with length and heatfalls with the length

Clip fraction: the share of tokens where the update hit the clip limit. Our runs did one optimizer update per rollout. So the policy of the trainer stayed the one that scored the samples, and nothing was clipped.

Our runs logged train/entropy_loss as 0 at every step, so this setup does not show the entropy of the model.

From one step to the next, the reward moved by up to 0.21 in our runs. A single step tells you little. Read the mean over five or more steps.

All three seeds showed the same trend: the reward rose and the answers got shorter. Section 5.3 gives the numbers for each seed.

Send the signals to a dashboard

The log is enough for ten steps. For a long run, a dashboard is easier to read. Miles can write the same train/, rollout/, and perf/ metrics to Weights & Biases or to TensorBoard. We read every number in this manual from the log. We tested both trackers with a 2-step run on our GB10.

For Weights & Biases without an account or a network, write the run to a local folder:

-e MILES_EXTRA_ARGS="--use-wandb --wandb-mode offline --wandb-project miles-lab --wandb-group plain --wandb-dir /root/lab/runs/plain/wandb"

Keep --wandb-group. Without it, the run stops at start with TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'. The log should show W&B offline mode enabled. Data will be saved locally., and an offline-run- folder appears under ~/miles-lab/runs/plain/wandb/wandb/.

For an online run, leave out --wandb-mode offline. Keep the key out of the command line, because commands go to the shell history and the process list. Put WANDB_API_KEY=<your key> in a file that only you can read, such as ~/miles-lab/wandb.env with mode 600, and add --env-file ~/miles-lab/wandb.env to the docker run line. Do not put the key in MILES_EXTRA_ARGS, because the launcher prints the full command in the log.

For TensorBoard, give Miles a folder and turn the writer on:

-e TENSORBOARD_DIR=/root/lab/runs/plain/tb -e MILES_EXTRA_ARGS="--use-tensorboard"

The log should show Saving tensorboard log to /root/lab/runs/plain/tb. Then open the folder on the host with tensorboard --logdir ~/miles-lab/runs/plain/tb.

Act on these changes

ChangeLikely causeFirst check
The gap jumps and stays highthe engine and the trainer no longer use the same weightsthe weight update logs, and section 5.2
The gradient norm grows step after stepthe learning rate is too high for this batchlower the learning rate and repeat
The reward falls and the length risesthe model has learned to talk longer instead of betterthe reward function, and the cut share
The clip fraction is above 0 with one update per rolloutthe samples did not come from the current weightsthe update interval and the async settings
The rollout time grows with flat lengththe engine or the GPU is slowerthe heat log and the engine log

Keep your own ranges. These numbers hold for our model, data, and machine. Run two or three seeds of your own setup, and use their ranges instead.

Miles radixark/miles:latest, Miles main of 2026-10-15 · 08752a1 · 2026-10-15 · Edition 2026.10