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çenek | Ne 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'leri | AWS Bedrock, Azure OpenAI veya Google Vertex AI aracılığıyla sınır modelleri |
| Özel altyapı model endpoint'leri | Ayrı 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
ocCLI, 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:
serviceMeshdevre dışı bırakılmalıdır.managementState: Managedayarlanarak KServe etkinleştirilmelidir.- KServe
RawDeploymentmodunu 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: ManagedModelCar 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-applicationsModel 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>:latestOrtamı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"}]}'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: 60Runtime yapılandırmasını uygulayın:
oc apply -n <namespace> -f serving-runtime-vllm.yamlInferenceService 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
storageUriiç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: vllmInferenceService bildirimini uygulayın:
oc apply -n <namespace> -f isvc-<model-name>.yamlDağı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
| Sorun | Olası neden | Çözüm |
|---|---|---|
ErrImagePull | Eksik veya geçersiz registry kimlik bilgileri | model-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. |
ImagePullBackOff | ModelCar 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ıyor | Model image indirme devam ediyor | oc 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ıyor | Model 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ız | Desteklenmeyen model dosya biçimi | Hugging Face safetensors dosyalarını kullanın ve eski checkpoint'leri hariç tutun. |
| OpenSSL FIPS kendi kendine test hataları | Container image FIPS uyumlu değil | FIPS uyumlu bir vLLM image kullanın. |
OutOfMemory / OOMKilled | Yetersiz GPU belleği | GPU kaynaklarını artırın, bağlam uzunluğunu azaltın veya nicelleştirilmiş (quantized) bir model kullanın. |
InferenceService Pending durumunda kalıyor | Küme kaynakları kullanılamıyor | GPU 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.