เรียกใช้การอนุมานโดยใช้โมเดล Gemma บน Cloud Run ด้วย RTX 6000 Pro GPU

1. บทนำ

ภาพรวม

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

  • วิธีติดตั้งใช้งานโมเดล Gemma บน GPU RTX 6000 Pro ของ Cloud Run
  • วิธีดาวน์โหลดโมเดลจาก Cloud Storage พร้อมกันระหว่างการเริ่มต้นคอนเทนเนอร์

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

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

export PROJECT_ID=<YOUR_PROJECT_ID>

export REGION=europe-west4
export SERVICE_NAME=gemma-rtx-codelab

# set the project
gcloud config set project $PROJECT_ID

เปิดใช้ API ที่จำเป็นสำหรับ Codelab นี้

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

สร้างโฟลเดอร์สำหรับ Codelab

mkdir codelab-rtx
cd codelab-rtx

เปิดใช้การเข้าถึง Google แบบส่วนตัวในซับเน็ตเพื่อเพิ่มประสิทธิภาพการโหลดโมเดล ML จาก Cloud Storage ดูข้อมูลเพิ่มเติมได้ในส่วนเอกสารแนวทางปฏิบัติแนะนำสำหรับ GPU เกี่ยวกับการโหลดโมเดลจาก Cloud Storage

gcloud compute networks subnets update default \
  --region=europe-west4 \
  --enable-private-ip-google-access

3. ตั้งค่า Cloud Storage

ก่อนอื่น ให้สร้าง Bucket ของ Cloud Storage เพื่อจัดเก็บน้ำหนักของโมเดล

สร้างที่เก็บข้อมูลที่ไม่ซ้ำกัน

# Generate a unique bucket name
export MODEL_BUCKET="${PROJECT_ID}-rtx-codelab-$(python3 -c 'import uuid; print(str(uuid.uuid4())[:8])')"
echo "Bucket name: $MODEL_BUCKET"

# Create the regional bucket
gcloud storage buckets create gs://$MODEL_BUCKET \
    --location=$REGION \
    --uniform-bucket-level-access

4. เรียกข้อมูลน้ำหนักของโมเดล

จากนั้นดาวน์โหลดโมเดล Gemma 3 ไปยังไดเรกทอรีในเครื่อง แล้วอัปโหลดไปยังที่เก็บข้อมูล Cloud Storage

ติดตั้ง Ollama

คุณเรียกใช้คำสั่งนี้เพื่อติดตั้ง Ollama ได้

curl -fsSL https://ollama.com/install.sh | sh

ดาวน์โหลดโมเดล

สร้างไดเรกทอรีสำหรับโมเดลที่ดาวน์โหลด

mkdir model-weights

คุณจะต้องใช้แท็บเทอร์มินัล 2 แท็บสำหรับกระบวนการนี้ โดยแท็บหนึ่งใช้เพื่อเรียกใช้เซิร์ฟเวอร์ Ollama และอีกแท็บใช้เพื่อดึงข้อมูลโมเดล

เทอร์มินัล 1 (เซิร์ฟเวอร์):

เริ่มเซิร์ฟเวอร์โดยส่งตำแหน่งของโมเดลที่ดาวน์โหลด คำสั่งนี้จะทำงานต่อไป

OLLAMA_MODELS=$(pwd)/model-weights ollama serve

เทอร์มินัล 2 (ไคลเอ็นต์): เปิดแท็บเทอร์มินัลใหม่แล้วดาวน์โหลดโมเดล ไคลเอ็นต์จะสื่อสารกับเซิร์ฟเวอร์ที่ทำงานอยู่โดยอัตโนมัติ

# note if you wish to use a larger model, you can change this to gemma3:27b
ollama pull gemma3:1b

กลับไปที่เทอร์มินัล 1: เมื่อดาวน์โหลดในเทอร์มินัล 2 เสร็จแล้ว ให้กลับไปที่เทอร์มินัล 1 แล้วกด Ctrl+C เพื่อหยุดเซิร์ฟเวอร์

อัปโหลดไปยัง Cloud Storage

ตอนนี้ให้อัปโหลดน้ำหนักไปยังที่เก็บข้อมูล gcloud storageจัดการการอัปโหลดแบบขนานโดยอัตโนมัติเพื่อเพิ่มความเร็ว

gcloud storage cp -r ./model-weights/* gs://$MODEL_BUCKET/

(ไม่บังคับ) ล้างข้อมูลน้ำหนักในเครื่อง

เนื่องจากตอนนี้โมเดลอยู่ใน Cloud Storage แล้ว ให้นำสำเนาในเครื่องออก

rm -rf model-weights

5. สร้างบริการ

ก่อนอื่น ให้สร้างโฟลเดอร์สำหรับบริการ

mkdir rtx-service
cd rtx-service

สร้าง Dockerfile ที่มีเนื้อหาต่อไปนี้

FROM ollama/ollama:latest

# Install Google Cloud CLI
RUN apt-get update && apt-get install -y curl gnupg && \
    echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] http://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
    apt-get update && apt-get install -y google-cloud-cli && \
    apt-get clean && rm -rf /var/lib/apt/lists/*

# Listen on all interfaces, port 11434
ENV OLLAMA_HOST 0.0.0.0:11434

# Store model weight files in /models
ENV OLLAMA_MODELS /models

# Reduce logging verbosity
ENV OLLAMA_DEBUG false

# Never unload model weights from the GPU
ENV OLLAMA_KEEP_ALIVE -1

# Copy and set up the startup script
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

# Start using the entrypoint script
ENTRYPOINT ["/entrypoint.sh"]

สร้างไฟล์ชื่อ entrypoint.sh ที่มีเนื้อหาต่อไปนี้

#!/bin/bash
set -e

# Ensure OLLAMA_MODELS directory exists
mkdir -p $OLLAMA_MODELS

# Download model weights from GCS if MODEL_BUCKET is set
if [ -n "$MODEL_BUCKET" ]; then
  echo "Downloading model weights from gs://$MODEL_BUCKET..."
  # gcloud storage handles concurrent downloads automatically
  gcloud storage cp -r "gs://$MODEL_BUCKET/*" "$OLLAMA_MODELS/"
else
  echo "MODEL_BUCKET not set. Skipping download."
fi

# Start Ollama
exec ollama serve

6. ทำให้ใช้งานได้กับ Cloud Run

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

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

สร้างบัญชีบริการเฉพาะสำหรับแอปพลิเคชันนี้ และให้สิทธิ์ที่จำเป็นเท่านั้น

# Create a dedicated service account
gcloud iam service-accounts create rtx-codelab-identity \
    --display-name="RTX Codelab Identity"

# Grant permission to read from the model bucket
gcloud storage buckets add-iam-policy-binding gs://$MODEL_BUCKET \
    --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
    --role="roles/storage.objectViewer"

# Grant access to the Compute Engine network for the Cloud Run service identity
gcloud projects add-iam-policy-binding $PROJECT_ID \
     --member="serviceAccount:rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com" \
     --role="roles/compute.networkUser"

# Grant access to the Compute Engine network for the default service account
gcloud projects add-iam-policy-binding $PROJECT_ID \
 --member="serviceAccount:service-$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')@serverless-robot-prod.iam.gserviceaccount.com" \
 --role="roles/compute.networkUser"

การกำหนดค่าเครือข่าย

ใช้ข้อมูลขาออก VPC โดยตรงเพื่อให้ได้ประสิทธิภาพสูงสุดเมื่อดาวน์โหลดโมเดลขนาดใหญ่ ซึ่งจะช่วยให้คอนเทนเนอร์เข้าถึง Cloud Storage ผ่านเครือข่ายส่วนตัวของ Google ได้ โดยข้ามอินเทอร์เน็ตสาธารณะและเกตเวย์ NAT มีการใช้แฟล็กต่อไปนี้ในคำสั่ง gcloud run deploy

  • --network: เชื่อมต่อกับ VPC default (ตรวจสอบว่าเครือข่ายนี้มีอยู่และมีซับเน็ตในภูมิภาคของคุณที่เปิดใช้การเข้าถึง Google แบบส่วนตัว)
  • --subnet: ซับเน็ตที่เฉพาะเจาะจงในภูมิภาคของคุณ (โดยปกติคือ default หากใช้เครือข่ายเริ่มต้น)
  • --vpc-egress: ตั้งค่าเป็น all-traffic เพื่อบังคับให้การรับส่งข้อมูลขาออกทั้งหมดผ่าน VPC

คำสั่งการทำให้ใช้งานได้

gcloud beta run deploy $SERVICE_NAME \
    --source . \
    --region $REGION \
    --project $PROJECT_ID \
    --no-allow-unauthenticated \
    --port 11434 \
    --service-account rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
    --cpu 20 --memory 80Gi \
    --gpu 1 \
    --gpu-type nvidia-rtx-pro-6000 \
    --set-env-vars MODEL_BUCKET=$MODEL_BUCKET \
    --network default \
    --subnet default \
    --vpc-egress all-traffic \
    --no-gpu-zonal-redundancy

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

เมื่อติดตั้งใช้งานแล้ว คุณจะโต้ตอบกับโมเดล Gemma 3 ได้โดยใช้ Ollama API

รับ URL ของบริการ

ดึงข้อมูล URL ของบริการ Cloud Run ที่ทำให้ใช้งานได้

SERVICE_URL=$(gcloud run services describe $SERVICE_NAME --region $REGION --format 'value(status.url)')
echo "Service URL: $SERVICE_URL"

เรียกใช้การอนุมาน

ส่งพรอมต์ไปยังโมเดลโดยใช้ curl คุณตั้งค่า "stream": false เพื่อรับคำตอบทั้งหมดในออบเจ็กต์ JSON เดียว และใช้ jq เพื่อดึงเฉพาะข้อความได้

หมายเหตุ: หากใช้โมเดลขนาดใหญ่กว่า เช่น gemma3:27b คุณจะต้องเปลี่ยนชื่อโมเดลใน JSON ด้านล่าง

curl -s "$SERVICE_URL/api/generate" \
  -H "Authorization: Bearer $(gcloud auth print-identity-token)" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "gemma3:1b",
  "prompt": "Why is the sky blue?",
  "stream": false
}' | jq -r '.response'

8. ยินดีด้วย

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

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

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

  • วิธีติดตั้งใช้งานโมเดล Gemma บน GPU RTX 6000 Pro ของ Cloud Run
  • วิธีดาวน์โหลดโมเดลจาก Cloud Storage พร้อมกันระหว่างการเริ่มต้นคอนเทนเนอร์

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

คุณสามารถลบโปรเจ็กต์หรือลบทรัพยากรแต่ละรายการเพื่อหลีกเลี่ยงการเรียกเก็บเงินจากบัญชี Google Cloud สำหรับทรัพยากรที่ใช้ในบทแนะนำนี้

ตัวเลือกที่ 1: ลบทรัพยากร

ลบบริการ Cloud Run

gcloud run services delete $SERVICE_NAME \
      --region $REGION \
      --quiet

ลบบัญชีบริการ

gcloud iam service-accounts delete \
      rtx-codelab-identity@$PROJECT_ID.iam.gserviceaccount.com \
      --quiet

ลบที่เก็บข้อมูล Cloud Storage

gcloud storage rm --recursive gs://$MODEL_BUCKET

ลบอิมเมจคอนเทนเนอร์

การสร้างนี้สร้างอิมเมจคอนเทนเนอร์ใน Artifact Registry คุณสามารถค้นหาชื่อรูปภาพและลบได้

แสดงรายการอิมเมจเพื่อค้นหาชื่อที่แน่นอน (โดยปกติคือ gcr.io/PROJECT_ID/SERVICE_NAME)

gcloud container images list --filter="name:$SERVICE_NAME"

ลบรูปภาพ (แทนที่ IMAGE_NAME ด้วยผลลัพธ์จากด้านบน)

gcloud container images delete <IMAGE_NAME> --force-delete-tags

ตัวเลือกที่ 2: ลบโปรเจ็กต์

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