Model sunum altyapısı

Ortamınız halihazırda bir model sunum çözümü sağlamadığında model endpoint'lerini nasıl dağıtacağınızı ve yapılandıracağınızı öğrenin.

IBM Bob'u bir büyük dil modeline (LLM) bağlamadan önce, dağıtılmış bir model endpoint'ine erişiminiz olmalıdır. Bob, model sunum altyapısını sağlamaz, barındırmaz veya yönetmez. Kuruluşunuz OpenShift AI, GPU tabanlı çıkarım sunucuları, bulut AI hizmetleri veya diğer çıkarım platformları aracılığıyla model endpoint'leri sağlıyorsa, doğrudan Model Gateway'i Yapılandırma bölümüne geçin.

Dağıtım seçenekleri

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 kendine barındırılan modeller; RHOAI kümede zaten mevcut
Genel bulutAWS Bedrock, Azure OpenAI veya Google Vertex AI aracılığıyla öncü (frontier) modeller
Özel altyapıAyrı GPU sunucularında veya özel bir çıkarım kümesinde sunulan modeller

OpenShift AI (küme içi, OCI/ModelCar)

Red Hat OpenShift AI (RHOAI), air-gapped dağıtımlar da dahil olmak üzere modelleri küme üzerinde sunmak için önerilen platformdur. Model ağırlıklarını yüklemek için tercih edilen yaklaşım OCI/ModelCar modelidir: model dosyaları /models/ altında bir OCI image'ına eklenir ve özel bir registry'ye aktarılır. InferenceService dağıtıldığında KServe, image'ı çeken ve ağırlıkları sunum çalışma zamanının (örneğin vLLM) yükleyeceği /mnt/models/ altındaki paylaşılan bir birime kopyalayan bir modelcar-init başlatma (init) container'ı enjekte eder. Model image'ı ilk çekimden sonra düğümde (node) önbelleğe alınır — aynı düğümde daha sonraki yeniden başlatmalarda indirme işlemi tamamen atlanır.

Önkoşullar:

  • Kümede kurulu Red Hat OpenShift AI operatörü
  • KServe etkinleştirilmiş ve yapılandırılmış
  • NVIDIA GPU Operatörü (veya eşdeğeri) ile yapılandırılmış GPU özellikli worker node'ları
  • Hedef namespace'te kaynak oluşturma iznine sahip hedef kümede kimliği doğrulanmış oc CLI
  • Kümeye erişilebilen ve image gönderme kimlik bilgilerine sahip özel bir container registry

Red Hat OpenShift AI yapılandırması

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

  • serviceMesh bileşenini devre dışı bırakın.
  • managementState: Managed ayarlayarak KServe'i etkinleştirin.
  • KServe'i RawDeployment modunu kullanacak şekilde yapılandırın.
  • Kullanılmayan tüm Red Hat OpenShift AI bileşenlerini kaldırın.

Ö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 içermelidir.

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

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

Çıktı şunları içermelidir:

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

Eğer enableModelcar eksikse veya false ise ConfigMap'i güncelleyin:

# Mevcut değeri alın, bayrağı birleştirin ve patch uygulayın
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'ı içine paketleyin

Model ağırlıklarını Hugging Face'ten indirin ve bir OCI image'ı içinde paketleyin. Image'ın tüm model dosyaları /models dizini altında olmalıdır. Daha fazla bilgi için bkz. KServe belgeleri. vLLM dağıtımları için safetensors model parçalarını dahil edin ve .bin, .pt ve original/* gibi eski denetim noktası (checkpoint) dosyalarını hariç tutun.

Örnek Dockerfile:

FROM busybox:latest

# Model ağırlıkları — safetensors parçaları ve dizini
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), bunu ekleyin. Alternatif olarak tüm dizini tek bir komutla kopyalayın — daha basittir ancak vLLM tarafından gerekmeyen dosyaları da içerir:

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

Image'ı özel bir registry'ye yükleyin

OCI image'ını kümeden erişilebilen özel bir container registry'sine yükleyin (push):

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

Aşağıdakiler dahil desteklenen herhangi bir image yönetim aracını kullanabilirsiniz:

  • Podman
  • Skopeo
  • CI/CD işlem hatları (pipelines)
  • Registry'ye özgü araçlar

Hedef namespace ve image pull secret'ı oluşturun

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

oc new-project <namespace>

Registry pull secret'ını oluşturun:

# KServe'in model image'ını özel registry'nizden ç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 servis hesabı (service account) oluşturun:

# KServe tahmincisi (predictor) tarafından kullanılan servis hesabı
oc create sa model-puller-sa -n <namespace>

Pull secret'ı servis hesabıyla ilişkilendirin:

# Pull secret'ı bağlayın — 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'ının alınması sırasında ModelCar başlatma container'ı tarafından kullanılır.

Bir ServingRuntime oluşturun

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

Çalışma zamanı yapılandırmasını uygulayın:

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

InferenceService'i dağıtın

Bir oci:// depolama URI'si kullanarak OCI model image'ına referans veren bir InferenceService oluşturun.

Temel yapılandırma gereksinimleri:

  • Önceden oluşturulan ServingRuntime kaynağına referans verin.
  • storageUri içinde OCI image konumunu belirtin.
  • Model gereksinimleriyle eşleşen CPU, bellek ve GPU kaynak sınırlarını yapılandırın.
  • vLLM için paylaşılan belleği (/dev/shm) bağlayın.
  • vLLM çalışma zamanı bağımsız değişkenlerini ve ortam değişkenlerini yapılandırın.

Örnek:

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>"          # ör. "8"
        limits:
          cpu: "<cpu-limit>"            # ör. "16"
          memory: <memory-limit>        # ör. 96Gi — model VRAM gereksinimlerine göre boyutlandırın
          nvidia.com/gpu: "<gpu-count>" # ör. "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"        # günlük taşmasını önlemek için vLLM log satırlarını kısaltın
        - 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 limiti ile eşleşmelidir
        - name: CUDA_VISIBLE_DEVICES
          value: "<gpu-indices>" # ör. tek bir 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 manifest'ini uygulayın:

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

Dağıtımı doğrulayın

Dağıtım durumunu, pod başlangıcını ve çalışma zamanı loglarını izleyin:

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

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

# Tahminci loglarını takip edin (Running olduktan sonra model yüklemesi 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'ın var olduğunu, geçerli kimlik bilgilerine sahip olduğunu ve hem oc secrets link hem de imagePullSecrets yaması kullanılarak model-puller-sa'ya bağlandığını onaylayın.
ImagePullBackOffImage pull secret ModelCar için yapılandırılmamışServis hesabının imagePullSecrets yapılandırmasını içerdiğinden emin olun. Şu komutu çalıştırın: oc patch serviceaccount model-puller-sa -n <namespace> -p '{"imagePullSecrets": [{"name": "model-registry-secret"}]}'
Tahminci Init:0/1 durumunda kalıyorModel image'ı indirilmeye devam ediyorPulling/Pulled ilerlemesi için oc describe pod event'lerini kontrol edin; çekme süresi image boyutu ve registry bant genişliğine göre değişir.
Tahminci süresiz olarak Init:0/1 durumunda kalıyorModel dosyaları bulunamadıModel dosyalarının OCI image'ında /models altında saklandığını doğrulayın.
Engine core initialization failedİlk CUDA derleme zaman aşımıÖnbellekler oluşturulurken ilk başlatma daha uzun sürebilir. Yeniden başlatın ve tekrar deneyin.
Model yükleme başarısız oluyorDesteklenmeyen model dosya biçimiHugging Face safetensors dosyalarını kullanın ve eski denetim noktalarını hariç tutun.
OpenSSL FIPS self-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 kuantize (quantized) edilmiş bir model kullanın.
InferenceService Pending durumunda kalıyorKüme kaynakları kullanılamıyorGPU kullanılabilirliğini doğrulayın ve kullanılmayan iş yüklerinden kaynakları serbest bırakın.

Daha fazla bilgi için bkz.:

Genel bulut model endpoint'leri

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

Önkoşullar:

  • OpenShift 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.

IBM Bob'u yapılandırmadan önce

Aşağıdakilerden emin olun:

  • Model dağıtımı sağlanmış ve etkindir.
  • Kimlik doğrulama bilgileri oluşturulmuş ve güvenli bir şekilde saklanmıştır.
  • Sağlayıcıya özgü tüm ağ veya erişim gereksinimleri tamamlanmıştır.

Endpoint kullanılabilir olduktan sonra Model Gateway'i Yapılandırma bölümüne geçin.

Özel altyapı model endpoint'leri

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

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

Önkoş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 mevcuttur.

IBM Bob'u yapılandırmadan önce

Aşağıdakileri doğrulayın:

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

Bağlantı ve kimlik doğrulama doğrulandıktan sonra Model Gateway'i Yapılandırma bölümüne geçin.

Bu konu nasıl?