Cách sử dụng Ollama làm tệp trợ giúp với GPU Cloud Run và Open WebUI làm vùng chứa lưu lượng vào giao diện người dùng

1. Giới thiệu

Tổng quan

Gần đây, Cloud Run đã thêm tính năng hỗ trợ GPU. Tính năng này được cung cấp dưới dạng bản xem trước công khai trong danh sách chờ. Nếu bạn muốn dùng thử tính năng này, hãy điền vào biểu mẫu này để tham gia danh sách chờ. Cloud Run là một nền tảng vùng chứa trên Google Cloud giúp bạn dễ dàng chạy mã trong một vùng chứa mà không cần phải quản lý cụm.

Hiện nay, các GPU chúng tôi cung cấp là GPU Nvidia L4 với 24 GB vRAM. Mỗi phiên bản Cloud Run có một GPU và tính năng tự động điều chỉnh tỷ lệ của Cloud Run vẫn được áp dụng. Điều đó bao gồm việc mở rộng quy mô lên tới 5 phiên bản (có thể tăng hạn mức), cũng như giảm quy mô về 0 phiên bản khi không có yêu cầu nào.

Một trường hợp sử dụng GPU là chạy các mô hình ngôn ngữ lớn (LLM) mở của riêng bạn. Hướng dẫn này sẽ hướng dẫn bạn cách triển khai một dịch vụ chạy một mô hình ngôn ngữ lớn (LLM).

Trong lớp học lập trình này, bạn sẽ triển khai dịch vụ nhiều vùng chứa sử dụng Open WebUI làm vùng chứa lưu lượng vào giao diện người dùng và sử dụng Ollama trong tệp trợ giúp để phân phát mô hình Gemma 2 2B được lưu trữ trong bộ chứa Google Cloud Storage.

Kiến thức bạn sẽ học được

  • Cách tạo dịch vụ nhiều vùng chứa trong Cloud Run
  • Cách triển khai Ollama làm chương trình trợ giúp phân phối mô hình Gemma 2 2B
  • Cách triển khai Open WebUI dưới dạng vùng chứa truy cập vào giao diện người dùng

2. Đặt biến môi trường và bật API

Nâng cấp gcloud CLI

Trước tiên, bạn cần cài đặt một phiên bản gần đây của gcloud CLI. Bạn có thể cập nhật CLI bằng cách chạy lệnh sau:

gcloud components update

Thiết lập biến môi trường

Bạn có thể đặt các biến môi trường sẽ được sử dụng trong suốt lớp học lập trình này.

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

Bật API

Trước khi có thể bắt đầu sử dụng lớp học lập trình này, bạn sẽ cần bật một số API. Lớp học lập trình này yêu cầu sử dụng các API sau. Bạn có thể bật các API đó bằng cách chạy lệnh sau:

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

Tạo một thư mục cho lớp học lập trình này.

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

3. Tạo một vùng chứa GCS để lưu trữ mô hình Gemma 2 2B

Trước tiên, bạn sẽ cài đặt Ollama để tải mô hình xuống. Thao tác này sẽ tải mô hình xuống /home/$USER/.ollama/models

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

Bây giờ hãy chạy ollama bằng cách chạy

ollama serve

Ollama bắt đầu nghe trên cổng 11434.

Mở cửa sổ dòng lệnh thứ hai để kéo mô hình Gemma 2 2B xuống

ollama pull gemma2:2b

(Không bắt buộc) Bạn có thể tương tác với Gemma từ dòng lệnh bằng cách chạy

ollama run gemma2:2b

Khi bạn trò chuyện xong với Gemma, bạn có thể thoát bằng cách nhập

/bye

4. Tạo Bộ chứa Storage

Giờ đây, khi mô hình đã tải xuống, bạn có thể chuyển mô hình đó sang bộ chứa GCS.

Trước tiên, hãy tạo bộ chứa.

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

Bây giờ, hãy di chuyển thư mục mô hình vào GCS.

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

5. Tạo hình ảnh Ollama

Tạo một tệp dockerfile có nội dung sau

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"]

Tạo một kho lưu trữ Artifact Registry để lưu trữ hình ảnh dịch vụ.

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

Tạo hình ảnh xe bên 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. Tạo hình ảnh giao diện người dùng Open WebUI

Trong phần này, bạn sẽ tạo vùng chứa lưu lượng vào giao diện người dùng bằng Open WebUI.

Dùng docker để kéo hình ảnh Open WebUI xuống.

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

Sau đó, định cấu hình Docker để sử dụng thông tin đăng nhập Google Cloud của bạn nhằm xác thực với Artifact Registry. Thao tác này sẽ cho phép bạn sử dụng docker để đẩy một hình ảnh vào kho lưu trữ Artifact Registry.

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

Gắn thẻ cho hình ảnh rồi đẩy vào Cấu phần phần mềm.

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. Triển khai dịch vụ nhiều vùng chứa cho Cloud Run

Sử dụng tệp yaml để triển khai dịch vụ nhiều vùng chứa

Tạo service.yaml với các nội dung sau.

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

Cập nhật service.yaml để thay thế PROJECT_ID bằng mã dự án của bạn:

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

Triển khai cho Cloud Run bằng lệnh sau.

gcloud beta run services replace service.yaml

Kiểm thử dịch vụ Cloud Run

Bây giờ, hãy mở URL của dịch vụ trong trình duyệt web.

Sau khi giao diện người dùng tải xong, trong phần Chọn mô hình, hãy chọn Gemma 2 2B.

Bây giờ, hãy đặt câu hỏi cho Gemma, ví dụ: "Sao bầu trời lại có màu xanh?"

8. Xin chúc mừng!

Chúc mừng bạn đã hoàn thành lớp học lập trình!

Bạn nên xem tài liệu về hàm Cloud Run

Nội dung đã đề cập

  • Cách tạo dịch vụ nhiều vùng chứa trong Cloud Run
  • Cách triển khai Ollama làm chương trình trợ giúp phân phối mô hình Gemma 2 2B
  • Cách triển khai Open WebUI dưới dạng vùng chứa lưu lượng vào giao diện người dùng

9. Dọn dẹp

Để tránh bị tính phí do nhầm lẫn (ví dụ: nếu các dịch vụ Cloud Run vô tình được gọi nhiều lần hơn mức phân bổ số lần gọi Cloud Run hằng tháng trong cấp miễn phí), bạn có thể xoá Cloud Run hoặc xoá dự án mà bạn đã tạo ở Bước 2.

Để xoá hàm Cloud Run, hãy truy cập vào Cloud Console của Cloud Run tại https://console.cloud.google.com/run rồi xoá dịch vụ ollama-sidecar-codelab.

Nếu chọn xoá toàn bộ dự án, bạn có thể truy cập vào https://console.cloud.google.com/cloud-resource-manager, chọn dự án bạn đã tạo ở Bước 2 rồi chọn Xoá. Nếu xoá dự án, bạn sẽ phải thay đổi các dự án trong Cloud SDK của mình. Bạn có thể xem danh sách tất cả dự án hiện có bằng cách chạy gcloud projects list.