GDC Sandbox AI Optimized SKU に含まれるエンタープライズ グレードの NVIDIA GPU を使用すると、生成 AI などの要求の厳しい AI トレーニング アプリケーションと推論アプリケーションを開発してテストできます。
Gemma は、Gemini テクノロジーに基づく軽量の大規模言語モデルです。このチュートリアル ガイドでは、GDC Sandbox に Ollama と Open-WebUI を使用して Gemma をデプロイする方法について説明します。このガイドの目的は次のとおりです。
- GPU を使用する AI 最適化 GDC Sandbox に Gemma モデルを使用して Ollama をデプロイします。
- Open-WebUI インターフェースを介して、プライベート エンドポイントの Ollama サービスにプロンプトを送信します。
始める前に
GDC Sandbox の GPU は org-infra クラスタに含まれています。
組織のインフラストラクチャ クラスタに対してコマンドを実行するには、クラスタを操作するで説明されているように、
org-1-infra
クラスタの kubeconfig があることを確認します。gdcloud
コマンドラインで構成と認証を行う。- 組織インフラストラクチャ クラスタの kubeconfig ファイルを生成し、そのパスを環境変数
KUBECONFIG
に割り当てます。
ユーザーにプロジェクト
sandbox-gpu-project
のsandbox-gpu-admin
ロールが割り当てられていることを確認します。デフォルトでは、このロールはplatform-admin
ユーザーに割り当てられます。platform-admin
としてログインし、次のコマンドを実行して、他のユーザーにロールを割り当てることができます。kubectl --kubeconfig ${KUBECONFIG} create rolebinding ${NAME} --role=sandbox-gpu-admin \ --user=${USER} --namespace=sandbox-gpu-project
Artifact Registry の使用の説明に従って Artifact Registry リポジトリを設定し、アーティファクト レジストリにイメージを push および pull できるようにログインしてください。
Ollama と Open-WebUI を使用して Gemma モデルをデプロイする
デプロイは、特定のコンポーネントまたはサービスを定義する Kubernetes 構成ファイル(YAML マニフェスト)のセットによってオーケストレートされます。
Gemma が事前にダウンロードされた Dockerfile を作成します。
FROM ubuntu # Install Ollama # This uses Ollamas official installation script, which adds Ollama to /usr/local/bin RUN apt-get update && apt-get install -y --no-install-recommends curl ca-certificates RUN curl -fsSL https://ollama.com/install.sh -o install.sh RUN chmod +x install.sh RUN ./install.sh && \ rm -rf /var/lib/apt/lists/* # Set environment variables for Ollama (optional, but good practice) ENV OLLAMA_HOST="0.0.0.0" # ENV OLLAMA_MODELS="/usr/local/ollama/models" # Default is /root/.ollama # If you want to customize the model storage path within the container, set OLLAMA_MODELS # and then ensure you create and populate that directory. Default is usually fine for pre-downloaded. # --- Predownload Gemma Model --- # This step starts Ollama server in the background, pulls the model, # and then kills the server to allow the Docker build to continue. # This approach works around Docker''s RUN command limitations for services. RUN ollama serve & \ sleep 5 && \ # Give the Ollama server a moment to start up # Use --retry and --retry-connrefused to handle startup delays curl --retry 10 --retry-connrefused -s http://localhost:11434 || true && \ echo "Attempting to pull gemma:7b..." && \ ollama pull gemma:7b && \ echo "Model pull complete. Cleaning up background Ollama process." && \ pkill ollama || true # Gracefully kill the ollama serve process # Expose Ollama's default port EXPOSE 11434 # Command to run Ollama server when the container starts CMD ["ollama", "serve"]
Docker イメージをビルドして、Artifact Registry リポジトリにアップロードします。
docker build -t ollama-gemma . docker tag ollama-gemma REGISTRY_REPOSITORY_URL/ollama-gemma:latest docker push REGISTRY_REPOSITORY_URL/ollama-gemma:latest
次のように置き換えます。
REGISTRY_REPOSITORY_URL
は、リポジトリの URL に置き換えます。
Docker 認証情報を保存する Secret を作成します。
export SECRET=DOCKER_REGISTRY_SECRET export DOCKER_TEST_CONFIG=~/.docker/config.json kubectl --kubeconfig ${KUBECONFIG}$ create secret docker-registry ${SECRET} --from-file=.dockerconfigjson=${DOCKER_TEST_CONFIG} -n sandbox-gpu-project
次のように置き換えます。
DOCKER_REGISTRY_SECRET
: シークレットの名前。
ollama-deployment.yaml
ファイルを作成して、Ollama AI エンジンのデプロイを定義します。Ollama サーバーのデプロイでは、1 つの GPU がリクエストされます。
apiVersion: apps/v1 kind: Deployment metadata: annotations: deployment.kubernetes.io/revision: "9" name: ollama namespace: sandbox-gpu-project spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: ollama strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: ollama egress.networking.gke.io/enabled: "true" spec: containers: - name: ollama image: REGISTRY_REPOSITORY_URL/ollama-gemma:latest imagePullPolicy: Always ports: - containerPort: 11434 protocol: TCP resources: limits: nvidia.com/gpu-pod-NVIDIA_H100_80GB_HBM3: "1" requests: nvidia.com/gpu-pod-NVIDIA_H100_80GB_HBM3: "1" env: - name: OLLAMA_HOST value: 0.0.0.0 - name: OLLAMA_ORIGINS value: http://localhost:8080,http://ollama-webui.ollama-llm.svc.cluster.local:8080,http://ollama-webui:8080 securityContext: seLinuxOptions: type: unconfined_t terminationMessagePath: /dev/termination-log terminationMessagePolicy: File imagePullSecrets: - name: DOCKER_REGISTRY_SECRET dnsConfig: nameservers: - 8.8.8.8 dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler terminationGracePeriodSeconds: 30
次のように置き換えます。
REGISTRY_REPOSITORY_URL
: リポジトリの URL。DOCKER_REGISTRY_SECRET
: Secret の名前。
Ollama サーバーを内部的に公開するファイル
ollama-service.yaml
を作成します。apiVersion: v1 kind: Service metadata: name: ollama namespace: sandbox-gpu-project annotations: metallb.universe.tf/ip-allocated-from-pool: lb-address-pool-0-ptleg spec: type: LoadBalancer selector: app: ollama ports: - port: 11434 nodePort: 30450 ipFamilyPolicy: SingleStack ipFamilies: - IPv4 clusterIPs: - 10.1.122.216 clusterIP: 10.1.122.216
マニフェストを適用する
kubectl --kubeconfig ${KUBECONFIG} apply -f ollama-deployment.yaml kubectl --kubeconfig ${KUBECONFIG} apply -f ollama-service.yaml
ollama Pod が実行されていることを確認します。
kubectl --kubeconfig ${KUBECONFIG} get deployments -n sandbox-gpu-project kubectl --kubeconfig ${KUBECONFIG} get service -n sandbox-gpu-project
出力から Ollama サービス
OLLAMA_BASE_END_POINT
の外部 IP をメモします。kubectl --kubeconfig ${KUBECONFIG} get service ollama \ -n sandbox-gpu-project -o jsonpath='{.status.loadBalancer.ingress[*].ip}'
Open-WebUI インターフェースをデプロイするファイル
openweb-ui-deployment.yaml
を作成します。apiVersion: apps/v1 kind: Deployment metadata: name: ollama-webui namespace: sandbox-gpu-project labels: app: ollama-webui annotations: deployment.kubernetes.io/revision: "5" spec: replicas: 1 selector: matchLabels: app: ollama-webui strategy: type: RollingUpdate rollingUpdate: maxSurge: 25% maxUnavailable: 25% progressDeadlineSeconds: 600 revisionHistoryLimit: 10 template: metadata: labels: app: ollama-webui creationTimestamp: null spec: containers: - name: ollama-webui image: ghcr.io/open-webui/open-webui:main imagePullPolicy: IfNotPresent ports: - name: http containerPort: 8080 protocol: TCP env: - name: OLLAMA_BASE_URL value: OLLAMA_BASE_END_POINT - name: PORT value: "8080" terminationMessagePath: /dev/termination-log terminationMessagePolicy: File restartPolicy: Always dnsPolicy: ClusterFirst schedulerName: default-scheduler terminationGracePeriodSeconds: 30
次のように置き換えます。
OLLAMA_BASE_END_POINT
: Ollama サービスの外部 IP アドレス。
ファイル
ollama-webui-service.yaml
を作成して、オープン webui インターフェースを外部に公開します。apiVersion: v1 kind: Service metadata: name: ollama-webui namespace: sandbox-gpu-project annotations: metallb.universe.tf/ip-allocated-from-pool: lb-address-pool-0-ptleg spec: type: LoadBalancer ipFamilyPolicy: SingleStack ipFamilies: - IPv4 clusterIPs: - 10.1.104.52 clusterIP: 10.1.104.52 ports: - port: 80 targetPort: 8080 nodePort: 32351 selector: app: ollama-webui
マニフェスト
openweb-ui-deployment.yaml
とollama-webui-service.yaml
をクラスタに適用します。kubectl --kubeconfig ${KUBECONFIG} apply -f openweb-ui-deployment.yaml kubectl --kubeconfig ${KUBECONFIG} apply -f ollama-webui-service.yaml
外部 IP アドレスからのインバウンド トラフィックを許可するプロジェクト ネットワーク ポリシーを作成します。
kubectl --kubeconfig ${KUBECONFIG} apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ProjectNetworkPolicy metadata: namespace: sandbox-gpu-project name: allow-inbound-traffic-from-external spec: policyType: Ingress subject: subjectType: UserWorkload ingress: - from: - ipBlock: cidr: 0.0.0.0/0 EOF
次のコマンドを実行して、Ollama サービスの外部 IP を特定します。この値は、後のステップで
OPEN_WEB_UI_ENDPOINT
に代入するので、メモしておいてください。kubectl --kubeconfig ${KUBECONFIG} get service -n sandbox-gpu-project
Google Chrome を開き、前の手順で確認した外部 IP アドレスを使用して URL を入力します。これで、Open Web UI インターフェースを介して Gemma モデルを操作できるようになりました。
http://OPEN_WEB_UI_ENDPOINT/