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

1. مقدمه

نمای کلی

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

امروزه، پردازنده‌های گرافیکی که ما در دسترس قرار می‌دهیم، پردازنده‌های گرافیکی Nvidia L4 با 24 گیگابایت VRAM هستند. هر نمونه Cloud Run یک GPU وجود دارد و مقیاس خودکار Cloud Run همچنان اعمال می‌شود. این شامل کاهش تا 5 نمونه (با افزایش سهمیه در دسترس)، و همچنین کاهش مقیاس به صفر در صورت عدم وجود درخواست است.

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

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

چیزی که یاد خواهید گرفت

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

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 ها را فعال کنید

قبل از اینکه بتوانید از این کد لبه استفاده کنید، چندین API وجود دارد که باید آنها را فعال کنید. این آزمایشگاه کد نیاز به استفاده از API های زیر دارد. با اجرای دستور زیر می توانید آن API ها را فعال کنید:

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

یک دایرکتوری برای این کد لبه ایجاد کنید.

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

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

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

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

حالا اولاما را با دویدن اجرا کنید

ollama serve

اولاما شروع به گوش دادن در پورت 11434 می کند.

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

ollama pull gemma2:2b

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

ollama run gemma2:2b

پس از اتمام چت با Gemma، می توانید با تایپ کردن خارج شوید

/bye

4. یک Storage Bucket ایجاد کنید

اکنون که مدل دانلود شده است، می توانید مدل را به سطل 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. تصویر اوللاما را ایجاد کنید

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

یک مخزن رجیستری مصنوع برای ذخیره تصاویر سرویس خود ایجاد کنید.

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

تصویر olama sidecar را بسازید

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 frontend را ایجاد کنید

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

از داکر برای پایین کشیدن تصویر Open WebUI استفاده کنید.

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

سپس Docker را پیکربندی کنید تا از اعتبارنامه Google Cloud شما برای احراز هویت با Artifact Registry استفاده کند. این به شما امکان می دهد از docker برای ارسال یک تصویر به مخزن رجیستری Artifact استفاده کنید.

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

تصویر خود را تگ کنید و سپس به رجیستری Artifact فشار دهید.

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

سرویس.yaml را به‌روزرسانی کنید تا ID پروژه خود را جایگزین 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 Service را در مرورگر وب خود باز کنید.

پس از بارگیری رابط کاربری، در قسمت Select a model ، Gemma 2 2B را انتخاب کنید.

حالا یک سوال از جما بپرسید، به عنوان مثال "چرا آسمان آبی است؟"

8. تبریک می گویم!

برای تکمیل کد لبه تبریک می گویم!

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

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

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

9. پاکسازی کنید

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

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

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