이 튜토리얼에서는 Apache Beam RunInference API를 사용하여 스트리밍 Dataflow 파이프라인에서 대규모 언어 모델(LLM)을 실행하는 방법을 보여줍니다.
RunInference API에 대한 자세한 내용은 Apache Beam 문서에서 Beam ML 정보를 참조하세요.
예시 코드는 GitHub에서 제공됩니다.
목표
- 모델 입력 및 응답에 대한 Pub/Sub 주제 및 구독을 만듭니다.
- Vertex AI 커스텀 작업을 사용하여 Cloud Storage에 모델을 로드합니다.
- 파이프라인을 실행합니다.
- 모델에 질문을 하고 응답을 얻습니다.
비용
이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.
프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요.
이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.
시작하기 전에
종속 항목 설치를 위해 여유 디스크 공간이 5GB 이상인 머신에서 이 튜토리얼을 실행합니다.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create
PROJECT_ID Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project
PROJECT_ID Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Dataflow, Compute Engine, Cloud Storage, Pub/Sub, and Vertex AI APIs:
gcloud services enable dataflow.googleapis.com
compute.googleapis.com storage.googleapis.com pubsub.googleapis.com aiplatform.googleapis.com -
If you're using a local shell, then create local authentication credentials for your user account:
gcloud auth application-default login
You don't need to do this if you're using Cloud Shell.
-
Grant roles to your user account. Run the following command once for each of the following IAM roles:
roles/iam.serviceAccountUser
gcloud projects add-iam-policy-binding
PROJECT_ID --member="user:USER_IDENTIFIER " --role=ROLE - Replace
PROJECT_ID
with your project ID. -
Replace
USER_IDENTIFIER
with the identifier for your user account. For example,user:myemail@example.com
. - Replace
ROLE
with each individual role.
- Replace
-
Compute Engine 기본 서비스 계정에 역할을 부여합니다. 다음 IAM 역할마다 다음 명령어를 1회 실행합니다.
roles/dataflow.admin
roles/dataflow.worker
roles/storage.admin
roles/pubsub.editor
roles/aiplatform.user
gcloud projects add-iam-policy-binding
PROJECT_ID --member="serviceAccount:PROJECT_NUMBER -compute@developer.gserviceaccount.com" --role=SERVICE_ACCOUNT_ROLE 다음을 바꿉니다.
PROJECT_ID
: 프로젝트 IDPROJECT_NUMBER
: 프로젝트 번호입니다. 프로젝트 번호를 찾으려면gcloud projects describe
명령어를 사용합니다.SERVICE_ACCOUNT_ROLE
: 개별 역할입니다.
- Google Cloud 프로젝트 ID를 복사합니다. 이 값은 이 튜토리얼의 뒷부분에서 사용됩니다.
Google Cloud 리소스 만들기
이 섹션에서는 다음을 만드는 방법을 설명합니다.
- 임시 스토리지 위치로 사용할 Cloud Storage 버킷
- 모델 프롬프트의 Pub/Sub 주제
- 모델 응답의 Pub/Sub 주제 및 구독
Cloud Storage 버킷 만들기
gcloud CLI를 사용하여 Cloud Storage 버킷을 만듭니다. 이 버킷은 Dataflow 파이프라인에서 임시 스토리지 위치로 사용됩니다.
버킷을 만들기 위해 gcloud storage buckets create
명령어를 사용합니다.
gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION
다음을 바꿉니다.
- BUCKET_NAME: 버킷 이름 지정 요구사항을 충족하는 Cloud Storage 버킷의 이름입니다. Cloud Storage 버킷 이름은 전역에서 고유해야 합니다.
- LOCATION: 버킷의 위치입니다.
버킷 이름을 복사합니다. 이 값은 이 튜토리얼의 뒷부분에서 사용됩니다.
Pub/Sub 주제 및 구독 만들기
Pub/Sub 주제 2개와 하나의 구독을 만듭니다. 하나의 주제는 모델에 전송하는 입력 프롬프트에 사용됩니다. 다른 주제 및 연결된 구독은 모델의 응답에 사용됩니다.
주제를 만들기 위해 각 주제에 한 번씩
gcloud pubsub topics create
명령어를 두 번 실행합니다.gcloud pubsub topics create
PROMPTS_TOPIC_ID gcloud pubsub topics createRESPONSES_TOPIC_ID 다음을 바꿉니다.
- PROMPTS_TOPIC_ID: 모델에 전송할 입력 프롬프트의 주제 ID입니다(예:
prompts
). - RESPONSES_TOPIC_ID: 모델 응답에 대한 주제 ID입니다(예:
responses
).
- PROMPTS_TOPIC_ID: 모델에 전송할 입력 프롬프트의 주제 ID입니다(예:
구독을 만들고 응답 주제에 연결하려면
gcloud pubsub subscriptions create
명령어를 사용합니다.gcloud pubsub subscriptions create
RESPONSES_SUBSCRIPTION_ID --topic=RESPONSES_TOPIC_ID RESPONSES_SUBSCRIPTION_ID를
responses-subscription
과 같은 모델 응답의 구독 ID로 바꿉니다.
주제 ID 및 구독 ID를 복사합니다. 이러한 값은 이 튜토리얼의 뒷부분에서 필요합니다.
개발 환경 준비
코드 샘플을 다운로드한 후 튜토리얼을 실행하도록 환경을 설정합니다.
python-docs-samples GitHub 저장소의 코드 샘플은 이 파이프라인을 실행하는 데 필요한 코드를 제공합니다. 자체 파이프라인을 빌드할 준비가 되었으면 이 샘플 코드를 템플릿으로 사용할 수 있습니다.
venv를 사용해서 파이프라인 프로젝트를 실행하도록 격리된 Python 가상 환경을 만듭니다. 가상 환경을 사용하면 다른 프로젝트의 종속 항목으로부터 한 프로젝트의 종속 항목을 분리할 수 있습니다. Python을 설치하고 가상 환경을 만드는 방법은 Python 개발 환경 설정을 참조하세요.
git clone
명령어를 사용하여 GitHub 저장소를 클론합니다.git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
run-inference
디렉터리로 이동합니다.cd python-docs-samples/dataflow/run-inference
명령어 프롬프트를 사용하는 경우 Python 3 및
pip
가 시스템에서 실행되는지 확인합니다.python --version python -m pip --version
필요한 경우 Python 3를 설치합니다.
Cloud Shell을 사용하는 경우 Cloud Shell에 Python이 이미 설치되어 있으므로 이 단계를 건너뛸 수 있습니다.
Python 가상 환경을 만듭니다.
python -m venv /tmp/env source /tmp/env/bin/activate
종속 항목을 설치합니다.
pip install -r requirements.txt --no-cache-dir
모델 로드 코드 샘플
이 튜토리얼의 모델 로드 코드는 모델의 state_dict
객체를 Cloud Storage에 로드하는 Vertex AI 커스텀 작업을 실행합니다.
시작 파일은 다음과 같습니다.
파이프라인 코드 샘플
이 튜토리얼의 파이프라인 코드는 다음을 수행하는 Dataflow 파이프라인을 배포합니다.
- Pub/Sub에서 프롬프트를 읽고 텍스트를 토큰 텐서로 인코딩합니다.
RunInference
변환을 실행합니다.- 출력 토큰 텐서를 텍스트로 디코딩하고 응답을 Pub/Sub에 씁니다.
시작 파일은 다음과 같습니다.
모델 로드
LLM은 매우 큰 모델일 수 있습니다. 더 많은 매개변수로 학습된 더 큰 모델일수록 일반적으로 더 나은 결과를 제공합니다. 그러나 모델이 클수록 실행하는 데 더 큰 머신과 메모리가 필요합니다. 또한 모델이 클수록 CPU에서 실행 속도가 느려질 수 있습니다.
Dataflow에서 PyTorch 모델을 실행하기 전에 모델의 state_dict
객체를 로드해야 합니다. 모델의 state_dict
객체는 모델의 가중치를 저장합니다.
Apache Beam RunInference
변환을 사용하는 Dataflow 파이프라인에서 모델의 state_dict
객체를 Cloud Storage에 로드해야 합니다. Cloud Storage에 state_dict
객체를 로드하기 위해 사용하는 머신에 모델을 로드하는 데 충분한 메모리가 있어야 합니다. 또한 가중치를 다운로드하고 이를 Cloud Storage에 업로드하기 위해 머신에 빠른 인터넷 연결이 필요합니다.
다음 표에서는 각 모델의 매개변수 수와 각 모델을 로드하는 데 필요한 최소 메모리를 보여줍니다.
모델 | 매개변수 | 필요한 메모리 |
---|---|---|
google/flan-t5-small |
8,000만 개 | 320MB 초과 |
google/flan-t5-base |
2억 5천만 | 1GB 초과 |
google/flan-t5-large |
7억 8천만 | 3.2GB 초과 |
google/flan-t5-xl |
30억 | 12GB 초과 |
google/flan-t5-xxl |
110억 | 44GB 초과 |
google/flan-ul2 |
200억 | 80GB 초과 |
더 작은 모델을 로컬로 로드할 수 있지만 이 튜토리얼에서는 적절한 크기의 VM으로 모델을 로드하는 Vertex AI 커스텀 작업을 실행하는 방법을 보여줍니다.
LLM이 매우 클 수 있기 때문에 이 튜토리얼의 예시에서는 기본 float32
형식 대신 float16
형식으로 state_dict
객체를 저장합니다.
이 구성에서는 각 매개변수에 32비트 대신 16비트가 사용되어 state_dict
객체 크기가 절반이 됩니다. 크기가 작을수록 모델을 로드하는 데 필요한 시간이 최소화됩니다. 그러나 형식 변환에 따라 VM이 모델 및 state_dict
객체를 메모리에 맞춰야 합니다.
다음 표에서는 state_dict
객체가 float16
형식으로 저장된 후 모델을 로드하기 위한 최소 요구사항을 보여줍니다. 또한 Vertex AI를 사용하여 모델을 로드하기 위한 권장 머신 유형을 보여줍니다. Vertex AI의 최소(및 기본) 디스크 크기는 100GB이지만 일부 모델에 따라 더 큰 디스크가 필요할 수 있습니다.
모델 이름 | 필요한 메모리 | 머신 유형 | VM 메모리 | VM 디스크 |
---|---|---|---|---|
google/flan-t5-small |
480MB 초과 | e2-standard-4 |
16GB | 100GB |
google/flan-t5-base |
1.5GB 초과 | e2-standard-4 |
16GB | 100GB |
google/flan-t5-large |
4.8GB 초과 | e2-standard-4 |
16GB | 100GB |
google/flan-t5-xl |
18GB 초과 | e2-highmem-4 |
32GB | 100GB |
google/flan-t5-xxl |
66GB 초과 | e2-highmem-16 |
128GB | 100GB |
google/flan-ul2 |
120GB 초과 | e2-highmem-16 |
128GB | 150GB |
Vertex AI 커스텀 작업을 사용하여 모델의 state_dict
객체를 Cloud Storage에 로드합니다.
python download_model.py vertex \
--model-name="MODEL_NAME " \
--state-dict-path="gs://BUCKET_NAME /run-inference/MODEL_NAME .pt" \
--job-name="Load MODEL_NAME " \
--project="PROJECT_ID " \
--bucket="BUCKET_NAME " \
--location="LOCATION " \
--machine-type="VERTEX_AI_MACHINE_TYPE " \
--disk-size-gb="DISK_SIZE_GB "
다음을 바꿉니다.
- MODEL_NAME: 모델의 이름입니다(예:
google/flan-t5-xl
). - VERTEX_AI_MACHINE_TYPE: Vertex AI 커스텀 작업을 실행할 머신의 유형입니다(예:
e2-highmem-4
). - DISK_SIZE_GB: VM의 디스크 크기(GB)입니다. 최소 크기는 100GB입니다.
모델 크기에 따라 모델을 로드하는 데 몇 분 정도 걸릴 수 있습니다. 상태를 보려면 Vertex AI 커스텀 작업 페이지로 이동합니다.
파이프라인 실행
모델을 로드한 후 Dataflow 파이프라인을 실행합니다. 파이프라인을 실행하려면 각 작업자에 사용되는 모델 및 메모리를 모두 메모리에 맞게 조정해야 합니다.
다음 표에서는 추론 파이프라인을 실행하기 위해 권장되는 머신 유형을 보여줍니다.
모델 이름 | 머신 유형 | VM 메모리 |
---|---|---|
google/flan-t5-small |
n2-highmem-2 |
16GB |
google/flan-t5-base |
n2-highmem-2 |
16GB |
google/flan-t5-large |
n2-highmem-4 |
32GB |
google/flan-t5-xl |
n2-highmem-4 |
32GB |
google/flan-t5-xxl |
n2-highmem-8 |
64 GB |
google/flan-ul2 |
n2-highmem-16 |
128GB |
파이프라인을 실행합니다.
python main.py \
--messages-topic="projects/PROJECT_ID /topics/PROMPTS_TOPIC_ID " \
--responses-topic="projects/PROJECT_ID /topics/RESPONSES_TOPIC_ID " \
--model-name="MODEL_NAME " \
--state-dict-path="gs://BUCKET_NAME /run-inference/MODEL_NAME .pt" \
--runner="DataflowRunner" \
--project="PROJECT_ID " \
--temp_location="gs://BUCKET_NAME /temp" \
--region="REGION " \
--machine_type="DATAFLOW_MACHINE_TYPE " \
--requirements_file="requirements.txt" \
--requirements_cache="skip" \
--experiments="use_sibling_sdk_workers" \
--experiments="no_use_multiple_sdk_containers"
다음을 바꿉니다.
- PROJECT_ID: 프로젝트 ID입니다.
- PROMPTS_TOPIC_ID: 모델에 전송할 입력 프롬프트의 주제 ID입니다.
- RESPONSES_TOPIC_ID: 모델 응답의 주제 ID입니다.
- MODEL_NAME: 모델의 이름입니다(예:
google/flan-t5-xl
). - BUCKET_NAME: 버킷의 이름입니다.
- REGION: 작업을 배포할 리전입니다(예:
us-central1
). - DATAFLOW_MACHINE_TYPE: 파이프라인을 실행할 VM입니다(예:
n2-highmem-4
).
모델이 작업자당 한 번만 로드되고 메모리가 부족하지 않도록 보장하려면 파이프라인 옵션 --experiments=no_use_multiple_sdk_containers
를 설정하여 단일 프로세스를 사용하도록 작업자를 구성합니다. RunInference
변환이 여러 스레드와 동일한 모델을 공유하므로 스레드 수를 제한할 필요가 없습니다.
이 예시의 파이프라인은 CPU로 실행됩니다. 더 큰 모델의 경우 각 요청을 처리하는 데 더 많은 시간이 필요합니다. 더 빠른 응답이 필요하면 GPU를 사용 설정할 수 있습니다.
파이프라인 상태를 보려면 Dataflow 작업 페이지로 이동합니다.
모델에 질문하기
파이프라인 실행이 시작된 후 모델에 프롬프트를 제공하고 응답을 수신합니다.
Pub/Sub에 메시지를 게시하여 프롬프트를 전송합니다.
gcloud pubsub topics publish
명령어를 사용합니다.gcloud pubsub topics publish
PROMPTS_TOPIC_ID \ --message="PROMPT_TEXT "PROMPT_TEXT
를 제공하려는 프롬프트가 포함된 문자열로 바꿉니다. 프롬프트를 따옴표로 묶습니다.자체 프롬프트를 사용하거나 다음 예시 중 하나를 시도합니다.
Translate to Spanish: My name is Luka
Complete this sentence: Once upon a time, there was a
Summarize the following text: Dataflow is a Google Cloud service that provides unified stream and batch data processing at scale. Use Dataflow to create data pipelines that read from one or more sources, transform the data, and write the data to a destination.
응답을 가져오려면
gcloud pubsub subscriptions pull
명령어를 사용합니다.모델 크기에 따라 모델이 응답을 생성하는 데 몇 분 정도 걸릴 수 있습니다. 모델이 클수록 배포 및 응답 생성에 더 오래 걸립니다.
gcloud pubsub subscriptions pull
RESPONSES_SUBSCRIPTION_ID --auto-ackRESPONSES_SUBSCRIPTION_ID
를 모델 응답의 구독 ID로 바꿉니다.
삭제
이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.
프로젝트 삭제
Delete a Google Cloud project:
gcloud projects deletePROJECT_ID
개별 리소스 삭제
-
Python 가상 환경을 종료합니다.
deactivate
-
파이프라인을 중지합니다.
-
실행 중인 Dataflow 작업의 작업 ID를 나열한 후 튜토리얼 작업의 작업 ID를 기록해 둡니다.
gcloud dataflow jobs list --region=
REGION --status=active -
작업을 취소합니다.
gcloud dataflow jobs cancel
JOB_ID --region=REGION
-
-
버킷과 그 안의 항목을 삭제합니다.
gcloud storage rm gs://
BUCKET_NAME --recursive -
주제 및 구독을 삭제합니다.
gcloud pubsub topics delete
PROMPTS_TOPIC_ID gcloud pubsub topics deleteRESPONSES_TOPIC_ID gcloud pubsub subscriptions deleteRESPONSES_SUBSCRIPTION_ID -
Compute Engine 기본 서비스 계정에 부여한 역할을 취소합니다. 다음 IAM 역할마다 다음 명령어를 1회 실행합니다.
roles/dataflow.admin
roles/dataflow.worker
roles/storage.admin
roles/pubsub.editor
roles/aiplatform.user
gcloud projects remove-iam-policy-binding
PROJECT_ID --member=serviceAccount:PROJECT_NUMBER -compute@developer.gserviceaccount.com --role=SERVICE_ACCOUNT_ROLE 선택사항: Google 계정에서 역할을 취소합니다.
gcloud projects remove-iam-policy-binding
PROJECT_ID --member="user:EMAIL_ADDRESS " --role=roles/iam.serviceAccountUser-
Optional: Revoke the authentication credentials that you created, and delete the local credential file.
gcloud auth application-default revoke
-
Optional: Revoke credentials from the gcloud CLI.
gcloud auth revoke
다음 단계
- Dataflow ML 살펴보기
- RunInference API 자세히 알아보기
- Apache Beam의 AI/ML 파이프라인 문서에서 Apache Beam과 함께 ML을 사용하는 방법 자세히 알아보기
- 생성형 AI에 RunInference 사용 노트북 살펴보기
- Google Cloud에 대한 참조 아키텍처, 다이어그램, 권장사항을 살펴봅니다. Cloud 아키텍처 센터 살펴보기