저희는 내부적으로 1년 이상 사용해 온 파인튜닝(fine-tuning) 프레임워크인 DNA Factory를 오픈소스로 공개합니다. 이 프레임워크는 의도적으로 의견이 강하게 반영되어 있습니다. 즉, 권장되는 방법 하나만 제시하고, 문서화된 기본값(defaults), 토큰 레벨 손실 마스크 시각화(token-level loss-mask visualization) 기능을 제공하며, 오직 5가지 학습 방법(SFT, DPO, GRPO, OPD, SDFT)만을 지원합니다. https://github.com/dnotitia/dna-factory
왜 또 다른 학습 도구가 필요한가요? LLM 파인튜닝이 주류화되면서 수많은 학습 도구들이 등장했습니다. LLaMA-Factory도 그 역할을 했고, Axolotl은 이름만큼 유용했으며, NVIDIA(NeMo)와 Hugging Face(TRL) 역시 자체 프레임워크를 구축했습니다. 각각의 도구는 명확한 강점을 가지고 있습니다. 어떤 것은 빠르고, 어떤 것은 편리하며, 어떤 것은 뛰어난 호환성을 자랑합니다.
저희가 집중한 부분은 다른 것이었습니다. 바로 '올바르게 학습시키는 것'입니다. 저는 자체 LLM을 파인튜닝하는 여러 회사에 자문해 왔는데, 제대로 수행하는 곳은 손으로 셀 수 있을 정도였습니다. 대부분의 경우 잘못된 방식으로 학습시키거나, 생각했던 것과 다른 데이터를 가지고 학습시키고 있었습니다.
도구들은 너무 좋아져서 사용자가 그 작동 원리를 깊이 이해하지 못해도 학습을 시작할 수 있게 되었습니다. 하지만 LLM 학습은 근본적으로 매우 진보된 작업이며, 사람들이 도구를 사용하는 방법을 배우는 데만 집중하고 그 이면에 무슨 일이 일어나고 있는지 배우지 못하면 실수가 따르게 됩니다.
그래서 저희는 '올바른 학습 과정을 쉽게 만드는 방법'을 고민했고, 그 답이 바로 DNA Factory였습니다. 저희가 내부적으로 1년 이상 사용한 후 최근 오픈소스로 공개하게 되었습니다.
하나의 권장 방식 제공
핵심 아이디어는 단 하나의 접근 방식을 제공하는 것입니다. 즉, 저희가 찾은 가장 좋은 방법입니다. 만약 C++처럼 모든 옵션을 노출한다면 엄청난 자유도를 얻을 수 있지만, 사용하기 어렵게 됩니다. 저희는 파이썬다운(Pythonic) 경로를 택했습니다('명백하게 따라야 할 하나의 방식이 있어야 한다'). 저희는 많은 접근 방식을 테스트했고 가장 좋은 것을 골라 그것만을 배포합니다. 모든 기본값은 configs/_defaults-*.yaml에 있습니다. 사용자는 이 파일을 편집할 필요가 없습니다. 필요한 부분만 덮어쓰기(override)하면 됩니다. 이는 VSCode 설정과 유사하게 작동합니다. 기본값들은 길고 복잡하지만, 각각 왜 그렇게 설정되었는지 문서화되어 있습니다. 사용자는 그것들을 읽고 자신의 설정 파일에 변경 사항만을 추가하면 됩니다.
어떤 토큰으로 학습하는지 정확히 확인할 수 있습니다. Axolotl을 사용했을 때 저는 손실 마스킹(loss-masking) 시각화 기능이 정말 좋았습니다. 저희도 비슷한 것을 원했기 때문에 TRL의 손실 함수를 오버라이드하여 ANSI 코드로 토큰에 색상을 입혔습니다. 손실에 포함된 토큰은 파란색이고, 제외된 토큰은 회색입니다. 실제로 무엇이 학습되고 있는지 즉시 알 수 있습니다. 이것은 제가 연구자들이 저지르는 가장 흔한 실수 중 하나입니다. "잠깐, 그 토큰이 내내 손실에 포함되어 있었어?" DNA Factory에서는 한눈에 보이기 때문에 그런 실수가 발생하지 않습니다. 이 기능만으로도 도구가 사용할 가치가 있다는 피드백을 많이 받았습니다.
의도적으로 5가지 학습 방법만 포함했습니다. 모든 기법을 포함하려고 노력하지 않았습니다. 만약 그렇게 하고 싶다면 TRL을 직접 사용하세요. 저희는 현재 가장 잘 작동한다고 생각하는 것들, 즉 SFT(기준선), DPO, GRPO, OPD, 그리고 SDFT를 선택했습니다. PPO는 한때 널리 사용되었지만 지금은 거의 사용되지 않기 때문에 제외했습니다. DPO 역시 요즘에는 거의 사용되지 않아 곧 제거할 계획입니다. https://github.com/dnotitia/dna-factory/issues/46
저희의 현재 작업 대부분은 GRPO 및 기타 온-정책(on-policy) 방법들로 이루어져 있습니다. GRPO, OPD, 그리고 SDFT는 모두 온-정책 방식입니다. 고전적인 증류(distillation)는 학생이 선생님을 모방하는 것입니다. 구체적으로는 교사(teacher)와 학생(student)의 출력 분포(logits) 간의 KL 발산(KL divergence)을 최소화합니다. 이는 학생을 개선하지만, 파국적 망각(catastrophic forgetting)은 항상 위험 요소입니다. (이처럼 극적인 이름을 얻으려면 모델이 꽤 심하게 무언가를 잊어야 합니다.) 강력한 모델을 가져와 내부 회사 데이터로 미세 조정하여 도메인 지식을 추가하면, 일반 성능이 눈에 띄게 떨어지고 환각(hallucination)률은 올라갑니다. 단순히 주입하는 방식에는 한계가 있습니다.
OPD는 이 과정을 역전시킵니다. 교사가 학생이 복사할 답안을 작성해 주지 않습니다. 대신, 학생이 먼저 자신의 답안을 작성하고, 교사가 토큰별로 이를 채점합니다. 기술적으로 이는 역(reverse) KL을 사용합니다. 학생은 이미 알고 있던 것을 잊지 않으면서 새로운 지식을 습득합니다. SDFT는 정신적으로 같은 방식으로 작동하지만, 이름에서 알 수 있듯이 별도의 교사가 없습니다. 모델 자체가 자신의 교사 역할을 합니다.
추가 정보(특권적 컨텍스트, privileged context)가 주어진 모델 복사본이 교사 역할을 합니다. 학생은 스스로의 응답을 '스스로이지만 정답을 아는 존재'에 의해 평가받음으로써 학습합니다. 다시 한번, 목표는 파국적 망각(catastrophic forgetting)을 피하는 것입니다.
결과: 망각 없이 도메인 지식 주입
첨부된 이미지는 도메인 지식 주입으로 학습된 저희의 DNA 3.2 모델(아직 출시되지 않음)입니다. Qwen3.8 Flash Next부터 시작하여, 우리는 그 모델의 검열(censorship)을 효과적으로 제거했고(0.542 -> 0.971), 새로운 페르소나와 새로운 도메인 지식을 가르쳤습니다(0.076 -> 0.855). AIME, IFEval, MMLU-Pro, GPQA 및 기타 기존 벤치마크에서의 성능은 전혀 떨어지지 않았습니다. 그것은 이전 지식을 잊지 않으면서 새로운 것을 배웠습니다.
질문에 답변드리게 되어 기쁩니다. 피드백, 이슈 및 PR은 모두 환영합니다. 제출자: /u/likejazz [링크] [댓글]