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_prunedare_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 변형은 좋은 결과를 내지 못하는 것으로 관찰되었습니다.

Sources