Todos os produtos
Search
Central de documentação

Alibaba Cloud Service Mesh:Implantar um modelo de linguagem grande como serviço de inferência

Última atualização: Jun 28, 2026

Um modelo de linguagem grande (LLM) é um modelo de linguagem baseado em rede neural com centenas de milhões de parâmetros, como GPT-3, GPT-4, PaLM e PaLM 2. Ao implantar um LLM no Service Mesh (ASM) por meio do ModelMesh, você expõe recursos de PLN — classificação de texto, análise de sentimento e tradução automática — como endpoints de API. Com a abordagem de LLM como serviço, evita-se altos custos de infraestrutura, responde-se rapidamente às mudanças de mercado e dimensionam-se os serviços sob demanda para lidar com picos de tráfego, enquanto o modelo roda na nuvem e melhora a eficiência operacional.

Este tópico aborda três etapas: criar um runtime de serviço de modelo personalizado, implantar o modelo como serviço de inferência e enviar solicitações de inferência pelo gateway de entrada do ASM.

Como funciona

Esta implantação usa o ModelMesh dentro do ASM para servir um LLM do Hugging Face com ajuste fino eficiente em parâmetros (PEFT) via prompt tuning. O diagrama a seguir mostra a integração dos componentes:

+---------------------------------------------------------+
|                   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: Define a imagem de contêiner e a configuração do MLServer para servir o modelo.

  • InferenceService: Especifica qual modelo carregar e qual ServingRuntime usar. Funciona como o endpoint lógico para solicitações de inferência.

  • ModelMesh: Encaminha as solicitações recebidas do gateway de entrada do ASM para o InferenceService correto. Gerencia o carregamento e o dimensionamento dos modelos.

Pré-requisitos

Antes de começar, verifique se você tem:

Etapa 1: Criar um runtime personalizado

Crie um ServingRuntime personalizado para servir um LLM do Hugging Face com prompt tuning PEFT. Este processo envolve três partes: implementar a classe do servidor de modelo, empacotá-la em uma imagem Docker e criar o recurso do Kubernetes.

Implementar a classe do servidor de modelo

O servidor de modelo herda da classe base MLModel do MLServer e implementa dois manipuladores:

  • **load**: Carrega o LLM pré-treinado, aplica a configuração de prompt tuning PEFT e inicializa um tokenizador. O tokenizador permite que o servidor aceite entrada de texto bruto em vez de tensores pré-processados.

  • **predict**: Tokeniza o texto de entrada, executa a inferência e decodifica a saída de volta para texto legível.

A implementação completa está em peft_model_server.py:

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

O servidor de modelo lê a configuração das variáveis de ambiente:

Variável de ambiente

Valor padrão

Descrição

PRETRAINED_MODEL_PATH

bigscience/bloomz-560m

Caminho ou ID do modelo Hugging Face para o LLM base

PEFT_MODEL_ID

aipipeline/bloomz-560m_PROMPT_TUNING_CAUSAL_LM

ID da configuração de prompt tuning PEFT

DATASET_TEXT_COLUMN_NAME

Tweet text

Nome da coluna usada para o campo de texto de entrada

Criar a imagem Docker

Empacote o servidor de modelo e suas dependências em uma imagem Docker compatível com o ModelMesh.

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}

A imagem expõe duas portas: gRPC na porta 8001 e HTTP na porta 8002. Definir MLSERVER_MODEL_IMPLEMENTATION informa ao MLServer qual classe carregar, eliminando a necessidade de um arquivo separado de configurações do modelo.

Criar o recurso ServingRuntime

Defina um ServingRuntime que aponte para sua imagem Docker e configure o ambiente do MLServer.

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

Implante o ServingRuntime:

kubectl apply -f sample-runtime.yaml

Verifique se o runtime está disponível:

kubectl get servingruntimes -n modelmesh-serving

Saída esperada:

NAME                AGE
peft-model-server   10s

O runtime peft-model-server deve aparecer na saída.

Etapa 2: Implantar o serviço de inferência

Crie um recurso InferenceService para vincular seu modelo ao ServingRuntime da Etapa 1. O InferenceService é o endpoint lógico que o ModelMesh usa para encaminhar solicitações de inferência ao modelo.

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

Campos de configuração:

Campo

Valor

Descrição

modelFormat.name

peft-model

Deve corresponder ao formato declarado no ServingRuntime

runtime

peft-model-server

Informa ao ModelMesh qual runtime serve este modelo

serving.kserve.io/deploymentMode

ModelMesh

Anotação obrigatória que instrui o KServe a implantar via ModelMesh em vez de pods independentes

Implante o InferenceService:

kubectl apply -f peft-demo-isvc.yaml

Verifique se o InferenceService está pronto:

kubectl get inferenceservices -n modelmesh-serving

Saída esperada:

NAME        URL    READY   AGE
peft-demo          True    30s

Aguarde até que a coluna READY mostre True antes de prosseguir. Se o status permanecer como False, consulte Solução de problemas.

Etapa 3: Enviar uma solicitação de inferência

Envie uma solicitação POST para o modelo implantado através do gateway de entrada do ASM. A solicitação utiliza o protocolo de inferência v2 do KServe.

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

Substitua o seguinte espaço reservado pelo valor real:

Espaço reservado

Descrição

Exemplo

<IP-address-of-the-ingress-gateway>

IP externo do seu gateway de entrada do ASM

192.168.1.100

O corpo da solicitação (input.json) segue o formato do protocolo de inferência v2. Codifique o texto de entrada como Base64 no campo bytes_contents:

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

Neste exemplo, bytes_contents é a forma codificada em Base64 de "Every day is a new beginning, filled with opportunities and hope".

Resposta esperada

Uma inferência bem-sucedida retorna uma resposta JSON com a saída do modelo em bytesContents, também codificado em Base64:

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

Decodifique o valor de bytesContents de Base64 para verificar o resultado:

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

O modelo classificou o texto de entrada com o rótulo no complaint, confirmando que o serviço de inferência funciona corretamente.

Solução de problemas

Problema

Causa

Solução

O pod do ServingRuntime permanece em Pending

CPU ou memória insuficiente no cluster

Adicione nós ou reduza os requests de recursos na especificação do ServingRuntime

O InferenceService nunca atinge Ready: True

Tempo limite de carregamento do modelo ou falha no download

Verifique os logs do pod com kubectl logs -n modelmesh-serving <pod-name>. Aumente modelLoadingTimeoutMillis para downloads lentos. Em clusters isolados, defina TRANSFORMERS_OFFLINE e HF_DATASETS_OFFLINE como "1" e baixe previamente os modelos para o armazenamento local

O curl retorna conexão recusada

Gateway de entrada mal configurado ou IP/porta incorretos

Verifique o IP do gateway de entrada do ASM e confirme se a porta 8008 está exposta

Saída inesperada do modelo

Incompatibilidade entre o modelo e a configuração PEFT

Confirme se PRETRAINED_MODEL_PATH e PEFT_MODEL_ID apontam para configurações de modelo e ajuste compatíveis

Próximos passos