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çenek | Ne 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 bulut | AWS 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ış
ocCLI - 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:
serviceMeshbileşenini devre dışı bırakın.managementState: Managedayarlayarak KServe'i etkinleştirin.- KServe'i
RawDeploymentmodunu 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: ManagedModelCar 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-applicationsModel 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>:latestAş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"}]}'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.yamlInferenceService'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
ServingRuntimekaynağına referans verin. storageUriiç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: vllmInferenceService manifest'ini uygulayın:
oc apply -n <namespace> -f isvc-<model-name>.yamlDağı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
| Sorun | Olası neden | Çözüm |
|---|---|---|
ErrImagePull | Eksik veya geçersiz registry kimlik bilgileri | model-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. |
ImagePullBackOff | Image 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ıyor | Model image'ı indirilmeye devam ediyor | Pulling/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ıyor | Model 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 oluyor | Desteklenmeyen model dosya biçimi | Hugging Face safetensors dosyalarını kullanın ve eski denetim noktalarını hariç tutun. |
| OpenSSL FIPS self-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 kuantize (quantized) edilmiş 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 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.