Hugging Face Transformers 설계 철학
TL;DR
Hugging Face는 Transformers 라이브러리에서 "single model file" 정책을 적용하여, 표준 소프트웨어 엔지니어링의 DRY(중복 방지) 원칙을 의도적으로 거부합니다. 이 접근 방식은 모델의 forward pass에 필요한 모든 코드를 하나의 파일에 포함시켜, 기여의 용이성, 연구자를 위한 가독성, 그리고 급변하는 분야에서의 안정성을 우선시합니다.
단일 모델 파일 정책
Hugging Face는 모든 모델의 forward pass에 필요한 로직을 하나의 특정 파일에 담는 설계 철학을 구현합니다(예: BERT의 경우 modeling_bert.py). 라이브러리는 동일한 하위 구성 요소—예를 들어 attention 메커니즘—를 attention_layer.py와 같은 중앙 파일로 추상화하는 것을 명시적으로 피합니다. 이는 유사한 코드가 수십 개의 서로 다른 모델 파일에 중복될 수 있음을 의미합니다.
DRY를 거부하는 이유
오픈소스 기여 촉진
단일 모델 파일 구조는 외부 기여자들의 진입 장벽을 낮춥니다. 모델 코드를 분리함으로써, 하나의 모델에서 버그를 수정해도 다른 모델에 회귀가 발생할 가능성이 낮습니다. 이러한 독립성은 기여자들이 복잡한 중앙 추상화 구조를 이해하거나 무관한 모델이 깨질 위험을 감수하지 않고도 문제를 해결하거나 새로운 모델을 추가할 수 있게 합니다.
코드를 제품으로 우선시
Hugging Face는 모델링 코드를 사용자에게 제공되는 주요 제품으로 간주합니다. 많은 사용자가 라이브러리를 포크하거나 연구를 인용해 코드를 수정·적용하기 때문에, 모든 논리 구성 요소를 하나의 파일에 선형적이고 읽기 쉬운 순서로 제공하면 연구자의 적응력과 이해도가 향상됩니다.
급속한 ML 진화에 적응
머신러닝 연구는 너무 빠르게 진화하여 영구적인 "표준" 논리 패턴을 확립하기 어렵습니다. 구성 요소를 중앙화(예: attention layer)하면 새로운 변형이 등장하면서 명명 및 아키텍처 충돌이 발생합니다(T5의 상대 위치 임베딩이나 Reformer·BigBird의 청크드 어텐션 등). 이러한 구성 요소를 각각의 모델 파일에 유지함으로써, 라이브러리는 오래되거나 모호한 일반 명명 규칙의 위험을 피합니다.
정적 모델의 안정성
모델 아키텍처가 공개되어 Transformers에 통합되면, 핵심 구성 요소는 거의 변하지 않습니다. 모델은 정적이며 일반적으로 양방향 의존성을 갖지 않으므로(구형 모델이 최신 모델에 의존하는 경우가 없음), 전역 리팩터링이 필요할 경우가 거의 없습니다.
단일 파일 정책을 위반하지 않으면서 선행 모델과 후속 모델(예: DeBERTa와 DeBERTa-v2) 간의 동기화를 유지하기 위해, Hugging Face는 "복사 메커니즘"을 사용합니다. 이는 코드에 # Copied from <predecessor_model>.<function> 구문을 표시하는 방식이며, 도구가 자동으로 선행 모델 함수의 업데이트를 후속 모델 함수에 전파하도록 합니다.
트레이드오프와 단점
API 일관성
공유 추상화 없이 모델 간에 통합된 API를 유지하는 것은 더 어려워집니다. Hugging Face는 엄격한 리뷰 프로세스를 구현하고 매일 약 20,000개의 테스트를 실행하여 라이브러리 전반에 걸친 일관된 동작을 보장함으로써 이를 완화합니다.
구성 요소별 연구 통합
단일 파일 정책은 모든 모델에 적용 가능한 새로운 구성 요소를 제안하는 연구(예: Performer의 attention 메커니즘)를 통합하기 어렵게 만듭니다. 이러한 변경을 통합하려면 기존 모든 모델 파일을 수정해야 하며(정적 모델의 안정성을 위배) 또는 비현실적인 수많은 새로운 모델 파일을 생성해야 합니다. 이러한 경우, Hugging Face는 해당 연구가 큰 관심을 얻고 강력한 사전 학습 체크포인트를 제공하지 않는 한 통합을 포기할 수 있습니다.
Sources
- Original~Don't~ Repeat Yourself