วิธีใช้ Ollama เป็นไฟล์ช่วยเหลือที่มี Cloud Run GPU และ Open WebUI เป็นคอนเทนเนอร์ขาเข้าของฟรอนท์เอนด์

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 ใช้งานได้

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

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

  • วิธีสร้างบริการคอนเทนเนอร์หลายรายการใน Cloud Run
  • วิธีทำให้ Ollama ทำงานเป็นอุปกรณ์เสริมที่ให้บริการ Gemma 2 รุ่น 2B
  • วิธีทำให้ Open WebUI ใช้งานได้ในฐานะคอนเทนเนอร์ Ingress ของส่วนหน้า

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

อัปเกรด gcloud CLI

ก่อนอื่น คุณจะต้องติดตั้ง gcloud CLI เวอร์ชันล่าสุด คุณอัปเดต CLI โดยเรียกใช้คำสั่งต่อไปนี้

gcloud components update

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

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

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=us-central1
gcloud config set project $PROJECT_ID

เปิดใช้ API

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

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

สร้างไดเรกทอรีสำหรับ Codelab นี้

mkdir ollama-sidecar-codelab
cd ollama-sidecar-codelab

3. สร้างที่เก็บข้อมูล GCS เพื่อจัดเก็บโมเดล Gemma 2 2B

ก่อนอื่น คุณจะต้องติดตั้ง Ollama เพื่อดาวน์โหลดโมเดล การดำเนินการนี้จะดาวน์โหลดโมเดลไปยัง /home/$USER/.ollama/models

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

ตอนนี้ให้เรียกใช้ ollama โดยเรียกใช้

ollama serve

Ollama เริ่มฟังที่พอร์ต 11434

เปิดหน้าต่างเทอร์มินัลที่ 2 เพื่อดึงโมเดล Gemma 2 2B ลงมาเพื่อ

ollama pull gemma2:2b

(ไม่บังคับ) คุณสามารถโต้ตอบกับ Gemma จากบรรทัดคำสั่งได้โดยเรียกใช้

ollama run gemma2:2b

เมื่อแชทกับ Gemma เสร็จแล้ว คุณสามารถออกได้โดยพิมพ์

/bye

4. สร้างที่เก็บข้อมูล

เมื่อดาวน์โหลดโมเดลแล้ว คุณจะย้ายโมเดลไปยังที่เก็บข้อมูล GCS ได้

ก่อนอื่นให้สร้างที่เก็บข้อมูล

gcloud storage buckets create gs://$PROJECT_ID-gemma2-2b-codelab

จากนั้นให้ย้ายโฟลเดอร์โมเดลไปยัง GCS

gsutil cp -r /home/$USER/.ollama/models gs://$PROJECT_ID-gemma2-2b-codelab

5. สร้างรูปภาพ Ollama

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

FROM ollama/ollama

# 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 

# Store the model weights in the container image
ENV MODEL gemma2:2b
RUN ollama serve & sleep 5 && ollama pull $MODEL 

# Start Ollama
ENTRYPOINT ["ollama", "serve"]

สร้างที่เก็บ Artifact Registry เพื่อจัดเก็บอิมเมจบริการ

gcloud artifacts repositories create ollama-sidecar-codelab-repo --repository-format=docker \
    --location=us-central1 --description="Ollama + OpenWebUI website demo" \
    --project=$PROJECT_ID

สร้างรูปภาพไฟล์ช่วยเหลือของ ollama

gcloud builds submit \
   --tag us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/ollama-gemma-2b \
   --machine-type e2-highcpu-32

6. สร้างรูปภาพฟรอนท์เอนด์ Open WebUI

ในส่วนนี้ คุณจะต้องสร้างคอนเทนเนอร์ Ingress ของฟรอนต์เอนด์โดยใช้ Open WebUI

ใช้ Docker เพื่อดึงภาพ Open WebUI ลง

docker pull ghcr.io/open-webui/open-webui:main

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

gcloud auth configure-docker us-central1-docker.pkg.dev

ติดแท็กอิมเมจแล้วพุชไปยัง Artifact Registry

docker tag ghcr.io/open-webui/open-webui:main us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui

docker push us-central1-docker.pkg.dev/$PROJECT_ID/ollama-sidecar-codelab-repo/openwebui

7. ทำให้บริการหลายคอนเทนเนอร์ใช้งานได้ใน Cloud Run

ใช้ไฟล์ yaml เพื่อทำให้บริการหลายคอนเทนเนอร์ใช้งานได้

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

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: ollama-sidecar-codelab
  labels:
    cloud.googleapis.com/location: us-central1
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/maxScale: '5'
        run.googleapis.com/cpu-throttling: 'false'
        run.googleapis.com/startup-cpu-boost: 'true'
        run.googleapis.com/container-dependencies: '{"openwebui":["ollama-sidecar"]}'
    spec:
      containerConcurrency: 80
      timeoutSeconds: 300
      containers:
      - name: openwebui
        image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/openwebui
        ports:
        - name: http1
          containerPort: 8080
        env:
        - name: OLLAMA_BASE_URL
          value: http://localhost:11434
        - name: WEBUI_AUTH
          value: 'false'
        resources:
          limits:
            memory: 1Gi
            cpu: 2000m
        volumeMounts:
        - name: in-memory-1
          mountPath: /app/backend/data
        startupProbe:
          timeoutSeconds: 240
          periodSeconds: 240
          failureThreshold: 1
          tcpSocket:
            port: 8080
      - name: ollama-sidecar
        image: us-central1-docker.pkg.dev/YOUR_PROJECT_ID/ollama-sidecar-codelab/ollama-gemma-2b
        resources:
          limits:
            cpu: '6'
            nvidia.com/gpu: '1'
            memory: 16Gi
        volumeMounts:
        - name: gcs-1
          mountPath: /root/.ollama
        startupProbe:
          timeoutSeconds: 1
          periodSeconds: 10
          failureThreshold: 3
          tcpSocket:
            port: 11434
      volumes:
      - name: gcs-1
        csi:
          driver: gcsfuse.run.googleapis.com
          volumeAttributes:
            bucketName: YOUR_PROJECT_ID-gemma2-2b-codelab
      - name: in-memory-1
        emptyDir:
          medium: Memory
          sizeLimit: 10Gi
      nodeSelector:
        run.googleapis.com/accelerator: nvidia-l4

อัปเดต service.yaml เพื่อแทนที่ PROJECT_ID ด้วยรหัสโปรเจ็กต์ของคุณ

sed -i "s/YOUR_PROJECT_ID/${PROJECT_ID}/g" service.yaml

ติดตั้งใช้งานใน Cloud Run โดยใช้คําสั่งต่อไปนี้

gcloud beta run services replace service.yaml

ทดสอบบริการ Cloud Run

จากนั้นเปิด URL บริการในเว็บเบราว์เซอร์

เมื่อ UI โหลดเสร็จแล้ว ให้เลือก Gemma 2 2B ในส่วนเลือกรุ่น

ตอนนี้ลองถาม Gemma คำถาม เช่น "ทำไมท้องฟ้าถึงเป็นสีฟ้า"

8. ยินดีด้วย

ยินดีด้วยที่ทํา Codelab จนเสร็จสมบูรณ์

เราขอแนะนําให้อ่านเอกสารประกอบเกี่ยวกับฟังก์ชัน Cloud Run

หัวข้อที่ครอบคลุม

  • วิธีสร้างบริการคอนเทนเนอร์หลายรายการใน Cloud Run
  • วิธีทำให้ Ollama ทำงานเป็นอุปกรณ์เสริมที่ให้บริการ Gemma 2 รุ่น 2B
  • วิธีทำให้ Open WebUI ใช้งานได้เป็นคอนเทนเนอร์ฟรอนท์เอนด์

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

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

หากต้องการลบฟังก์ชัน Cloud Run ให้ไปที่คอนโซล Cloud ของ Cloud Run ที่ https://console.cloud.google.com/run แล้วลบบริการ ollama-sidecar-codelab

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