نحوه استفاده از Ollama به عنوان یک سایدکار با پردازنده‌های گرافیکی Cloud Run و Open WebUI به عنوان یک محفظه ورودی frontend

۱. مقدمه

نمای کلی

Cloud Run اخیراً پشتیبانی از GPU را اضافه کرده است. این قابلیت به صورت پیش‌نمایش عمومی در لیست انتظار موجود است. اگر علاقه‌مند به امتحان کردن این ویژگی هستید، این فرم را پر کنید تا به لیست انتظار بپیوندید. Cloud Run یک پلتفرم کانتینر در Google Cloud است که اجرای کد شما را در یک کانتینر، بدون نیاز به مدیریت یک کلاستر، ساده می‌کند.

امروزه، پردازنده‌های گرافیکی که ما ارائه می‌دهیم، پردازنده‌های گرافیکی Nvidia L4 با ۲۴ گیگابایت حافظه مجازی هستند. به ازای هر نمونه Cloud Run یک پردازنده گرافیکی وجود دارد و مقیاس‌بندی خودکار Cloud Run همچنان اعمال می‌شود. این شامل مقیاس‌بندی تا ۵ نمونه (با امکان افزایش سهمیه) و همچنین کاهش مقیاس به صفر نمونه در صورت عدم درخواست می‌شود.

یکی از کاربردهای پردازنده‌های گرافیکی (GPU) اجرای مدل‌های زبان بزرگ (LLM) متن‌باز خودتان است. این آموزش شما را در پیاده‌سازی سرویسی که یک LLM را اجرا می‌کند، راهنمایی می‌کند.

در این آزمایشگاه کد، شما یک سرویس چند کانتینری را مستقر خواهید کرد که از Open WebUI به عنوان یک کانتینر ورودی frontend استفاده می‌کند و از Ollama در یک محفظه جانبی برای ارائه یک مدل Gemma 2 2B ذخیره شده در یک سطل ذخیره‌سازی ابری گوگل استفاده می‌کند.

آنچه یاد خواهید گرفت

  • نحوه ایجاد یک سرویس چند کانتینری در Cloud Run
  • نحوه استقرار Ollama به عنوان یک خودروی جانبی در خدمت مدل Gemma 2 2B
  • نحوه‌ی پیاده‌سازی Open WebUI به عنوان یک کانتینر ورودی frontend

۲. تنظیم متغیرهای محیطی و فعال کردن APIها

ارتقاء رابط خط فرمان gcloud

ابتدا، باید آخرین نسخه از رابط خط فرمان gcloud را نصب کنید. می‌توانید با اجرای دستور زیر، رابط خط فرمان را به‌روزرسانی کنید:

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

۳. یک سطل GCS برای ذخیره مدل Gemma 2 2B ایجاد کنید

ابتدا، Ollama را برای دانلود مدل نصب خواهید کرد. این کار مدل را در /home/$USER/.ollama/models دانلود می‌کند.

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

حالا با اجرای دستور زیر، اولاما را اجرا کنید.

ollama serve

اولاما شروع به گوش دادن به پورت ۱۱۴۳۴ می‌کند.

یک پنجره ترمینال دوم باز کنید تا مدل Gemma 2 2B را به پایین بکشید

ollama pull gemma2:2b

(اختیاری) می‌توانید با اجرای دستور زیر از طریق خط فرمان با Gemma تعامل داشته باشید.

ollama run gemma2:2b

وقتی چت کردن با جما تمام شد، می‌توانید با تایپ کردن عبارت «\» از آن خارج شوید.

/bye

۴. یک سطل ذخیره‌سازی ایجاد کنید

اکنون که مدل دانلود شده است، می‌توانید آن را به سطل GCS خود منتقل کنید.

ابتدا سطل را ایجاد کنید.

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

حالا، پوشه models را به GCS منتقل کنید.

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

۵. تصویر اولاما را ایجاد کنید

یک فایل docker با محتوای زیر ایجاد کنید

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

تصویر واگن کناری اولاما را بسازید

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

۶. تصویر رابط کاربری Open WebUI را ایجاد کنید

در این بخش، با استفاده از Open WebUI، کانتینر ورودی frontend را ایجاد خواهید کرد.

از داکر برای دریافت تصویر 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

۷. سرویس چند کانتینری را در 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 را آزمایش کنید

اکنون آدرس اینترنتی سرویس را در مرورگر وب خود باز کنید.

پس از اتمام بارگذاری رابط کاربری، در قسمت «انتخاب مدل» ، Gemma 2 2B را انتخاب کنید.

حالا از جما یک سوال بپرسید، مثلاً «چرا آسمان آبی است؟»

۸. تبریک می‌گویم!

تبریک می‌گویم که آزمایشگاه کد را تمام کردید!

توصیه می‌کنیم مستندات مربوط به توابع Cloud Run را بررسی کنید.

آنچه ما پوشش داده‌ایم

  • نحوه ایجاد یک سرویس چند کانتینری در Cloud Run
  • نحوه استقرار Ollama به عنوان یک خودروی جانبی در خدمت مدل Gemma 2 2B
  • نحوه‌ی پیاده‌سازی Open WebUI به عنوان یک کانتینر ورودی frontend

۹. تمیز کردن

برای جلوگیری از هزینه‌های ناخواسته، (برای مثال، اگر سرویس‌های Cloud Run سهواً بیشتر از تخصیص فراخوانی ماهانه Cloud Run شما در سطح رایگان فراخوانی شوند)، می‌توانید Cloud Run یا پروژه‌ای را که در مرحله 2 ایجاد کرده‌اید، حذف کنید.

برای حذف عملکرد Cloud Run، به کنسول Cloud Run در آدرس https://console.cloud.google.com/run بروید و سرویس ollama-sidecar-codelab را حذف کنید.

اگر تصمیم به حذف کل پروژه دارید، می‌توانید به آدرس https://console.cloud.google.com/cloud-resource-manager بروید، پروژه‌ای را که در مرحله ۲ ایجاد کرده‌اید انتخاب کنید و گزینه Delete را انتخاب کنید. اگر پروژه را حذف کنید، باید پروژه‌ها را در Cloud SDK خود تغییر دهید. می‌توانید با اجرای gcloud projects list لیست تمام پروژه‌های موجود را مشاهده کنید.