Hugging Face PEFT 새로운 LoRA 병합 방법
Hugging Face는 PEFT 라이브러리에 여러 새로운 병합 방법을 통합하여, 개발자가 동일한 기본 모델에서 파생된 여러 LoRA 어댑터를 결합할 수 있게 했습니다. 이 업데이트를 통해 모델 기능을 실시간으로 합성할 수 있게 되며, 단일 병합 어댑터가 여러 전문 어댑터의 결합된 지식을 필요로 하는 작업을 수행할 수 있습니다.
지원되는 LoRA 병합 방법
PEFT는 이제 다양한 병합 알고리즘을 지원하며, 각 알고리즘은 어댑터 가중치(행렬 $A$와 $B$)를 다르게 처리하여 성능과 메모리 사용량 사이의 균형을 맞춥니다.
연관 (cat)
연관은 LoRA 어댑터의 정확한 가중치 병합입니다. 참여 어댑터의 $A$와 $B$ 행렬을 연결(concatenate)하여 서로 다른 랭크를 가질 수 있게 합니다. 이 방법은 일반적으로 좋은 결과를 제공하지만, 많은 수의 어댑터를 결합하면 어댑터 크기가 증가하고 메모리 부족(OOM) 오류가 발생할 수 있습니다.
선형/작업 산술 (linear)
"Editing Models with Task Arithmetic" 논문을 기반으로, 이 방법은 개별 $A$와 $B$ 행렬의 가중합을 수행합니다. 이 접근법은 모든 참여 LoRA 어댑터가 동일한 랭크를 가져야 합니다.
특이값 분해 (svd)
SVD는 곱 $BA$(델타 가중치)를 작업 가중치로 간주합니다. 병합된 델타 가중치를 계산한 뒤 SVD를 적용해 새로운 $A$와 $B$ 행렬을 근사합니다. 이 방법은 서로 다른 랭크를 가진 어댑터를 지원하며, 결과 병합 어댑터의 랭크를 사용자가 지정할 수 있지만 GPU 메모리를 많이 사용합니다.
TIES (ties, ties_svd)
TIES(TRIM, ELECT SIGN & MERGE)는 모델 병합 시 간섭을 해결합니다. 작업 가중치의 가장 작은 값들을 density 비율에 따라 가지치고, 다수 서명 마스크를( total 크기 또는 frequency 서명 빈도 사용) 계산한 뒤, 분리 병합을 수행합니다. 표준 버전과 SVD 변형 두 가지가 제공됩니다.
DARE (dare_linear, dare_ties, dare_linear_svd, dare_ties_svd)
DARE는 1-density 비율에 따라 작업 가중치를 무작위로 가지치고, 남은 가중치를 1/density 로 재스케일합니다. DARE는 Linear/Task Arithmetic 또는 TIES 방법과 결합할 수 있는 플러그인 역할을 합니다.
크기 기반 가지치기 (magnitude_prune, magnitude_prune_svd)
이 방법은 density 비율에 따라 작업 가중치의 가장 작은 값들을 가지치고, 남은 작업 텐서들의 가중합을 수행합니다. 표준 버전과 SVD 변형 두 가지가 제공됩니다.
구현 및 기능
사용자는 PEFT의 add_weighted_adapter() 클래스 메서드를 사용해 이러한 방법을 구현할 수 있습니다.
전문화된 기능 결합
어댑터를 병합하면 개별 어댑터가 단독으로 처리할 수 없던 사용 사례를 모델이 지원하게 됩니다. 예를 들어, "정신 건강" 어댑터와 "힌글리시"(힌디어‑영어) 언어 어댑터를 결합하면 모델이 힌글리시로 구체적인 정신 건강 조언을 제공할 수 있게 되며, 개별 어댑터는 각각 영어로만 조언을 제공하거나 힌글리시 스타일만 제공했습니다.
텍스트‑이미지 생성으로 확장
이 병합 방법은 🤗Diffusers 라이브러리를 통한 텍스트‑이미지 생성에도 적용됩니다. LoRA 체크포인트에서 PeftModel을 얻고 add_weighted_adapter()를 사용하면, 서로 다른 스타일이나 주제의 LoRA(예: "toy-face" LoRA와 "Pixel-Art" LoRA)를 결합해 두 특성을 모두 반영한 이미지를 생성할 수 있습니다.
기술적 관찰 및 권장 사항
Hugging Face의 테스트를 기반으로, 병합 방법을 선택할 때 다음 가이드라인을 권장합니다:
- 시작점: 대부분의 시나리오에서 가장 좋은 결과를 얻기 위해 어댑터 수가 적을 경우
cat방법부터 시작하십시오. - 대체 선형 방법:
cat이 충분하지 않을 경우, 순서대로linear,magnitude_prune,dare_linear를 시도하십시오.magnitude_prune와dare_linear에 대해서는density값을 0.7~0.8 사이로 설정하는 것이 권장됩니다. - TIES 설정:
ties를 사용할 때majority_sign_method="frequency"가 기본값total보다 종종 더 좋은 성능을 보입니다. 시작density값은 0.5를 권장합니다. - SVD 변형: 서로 다른 랭크를 가진 Stable Diffusion LoRA 어댑터를 다룰 때는
*svd계열 방법을 사용하십시오. SVD 연산은 계산 비용이 크고 더 많은 GPU 메모리를 요구합니다. - DARE 성능:
dare_ties변형은 좋은 결과를 내지 못하는 것으로 관찰되었습니다.