Model sunma altyapısı

Ortamınızda halihazırda bir model sunma çözümü yoksa IBM Bob şirket içi dağıtımı için model endpoint'lerini dağıtın ve yapılandırın.

IBM Bob'u büyük bir dil modeline (LLM) bağlayabilmek için önce dağıtılmış bir model endpoint'ine erişiminiz olması gerekir. Bob IDE, model sunma altyapısını temin etmez, barındırmaz veya yönetmez. Kuruluşunuz Red Hat OpenShift Container Platform (OCP) AI, GPU tabanlı çıkarım sunucuları, bulut AI hizmetleri veya diğer çıkarım platformları aracılığıyla zaten model endpoint'leri sağlıyorsa doğrudan Model çıkarım gateway'ini yapılandırma sayfasına geçin.

Ortamınıza ve operasyonel gereksinimlerinize en uygun seçeneği belirleyin.

SeçenekNe zaman kullanılır
OpenShift AI (küme içi, OCI/ModelCar)Air-gapped veya kendi barındırmalı modeller; Red Hat OpenShift AI kümede zaten mevcut
Genel bulut model endpoint'leriAWS Bedrock, Azure OpenAI veya Google Vertex AI aracılığıyla sınır modelleri
Özel altyapı model endpoint'leriAyrı GPU sunucularında veya özel bir çıkarım kümesinde sunulan model

OpenShift AI ile model dağıtma (küme içi, OCI/ModelCar)

Red Hat OpenShift AI (RHOAI), air-gapped dağıtımlar dahil olmak üzere modelleri küme içinde sunmak için önerilen platformdur. Model ağırlıklarını yüklemek için tercih edilen yaklaşım OCI/ModelCar desenidir: model dosyaları /models/ dizini altında bir OCI image'ına yerleştirilir ve özel bir registry'ye push edilir. InferenceService dağıtıldığında KServe, image'ı çeken ve ağırlıkları /mnt/models/ konumundaki paylaşımlı bir birime (volume) kopyalayan bir modelcar-init init container enjekte eder; ardından sunma runtime'ı (örneğin vLLM) bu konumdan yükleme yapar. Model image'ı ilk çekmenin ardından node'da önbelleğe alınır; aynı node üzerindeki sonraki yeniden başlatmalarda indirme işlemi atlanır.

Ön koşullar:

  • Kümede Red Hat OpenShift AI operator yüklü olmalıdır
  • KServe etkinleştirilmiş ve yapılandırılmış olmalıdır
  • NVIDIA GPU Operator (veya eşdeğeri) yapılandırılmış GPU'lu worker node'ları mevcut olmalıdır
  • oc CLI, hedef namespace'te kaynak oluşturma iznine sahip olacak şekilde hedef kümeye doğrulanmış olmalıdır
  • Kümeden erişilebilir, image push etmek için kimlik bilgilerine sahip özel bir container registry mevcut olmalıdır

Red Hat OpenShift AI'ı yapılandırma

DataScienceClusterInitialization ve DataScienceCluster kaynaklarını aşağıdaki şekilde yapılandırın:

  • serviceMesh devre dışı bırakılmalıdır.
  • managementState: Managed ayarlanarak KServe etkinleştirilmelidir.
  • KServe RawDeployment modunu kullanacak şekilde yapılandırılmalıdır.
  • Kullanılmayan tüm Red Hat OpenShift AI bileşenleri kaldırılmalıdır.

Örnek KServe yapılandırması:

kserve:
  defaultDeploymentMode: RawDeployment
  nim:
    managementState: Managed
  rawDeploymentServiceConfig: Headed
  serving:
    ingressGateway:
      certificate:
        type: OpenshiftDefaultIngress
    managementState: Removed
    name: knative-serving
  managementState: Managed

ModelCar desteğini etkinleştirme

ModelCar desteği, redhat-ods-applications namespace'indeki inferenceservice-config ConfigMap tarafından kontrol edilir. storageInitializer anahtarı "enableModelcar": true değerini içermelidir.

Mevcut yapılandırmayı doğrulayın:

oc get configmap inferenceservice-config \
  -n redhat-ods-applications \
  -o jsonpath='{.data.storageInitializer}'

Çıktı şunu içermelidir:

{
  "enableModelcar": true,
  "cpuModelcar": "10m",
  "memoryModelcar": "15Mi"
}

enableModelcar eksik veya false ise ConfigMap'i güncelleyin:

# Mevcut değeri al, bayrağı birleştir ve patch uygula
CURRENT=$(oc get configmap inferenceservice-config \
  -n redhat-ods-applications \
  -o jsonpath='{.data.storageInitializer}')
PATCHED=$(echo "$CURRENT" | python3 -c "
import json, sys
d = json.load(sys.stdin)
d['enableModelcar'] = True
print(json.dumps(d))
")
oc patch configmap inferenceservice-config \
  -n redhat-ods-applications \
  --type merge \
  -p "{\"data\":{\"storageInitializer\":$(echo $PATCHED | python3 -c 'import json,sys; print(json.dumps(sys.stdin.read()))')}}"

Değişikliği uygulamak için KServe controller'ını yeniden başlatın:

oc rollout restart deployment kserve-controller-manager -n redhat-ods-applications
oc rollout status deployment kserve-controller-manager -n redhat-ods-applications

Model dosyalarını bir OCI image'ına paketleme

Model ağırlıklarını Hugging Face'ten indirin ve bir OCI image'ına paketleyin. Image'ın tüm model dosyalarını /models dizininin altında barındırması gerekir. Daha fazla bilgi için bkz. KServe belgelerinde OCI image'ı model verileriyle hazırlama. vLLM dağıtımları için safetensors model parçalarını ekleyin ve .bin, .pt ve original/* gibi eski checkpoint dosyalarını hariç tutun.

Örnek Dockerfile:

FROM busybox:latest

# Model ağırlıkları -- safetensors parçaları ve indeksi
COPY <model-name>/model-*.safetensors        /models/
COPY <model-name>/model.safetensors.index.json /models/

# Model yapılandırması
COPY <model-name>/config.json            /models/
COPY <model-name>/generation_config.json /models/

# Tokenizer
COPY <model-name>/tokenizer.json          /models/
COPY <model-name>/tokenizer_config.json   /models/
COPY <model-name>/special_tokens_map.json /models/

Model bir sohbet şablonu içeriyorsa (örneğin chat_template.jinja) ekleyin. Alternatif olarak tüm dizini tek bir talimatla kopyalayabilirsiniz; bu daha basittir ancak vLLM için gerekli olmayan dosyaları da içerir:

FROM busybox:latest
COPY <model-name>/ /models/

Image'ı özel bir registry'ye push etme

OCI image'ını kümeden erişilebilir özel bir container registry'ye push edin:

<registry>/<project>/<model-name>:latest

Ortamınıza uygun araçları kullanın (podman push, skopeo copy, bir CI pipeline vb.).

Hedef namespace ve image pull secret oluşturma

Proje namespace'ini oluşturun ve model image'ını çekmek için kimlik bilgilerini yapılandırın.

Namespace'i oluşturun:

oc new-project <namespace>

Registry pull secret'ı oluşturun:

# KServe'in özel registry'nizden model image'ını çekebilmesi için pull secret
oc create secret docker-registry model-registry-secret \
  --docker-server=<registry> \
  --docker-username=<username> \
  --docker-password=<password-or-token> \
  -n <namespace>

Bir service account oluşturun:

# KServe predictor tarafından kullanılan service account
oc create sa model-puller-sa -n <namespace>

Pull secret'ı service account ile ilişkilendirin:

# Pull secret'ı ekle -- her iki komut da gereklidir:
# oc secrets link genel secret kullanımını kapsar;
# imagePullSecrets, özellikle KServe'in ModelCar init container'ı için gereklidir
oc secrets link model-puller-sa model-registry-secret --for=pull -n <namespace>
oc patch serviceaccount model-puller-sa -n <namespace> \
  -p '{"imagePullSecrets": [{"name": "model-registry-secret"}]}'
Not:

Her iki komut da gereklidir. imagePullSecrets girdisi, model image alımı sırasında ModelCar başlatma container'ı tarafından kullanılır.

ServingRuntime oluşturma

Hedef namespace'te vLLM tabanlı bir ServingRuntime dağıtın.

apiVersion: serving.kserve.io/v1alpha1
kind: ServingRuntime
metadata:
  name: vllm-runtime
  namespace: <namespace>
spec:
  multiModel: false
  supportedModelFormats:
    - name: pytorch
      autoSelect: true
  containers:
    - name: kserve-container
      image: vllm/vllm-openai:<version>
      ports:
        - containerPort: 3000
          protocol: TCP
      livenessProbe:
        httpGet:
          path: /health
          port: 3000
        periodSeconds: 30
        timeoutSeconds: 5
        failureThreshold: 3
      readinessProbe:
        httpGet:
          path: /health
          port: 3000
        periodSeconds: 10
        timeoutSeconds: 5
        failureThreshold: 3
      startupProbe:
        httpGet:
          path: /health
          port: 3000
        periodSeconds: 10
        timeoutSeconds: 5
        failureThreshold: 60

Runtime yapılandırmasını uygulayın:

oc apply -n <namespace> -f serving-runtime-vllm.yaml

InferenceService dağıtma

oci:// depolama URI'sini kullanarak OCI model image'ına başvuran bir InferenceService oluşturun.

Temel yapılandırma gereksinimleri:

  • Önceden oluşturulan ServingRuntime'a başvurun.
  • OCI image konumunu storageUri içinde belirtin.
  • Model gereksinimleriyle eşleşen CPU, bellek ve GPU kaynak sınırlarını yapılandırın.
  • vLLM için paylaşımlı bellek (/dev/shm) bağlayın.
  • vLLM runtime bağımsız değişkenlerini ve ortam değişkenlerini yapılandırın.
apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: <model-name>
  annotations:
    serving.kserve.io/autoscalerClass: external
    serving.kserve.io/deploymentMode: RawDeployment
spec:
  predictor:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: kubernetes.io/arch
                  operator: In
                  values:
                    - amd64
    tolerations:
      - key: nvidia.com/gpu
        operator: Exists
        effect: NoSchedule
    volumes:
      - name: shm
        emptyDir:
          medium: Memory
          sizeLimit: 64Gi
    model:
      modelFormat:
        name: pytorch
      runtime: vllm-runtime
      storageUri: "oci://<registry>/<namespace-or-project>/<model-name>:latest"
      resources:
        requests:
          cpu: "<cpu-request>"          # örn. "8"
        limits:
          cpu: "<cpu-limit>"            # örn. "16"
          memory: <memory-limit>        # örn. 96Gi -- modelin VRAM gereksinimlerine göre boyutlandır
          nvidia.com/gpu: "<gpu-count>" # örn. "1"
      volumeMounts:
        - name: shm
          mountPath: /dev/shm
      args:
        - /mnt/models/
        - --served-model-name=<model-name>
        - --port=3000
        - --enable-auto-tool-choice
        - --tool-call-parser=openai
      env:
        - name: HOME
          value: /tmp
        - name: MAX_LOG_LEN
          value: "100"        # vLLM log satırlarını kırparak log taşmasını önle
        - name: HF_HUB_CACHE
          value: /tmp
        - name: TRITON_CACHE_DIR
          value: /tmp
        - name: XDG_CACHE_HOME
          value: /tmp
        - name: HF_HOME
          value: /tmp/hf_home
        - name: NUM_GPUS
          value: "<gpu-count>" # yukarıdaki nvidia.com/gpu sınırıyla eşleşmelidir
        - name: CUDA_VISIBLE_DEVICES
          value: "<gpu-indices>" # örn. tek GPU için "0"; iki GPU için "0,1"
        - name: VLLM_WORKER_MULTIPROC_METHOD
          value: spawn
        - name: LOGNAME
          value: vllm
        - name: USER
          value: vllm

InferenceService bildirimini uygulayın:

oc apply -n <namespace> -f isvc-<model-name>.yaml

Dağıtımı doğrulama

Dağıtım durumunu, pod başlatmayı ve runtime günlüklerini izleyin:

# InferenceService'in Ready durumuna ulaşmasını izle
oc get inferenceservice <model-name> -n <namespace> -w

# Predictor pod'unun başlamasını izle
oc get pods -n <namespace> -w

# Predictor günlüklerini aktar (model yükleme Running sonrası birkaç dakika sürebilir)
oc logs -f deployment/<model-name>-predictor -n <namespace>

InferenceService READY: True bildirdiğinde endpoint'i doğrulayın.

Model kaydını doğrulayın ve bir test çıkarım isteği gönderin:

POD=$(oc get pods -n <namespace> \
  -l app=isvc.<model-name>-predictor \
  -o jsonpath='{.items[0].metadata.name}')

oc exec -n <namespace> "$POD" -c kserve-container -- \
  curl -fsS http://127.0.0.1:3000/v1/models

oc exec -n <namespace> "$POD" -c kserve-container -- \
  curl -fsS http://127.0.0.1:3000/v1/chat/completions \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "<model-name>",
    "messages": [{"role": "user", "content": "Hello"}],
    "max_tokens": 50
  }'

Sorun giderme

SorunOlası nedenÇözüm
ErrImagePullEksik veya geçersiz registry kimlik bilgilerimodel-registry-secret öğesinin mevcut olduğunu, geçerli kimlik bilgilerine sahip olduğunu ve hem oc secrets link hem de imagePullSecrets patch kullanılarak model-puller-sa ile ilişkilendirildiğini doğrulayın.
ImagePullBackOffModelCar için image pull secret yapılandırılmamışService account'un imagePullSecrets girdisini içerdiğinden emin olun. 3. adımdaki oc patch serviceaccount komutuna bakın.
Predictor Init:0/1 durumunda kalıyorModel image indirme devam ediyoroc describe pod olaylarında Pulling/Pulled ilerleme durumunu kontrol edin; çekme süresi image boyutu ve registry bant genişliğiyle orantılıdır.
Predictor Init:0/1 durumunda süresiz kalıyorModel dosyaları bulunamadıModel dosyalarının OCI image'ında /models altında depolandığını doğrulayın.
Engine core initialization failedİlk CUDA derleme zaman aşımıİlk başlatma, önbellekler oluşturulurken daha uzun sürebilir. Yeniden başlatın ve tekrar deneyin.
Model yükleme başarısızDesteklenmeyen model dosya biçimiHugging Face safetensors dosyalarını kullanın ve eski checkpoint'leri hariç tutun.
OpenSSL FIPS kendi kendine test hatalarıContainer image FIPS uyumlu değilFIPS uyumlu bir vLLM image kullanın.
OutOfMemory / OOMKilledYetersiz GPU belleğiGPU kaynaklarını artırın, bağlam uzunluğunu azaltın veya nicelleştirilmiş (quantized) bir model kullanın.
InferenceService Pending durumunda kalıyorKüme kaynakları kullanılamıyorGPU kullanılabilirliğini doğrulayın ve kullanılmayan workload'lardan kaynakları serbest bırakın.

Ek kaynaklar

Genel bulut model endpoint'lerini kullanma

Modeller IBM watsonx, AWS Bedrock, Azure OpenAI veya Google Vertex AI gibi bir bulut sağlayıcı tarafından barındırılıyorsa bu seçeneği kullanın.

Ön koşullar:

  • Red Hat OpenShift Container Platform (OCP) kümesinden bulut hizmeti endpoint'ine giden HTTPS (port 443) bağlantısı.
  • Geçerli API anahtarları, IAM kimlik bilgileri veya eşdeğer kimlik doğrulama bilgileri.

Başlamadan önce:

Şunlardan emin olun:

  • Model dağıtımı hazırlanmış ve etkin durumdadır.
  • Kimlik doğrulama bilgileri oluşturulmuş ve güvenli şekilde depolanmıştır.
  • Sağlayıcıya özgü ağ veya erişim gereksinimleri tamamlanmıştır.

Endpoint kullanılabilir duruma geldikten sonra Model çıkarım gateway'ini yapılandırma sayfasına geçin.

Özel altyapı model endpoint'lerini kullanma

Modeller IBM Bob kümesinin dışında müşteri tarafından yönetilen altyapıda barındırılıyorsa bu seçeneği kullanın:

  • Özel GPU sunucuları
  • Ayrı OpenShift kümeleri
  • Bare-metal çıkarım sunucuları
  • Kurumsal AI platformları

Ön koşullar:

  • Model endpoint'i OpenAI uyumlu bir API sunar.
  • IBM Bob kümesi ile endpoint arasında HTTPS bağlantısı mevcuttur.
  • Kimlik doğrulama bilgileri Kubernetes secret'ları olarak kullanılabilir durumdadır.

Başlamadan önce:

Şunları doğrulayın:

  • Kümeden endpoint'e ağ bağlantısı.
  • Gerekiyorsa TLS veya mutual TLS yapılandırması.
  • Ağ politikaları ve güvenlik duvarları erişime izin veriyor.
  • Endpoint kimlik doğrulaması düzgün çalışıyor.

Bağlantı ve kimlik doğrulama doğrulandıktan sonra Model çıkarım gateway'ini yapılandırma sayfasına geçin.

Bu konu nasıl?