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

1. บทนำ

ภาพรวม

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

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

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

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

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

  • วิธีใช้ GPU ใน Cloud Run
  • วิธีใช้กอดใบหน้าเพื่อเรียกข้อมูลโมเดล
  • วิธีทำให้โมเดลที่มีการปรับแต่งตามคำสั่ง 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 Shell d1264ca30785e435.png จาก Cloud Console

cb81e7c8e34bc8d.png

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

d95252b003979716.png

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

7833d5e1c5d18f54.png

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

เมื่อเชื่อมต่อกับ 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

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

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

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 secrete 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 แก่บัญชีบริการ

gcloud secrets add-iam-policy-binding HF_TOKEN \
    --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
    --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 ดูข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่าสถานะ Dockerbuildx –secrets Flag ได้ที่นี่

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 แล้ว

gcloud beta run deploy $SERVICE_NAME \
--image=us-central1-docker.pkg.dev/$PROJECT_ID/$AR_REPO_NAME/$SERVICE_NAME \
--service-account $SERVICE_ACCOUNT_ADDRESS \
--cpu=8 \
--memory=32Gi \
--gpu=1 --gpu-type=nvidia-l4 \
--region us-central1 \
--no-allow-unauthenticated \
--max-instances 5 \
--no-cpu-throttling

การทำให้ใช้งานได้อาจใช้เวลาถึง 5 นาที

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

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

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

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

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

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

ถัดไป ขดบริการ

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 -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
  • วิธีใช้กอดใบหน้าเพื่อเรียกข้อมูลโมเดล
  • วิธีทำให้โมเดล 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