주요 컨텐츠로 이동

(번역: Roy Bang) Original Blog Post

신경망 기반 기술과 대규모 언어 모델(LLM) 연구가 급속도로 발전함에 따라 기업들은 가치 창출을 위한 AI 애플리케이션에 점점 더 많은 관심을 보이고 있습니다. 이들은 분류, 요약, 순차적 작업, 제어된 텍스트 생성 등 텍스트 관련 과제를 해결하기 위해 생성 및 비생성 등 다양한 머신 러닝 접근 방식을 사용합니다. 조직은 타사 API를 선택할 수도 있지만, 자체 데이터로 모델을 미세 조정하면 도메인에 특화된 적절한 결과를 얻을 수 있으므로 다양한 환경에 안전하게 배포할 수 있는 비용 효율적이고 독립적인 솔루션을 구현할 수 있습니다.

미세 조정을 위한 전략을 선택할 때는 효율적인 리소스 활용과 비용 효율성을 보장하는 것이 중요합니다. 이 블로그에서는 이러한 매개변수 효율적 방법 중 가장 인기 있고 효과적인 변형인 저순위 적응(LoRA, 생성형 AI 경험을 강화하는 기술)을 살펴보고, 특히 QLoRA(LoRA의 훨씬 더 효율적인 변형)에 대해 중점적으로 설명합니다. 여기서는 개방형 대규모 언어 모델을 사용하여 제품 이름과 카테고리를 입력할 때 가상의 제품 설명을 생성하도록 미세 조정하는 방식으로 접근합니다. 이 연습을 위해 선택한 모델은 허용 라이선스(Apache 2.0)가 있는 개방형 대규모 언어 모델인 OpenLLaMA-3b-v2이며, 선택한 데이터 세트는 레드닷 디자인 어워드 제품 설명으로, 두 가지 모두 제공된 링크의 허깅페이스 허브에서 다운로드할 수 있습니다.

Fine-Tuning, LoRA 그리고 QLoRA

언어 모델 영역에서는 특정 데이터에 대해 특정 작업을 수행하도록 기존 언어 모델을 미세 조정하는 것이 일반적인 관행입니다. 여기에는 필요한 경우 작업별 헤드를 추가하고 훈련 과정에서 backpropagation을 통해 신경망의 가중치를 업데이트하는 작업이 포함됩니다. 이 미세 조정 프로세스와 처음부터 학습하는 것의 차이점을 알아두는 것이 중요합니다. 후자의 시나리오에서는 모델의 가중치가 무작위로 초기화되는 반면, 미세 조정에서는 사전 학습 단계에서 가중치가 이미 어느 정도 최적화되어 있습니다. 어떤 가중치를 최적화 또는 업데이트할지, 어떤 가중치를 동결할지는 선택한 기술에 따라 결정됩니다.

전체 미세 조정에는 신경망의 모든 레이어를 최적화하거나 훈련하는 작업이 포함됩니다. 이 접근 방식은 일반적으로 최상의 결과를 얻을 수 있지만, 리소스와 시간이 가장 많이 소요되는 방식이기도 합니다.

다행히도 효과적인 것으로 입증된 미세 조정을 위한 매개변수 효율적 접근 방식이 존재합니다. 대부분의 이러한 접근 방식은 성능이 떨어지지만, Low Rank Adaptation(LoRA)은 치명적인 망각(미세 조정 과정에서 사전 학습된 모델의 지식이 손실될 때 발생하는 현상)을 방지하여 경우에 따라 전체 미세 조정보다 성능이 더 뛰어난 경우도 있어 이러한 추세를 반전시켰습니다.

LoRA는 사전 학습된 대규모 언어 모델의 가중치 행렬을 구성하는 모든 가중치를 미세 조정하는 대신, 이 큰 행렬을 근사화하는 두 개의 작은 행렬을 미세 조정하는 개선된 미세 조정 방식입니다. 이러한 행렬이 LoRA 어댑터를 구성합니다. 이렇게 미세 조정된 어댑터는 사전 학습된 모델에 로드되어 추론에 사용됩니다.

QLoRA는 사전 학습된 모델을 양자화된 4비트 가중치(LoRA의 경우 8비트)로 GPU 메모리에 로드하는 메모리 효율성이 훨씬 더 높은 LoRA 버전으로, LoRA와 유사한 효과를 유지합니다. 이 방법을 살펴보고, 필요할 경우 두 가지 방법을 비교하며, 가장 빠른 학습 시간으로 최적의 성능을 달성하기 위한 QLoRA 하이퍼파라미터의 최적 조합을 찾아내는 것이 이 글의 초점입니다.

LoRA는 허깅페이스 파라미터 효율적 미세 조정(PEFT) 라이브러리에서 구현되어 사용이 간편하며, bitsandbytesPEFT를 함께 사용하여 QLoRA를 활용할 수 있습니다. 허깅페이스 트랜스포머 강화 학습(TRL) 라이브러리는 LoRA를 위한 원활한 통합과 함께 감독 미세 조정을 위한 편리한 트레이너를 제공합니다. 이 세 가지 라이브러리는 원하는 속성을 나타내는 지침을 입력하면 선택한 사전 학습 모델을 미세 조정하여 일관되고 설득력 있는 제품 설명을 생성하는 데 필요한 도구를 제공합니다.

Supervised Fine Tuning을 위한 데이터 준비하기

Instruction을 따르는 모델을 미세 조정하는 데 QLoRA의 효과를 조사하려면 데이터를 superviced fine-tuning에 적합한 형식으로 변환하는 것이 필수적입니다. Supervised fine-tuning은 본질적으로 사전 학습된 모델이 제공된 프롬프트에 따라 조건이 지정된 텍스트를 생성하도록 추가 학습하는 것입니다. 프롬프트-응답 쌍이 일관된 방식으로 형식이 지정된 데이터 세트에서 모델을 미세 조정한다는 점에서 감독을 받습니다.

허깅 페이스 허브에서 선택한 데이터셋에서 관찰한 예는 다음과 같습니다:

product

category

description

text

"Biamp Rack Products"

"Digital Audio Processors"

"“High recognition value, uniform aesthetics and practical scalability – this has been impressively achieved with the Biamp brand language …"

"Product Name: Biamp Rack Products; Product Category: Digital Audio Processors; Product Description: “High recognition value, uniform aesthetics and practical scalability – this has been impressively achieved with the Biamp brand language …

 

 

이 데이터셋은 유용하지만 위에서 설명한 방식에 따라 인스트럭션을 위한 언어 모델을 미세 조정하는 데는 적합하지 않은 형식입니다.

 

다음 코드는 허깅페이스 허브에서 데이터셋을 메모리로 로드하고, 필요한 필드를 일관된 형식의 문자열로 프롬프트를 변환한 다음, 바로 뒤에 응답(즉, 설명)을 삽입합니다. 이 형식은 대규모 언어 모델 연구계에서 '알파카 형식'으로 알려져 있는데, 이는 메타에서 원래의 LlaMA 모델을 미세 조정하여 널리 배포된 최초의 명령어 추종 대규모 언어 모델 중 하나인 알파카 모델을 생성하는 데 사용된 형식이기 때문입니다(상업용으로 라이선스가 부여되지는 않음).

그런 다음 결과 프롬프트는 supervised fine-tuning을 위해 허깅페이스 데이터셋에 로드됩니다. 이러한 각 프롬프트의 형식은 다음과 같습니다.

빠른 실험을 위해 각 미세 조정 작업은 이 데이터의 5000개 관찰 observation subset에 대해 수행됩니다.

미세 조정 전 모델 성능 테스트

미세 조정을 하기 전에 미세 조정 없이 모델의 성능을 확인하여 사전 학습된 모델 성능의 기준선을 확보하는 것이 좋습니다.

모델은 다음과 같이 8비트로 로드할 수 있으며, 허깅페이스의 모델 카드에 지정된 형식으로 입력하라는 메시지가 표시됩니다.

얻은 결과물은 우리가 원하는 것과는 다릅니다.

결과의 첫 번째 부분은 실제로 만족스럽지만 나머지는 엉망진창에 가깝습니다.

마찬가지로, 앞서 설명한 대로 모델에 '알파카 형식'의 입력 텍스트를 입력하면 출력도 마찬가지로 최적이 아닌 것으로 예상됩니다:

그리고 당연히 그렇습니다:

모델은 학습된 작업을 수행하여 다음으로 가장 가능성이 높은 토큰을 예측합니다. 이 맥락에서 감독 미세 조정의 핵심은 제어 가능한 방식으로 원하는 텍스트를 생성하는 것입니다. 이후 실험에서 QLoRA는 가중치가 고정된 상태에서 4비트로 로드된 모델을 활용하지만, 출력 품질을 검사하는 추론 프로세스는 일관성을 위해 위와 같이 8비트로 로드된 후 수행됩니다.

The Turnable Knobs

PEFT를 사용하여 LoRA 또는 QLoRA로 모델을 학습시킬 때(앞서 언급했듯이 두 모델의 주요 차이점은 후자의 경우 미세 조정 과정에서 사전 학습된 모델이 4비트로 고정된다는 점입니다), 낮은 순위 적응 프로세스의 하이퍼파라미터는 아래와 같이 LoRA 구성에서 정의할 수 있습니다:

이 중 두 개의 하이퍼파라미터인 r과 target_modules는 경험적으로 adaptation 품질에 큰 영향을 미치는 것으로 나타났으며, 다음 테스트의 초점이 될 것입니다. 다른 하이퍼파라미터는 단순화를 위해 위에 표시된 값으로 일정하게 유지됩니다.

r은 미세 조정 과정에서 학습된 낮은 순위 행렬의 순위를 나타냅니다. 이 값이 증가하면 낮은 순위 적응 중에 업데이트해야 하는 매개변수의 수가 증가합니다. 직관적으로 r이 낮을수록 훈련 프로세스가 더 빠르고 계산 집약적이지 않을 수 있지만, 이렇게 생성된 모델의 품질에 영향을 미칠 수 있습니다. 그러나 r을 특정 값 이상으로 높여도 모델 출력의 품질이 눈에 띄게 향상되지 않을 수 있습니다. r 값이 적응(미세 조정) 품질에 어떤 영향을 미치는지는 곧 테스트될 예정입니다.

LoRA로 미세 조정할 때 모델 아키텍처의 특정 모듈을 대상으로 지정할 수 있습니다. Adaptation 프로세스는 이러한 모듈을 대상으로 하여 업데이트 매트릭스를 적용합니다. 'r'의 상황과 유사하게, LoRA 적응 과정에서 더 많은 모듈을 타깃팅하면 훈련 시간이 늘어나고 컴퓨팅 리소스에 대한 수요가 증가합니다. 따라서 트랜스포머의 주의 블록만 타깃팅하는 것이 일반적인 관행입니다. 그러나 최근 Dettmers 등의 QLoRA 논문에서 볼 수 있듯이 모든 선형 레이어를 타깃팅하면 적응 품질이 향상된다는 연구 결과가 있습니다. 여기에서도 이에 대해 살펴보겠습니다.

모델의 선형 레이어 이름은 다음 코드를 사용하여 목록에 편리하게 추가할 수 있습니다:

LoRA로 미세 조정하기

일반적으로 대규모 언어 모델을 미세 조정하는 개발자의 경험은 지난 1년여 동안 크게 향상되었습니다. 허깅페이스의 high level abastraction은 TRL 라이브러리의 SFTTrainer 클래스입니다. QLoRA를 수행하려면 다음만 있으면 됩니다:

1.  모델을 4비트로 GPU 메모리에 로드합니다(bitsandbytes를 사용하면 이 프로세스가 가능).

2.  위에서 설명한 대로 LoRA 구성을 정의합니다.

3.  준비된 instruction의 훈련 및 테스트 분할을 허깅페이스 데이터셋 오브젝트에 데이터를 따라 정의합니다.

4. 훈련 argument를 정의합니다. 여기에는 epoch 수, 배치 크기 및 이 연습 중에 일정하게 유지될 기타 훈련 하이퍼파라미터가 포함됩니다.

5. 이 인수를 SFTTrainer 인스턴스에 전달합니다.

이러한 단계는 이 블로그와 관련된 리포지토리의 소스 파일에 명확하게 나와 있습니다.

실제 훈련 로직은 다음과 같이 잘 추상화되어 있습니다:

Databricks 워크스페이스에서 강력히 권장되는 MLFlow 자동 로그인을 활성화하면 모든 훈련 매개변수와 메트릭이 MLFlow 추적 서버를 통해 자동으로 추적 및 기록됩니다. 이 기능은 장기간 실행되는 훈련 작업을 모니터링하는 데 매우 유용합니다. 말할 필요도 없이, 미세 조정 프로세스는 GPU를 지원하는 최신 데이터브릭스 머신 런타임을 사용하여 생성된 컴퓨팅 클러스터(이 경우 단일 A100 GPU가 있는 단일 노드)를 사용하여 수행됩니다.

param_combo1

Hyperparameter 조합 #1: QLoRA 내 r=8, “q_proj”와 “v_proj” 타겟팅

첫 번째 시도된 QLoRA 하이퍼파라미터의 조합은 r=8이며, 적응을 위해 attention block, 즉 "q_proj"와 "v_proj"만을 대상으로 합니다.

다음 코드는 훈련 가능한 파라미터의 수를 보여줍니다:

이러한 선택으로 인해 모델이 구성하는 총 32억 개의 매개변수 중 2,662,400개의 매개변수(약 260만 개)가 미세 조정 과정에서 업데이트됩니다. 이는 모델 파라미터의 0.1%에도 미치지 못하는 수치입니다. 80GB의 GPU가 탑재된 단일 Nvidia A100에서 3회에 걸친 전체 미세 조정 프로세스는 약 12분밖에 걸리지 않습니다. GPU 사용률 메트릭은 클러스터 구성의 메트릭 탭에서 편리하게 확인할 수 있습니다.

gpu-utilization

학습 과정이 끝나면 다음과 같이 사전 학습된 모델에 어댑터 가중치를 로드하여 미세 조정된 모델을 얻습니다:

이제 이 모델을 다른 모델과 마찬가지로 추론에 사용할 수 있습니다.

정성적 평가

몇 가지 예제 프롬프트-응답 쌍이 아래에 나열되어 있습니다.

Prompt(알파카 형식으로 모델에 전달되며, 여기서는 간결성을 위해 표시되지 않음):

Create a detailed description for the following product: Corelogic Smooth Mouse, belonging to category: Optical Mouse

Response:

Prompt:

Create a detailed description for the following product: Hoover Lightspeed, belonging to category: Cordless Vacuum Cleaner

Response:

이 모델은 보다 일관된 설명을 생성하기 위해 분명히 조정되었습니다. 그러나 광학 마우스에 대한 첫 번째 프롬프트에 대한 응답이 매우 짧고 "진공 청소기에는 먼지통을 통해 비울 수 있는 먼지통이 장착되어 있습니다"라는 문구가 논리적으로 결함이 있습니다.

Hyperparameter 조합 #2: QLoRA 내 r=16 과 모든 선형 레이어 타겟팅

물론 여기서도 개선할 수 있습니다. 적응 과정에서 학습된 낮은 순위 행렬의 순위를 16으로 늘리는 것, 즉 r의 값을 16으로 두 배로 늘리고 다른 모든 값을 동일하게 유지하는 것을 고려해 볼 가치가 있습니다. 이렇게 하면 학습 가능한 파라미터 수가 5,324,800개(약 530만 개)로 두 배가 됩니다.

정성적 평가

그러나 출력 품질은 동일한 프롬프트에 대해 변경되지 않습니다.

Prompt:

Create a detailed description for the following product: Corelogic Smooth Mouse, belonging to category: Optical Mouse

Response:

Prompt:

Create a detailed description for the following product: Hoover Lightspeed, belonging to category: Cordless Vacuum Cleaner

Response:

세부 정보를 사용할 수 있는 세부 정보에서도 동일한 세부 정보 부족과 논리적 결함이 계속 발생합니다. 이렇게 미세 조정된 모델을 실제 시나리오에서 제품 설명 생성에 사용한다면 이는 허용되지 않는 결과물입니다.

Hyperparameter 조합 #3: QLoRA 내 r=8 그리고 모든 선형 레이어 타겟팅

r을 두 배로 늘린다고 해서 출력 품질이 눈에 띄게 향상되는 것은 아니므로 다른 중요한 knob를 변경하는 것이 좋습니다. 즉, attension block만 타겟팅하는 것이 아니라 모든 선형 레이어를 타겟팅하는 것이 좋습니다. 여기서 LoRA 하이퍼파라미터는 r=8이고 target_layers는 'q_proj', 'k_proj', 'v_proj', 'o_proj', 'gate_proj', 'down_proj', 'up_proj', 'lm_head' 입니다. 이렇게 하면 업데이트되는 파라미터 수가 12,994,560개로 증가하고 훈련 시간이 약 15.5분으로 늘어납니다.

정성적 평가

모델에 동일한 프롬프트를 입력하면 다음과 같은 결과가 표시됩니다:

Prompt:

Create a detailed description for the following product: Corelogic Smooth Mouse, belonging to category: Optical Mouse

Response:

Prompt:

Create a detailed description for the following product: Hoover Lightspeed, belonging to category: Cordless Vacuum Cleaner

Response:

이제 가상의 광학 마우스에 대한 다소 긴 일관된 설명을 볼 수 있으며 진공 청소기에 대한 설명에 논리적 결함이 없습니다. 제품 설명은 논리적 일뿐만 아니라 관련성이 있습니다. 다시 한 번 말씀드리지만, 이러한 비교적 높은 품질의 결과는 일관된 방식으로 포맷된 총 5000개의 프롬프트-설명 쌍으로 구성된 데이터 세트를 사용하여 모델의 가중치를 1% 미만으로 미세 조정함으로써 얻을 수 있습니다.

Hyperparameter 조합 #4: LoRA 내 r=8 그리고 모든 선형 레이어 타겟팅

또한 사전 학습된 모델을 4비트 대신 8비트로 고정할 경우 모델의 출력 품질이 향상되는지 살펴볼 가치가 있습니다. 즉, QLoRA 대신 LoRA를 사용하여 정확한 미세 조정 프로세스를 복제하는 것입니다. 여기서 LoRA 하이퍼파라미터는 새로 발견된 최적 구성, 즉 r=8로 이전과 동일하게 유지되며 적응 프로세스 중에 모든 선형 트랜스포머 레이어를 대상으로 합니다.

정성적 평가

이 글 전체에서 사용된 두 가지 프롬프트의 결과는 다음과 같습니다:

Prompt:

Create a detailed description for the following product: Corelogic Smooth Mouse, belonging to category: Optical Mouse

Response:

Prompt:

Create a detailed description for the following product: Hoover Lightspeed, belonging to category: Cordless Vacuum Cleaner

Response:

다시 말하지만, 출력 텍스트의 품질은 크게 개선되지 않았습니다.

주요 관찰 사항

위의 일련의 실험과 QLoRA를 소개하는 우수한 논문에 자세히 설명된 추가 증거를 바탕으로, r(적응 중에 업데이트되는 행렬의 순위)의 값이 특정 지점을 넘어서면 적응 품질을 향상시키지 못한다는 것을 추론할 수 있습니다. 가장 큰 개선은 LoRA 및 QLoRA를 자세히 설명하는 기술 문헌에 일반적으로 기술된 바와 같이 attention block만이 아닌 적응 프로세스의 모든 선형 레이어를 타겟팅할 때 관찰됩니다. 위에서 수행한 실험과 기타 경험적 증거에 따르면 QLoRA는 LoRA에 비해 생성된 텍스트의 품질이 눈에 띄게 저하되지 않습니다.

배포 시 LoRA 어댑터 사용에 대한 추가 고려 사항

어댑터 사용을 최적화하고 이 기술의 한계를 이해하는 것이 중요합니다. 미세 조정을 통해 얻은 LoRA 어댑터의 크기는 일반적으로 몇 메가바이트에 불과하지만, 사전 학습된 기본 모델은 메모리와 디스크에 몇 기가바이트가 될 수 있습니다. 추론하는 동안 어댑터와 사전 학습된 LLM을 모두 로드해야 하므로 메모리 요구량은 비슷하게 유지됩니다.

또한 사전 학습된 LLM과 어댑터의 가중치가 병합되지 않으면 추론 지연 시간이 약간 증가합니다. 다행히도 PEFT 라이브러리를 사용하면 아래와 같이 한 줄의 코드로 가중치와 어댑터를 병합하는 프로세스를 수행할 수 있습니다:

아래 그림은 어댑터 미세 조정부터 모델 배포까지의 프로세스를 간략하게 설명합니다.

blogimg3

어댑터 패턴은 상당한 이점을 제공하지만, 어댑터를 병합하는 것이 보편적인 솔루션은 아닙니다. 어댑터 패턴의 한 가지 장점은 작업별 어댑터를 사용하여 하나의 대규모 사전 학습된 모델을 배포할 수 있다는 점입니다. 이렇게 하면 사전 학습된 모델을 여러 작업의 백본으로 활용하여 효율적으로 추론할 수 있습니다. 하지만 가중치를 병합하면 이러한 접근 방식이 불가능해집니다. 가중치를 병합할지 여부는 특정 사용 사례와 허용 가능한 추론 지연 시간에 따라 결정됩니다. 그럼에도 불구하고 LoRA/QLoRA는 매개변수를 효율적으로 미세 조정하는 데 매우 효과적인 방법이며 널리 사용되고 있습니다.

결론

Low Rank Adaptation은 올바른 구성과 함께 사용하면 훌륭한 결과를 얻을 수 있는 강력한 미세 조정 기법입니다. 적응 중에 올바른 순위 값과 타겟팅할 신경망 아키텍처의 레이어를 선택하면 미세 조정된 모델의 출력 품질이 결정될 수 있습니다. QLoRA를 사용하면 적응 품질을 유지하면서 메모리를 추가로 절약할 수 있습니다. 미세 조정이 수행되더라도 조정된 모델이 올바른 방식으로 배포되도록 하기 위해 몇 가지 중요한 엔지니어링 고려 사항이 있습니다.

요약해서 단일 A100에서 5000개의 observation에 대해 3번의 epoch에 대해 OpenLLaMA-3b-v2를 미세 조정할 때 시도된 다양한 LoRA 파라미터 조합, 텍스트 품질 출력 및 업데이트된 파라미터 수를 나타내는 간결한 표가 아래에 나와 있습니다.

r

target_modules

Base model weights

Quality of output

Number of parameters updated (in millions)

8

Attention blocks

4

low

2.662

16

Attention blocks

4

low

5.324

8

All linear layers

4

high

12.995

8

All linear layers

8

high

12.995

데이터브릭스에서 사용해 보세요! 블로그와 연결된 GitHub 리포지토리를 데이터브릭스 Repo에 복제하여 시작하세요. 데이터브릭에서 모델을 세밀하게 조정하기 위한 더 자세한 문서화된 예제는 여기에서 확인할 수 있습니다.

Databricks 무료로 시작하기

관련 포스트

MLflow AI Gateway 및 Llama2를 사용하여 생성형 AI 앱 빌드하기

고객 지원 봇, 내부 지식 그래프 또는 Q&A 시스템을 구축하기 위해 고객은 종종 사전 학습된 모델과 독점 데이터를 함께 활용하는 검색 증강 생성(RAG)...

Databricks + MosaicML

오늘 우리는 기업을 위한 생성형 AI 모델을 만들고 맞춤화하기 위한 선도적인 플랫폼인 MosaicML의 인수를 완료했다는 소식을 전하게 되어 기쁩니다. Databricks를 설립한 이래로 Databricks의...
모든 엔지니어링 블로그 포스트 보기