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

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

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

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

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

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

อัปเกรด gcloud CLI

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

gcloud components update

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

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

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

เปิดใช้ API

ก่อนที่จะเริ่มใช้ Codelab นี้ได้ คุณจะต้องเปิดใช้ API หลายรายการ Codelab นี้กำหนดให้ใช้ 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 --platform=linux/amd64 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

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

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

สร้างอิมเมจ Sidecar ของ 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
        env:
          - name: OLLAMA_MODELS
            value: /root/.ollama/models
        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 ใช้งานได้ในฐานะ Sidecar ที่ให้บริการโมเดล Gemma 2 2B
  • วิธีทําให้ Open WebUI ใช้งานได้เป็นคอนเทนเนอร์ขาเข้าส่วนหน้า

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

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

หากต้องการลบฟังก์ชัน Cloud Run ให้ไปที่ Cloud Console ของ 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