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 뉴스 데이터 세트와 같이 뉴스 기사 및 해당 헤드라인의 데이터 세트로 시작합니다.
- 사전 학습된 모델 미세 조정: '
text-bison@002
'과 같은 기본 모델을 선택하고 Python용 Vertex AI SDK를 사용하여 뉴스 데이터로 미세 조정합니다. - 결과 평가: 미세 조정된 모델의 성능을 기본 모델과 비교하여 광고 제목 생성 품질이 개선되었는지 확인합니다.
- 모델 배포 및 사용: API 엔드포인트를 통해 미세 조정된 모델을 사용 설정하고 새 기사의 제목을 자동으로 생성합니다.
2. 시작하기 전에
- Google Cloud 콘솔의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.
- Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.
- Colab Notebook을 열고 현재 사용 중인 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단계에서 코드 자체의 범위에서 호출되므로 tuned_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단계: 새롭게 미세 조정된 모델 평가
평가는 생성된 대답의 품질과 관련성을 평가하는 데 중요한 요소입니다. 생성형 언어 모델의 출력을 검사하여 일관성, 정확성, 제공된 프롬프트와의 일치를 확인하는 작업이 포함됩니다. 모델 평가는 개선이 필요한 영역을 파악하고, 모델 성능을 최적화하며, 생성된 텍스트가 품질 및 유용성에 관한 원하는 표준을 충족하는지 확인하는 데 도움이 됩니다. 자세한 내용은 문서를 참고하세요. 지금은 미세 조정된 모델에서 평가 측정항목을 가져와 기본 모델과 비교하는 방법을 알아보겠습니다.
- 평가 데이터 세트를 로드합니다.
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 Model Registry 페이지에서 평가 결과를 볼 수도 있습니다.
9. 중요 고려사항
- 모델 지원: 항상 모델 문서에서 최신 호환성을 확인하세요.
- 빠른 발전: LLM 분야는 빠르게 발전하고 있습니다. 더 새롭고 강력한 모델이 이전 기반에 구축된 미세 조정된 모델보다 성능이 우수할 수 있습니다. 다행인 점은 이 기능을 사용할 수 있게 되면 이러한 미세 조정 기법을 최신 모델에 적용할 수 있다는 것입니다.
- LoRA: LoRA는 LLM을 효율적으로 미세 조정하는 기법입니다. 이를 위해 기존의 사전 학습된 모델 레이어에 학습 가능한 낮은 계급 분해 행렬을 도입합니다. 여기에서 자세히 알아보세요. LoRA는 대규모 LLM의 모든 매개변수를 업데이트하는 대신 원본 모델의 가중치 행렬에 더해지거나 곱해지는 더 작은 행렬을 학습합니다. 이렇게 하면 미세 조정 중에 도입되는 추가 파라미터 수가 크게 줄어듭니다.
10. 삭제
이 Codelab에서 사용한 리소스의 비용이 Google Cloud 계정에 청구되지 않도록 하려면 다음 단계를 따르세요.
- Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.
- 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
- 대화상자에서 프로젝트 ID를 입력하고 종료를 클릭하여 프로젝트를 삭제합니다.
- 또는 Model Registry로 이동하여 모델 배포 및 테스트 탭으로 이동한 후 엔드포인트를 배포 취소하고 배포된 조정된 모델을 삭제할 수 있습니다.
11. 마무리
축하합니다. Vertex AI를 사용하여 LLM 모델을 미세 조정했습니다. 미세 조정은 LLM을 도메인 및 태스크에 맞게 맞춤설정할 수 있는 강력한 기법입니다. Vertex AI를 사용하면 모델을 효율적이고 효과적으로 미세 조정하는 데 필요한 도구와 리소스를 사용할 수 있습니다.
GitHub 저장소를 살펴보고 샘플 코드를 실험하여 미세 조정 및 평가를 직접 경험해 보세요. 타겟팅된 마케팅 문구 생성에서부터 복잡한 문서 요약, 문화적 뉘앙스가 있는 언어 번역까지 세부적으로 조정된 LLM이 특정 요구사항을 어떻게 해결할 수 있는지 고려해 보세요. Vertex AI에서 제공하는 포괄적인 도구 및 서비스 모음을 활용하여 미세 조정된 모델을 손쉽게 빌드, 학습, 평가, 배포하세요.