NeuBench

Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps

A new guide demonstrates how to fine-tune the 350M LFM2.5 model for structured-output compliance using Group Relative Policy Optimization. Running for 100 training steps on approximately 500 samples, the method improves the model's IFStruct benchmark score from 22.6% to 29.7%. This inexpensive recipe can run on free-tier Colab or Kaggle GPUs.

Model Size
2B
Dense Parameters
Benchmark Metric
22.6%
Reported Accuracy / Gain
Output Format
Structured JSON
Timestamped Metadata
Deployment Platform
Hugging Face
Cloud Infrastructure

The Core Development

This guide is a fully public, inexpensive recipe for making a small model substantially better at structured-output compliance. We fine-tune LFM2.5-350M with Group Relative Policy Optimization (GRPO) using the TRL library and evaluate it on the IFStruct benchmark . The full run takes around 500 samples and 100 training steps, small enough for a free-tier Colab or Kaggle GPU, and is available on GitHub . The results show that even a light fine-tuning procedure improves performance from 22.6% to 29.7% on the IFStruct benchmark.

Structured output is one of the most common real-world tasks for LLMs, yet most benchmarks fold it into broader reasoning or extraction scores rather than measuring it on its own. Whether a model reliably returns valid, parseable output in the requested format and shape — schema compliance — is often what decides whether it can be wired into a downstream system at all.

Note that the training pipeline described here is not the one used to train the RL model described in the IFStruct blog . This notebook doesn't aim to recreate the IFStruct benchmark score, but to show how task-specific fine-tuning of smaller models can improve performance and match that of far larger models.

How It Works & Technical Architecture

We use nvidia/Nemotron-RL-instruction_following-structured_outputs , which pairs each prompt with a target JSON Schema and an expected field count. We use about 500 samples for training.

We load LiquidAI/LFM2.5-350M and attach a LoRA adapter. Because LFM2.5 uses a hybrid attention/convolution architecture, we target the LFM-specific module names:

Finally, we merge the LoRA adapter back into the base weights and save it as a single self-contained checkpoint, ready to convert to GGUF for serving:

A short GRPO run with about 500 samples and 100 steps can lift a small 350M parameter model from 22.6% to 29.7% on IFStruct. The takeaway is that a cheap, task-specific reward signal can make a small model substantially more reliable about form , closing much of the gap to models several times its size.

Strategic Perspective & Ecosystem Impact

We will need uv for the Python tooling and llama.cpp for serving. Following the Liquid AI llama.cpp deployment docs , install llama.cpp with Homebrew and verify that llama-server is available:

Before we begin, let's evaluate LFM2.5-350M on the IFStruct benchmark and see whether we can reproduce the reported score of 21.1% .

IFStruct is a benchmark for testing the validity of LLM outputs and schema adherence. The benchmark is open-source in Liquid4All/ifstruct , with the public benchmark dataset available on Hugging Face at LiquidAI/ifstruct-v1.0 .

Why it matters

This technique shows that light, task-specific fine-tuning can significantly improve small language models for structured output, helping them approach the performance of much larger models at a low cost.

Topic dossiers Meta AI & Llama NVIDIA Hugging Face