วิธีเรียกใช้การอนุมาน LLM บน GPU ของ Cloud Run ด้วย vLLM และ OpenAI Python SDK

1. บทนำ

ภาพรวม

Cloud Run เพิ่งเพิ่มการรองรับ GPU โดยพร้อมใช้งานเป็นเวอร์ชันตัวอย่างแบบสาธารณะที่ต้องลงชื่อสมัครใช้ หากสนใจลองใช้ฟีเจอร์นี้ โปรดกรอกแบบฟอร์มนี้เพื่อเข้าร่วมรายชื่อผู้รอใช้ Cloud Run เป็นแพลตฟอร์มคอนเทนเนอร์ใน Google Cloud ที่ช่วยให้คุณเรียกใช้โค้ดในคอนเทนเนอร์ได้อย่างตรงไปตรงมาโดยไม่ต้องจัดการคลัสเตอร์

ปัจจุบัน GPU ที่เรามีให้ใช้งานคือ GPU รุ่น L4 ของ Nvidia ที่มี vRAM ขนาด 24 GB มี GPU 1 ตัวต่ออินสแตนซ์ Cloud Run และการปรับขนาดอัตโนมัติของ Cloud Run ยังคงมีผล ซึ่งรวมถึงการเพิ่มขนาดสูงสุด 5 อินสแตนซ์ (พร้อมโควต้าที่เพิ่มขึ้น) รวมถึงการลดขนาดเป็น 0 อินสแตนซ์เมื่อไม่มีคำขอ

กรณีการใช้งาน GPU อย่างหนึ่งคือการเรียกใช้โมเดลภาษาขนาดใหญ่ (LLM) แบบเปิดของคุณเอง บทแนะนำนี้จะแนะนำขั้นตอนการติดตั้งใช้งานบริการที่เรียกใช้ LLM

บริการนี้เป็นบริการแบ็กเอนด์ที่เรียกใช้ vLLM ซึ่งเป็นเครื่องมืออนุมานสำหรับระบบการผลิต Codelab นี้ใช้ Gemma 2 ของ Google ซึ่งเป็นโมเดลที่ได้รับการปรับแต่งตามคำสั่งที่มีพารามิเตอร์ 2 พันล้านรายการ

สิ่งที่คุณจะได้เรียนรู้

  • วิธีใช้ GPU ใน Cloud Run
  • วิธีใช้ Hugging Face เพื่อดึงข้อมูลโมเดล
  • วิธีทำให้โมเดล Gemma 2 2b ที่ปรับแต่งตามคำสั่งของ Google ใช้งานได้ใน Cloud Run โดยใช้ vLLM เป็นเครื่องมืออนุมาน
  • วิธีเรียกใช้บริการแบ็กเอนด์เพื่อเติมประโยคให้สมบูรณ์

2. การตั้งค่าและข้อกำหนด

ข้อกำหนดเบื้องต้น

  • คุณเข้าสู่ระบบ Cloud Console แล้ว
  • คุณเคยทำให้บริการ Cloud Run ใช้งานได้แล้ว เช่น คุณสามารถทำตามคู่มือเริ่มต้นใช้งานการติดตั้งใช้งานบริการเว็บจากซอร์สโค้ดเพื่อเริ่มต้นใช้งาน
  • คุณมีบัญชี Hugging Face และรับทราบสัญญาอนุญาต Gemma 2 2b ที่ https://huggingface.co/google/gemma-2-2b-it แล้ว มิฉะนั้นคุณจะดาวน์โหลดโมเดลไม่ได้
  • คุณได้สร้างโทเค็นเพื่อการเข้าถึงที่มีสิทธิ์เข้าถึงโมเดล google/gemma-2-2b-it แล้ว

เปิดใช้งาน Cloud Shell

  1. จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell d1264ca30785e435.png

cb81e7c8e34bc8d.png

หากเริ่มใช้ Cloud Shell เป็นครั้งแรก คุณจะเห็นหน้าจอระดับกลางที่อธิบายว่า Cloud Shell คืออะไร หากเห็นหน้าจอดังกล่าว ให้คลิกต่อไป

d95252b003979716.png

การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน

7833d5e1c5d18f54.png

เครื่องเสมือนนี้โหลดเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่จำเป็นไว้แล้ว โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานส่วนใหญ่หรือทั้งหมดในโค้ดแล็บนี้ได้ด้วยเบราว์เซอร์

เมื่อเชื่อมต่อกับ Cloud Shell แล้ว คุณควรเห็นว่าคุณได้รับการตรวจสอบสิทธิ์และระบบได้ตั้งค่าโปรเจ็กต์เป็นรหัสโปรเจ็กต์ของคุณ

  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list

เอาต์พุตของคำสั่ง

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคำสั่ง gcloud รู้จักโปรเจ็กต์ของคุณ
gcloud config list project

เอาต์พุตของคำสั่ง

[core]
project = <PROJECT_ID>

หากไม่ได้ตั้งค่าไว้ คุณตั้งค่าได้ด้วยคำสั่งนี้

gcloud config set project <PROJECT_ID>

เอาต์พุตของคำสั่ง

Updated property [core/project].

3. เปิดใช้ API และตั้งค่าตัวแปรสภาพแวดล้อม

เปิดใช้ API

ก่อนที่จะเริ่มใช้ Codelab นี้ได้ คุณจะต้องเปิดใช้ API หลายรายการ Codelab นี้กำหนดให้ใช้ API ต่อไปนี้ คุณเปิดใช้ API เหล่านั้นได้โดยการเรียกใช้คำสั่งต่อไปนี้

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    secretmanager.googleapis.com \
    artifactregistry.googleapis.com

ตั้งค่าตัวแปรสภาพแวดล้อม

คุณตั้งค่าตัวแปรสภาพแวดล้อมที่จะใช้ตลอดทั้งโค้ดแล็บนี้ได้

HF_TOKEN=<YOUR_HUGGING_FACE_TOKEN>
PROJECT_ID=<YOUR_PROJECT_ID>

REGION=us-central1
SERVICE_NAME=vllm-gemma-2-2b-it
AR_REPO_NAME=vllm-gemma-2-2b-it-repo
SERVICE_ACCOUNT=vllm-gemma-2-2b-it
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

4. สร้างบัญชีบริการ

บัญชีบริการนี้ใช้เพื่อสร้างบริการ Cloud Run และเข้าถึงข้อมูลลับจาก Secret Manager

ก่อนอื่น ให้สร้างบัญชีบริการโดยเรียกใช้คำสั่งนี้

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run vllm SA to access secret manager"

ประการที่ 2 มอบบทบาทผู้ใช้ Vertex AI ให้กับบัญชีบริการ

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/secretmanager.secretAccessor

ตอนนี้ให้สร้างข้อมูลลับใน Secret Manager ชื่อ HF_TOKEN สำหรับโทเค็นการเข้าถึง Hugging Face Cloud Build ใช้บัญชีบริการเพื่อเข้าถึงข้อมูลลับนี้ในเวลาบิลด์เพื่อดึงโมเดล Gemma 2 (2B) จาก Hugging Face ดูข้อมูลเพิ่มเติมเกี่ยวกับข้อมูลลับและ Cloud Build ได้ที่นี่

printf $HF_TOKEN | gcloud secrets create HF_TOKEN --data-file=-

และให้สิทธิ์เข้าถึงข้อมูลลับ HF_TOKEN ใน Secret Manager แก่บัญชีบริการ Compute เริ่มต้นเมื่อสร้างอิมเมจ

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)")

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member="serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
  --role="roles/secretmanager.secretAccessor"

5. สร้างอิมเมจใน Artifact Registry

ก่อนอื่น ให้สร้างที่เก็บใน Artifact Registry

gcloud artifacts repositories create $AR_REPO_NAME \
  --repository-format docker \
  --location us-central1

จากนั้นสร้าง Dockerfile ที่จะรวมข้อมูลลับจาก Secret Manager ดูข้อมูลเพิ่มเติมเกี่ยวกับแฟล็ก Docker buildx –secrets ได้ที่นี่

FROM vllm/vllm-openai:latest

ENV HF_HOME=/model-cache
RUN --mount=type=secret,id=HF_TOKEN HF_TOKEN=$(cat /run/secrets/HF_TOKEN) \
    huggingface-cli download google/gemma-2-2b-it

ENV HF_HUB_OFFLINE=1

ENTRYPOINT python3 -m vllm.entrypoints.openai.api_server \
    --port ${PORT:-8000} \
    --model ${MODEL_NAME:-google/gemma-2-2b-it} \
    ${MAX_MODEL_LEN:+--max-model-len "$MAX_MODEL_LEN"}

ตอนนี้ให้สร้างไฟล์ cloudbuild.yaml

steps:
- name: 'gcr.io/cloud-builders/docker'
  id: build
  entrypoint: 'bash'
  secretEnv: ['HF_TOKEN']
  args: 
    - -c
    - |
        SECRET_TOKEN="$$HF_TOKEN" docker buildx build --tag=${_IMAGE} --secret id=HF_TOKEN .

availableSecrets:
  secretManager:
  - versionName: 'projects/${PROJECT_ID}/secrets/HF_TOKEN/versions/latest'
    env: 'HF_TOKEN'

images: ["${_IMAGE}"]

substitutions:  
  _IMAGE: 'us-central1-docker.pkg.dev/${PROJECT_ID}/vllm-gemma-2-2b-it-repo/vllm-gemma-2-2b-it'

options:
  dynamicSubstitutions: true
  machineType: "E2_HIGHCPU_32"

สุดท้าย ให้ส่งบิลด์

gcloud builds submit --config=cloudbuild.yaml

การสร้างอาจใช้เวลาประมาณ 8 นาที

6. ติดตั้งใช้งานบริการ

ตอนนี้คุณพร้อมที่จะทําให้อิมเมจใช้งานได้ใน Cloud Run แล้ว การติดตั้งใช้งานจะใช้เวลาประมาณ 5 นาที คุณจะต้องเพิ่มการหน่วงเวลาเริ่มต้นสำหรับการตรวจสอบสถานะการทำงานเป็นเวลา 2-3 นาทีเพื่อให้รูปภาพมีเวลาโหลดมากขึ้น ไม่เช่นนั้น คุณจะได้รับข้อผิดพลาด "เกินกำหนดเวลา" จากการตรวจสอบสถานะ

gcloud beta run deploy $SERVICE_NAME \
--image=$REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 \
--port=8000 \
--gpu-type=nvidia-l4 \
--region $REGION \
--no-allow-unauthenticated \
--max-instances 3 \
--no-cpu-throttling \
--no-gpu-zonal-redundancy \
--startup-probe tcpSocket.port=8000,initialDelaySeconds=240,failureThreshold=1,timeoutSeconds=240,periodSeconds=240

7. ทดสอบบริการ

เมื่อติดตั้งใช้งานแล้ว คุณจะใช้บริการพร็อกซีสำหรับนักพัฒนาแอปของ Cloud Run ซึ่งจะเพิ่มโทเค็นรหัสให้โดยอัตโนมัติ หรือจะใช้ URL ของบริการโดยตรงก็ได้

การใช้บริการพร็อกซีสำหรับนักพัฒนาแอปของ Cloud Run

หากต้องการใช้บริการพร็อกซีสำหรับนักพัฒนาแอปของ Cloud Run ให้ทำตามขั้นตอนต่อไปนี้

ก่อนอื่นให้เรียกใช้คำสั่งต่อไปนี้

gcloud run services proxy $SERVICE_NAME --region us-central1

จากนั้นใช้ curl กับบริการ

curl -X POST http://localhost:8080/v1/completions \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

การใช้ URL ของบริการโดยตรง

ก่อนอื่น ให้ดึง URL ของบริการที่ใช้งาน

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')

Curl บริการ

curl -X POST $SERVICE_URL/v1/completions \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{
  "model": "google/gemma-2-2b-it",
  "prompt": "Cloud Run is a",
  "max_tokens": 128,
  "temperature": 0.90
}'

ผลลัพธ์

คุณควรเห็นผลลัพธ์ที่คล้ายกับต่อไปนี้

{"id":"cmpl-e0e6924d4bfd4d918383c87cba5e25ac","object":"text_completion","created":1723853023,"model":"google/gemma-2-2b","choices":[{"index":0,"text":" serverless compute platform that lets you write your backend code in standard languages, such as Java, Go, PHP and Python.\n\nYou can deploy your function as a REST API that scales on demand and allows you to add additional security features such as HTTPS.\n\nTo write code for an Android app with Cloud Run, you need to use the GraalVM. This is because while Node.js is a more commonly known node-based platform, GraalVM is a virtual machine (VM) to run native code in the Cloud Run environment.\n\nNow you need graal.vm/java-11-jre.jar, the","logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":5,"total_tokens":133,"completion_tokens":128}}

8. ยินดีด้วย

ขอแสดงความยินดีที่ทำ Codelab นี้เสร็จสมบูรณ์

เราขอแนะนำให้อ่านเอกสารประกอบของ Cloud Run

สิ่งที่เราได้พูดถึง

  • วิธีใช้ GPU ใน Cloud Run
  • วิธีใช้ Hugging Face เพื่อดึงข้อมูลโมเดล
  • วิธีทำให้โมเดล Gemma 2 (2B) ของ Google ใช้งานได้ใน Cloud Run โดยใช้ vLLM เป็นเครื่องมืออนุมาน
  • วิธีเรียกใช้บริการแบ็กเอนด์เพื่อเติมประโยคให้สมบูรณ์

9. ล้างข้อมูล

หากต้องการหลีกเลี่ยงการเรียกเก็บเงินโดยไม่ตั้งใจ (เช่น หากมีการเรียกใช้บริการ Cloud Run โดยไม่ตั้งใจมากกว่าการจัดสรรการเรียกใช้ Cloud Run รายเดือนในระดับฟรี) คุณสามารถลบ Cloud Run หรือลบโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 ได้

หากต้องการลบบริการ Cloud Run ให้ไปที่ Cloud Console ของ Cloud Run ที่ https://console.cloud.google.com/run แล้วลบvllm-gemma-2-2b บริการ คุณอาจต้องลบvllm-gemma-2-2bบัญชีบริการด้วย

หากเลือกที่จะลบทั้งโปรเจ็กต์ ให้ไปที่ https://console.cloud.google.com/cloud-resource-manager เลือกโปรเจ็กต์ที่สร้างในขั้นตอนที่ 2 แล้วเลือก "ลบ" หากลบโปรเจ็กต์ คุณจะต้องเปลี่ยนโปรเจ็กต์ใน Cloud SDK คุณดูรายการโปรเจ็กต์ทั้งหมดที่พร้อมใช้งานได้โดยเรียกใช้ gcloud projects list