Tüm Ürünler
Search
Belge Merkezi

Alibaba Cloud Service Mesh:Deploy a large language model as an inference service

Son Güncelleme:Oct 07, 2026

GPT-3, GPT-4, PaLM ve PaLM 2 gibi yüz milyonlarca parametreye sahip sinir ağ tabanlı dil modellerine büyük dil modeli (LLM) adı verilir. ModelMesh aracılığıyla Service Mesh (ASM) üzerinde bir LLM dağıtarak metin sınıflandırma, duygu analizi ve makine çevirisi gibi doğal dil işleme (NLP) yeteneklerini API uç noktaları olarak sunabilirsiniz. Hizmet olarak LLM yaklaşımı sayesinde yüksek altyapı maliyetlerinden kaçınır, pazar değişikliklerine hızlı yanıt verir ve trafik artışlarını yönetmek için hizmetleri talebe göre ölçeklendirirsiniz; tüm bunlar model cloud üzerinde çalışırken operasyonel verimliliği artırmanızı sağlar.

Bu konuda özel bir model sunma çalışma zamanı oluşturma, modeli çıkarım hizmeti olarak dağıtma ve ASM giriş ağ geçidi üzerinden çıkarım istekleri gönderme adımları açıklanmaktadır.

Çalışma prensibi

Bu dağıtım, Parametre Verimli İnce Ayar (PEFT) istem ayarlama ile bir Hugging Face LLM'yi sunmak için ASM içinde ModelMesh kullanır. Aşağıdaki diyagram bileşenlerin nasıl entegre olduğunu gösterir:

+---------------------------------------------------------+
|                   ASM ingress gateway                   |
|                    (port 8008, HTTP)                    |
+----------------------------+----------------------------+
                             |
                             v
+---------------------------------------------------------+
|                       ModelMesh                         |
|            (model routing and orchestration)            |
+---------------------------------------------------------+
|  ServingRuntime             InferenceService            |
|  +------------------+      +-----------------------+   |
|  | peft-model-server |<-----| peft-demo             |   |
|  | (MLServer-based)  |      | (model endpoint)      |   |
|  +------------------+      +-----------------------+   |
|         |                                               |
|         v                                               |
|  +------------------+      +-----------------------+   |
|  | MLServer          |      | Hugging Face model    |   |
|  | (gRPC :8001,      |      | + PEFT config         |   |
|  |  HTTP :8002)      |      | (bloomz-560m)         |   |
|  +------------------+      +-----------------------+   |
+---------------------------------------------------------+
  • ServingRuntime: Modeli sunmak için konteyner görüntüsünü ve MLServer yapılandırmasını tanımlar.

  • InferenceService: Hangi modelin yükleneceğini ve hangi ServingRuntime'ın kullanılacağını belirtir. Çıkarım istekleri için mantıksal uç nokta görevi görür.

  • ModelMesh: Gelen istekleri ASM giriş ağ geçidinden doğru InferenceService'a yönlendirir. Model yüklemeyi ve ölçeklendirmeyi yönetir.

Ön koşullar

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

1. Adım: Özel bir çalışma zamanı oluşturun

PEFT istem ayarlama ile bir Hugging Face LLM'yi sunmak için özel bir ServingRuntime oluşturun. Bu süreç üç bölümden oluşur: model sunucu sınıfını uygulama, bunu bir Docker görüntüsüne paketleme ve Kubernetes kaynağını oluşturma.

Model sunucu sınıfını uygulayın

Model sunucu, MLServer MLModel temel sınıfından türetilir ve iki işleyici uygular:

  • **load**: Önceden eğitilmiş LLM'yi yükler, PEFT istem ayarlama yapılandırmasını uygular ve bir tokenizer başlatır. Tokenizer, sunucunun önceden işlenmiş tensörler yerine ham metin girdisini kabul etmesini sağlar.

  • **predict**: Girdi metnini tokenize eder, çıkarım çalıştırır ve çıktıyı tekrar okunabilir metne dönüştürür.

Tam uygulama peft_model_server.py dosyasında bulunmaktadır:

peft_model_server.py

from typing import List

from mlserver import MLModel, types
from mlserver.codecs import decode_args

from peft import PeftModel, PeftConfig
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
import os

class PeftModelServer(MLModel):
    async def load(self) -> bool:
        self._load_model()
        self.ready = True
        return self.ready

    @decode_args
    async def predict(self, content: List[str]) -> List[str]:
        return self._predict_outputs(content)

    def _load_model(self):
        model_name_or_path = os.environ.get("PRETRAINED_MODEL_PATH", "bigscience/bloomz-560m")
        peft_model_id = os.environ.get("PEFT_MODEL_ID", "aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM")
        self.tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, local_files_only=True)
        config = PeftConfig.from_pretrained(peft_model_id)
        self.model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path)
        self.model = PeftModel.from_pretrained(self.model, peft_model_id)
        self.text_column = os.environ.get("DATASET_TEXT_COLUMN_NAME", "Tweet text")
        return

    def _predict_outputs(self, content: List[str]) -> List[str]:
        output_list = []
        for input in content:
            inputs = self.tokenizer(
                f'{self.text_column} : {input} Label : ',
                return_tensors="pt",
            )
            with torch.no_grad():
                inputs = {k: v for k, v in inputs.items()}
                outputs = self.model.generate(
                    input_ids=inputs["input_ids"], attention_mask=inputs["attention_mask"], max_new_tokens=10, eos_token_id=3
                )
                outputs = self.tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)
            output_list.append(outputs[0])
        return output_list

Model sunucu, yapılandırmayı ortam değişkenlerinden okur:

Ortam değişkeni Varsayılan değer Açıklama
PRETRAINED_MODEL_PATH bigscience/bloomz-560m Temel LLM için yol veya Hugging Face model kimliği
PEFT_MODEL_ID aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM PEFT istem ayarlama yapılandırma kimliği
DATASET_TEXT_COLUMN_NAME Tweet text Girdi metin alanı için kullanılan sütun adı

Docker görüntüsünü oluşturun

Model sunucuyu ve bağımlılıklarını ModelMesh ile uyumlu bir Docker görüntüsüne paketleyin.

Dockerfile

# TODO: choose appropriate base image, install Python, MLServer, and
# dependencies of your MLModel implementation
FROM python:3.8-slim-buster
RUN pip install mlserver peft transformers datasets
# ...

# The custom MLModel implementation should be on the Python search path
# instead of relying on the working directory of the image. If using a
# single-file module, this can be accomplished with:
COPY --chown=${USER} ./peft_model_server.py /opt/peft_model_server.py
ENV PYTHONPATH=/opt/

# environment variables to be compatible with ModelMesh Serving
# these can also be set in the ServingRuntime, but this is recommended for
# consistency when building and testing
ENV MLSERVER_MODELS_DIR=/models/_mlserver_models \
    MLSERVER_GRPC_PORT=8001 \
    MLSERVER_HTTP_PORT=8002 \
    MLSERVER_LOAD_MODELS_AT_STARTUP=false \
    MLSERVER_MODEL_NAME=peft-model

# With this setting, the implementation field is not required in the model
# settings which eases integration by allowing the built-in adapter to generate
# a basic model settings file
ENV MLSERVER_MODEL_IMPLEMENTATION=peft_model_server.PeftModelServer

CMD mlserver start ${MLSERVER_MODELS_DIR}

Görüntü iki bağlantı noktasını açığa çıkarır: gRPC için 8001 ve HTTP için 8002. MLSERVER_MODEL_IMPLEMENTATION ayarının yapılması, MLServer'a hangi sınıfın yükleneceğini bildirir; bu nedenle ayrı bir model ayarları dosyasına gerek yoktur.

ServingRuntime kaynağını oluşturun

Docker görüntünüzü işaret eden ve MLServer ortamını yapılandıran bir ServingRuntime tanımlayın.

sample-runtime.yaml

apiVersion: serving.kserve.io/v1alpha1
kind: ServingRuntime
metadata:
  name: peft-model-server
  namespace: modelmesh-serving
spec:
  supportedModelFormats:
    - name: peft-model
      version: "1"
      autoSelect: true
  multiModel: true
  grpcDataEndpoint: port:8001
  grpcEndpoint: port:8085
  containers:
    - name: mlserver
      image:  registry.cn-beijing.aliyuncs.com/test/peft-model-server:latest
      env:
        - name: MLSERVER_MODELS_DIR
          value: "/models/_mlserver_models/"
        - name: MLSERVER_GRPC_PORT
          value: "8001"
        - name: MLSERVER_HTTP_PORT
          value: "8002"
        - name: MLSERVER_LOAD_MODELS_AT_STARTUP
          value: "true"
        - name: MLSERVER_MODEL_NAME
          value: peft-model
        - name: MLSERVER_HOST
          value: "127.0.0.1"
        - name: MLSERVER_GRPC_MAX_MESSAGE_LENGTH
          value: "-1"
        - name: PRETRAINED_MODEL_PATH
          value: "bigscience/bloomz-560m"
        - name: PEFT_MODEL_ID
          value: "aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM"
        # - name: "TRANSFORMERS_OFFLINE"
        #   value: "1"
        # - name: "HF_DATASETS_OFFLINE"
        #   value: "1"
      resources:
        requests:
          cpu: 500m
          memory: 4Gi
        limits:
          cpu: "5"
          memory: 5Gi
  builtInAdapter:
    serverType: mlserver
    runtimeManagementPort: 8001
    memBufferBytes: 134217728
    modelLoadingTimeoutMillis: 90000

ServingRuntime'ı dağıtın:

kubectl apply -f sample-runtime.yaml

Çalışma zamanının mevcut olduğunu doğrulayın:

kubectl get servingruntimes -n modelmesh-serving

Beklenen çıktı:

NAME                AGE
peft-model-server   10s

peft-model-server çalışma zamanı çıktıda görünmelidir.

2. Adım: Çıkarım hizmetini dağıtın

Modelinizi 1. Adımdaki ServingRuntime'a bağlamak için bir InferenceService kaynağı oluşturun. InferenceService, ModelMesh'in çıkarım isteklerini modele yönlendirmek için kullandığı mantıksal uç noktadır.

peft-demo-isvc.yaml

apiVersion: serving.kserve.io/v1beta1
kind: InferenceService
metadata:
  name: peft-demo
  namespace: modelmesh-serving
  annotations:
    serving.kserve.io/deploymentMode: ModelMesh
spec:
  predictor:
    model:
      modelFormat:
        name: peft-model
      runtime: peft-model-server
      storage:
        key: localMinIO
        path: sklearn/mnist-svm.joblib

Yapılandırma alanları:

Alan Değer Açıklama
modelFormat.name peft-model ServingRuntime'da bildirilen biçimle eşleşmelidir
runtime peft-model-server ModelMesh'e bu modeli hangi çalışma zamanının sunacağını bildirir
serving.kserve.io/deploymentMode ModelMesh KServe'e modeli bağımsız podlar yerine ModelMesh üzerinden dağıtması talimatını veren gerekli ek açıklama

InferenceService'ı dağıtın:

kubectl apply -f peft-demo-isvc.yaml

InferenceService'ın hazır olup olmadığını kontrol edin:

kubectl get inferenceservices -n modelmesh-serving

Beklenen çıktı:

NAME        URL    READY   AGE
peft-demo          True    30s

Devam etmeden önce READY sütununun True değerini gösterdiğinden emin olun. Durum False olarak kalıyorsa bkz. Sorun giderme.

3. Adım: Bir çıkarım isteği gönderin

Dağıtılan modele ASM giriş ağ geçidi üzerinden bir POST isteği gönderin. İstek, KServe v2 çıkarım protokolünü kullanır.

MODEL_NAME="peft-demo"
ASM_GW_IP="<IP-address-of-the-ingress-gateway>"
curl -X POST -k http://${ASM_GW_IP}:8008/v2/models/${MODEL_NAME}/infer -d @./input.json

Aşağıdaki yer tutucuyu gerçek değerinizle değiştirin:

Yer tutucu Açıklama Örnek
<IP-address-of-the-ingress-gateway> ASM giriş ağ geçidinizin harici IP adresi 192.168.1.100

İstek gövdesi (input.json), v2 çıkarım protokolü biçimini takip eder. Girdi metnini bytes_contents alanında Base64 olarak kodlayın:

{
    "inputs": [
        {
          "name": "content",
          "shape": [1],
          "datatype": "BYTES",
          "contents": {"bytes_contents": ["RXZlcnkgZGF5IGlzIGEgbmV3IGJpbm5pbmcsIGZpbGxlZCB3aXRoIG9wdGlvbnBpZW5pbmcgYW5kIGhvcGU="]}
        }
    ]
}

Bu örnekte, bytes_contents değeri "Every day is a new beginning, filled with opportunities and hope" metninin Base64 kodlanmış halidir.

Beklenen yanıt

Başarılı bir çıkarım işlemi, model çıktısını yine Base64 ile kodlanmış olarak bytesContents alanında içeren bir JSON yanıtı döndürür:

{
 "modelName": "peft-demo__isvc-5c5315c302",
 "outputs": [
  {
   "name": "output-0",
   "datatype": "BYTES",
   "shape": [
    "1",
    "1"
   ],
   "parameters": {
    "content_type": {
     "stringParam": "str"
    }
   },
   "contents": {
    "bytesContents": [
     "VHdlZXQgdGV4dCA6IEV2ZXJ5IGRheSBpcyBhIG5ldyBiaW5uaW5nLCBmaWxsZWQgd2l0aCBvcHRpb25waWVuaW5nIGFuZCBob3BlIExhYmVsIDogbm8gY29tcGxhaW50"
    ]
   }
  }
 ]
}

Sonucu doğrulamak için bytesContents değerini Base64'ten çözümleyin:

Tweet text : Every day is a new binning, filled with optionpiening and hope Label : no complaint

Model, girdi metnini no complaint etiketiyle sınıflandırdı; bu da çıkarım hizmetinin doğru çalıştığını doğrular.

Sorun giderme

Sorun Neden Çözüm
ServingRuntime pod'u Pending durumunda kalıyor Kümede yetersiz CPU veya bellek Düğüm ekleyin veya ServingRuntime spesifikasyonundaki kaynak requests değerlerini azaltın
InferenceService hiçbir zaman Ready: True durumuna gelmiyor Model yükleme zaman aşımı veya indirme hatası kubectl logs -n modelmesh-serving <pod-name> ile pod günlüklerini kontrol edin. Yavaş indirmeler için modelLoadingTimeoutMillis değerini artırın. İzole kümeler için TRANSFORMERS_OFFLINE ve HF_DATASETS_OFFLINE değerlerini "1" olarak ayarlayın ve modelleri yerel depolamaya önceden indirin
curl komutu bağlantı reddedildi hatası döndürüyor Giriş ağ geçidi yanlış yapılandırılmış veya yanlış IP/bağlantı noktası ASM giriş ağ geçidi IP adresini doğrulayın ve 8008 bağlantı noktasının açık olduğunu teyit edin
Beklenmeyen model çıktısı Model ve PEFT yapılandırması uyuşmazlığı PRETRAINED_MODEL_PATH ve PEFT_MODEL_ID değerlerinin uyumlu model ve ayar yapılandırmalarını işaret ettiğinden emin olun

Sonraki adımlar