Articlehuggingface.co·2026년 9월 3일·0

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

Quick Summary

LFM2.5 350M을 약 500개 샘플로 100단계 GRPO 미세조정한 결과, 동일한 llama.cpp·BF16 평가 환경에서 IFStruct 통과율이 22.6%에서 29.7%로 상승했다.

Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps 관련 대표 이미지

🖼️ 인포그래픽

Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps 내용을 설명하는 본문 이미지

🖼️ 4컷 인포그래픽

Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps의 핵심 내용을 4단계로 요약한 인포그래픽
Fine-tuning a 350M Model for Better Structured Outputs in 100 GRPO Steps 핵심 내용을 4단계로 압축한 4컷 인포그래픽

💡 한 줄 요약

LFM2.5-350M을 약 500개 샘플로 100단계 GRPO 미세조정한 결과, 동일한 llama.cpp·BF16 평가 환경에서 IFStruct 통과율이 22.6%에서 29.7%로 상승했다.

📌 핵심 요약

  • 공개된 학습 절차는 TRL과 LoRA를 사용하며, 무료 등급의 16GB GPU에서 실행하도록 구성됐다. 실제 학습 대상은 약 600만 개 파라미터로 전체 모델의 약 1.66%다.
  • 학습 데이터는 nvidia/Nemotron-RL-instruction_following-structured_outputs의 약 500개 샘플이다. 프롬프트의 40%에는 코드 블록 출력 지시를 추가하고, 이와 겹치지 않는 20%는 항목 수가 지정된 최상위 배열 과제로 변환했다.
  • 보상은 출력 형식, 필드 수, JSON Schema 준수 여부를 평가하며 가중치는 각각 1.0, 0.5, 2.0이다. 프롬프트 그룹당 8개 응답을 생성하며 100단계 학습했다.
  • IFStruct 2,000개 샘플에서 통과 건수는 452개에서 594개로 증가했다. JSON 통과율은 18.0%에서 31.9%, YAML은 27.2%에서 27.5%, 최상위 목록은 16.6%에서 29.7%로 변했다.
  • 평균 지연시간은 1,453ms에서 1,518ms로 늘었다. 필수 필드 누락, 잘못된 항목 수, 타입 불일치의 집계 횟수도 증가해, 전체 통과율 상승이 모든 오류 유형의 감소를 뜻하지는 않았다.

🧩 주요 포인트

  1. 약 1.66%의 파라미터만 학습하고도 IFStruct 통과율이 7.1%포인트 상승해, 소규모 모델의 구조화 출력 개선에 제한된 미세조정이 효과를 보였다.
  2. 코드 블록·최상위 배열 과제를 보강한 학습 후 JSON과 최상위 목록에서 개선이 크게 나타났지만, YAML 변화는 작아 형식별 성과를 구분해야 한다.
  3. 동일한 llama.cpp·BF16 환경의 비교는 학습 전후 성과를 판단하는 기준이 되지만, 늘어난 지연시간과 일부 오류 집계는 통과율과 함께 살펴야 할 제약이다.

🧠 상세 정리

1. 구조화 출력 준수를 개선하려는 실험

이 글은 소규모 언어 모델이 요청된 형식과 구조를 더 잘 따르도록 만드는 공개 미세조정 절차를 소개한다. 구조화 출력은 실제 활용에서 흔한 과제지만, 많은 벤치마크에서는 독립적인 평가 대상보다 추론이나 정보 추출 점수의 일부로 다뤄진다는 문제의식에서 출발한다. 저자는 출력이 유효하게 파싱되고 요청된 스키마를 따르는지가 모델을 후속 시스템에 연결할 수 있는지를 결정하는 경우가 많다고 설명한다. 실험에서는 LFM2.5-350M에 TRL 기반 GRPO를 적용하고 IFStruct로 학습 전후를 평가한다. 이 절차는 기존 IFStruct 소개 글에 등장한 강화학습 모델의 학습 파이프라인을 재현하려는 것이 아니라, 작은 모델의 과제별 미세조정 효과를 보여주려는 목적을 갖는다.

2. 학습과 평가 환경의 분리

실행 환경은 GPU를 사용하는 미세조정 단계와 로컬에서 수행할 수 있는 평가 단계로 나뉜다. 학습 노트북은 무료 등급 Colab 또는 Kaggle GPU에 맞춰 구성됐고, 평가에는 Apple M5 Max와 36GB 통합 메모리를 갖춘 MacBook Pro가 사용됐다. 로컬 추론은 llama.cpp가 제공하는 OpenAI 호환 서버를 통해 수행하며, IFStruct 평가기가 이 서버에 요청을 보낸다. 기본 모델은 BF16 GGUF로 제공하고, 서버에는 문맥 크기 32,768과 병렬 요청 수 4를 설정하며 가능한 경우 모든 레이어를 GPU로 옮기도록 지정한다. 전체 평가는 2,000개 샘플을 대상으로 스레드 4개와 최대 출력 토큰 2,048개를 사용해 실행한다.

3. 기본 모델의 기준 성능과 취약점

기본 LFM2.5-350M은 IFStruct에서 2,000개 중 452개를 통과해 22.6%를 기록했고, 평균 지연시간은 1,453ms였다. 이는 IFStruct 공개 글의 21.1%와 가까운 값이지만, 저자는 동일한 서빙 환경에서 비교하기 위해 직접 측정한 22.6%를 기준선으로 사용한다. 형식별 통과율은 JSON 18.0%, YAML 27.2%였으며, 최상위 구조별로는 래퍼 키를 갖는 출력이 28.5%, 최상위 목록이 16.6%였다. 오류 집계에서는 필수 필드 누락 7,228회, 잘못된 항목 수 738회, 타입 불일치 540회가 나타났고, 닫히지 않은 코드 블록과 불필요한 필드도 보고됐다. 따라서 기본 모델의 어려움은 파싱 가능성뿐 아니라 필드 구성, 항목 수, 요청된 최상위 구조의 준수까지 걸쳐 있었다.

4. 평가 과제와의 차이를 보완한 학습 데이터

학습에는 프롬프트마다 목표 JSON Schema와 예상 필드 수가 연결된 nvidia/Nemotron-RL-instruction_following-structured_outputs 데이터의 약 500개 샘플을 사용한다. 저자는 이 데이터의 분포가 IFStruct 평가와 다르기 때문에 두 가지 차이를 줄이도록 프롬프트를 보강한다. 먼저 전체의 40%에는 출력을 코드 블록 안에 반환하라는 지시를 덧붙여, 항상 원시 JSON만 출력하는 대신 요청된 형식을 따르도록 학습한다. 이 집합과 겹치지 않는 20%는 기존 스키마를 배열로 감싸고 필요한 항목 수를 지정해 최상위 배열 과제로 바꾼다. 두 번째 보강은 최상위 목록 출력과 항목 수 준수를 겨냥하며, 원문은 이를 학습 데이터와 평가 과제 사이의 간극을 줄이는 장치로 설명한다.

5. LoRA 적용과 세 가지 구조 보상

LFM2.5-350M에는 LoRA 어댑터를 부착하며, 어텐션과 합성곱을 결합한 모델 구조에 맞춰 q_proj, k_proj, v_proj, out_proj, in_proj, w1, w2, w3 모듈을 대상으로 삼는다. LoRA 순위는 16, 알파는 32로 설정하며, 학습되는 파라미터는 약 600만 개로 전체의 약 1.66%다. 각 응답에는 0부터 1까지의 범위를 갖는 세 보상을 적용하는데, 형식 보상은 요청된 형태에 맞으면 1.0, 파싱은 가능하지만 형태가 다르면 0.2, 파싱이 불가능하면 0.0을 부여한다. 필드 수 보상은 예상 개수와 정확히 일치할 때 만점을 주고 차이에 따라 선형으로 감소하며, 스키마 보상은 제약 위반을 세고 필수 키 충족 여부를 부분 점수의 조건으로 사용한다. 최종 보상은 형식, 필드 수, 스키마 검증에 각각 1.0, 0.5, 2.0의 가중치를 적용해 합산한다.

6. 100단계 GRPO 학습과 가중치 병합

GRPO 학습은 무료 등급의 16GB GPU를 기준으로 구성하며, 프롬프트 그룹당 응답 8개를 생성하면서 총 100단계 진행한다. 학습률은 0.00005, 준비 단계는 10단계이고, 장치별 배치 크기 4와 기울기 누적 8단계를 사용하며 최대 응답 길이는 중첩 JSON을 수용하도록 1,024토큰으로 설정한다. 샘플링 온도는 그룹 내 응답 다양성을 위해 1.1로 두고, 기준 모델에 대한 KL 페널티 계수는 0.01로 지정한다. 원문은 학습 중 세 보상 성분이 모두 상승하고, 준비 단계 이후 기준 모델과의 KL 값이 0에서 벗어나며, 길이 제한으로 잘린 응답 비율은 거의 0에 머물렀다고 보고한다. 학습이 끝나면 LoRA 어댑터를 기본 가중치에 병합하고 모델과 토크나이저를 저장해, 별도 어댑터 없이 사용할 수 있는 체크포인트를 만든다.

7. 동일한 서빙 조건에서 확인한 개선

미세조정된 체크포인트는 llama.cpp의 변환 스크립트로 BF16 GGUF 파일로 바꾼 뒤 로컬 서버에 올린다. 기본 모델과 같은 문맥 크기, 병렬 요청 수, 평가 데이터 및 출력 토큰 한도를 적용해 IFStruct 전체 평가를 다시 수행한다. 결과는 2,000개 중 594개 통과로 29.7%였으며, 기본 모델보다 통과 건수가 142개 늘고 통과율은 7.1%포인트 상승했다. JSON은 180개에서 319개로 통과 건수가 늘며 18.0%에서 31.9%로 개선됐지만, YAML은 272개에서 275개로 증가해 27.2%에서 27.5%로 소폭 변했다. 최상위 목록의 통과율은 16.6%에서 29.7%로 높아졌고, 래퍼 키 구조도 28.5%에서 29.7%로 올라 학습 후 두 구조의 통과율이 같아졌다.

8. 남은 오류와 개선의 범위

전체 통과율은 개선됐지만 평균 지연시간은 1,453ms에서 1,518ms로 65ms 늘었고, 모든 세부 과제가 좋아진 것은 아니다. 예를 들어 행사 티켓 예약은 45.8%에서 57.9%로 상승했지만, 카메라 리뷰는 7.2%에서 6.0%로, 인터뷰 대화 구간은 26.2%에서 16.2%로 하락했다. 오류 집계에서도 필수 필드 누락은 7,228회에서 7,331회로, 잘못된 항목 수는 738회에서 890회로, 타입 불일치는 540회에서 555회로 늘었다. 이 수치는 전체 통과 샘플의 증가와 개별 제약 위반 횟수의 감소가 같은 결과가 아님을 보여주므로, 두 지표를 구분해 해석해야 한다. 제공된 본문에는 더 큰 모델과의 직접 비교 결과가 제시되지 않아, 확인된 성과는 해당 소규모 모델의 학습 전후 구조 준수 개선 범위로 정리할 수 있다.

🧾 핵심 주장 / 시사점

  • 약 500개 샘플과 100단계 학습으로 얻은 7.1%포인트 개선은 구조 준수를 직접 평가하는 보상으로 소규모 모델의 특정 과제 성능을 높일 수 있음을 보여준다.
  • JSON과 최상위 목록의 개선 폭에 비해 YAML 변화가 작다는 점은 전체 점수만으로는 형식별 개선 범위를 충분히 설명할 수 없음을 보여준다.
  • 통과율 상승과 일부 오류 집계 증가가 함께 나타났으므로, 완전히 통과한 샘플 수와 개별 제약 위반 횟수는 별도로 해석할 필요가 있다.

✅ 액션 아이템

  • 동일한 llama.cpp·BF16 환경에서 LFM2.5-350M의 100단계 GRPO 학습 전후 IFStruct 통과율 비교 재현.
  • JSON·YAML·최상위 목록의 통과율을 구분해 형식별 개선 범위 확인.
  • 평균 지연시간 1,453ms와 1,518ms의 차이 및 필수 필드 누락·잘못된 항목 수·타입 불일치 집계 증가를 함께 검토.

❓ 열린 질문

  • JSON 통과율이 18.0%에서 31.9%로 상승한 반면 YAML은 27.2%에서 27.5%로 변한 이유는 무엇인가?
  • 코드 블록 지시 40%와 최상위 배열 과제 20%는 각각 IFStruct 통과율 개선에 얼마나 기여했는가?
  • IFStruct 통과 건수가 452개에서 594개로 늘었는데도 필수 필드 누락·잘못된 항목 수·타입 불일치 집계가 증가한 이유는 무엇인가?

관련 문서

공통 태그와 주제 흐름을 기준으로 같이 보면 좋은 문서를 이어서 제안합니다.