1. 소개
미세 조정이 중요한 이유
기반 모델은 일반적인 용도로 학습되며 제대로 작동하지 않을 때도 있습니다. 이는 모델에서 수행하려는 작업이 프롬프트 설계만 사용해서는 모델을 학습시키기 어려운 전문 작업이기 때문일 수 있습니다. 이러한 경우 모델 조정을 사용하여 특정 작업에 대한 모델 성능을 개선할 수 있습니다. 모델 조정은 지침이 충분하지 않은 경우 특정 출력 요구사항을 준수하는 데도 도움이 됩니다. 대규모 언어 모델 (LLM)은 방대한 양의 정보를 가질 수 있고 많은 작업을 수행할 수 있지만, 전문 교육을 받아야만 뛰어난 성능을 발휘합니다. 미세 조정을 통해 LLM을 학습시킬 수 있으므로 선행 학습된 LLM을 특정 니즈에 맞게 조정할 수 있습니다.
이 Codelab에서는 LLM 모델에 지도 조정 접근 방식을 사용하여 미세 조정을 실행하는 방법을 알아봅니다.
지도 조정은 새로운 스킬을 학습하여 모델의 성능을 개선합니다. 라벨이 지정된 수백 개의 예가 포함된 데이터를 사용하여 원하는 동작이나 작업을 모방하도록 모델을 학습시킵니다. 입력 텍스트 (프롬프트)와 출력 텍스트 (응답)에 대해 라벨이 지정된 데이터 세트를 제공하여 모델에 특정 사용 사례에 맞게 응답을 맞춤설정하는 방법을 알려 보겠습니다.
모델 맞춤설정에 대한 자세한 내용은 여기에서 확인할 수 있습니다.
빌드할 항목
사용 사례: 뉴스 기사 헤드라인 생성
뉴스 기사의 헤드라인을 자동으로 생성한다고 가정해 보겠습니다. Vertex AI를 사용하면 특정 스타일로 적절하게 요약된 제목을 생성하고 뉴스 채널의 가이드라인에 따라 제목을 맞춤설정하는 LLM을 미세 조정할 수 있습니다.
이 Codelab에서는 다음 작업을 수행합니다.
BBC FULLTEXT DATA
(BigQuery 공개 데이터 세트bigquery-public-data.bbc_news.fulltext
에서 제공)를 사용합니다.- LLM (
text-bison@002
)을 'bbc-news-summary-tuned
'라는 새로운 미세 조정된 모델로 미세 조정합니다. 결과를 기본 모델의 응답과 비교합니다. 이 Codelab에서 사용할 수 있는 샘플 JSONL 파일은 저장소에서 제공됩니다. 파일을 Cloud Storage 버킷에 업로드하고 다음과 같은 세부 조정 단계를 실행할 수 있습니다. - 데이터 준비: 예시 코드에 사용된 BBC News 데이터 세트와 같이 뉴스 기사와 해당하는 헤드라인의 데이터 세트로 시작합니다.
- 선행 학습된 모델 세부 조정: '
text-bison@002
'과 같은 기본 모델을 선택합니다. Python용 Vertex AI SDK를 사용하여 뉴스 데이터로 미세 조정합니다. - 결과 평가: 미세 조정된 모델의 실적을 기본 모델과 비교하여 광고 제목 생성 품질이 개선되었는지 확인합니다.
- 모델 배포 및 사용: API 엔드포인트를 통해 미세 조정된 모델을 사용할 수 있도록 하고 새 기사의 헤드라인을 자동으로 생성합니다.
2. 시작하기 전에
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
- Colab 노트북을 열고 현재 활성 상태인 Google Cloud 계정과 동일한 계정으로 로그인합니다.
3. 대규모 언어 모델 미세 조정
이 Codelab에서는 Python용 Vertex AI SDK를 사용하여 모델을 미세 조정합니다. HTTP, CURL 명령어, Java SDK, 콘솔 등 다른 옵션을 사용하여 미세 조정을 수행할 수도 있습니다.
5단계에 걸쳐 맞춤 응답을 위해 모델을 세부 조정하고 평가할 수 있습니다. 저장소의 llm_fine_tuning_supervised.ipynb 파일에서 전체 코드를 참조할 수 있습니다.
4. 1단계: 종속 항목 설치 및 가져오기
!pip install google-cloud-aiplatform
!pip install --user datasets
!pip install --user google-cloud-pipeline-components
저장소의 .ipynb 파일에 표시된 대로 나머지 단계를 따릅니다. PROJECT_ID 및 BUCKET_NAME을 사용자 인증 정보로 바꿔야 합니다.
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import warnings
warnings.filterwarnings('ignore')
import vertexai
vertexai.init(project=PROJECT_ID, location=REGION)
import kfp
import sys
import uuid
import json
import pandas as pd
from google.auth import default
from datasets import load_dataset
from google.cloud import aiplatform
from vertexai.preview.language_models import TextGenerationModel, EvaluationTextSummarizationSpec
5. 2단계: 학습 데이터 준비 및 로드
YOUR_BUCKET을 버킷으로 바꾸고 샘플 TRAIN.jsonl 학습 데이터 파일을 여기에 업로드합니다. 샘플 데이터는 위에 언급된 링크에서 이 사용 사례에 맞게 프로비저닝되어 있습니다.
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/TRAIN.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
이 단계의 결과는 다음과 같습니다.
6. 3단계: 대규모 언어 모델 미세 조정
이 시점에서는 지원 가능 여부에 따라 대규모 언어 모델을 조정할 수 있습니다. 하지만 이 스니펫에서는 선행 학습된 모델 'text-bison@002'를 조정합니다. 이전 단계에서 로드한 학습 데이터가 있는 데이터 프레임으로 대체합니다.
model_display_name = 'bbc-finetuned-model' # @param {type:"string"}
tuned_model = TextGenerationModel.from_pretrained("text-bison@002")
tuned_model.tune_model(
training_data=df,
train_steps=100,
tuning_job_location="europe-west4",
tuned_model_location="europe-west4",
)
이 단계를 완료하는 데는 몇 시간 정도 걸립니다. 결과의 파이프라인 작업 링크를 사용하여 미세 조정 진행 상황을 추적할 수 있습니다.
7. 4단계: 새로운 미세 조정된 모델로 예측
미세 조정 작업이 완료되면 새 모델로 예측할 수 있습니다. 새로 조정된 모델로 예측하려면 다음 안내를 따르세요.
response = tuned_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)
다음과 같은 결과가 표시됩니다.
비교를 위해 기본 모델 (text-bison@002
)으로 예측하려면 다음 명령어를 실행합니다.
base_model = TextGenerationModel.from_pretrained("text-bison@002")
response = base_model.predict("Summarize this text to generate a title: \n Ever noticed how plane seats appear to be getting smaller and smaller? With increasing numbers of people taking to the skies, some experts are questioning if having such packed out planes is putting passengers at risk. They say that the shrinking space on aeroplanes is not only uncomfortable it it's putting our health and safety in danger. More than squabbling over the arm rest, shrinking space on planes putting our health and safety in danger? This week, a U.S consumer advisory group set up by the Department of Transportation said at a public hearing that while the government is happy to set standards for animals flying on planes, it doesn't stipulate a minimum amount of space for humans.")
print(response.text)
다음과 같은 결과가 표시됩니다.
생성된 두 제목 모두 적절해 보이지만 첫 번째 제목 (미세 조정된 모델로 생성)은 해당 데이터 세트에 사용된 제목의 스타일에 더 잘 맞습니다.
미세 조정된 모델 로드
방금 미세 조정한 모델을 로드하는 것이 더 쉬울 수 있습니다. 하지만 3단계에서 이 함수는 코드 자체의 범위에서 호출되므로 미세 조정된 모델을 계속 변수에 저장하여 'managed_model' 변수에 유지합니다. 하지만 과거에 조정한 모델을 호출하려면 어떻게 해야 할까요?
이렇게 하려면 Vertex AI Model Registry에서 배포된 미세 조정된 모델의 전체 엔드포인트 URL을 사용하여 LLM에서 get_tuned_model() 메서드를 호출하면 됩니다. 여기서는 각각의 ID 대신 PROJECT_NUMBER와 MODEL_NUMBER를 입력합니다.
tuned_model_1 = TextGenerationModel.get_tuned_model("projects/<<PROJECT_NUMBER>>/locations/europe-west4/models/<<MODEL_NUMBER>>")
print(tuned_model_1.predict("YOUR_PROMPT"))
8. 5단계: 새 미세 조정된 모델 평가
평가는 생성된 응답의 품질과 관련성을 평가하는 중요한 측면입니다. 생성형 언어 모델의 출력을 검사하여 일관성, 정확성, 제공된 프롬프트와의 일치 여부를 확인합니다. 모델 평가는 개선이 필요한 영역을 파악하고, 모델 성능을 최적화하며, 생성된 텍스트가 원하는 품질 및 유용성 기준을 충족하는지 확인하는 데 도움이 됩니다. 자세한 내용은 문서를 참고하세요. 지금은 미세 조정된 모델에서 일부 평가 측정항목을 가져오고 기본 모델과 비교하는 방법을 알아보겠습니다.
- EVALUATION 데이터 세트를 로드합니다.
json_url = 'https://storage.googleapis.com/YOUR_BUCKET/EVALUATE.jsonl'
df = pd.read_json(json_url, lines=True)
print (df)
- 미세 조정된 모델에서 텍스트 요약 작업의 평가 사양을 정의합니다.
task_spec = EvaluationTextSummarizationSpec(
task_name = "summarization",
ground_truth_data=df
)
이 단계는 완료하는 데 몇 분 정도 걸립니다. 결과의 파이프라인 작업 링크를 사용하여 진행 상황을 추적할 수 있습니다. 완료 후 다음과 같은 평가 결과가 표시됩니다.
평가 결과의 rougeLSum
측정항목은 요약의 ROUGE-L 점수를 지정합니다. ROUGE-L은 요약과 참조 요약 사이의 중복을 측정하는 재현율 기반 측정항목입니다. 두 요약 사이의 최장 공통 부분 수열 (LCS)을 참조 요약의 길이로 나누어 계산합니다.
제공된 표현식의 rougeLSum
점수는 0.36600753600753694입니다. 즉, 요약이 참조 요약과 36.6% 중복됩니다.
기준 모델에서 평가 단계를 실행하면 미세 조정된 모델에 비해 요약 점수가 상대적으로 더 높은 것을 확인할 수 있습니다.
평가 작업을 만들 때 지정한 Cloud Storage 출력 디렉터리에서 평가 결과를 찾을 수 있습니다. 파일 이름은 evaluation_metrics.json
입니다. 조정된 모델의 경우 Google Cloud 콘솔의 Vertex AI 모델 레지스트리 페이지에서 평가 결과를 볼 수도 있습니다.
9. 중요 고려사항
- 모델 지원: 항상 모델 문서에서 최신 호환성을 확인하세요.
- 신속한 개발: LLM 분야는 빠르게 발전하고 있습니다. 보다 강력한 최신 모델은 이전 기반을 기반으로 빌드된 미세 조정된 모델보다 잠재적으로 성능이 우수할 수 있습니다. 좋은 소식은 이러한 미세 조정 기술을 사용할 수 있게 되면 최신 모델에 적용할 수 있다는 것입니다.
- LoRA: LoRA는 LLM을 효율적으로 미세 조정하는 기법입니다. 이를 위해 기존의 선행 학습된 모델의 레이어에 학습 가능한 저순위 분해 행렬을 도입합니다. 자세한 내용은 여기를 참고하세요. 대용량 LLM의 모든 매개변수를 업데이트하는 대신 LoRA는 원래 모델의 가중치 행렬에 더하거나 이를 곱하는 작은 행렬을 학습합니다. 따라서 미세 조정 중에 도입되는 추가 매개변수의 수가 크게 줄어듭니다.
10. 삭제
이 Codelab에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.
- 또는 Model Registry로 이동하여 모델 배포 및 테스트 탭으로 이동하고 엔드포인트를 배포 취소하고 배포된 조정된 모델을 삭제할 수 있습니다.
11. 마무리
축하합니다. Vertex AI를 사용하여 LLM 모델을 미세 조정했습니다. 미세 조정은 도메인 및 태스크에 맞게 LLM을 맞춤설정할 수 있는 강력한 기술입니다. Vertex AI를 사용하면 모델을 효율적이고 효과적으로 미세 조정하는 데 필요한 도구와 리소스를 이용할 수 있습니다.
GitHub 저장소를 탐색하고 샘플 코드를 실험하여 미세 조정과 평가를 직접 경험해 보세요. 미세 조정된 LLM이 타겟팅된 마케팅 문구 생성부터 복잡한 문서 요약 또는 문화적 뉘앙스를 포함한 언어 번역에 이르기까지 특정 요구사항을 어떻게 해결할 수 있는지 고려하세요. Vertex AI에서 제공하는 포괄적인 도구 및 서비스 모음을 활용하여 미세 조정된 모델을 쉽게 빌드, 학습, 평가, 배포할 수 있습니다.