Todos los productos
Search
Centro de documentos

Platform For AI:Deploy a Triton Inference Server image

Última actualización: Sep 04, 2026

Triton Inference Server es un motor de inference desarrollado por NVIDIA. Permite desplegar modelos de diversos frameworks de IA —como TensorRT, TensorFlow, PyTorch y ONNX— como servicios de inference en línea, y admite la gestión de múltiples modelos y backends personalizados. Puede desplegar rápidamente servicios de inference basados en Triton en PAI Elastic Algorithm Service (EAS).

Requisitos previos

  • Un bucket de Object Storage Service (OSS) en la misma región que PAI.

  • Archivos de modelos entrenados, como .pt, .onnx, .plan o .savedmodel.

Inicio rápido: despliegue de un servicio de modelo único

Paso 1: preparación del repositorio de modelos

Triton requiere una estructura de directorios específica en un bucket de Object Storage Service (OSS). Cree los directorios con el siguiente formato. Para obtener instrucciones, consulte Manage directories y Upload files.

oss://your-bucket/models/triton/
└── your_model_name/
    ├── 1/                    # Version directory (must be a number)
    │   └── model.pt          # Model file
    └── config.pbtxt          # Model configuration file

Requisitos clave:

  • El nombre del directorio de versión debe ser un número, como 1, 2 o 3.

  • Un número mayor indica una versión más reciente.

  • Cada modelo requiere un archivo de configuración config.pbtxt.

Paso 2: creación del archivo de configuración del modelo

Cree un archivo config.pbtxt para configurar la información básica de su modelo. A continuación se muestra un ejemplo:

name: "your_model_name"
platform: "pytorch_libtorch"
max_batch_size: 128

input [
  {
    name: "INPUT__0"
    data_type: TYPE_FP32
    dims: [ 3, -1, -1 ]
  }
]

output [
  {
    name: "OUTPUT__0"
    data_type: TYPE_FP32
    dims: [ 1000 ]
  }
]

# Use a GPU for inference
# instance_group [
#   { 
#     kind: KIND_GPU
#   }
# ]

# Model version configuration
# Load only the latest version (default behavior)
# version_policy: { latest: { num_versions: 1 }}

# Load all versions
# version_policy: { all { }}

# Load the two latest versions
# version_policy: { latest: { num_versions: 2 }}

# Load specific versions
# version_policy: { specific: { versions: [1, 3] }}

Parámetros

Parámetro

Obligatorio

Descripción

name

No

Nombre del modelo. Si se especifica, debe coincidir con el nombre del directorio del modelo.

platform

Sí

Framework del modelo. Valores válidos: pytorch_libtorch, tensorflow_savedmodel, tensorflow_graphdef, tensorrt_plan y onnxruntime_onnx.

backend

Sí

Alternativa a platform. Establezca este valor en python para personalizar la lógica de inference con el backend de Python.

max_batch_size

Sí

Tamaño máximo del lote. Establezca este valor en 0 para deshabilitar el procesamiento por lotes.

input

Sí

Configuración del tensor de entrada, que incluye name, data_type y dims (dimensiones).

output

Sí

Configuración del tensor de salida, que incluye name, data_type y dims (dimensiones).

instance_group

No

Especifica el dispositivo de inference: KIND_GPU o KIND_CPU. Para ver un ejemplo de configuración, consulte el archivo config.pbtxt anterior.

version_policy

No

Controla qué versiones del modelo se cargan. Para ver un ejemplo de configuración, consulte el archivo config.pbtxt anterior.

Importante

Debe especificar el parámetro platform o backend.

Paso 3: despliegue del servicio

  1. Inicie sesión en la PAI console y seleccione la región de destino en la barra de navegación superior.

  2. En el panel de navegación izquierdo, haga clic en Elastic Algorithm Service (EAS), seleccione el espacio de trabajo de destino y luego haga clic en Deploy Service.

  3. En la sección Scenario-based Model Deployment, haga clic en Triton Deployment.

  4. Configure los parámetros de despliegue:

    • Service Name: introduzca un nombre personalizado para el servicio.

    • Model Configuration: para el tipo de configuración, seleccione OSS y luego introduzca la ruta a su repositorio de modelos, por ejemplo, oss://your-bucket/models/triton/.

    • Number of Replicas y Resource Specification: seleccione los valores según sus necesidades. Para obtener ayuda sobre cómo estimar la memoria GPU necesaria, consulte Estimate the GPU memory required for large models.

  5. Haga clic en Deploy y espere a que se inicie el servicio.

Paso 4: habilitación de gRPC (opcional)

De forma predeterminada, Triton proporciona un servicio HTTP en el puerto 8000. Para usar gRPC, realice los siguientes pasos:

  1. En la esquina superior derecha de la página de configuración del servicio, haga clic en Convert to Custom Deployment.

  2. En la sección Environment Information, establezca el Port Number en 8001.

  3. En Features > Advanced Networking, habilite la opción gRPC.

  4. Haga clic en Deploy.

Una vez desplegado el modelo, puede call the service.

Despliegue de un servicio multimodelo

Para desplegar varios modelos en una sola instancia de Triton, colóquelos en el mismo directorio del repositorio de modelos:

oss://your-bucket/models/triton/
├── resnet50_pytorch/
│   ├── 1/
│   │   └── model.pt
│   └── config.pbtxt
├── densenet_onnx/
│   ├── 1/
│   │   └── model.onnx
│   └── config.pbtxt
└── classifier_tensorflow/
    ├── 1/
    │   └── model.savedmodel/
    │       ├── saved_model.pb
    │       └── variables/
    └── config.pbtxt

Los pasos de despliegue son los mismos que para un modelo único. Triton carga automáticamente todos los modelos del repositorio.

Backend de Python para inference personalizada

Cuando necesite personalizar el preprocesamiento, el posprocesamiento o la lógica de inference, puede utilizar el backend de Python de Triton.

Estructura de directorios

your_model_name/
├── 1/
│   ├── model.pt          # Model file
│   └── model.py          # Custom inference logic
└── config.pbtxt

Implementación del backend de Python

Cree un archivo model.py y defina la clase TritonPythonModel:

import json
import os
import torch
from torch.utils.dlpack import from_dlpack, to_dlpack

import triton_python_backend_utils as pb_utils

class TritonPythonModel:
    """The class name must be 'TritonPythonModel'."""

    def initialize(self, args):
        """
        Triton calls this optional function once when it loads a model.
        Use it to initialize information related to model properties and configurations.
        Parameters
        ----------
        args : A dictionary where both keys and values are strings. It includes:
          * model_config: Model configuration information in JSON format.
          * model_instance_kind: The device type.
          * model_instance_device_id: The device ID.
          * model_repository: The path to the model repository.
          * model_version: The model version.
          * model_name: The model name.
        """

        # Parse the model configuration from the JSON string into a Python dictionary.
        self.model_config = model_config = json.loads(args["model_config"])

        # Get properties from the model configuration file.
        output_config = pb_utils.get_output_config_by_name(model_config, "OUTPUT__0")

        # Convert Triton types to NumPy types.
        self.output_dtype = pb_utils.triton_string_to_numpy(output_config["data_type"])

        # Get the path to the model repository.
        self.model_directory = os.path.dirname(os.path.realpath(__file__))

        # Get the device for model inference. This example uses a GPU.
        self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
        print("device: ", self.device)

        model_path = os.path.join(self.model_directory, "model.pt")
        if not os.path.exists(model_path):
            raise pb_utils.TritonModelException("Cannot find the pytorch model")
        # Load the PyTorch model to the GPU by using .to(self.device).
        self.model = torch.jit.load(model_path).to(self.device)

        print("Initialized...")

    def execute(self, requests):
        """
        This required function executes the model. Triton calls it for every inference request.
        If batching is enabled, you must implement the batch processing logic.
        Parameters
        ----------
        requests : A list of pb_utils.InferenceRequest objects.

        Returns
        -------
        A list of pb_utils.InferenceResponse objects. The list must have the same length as the requests list.
        """

        output_dtype = self.output_dtype

        responses = []

        # Iterate through the requests list and create a corresponding response for each request.
        for request in requests:
            # Get the input tensor.
            input_tensor = pb_utils.get_input_tensor_by_name(request, "INPUT__0")
            # Convert the Triton tensor to a Torch tensor.
            pytorch_tensor = from_dlpack(input_tensor.to_dlpack())

            if pytorch_tensor.shape[2] > 1000 or pytorch_tensor.shape[3] > 1000:
                responses.append(
                    pb_utils.InferenceResponse(
                        output_tensors=[],
                        error=pb_utils.TritonError(
                            "Image shape should not be larger than 1000"
                        ),
                    )
                )
                continue

            # Run inference on the GPU.
            prediction = self.model(pytorch_tensor.to(self.device))

            # Convert the Torch output tensor to a Triton tensor.
            out_tensor = pb_utils.Tensor.from_dlpack("OUTPUT__0", to_dlpack(prediction))

            inference_response = pb_utils.InferenceResponse(output_tensors=[out_tensor])
            responses.append(inference_response)

        return responses

    def finalize(self):
        """
        This optional function is called when the model is unloaded. Use it for cleanup tasks.
        """
        print("Cleaning up...")
Importante

Al utilizar un backend de Python, tenga en cuenta que algunos comportamientos de Triton cambian:

  • max_batch_size se ignora: el parámetro max_batch_size en el archivo config.pbtxt no habilita el procesamiento por lotes dinámico para el backend de Python. Debe iterar sobre la lista requests en su método execute y construir manualmente los lotes para la inference.

  • instance_group se ignora: la configuración instance_group en config.pbtxt no controla si el backend de Python usa CPU o GPU. Debe mover explícitamente el modelo y los datos al dispositivo de destino en sus métodos initialize y execute con código como pytorch_tensor.to(torch.device("cuda")).

Actualización del archivo de configuración

name: "resnet50_pt"
backend: "python"
max_batch_size: 128
input [
  {
    name: "INPUT__0"
    data_type: TYPE_FP32
    dims: [ 3, -1, -1 ]
  }
]
output [
  {
    name: "OUTPUT__0"
    data_type: TYPE_FP32
    dims: [ 1000 ]
  }
]

parameters: {
    key: "FORCE_CPU_ONLY_INPUT_TENSORS"
    value: {string_value: "no"}
}

Descripción de los parámetros clave:

  • backend: debe establecerse en python.

  • parameters: esta es una configuración opcional. Si ejecuta la inference en una GPU, establezca el parámetro FORCE_CPU_ONLY_INPUT_TENSORS en no para evitar la sobrecarga innecesaria que implica copiar tensores de entrada entre la CPU y la GPU.

Despliegue del servicio

Al usar el backend de Python, debe configurar la memoria compartida. Vaya a Custom Model Deployment > JSON Deployment, introduzca la siguiente configuración JSON y luego despliegue el servicio.

{
  "metadata": {
    "name": "triton_server_test",
    "instance": 1
  },
  "cloud": {
        "computing": {
            "instance_type": "ml.gu7i.c8m30.1-gu30",
            "instances": null
        }
    },
  "containers": [
    {
      "command": "tritonserver --model-repository=/models",
      "image": "eas-registry-vpc.<region>.cr.aliyuncs.com/pai-eas/tritonserver:25.03-py3",
      "port": 8000,
      "prepare": {
        "pythonRequirements": [
          "torch==2.0.1"
        ]
      }
    }
  ],
  "storage": [
    {
      "mount_path": "/models",
      "oss": {
        "path": "oss://oss-test/models/triton_backend/"
      }
    },
    {
      "empty_dir": {
        "medium": "memory",
        // Configure 1 GB of shared memory.
        "size_limit": 1
      },
      "mount_path": "/dev/shm"
    }
  ]
}

Parámetros clave de la configuración JSON:

  • containers[0].image: la imagen oficial de Triton. Reemplace <region> con la región donde se encuentra su servicio.

  • containers[0].prepare.pythonRequirements: enumere aquí sus dependencias de Python. EAS las instala automáticamente antes de que se inicie el servicio.

  • storage: contiene dos elementos de montaje.

    • El primer elemento monta la ruta de su repositorio de modelos de OSS en el directorio /models del contenedor.

    • El segundo elemento es una configuración obligatoria para la memoria compartida. Los procesos de Triton Server y del backend de Python utilizan la ruta de memoria compartida /dev/shm para transferir datos de tensores con copia cero y lograr el máximo rendimiento. El valor size_limit se especifica en GB. Estime el tamaño necesario según su modelo y la concurrencia esperada.

Llamada al servicio

Obtención del endpoint y token del servicio

  1. Vaya a la página Elastic Algorithm Service (EAS) y haga clic en el nombre de su servicio.

  2. En la pestaña Service Details, haga clic en View Endpoint Information. Copie el Internet Endpoint y el Token.

Envío de una solicitud HTTP

Si el número de puerto está establecido en 8000, el servicio admite solicitudes HTTP.

import numpy as np
# To install the tritonclient package, run the following command: pip install tritonclient
import tritonclient.http as httpclient

# The public endpoint generated after the service is deployed. Do not include the http:// prefix.
url = '1859257******.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/triton_server_test'

triton_client = httpclient.InferenceServerClient(url=url)

image = np.ones((1,3,224,224))
image = image.astype(np.float32)

inputs = []
inputs.append(httpclient.InferInput('INPUT__0', image.shape, "FP32"))
inputs[0].set_data_from_numpy(image, binary_data=False)
outputs = []
outputs.append(httpclient.InferRequestedOutput('OUTPUT__0', binary_data=False))  # Get a 1000-dimensional vector.

# Specify the model name, request token, inputs, and outputs.
results = triton_client.infer(
    model_name="<your-model-name>",
    model_version="<version-num>",
    inputs=inputs,
    outputs=outputs,
    headers={"Authorization": "<your-service-token>"},
)
output_data0 = results.as_numpy('OUTPUT__0')
print(output_data0.shape)
print(output_data0)

Envío de una solicitud gRPC

Si establece el puerto en 8001 y habilita gRPC, el servicio admitirá solicitudes gRPC.

Importante

El endpoint de gRPC es diferente del endpoint HTTP. Asegúrese de obtener el endpoint correcto desde la página de detalles del servicio.

#!/usr/bin/env python
import grpc
# To install the tritonclient package, run the following command: pip install tritonclient
from tritonclient.grpc import service_pb2, service_pb2_grpc
import numpy as np

if __name__ == "__main__":
    # The service endpoint generated after service deployment. Do not include http://. Append :80 to the end.
    host = (
        "service_name.115770327099****.cn-beijing.pai-eas.aliyuncs.com:80"
    )
    # The service token. In a real application, you should use an actual token.
    token = "<your-service-token>"
    # The model name and version.
    model_name = "<your-model-name>"
    model_version = "<version-num>"
    
    # Create gRPC metadata for token authentication.
    metadata = (("authorization", token),)

    # Create a gRPC channel and stub to communicate with the server.
    channel = grpc.insecure_channel(host)
    grpc_stub = service_pb2_grpc.GRPCInferenceServiceStub(channel)
    # Build the inference request.
    request = service_pb2.ModelInferRequest()
    request.model_name = model_name
    request.model_version = model_version

    # Construct the input tensor, which corresponds to the input parameter defined in the model configuration file.
    input = service_pb2.ModelInferRequest().InferInputTensor()
    input.name = "INPUT__0"
    input.datatype = "FP32"
    input.shape.extend([1, 3, 224, 224])
    # Construct the output tensor, which corresponds to the output parameter defined in the model configuration file.
    output = service_pb2.ModelInferRequest().InferRequestedOutputTensor()
    output.name = "OUTPUT__0"

    # Add the input and output specifications to the request.
    request.inputs.extend([input])
    request.outputs.extend([output])
    # Construct a random array and serialize it into a byte sequence as the input data.
    request.raw_input_contents.append(np.random.rand(1, 3, 224, 224).astype(np.float32).tobytes())
            
    # Send the inference request and receive the response.
    response, _ = grpc_stub.ModelInfer.with_call(request, metadata=metadata)
    
    # Extract the output tensor from the response.
    output_contents = response.raw_output_contents[0]  # Assume there is only one output tensor.
    output_shape = [1, 1000]  # Assume the output tensor shape is [1, 1000].
    
    # Convert the output bytes to a NumPy array.
    output_array = np.frombuffer(output_contents, dtype=np.float32)
    output_array = output_array.reshape(output_shape)
    
    # Print the model's output result.
    print("Model output:\n", output_array)

Consejos de depuración

Habilitación de registros detallados

Establezca verbose=True para imprimir los datos JSON de las solicitudes y respuestas:

client = httpclient.InferenceServerClient(url=url, verbose=True)

Ejemplo de salida:

POST /api/predict/triton_test/v2/models/resnet50_pt/versions/1/infer, headers {'Authorization': '************1ZDY3OTEzNA=='}
b'{"inputs":[{"name":"INPUT__0","shape":[1,3,32,32],"datatype":"FP32","data":[1.0,1.0,1.0,.....,1.0]}],"outputs":[{"name":"OUTPUT__0","parameters":{"binary_data":false}}]}'

Depuración en línea

Puede probar el servicio directamente con la función de depuración en línea de la consola. Complete la URL de la solicitud con /api/predict/triton_test/v2/models/resnet50_pt/versions/1/infer y utilice los datos de solicitud JSON de los registros detallados como cuerpo de la solicitud.

Después de enviar la solicitud, se devuelve el código de estado 200. El cuerpo de la respuesta contiene model_version:"1", el nombre de la salida es OUTPUT__0, el tipo de datos es FP32, la forma es [1,1000] y los datos son una matriz de números de punto flotante, lo que indica que la solicitud de inference fue exitosa.

Prueba de estrés del servicio

Los siguientes pasos muestran cómo realizar una prueba de estrés con una sola entrada de datos. Para obtener más información sobre las pruebas de estrés, consulte Service Stress Testing:

  1. En la pestaña Benchmark Task, haga clic en Create Stress Testing Task. Seleccione su servicio de Triton desplegado e introduzca la URL de la prueba de estrés.

  2. Para el origen de datos, seleccione Single Data Entry y luego use el siguiente código para convertir el cuerpo de la solicitud JSON en una cadena codificada en Base64.

    import base64
    
    # An existing JSON request body string
    json_str = '{"inputs":[{"name":"INPUT__0","shape":[1,3,32,32],"datatype":"FP32","data":[1.0,1.0,.....,1.0]}]}'
    # Encode directly
    base64_str = base64.b64encode(json_str.encode('utf-8')).decode('ascii')
    print(base64_str)

    En el cuadro de diálogo Create Stress Testing Task, configure los siguientes ajustes:

    • Service: seleccione el servicio de Triton de destino.

    • Stress Test URL: introduzca /api/predict/triton_xxx/v2/models/resnet50_pt/versions/1/infer como ruta.

    • Single Data: pegue el resultado codificado en Base64 del código anterior en el cuadro de texto.

    • Maximum Stress Test Duration: 300 segundos.

    • Maximum QPS: 64,000.

Preguntas frecuentes

P: Error de CUDA "no kernel image"

Este error ocurre debido a un problema de compatibilidad entre la versión de la imagen y la GPU. Puede intentar cambiar a un tipo de instancia de GPU diferente, como A10 o T4.

P: Error "url should not include the scheme"

Este error ocurre porque la URL del servicio es incorrecta. El formato del endpoint de la sección "Get the service endpoint and token" es http://17519301*******.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/wen***** (tenga en cuenta que esto es diferente del endpoint de gRPC). Debe eliminar el prefijo http://.

P: Error de gRPC "DNS resolution failed"

Este error ocurre porque el host del servicio es incorrecto. El formato del endpoint de la sección "Get the service endpoint and token" es http://we*****.1751930*****.cn-hangzhou.pai-eas.aliyuncs.com/ (tenga en cuenta que esto es diferente del endpoint HTTP). Debe eliminar el prefijo http:// y la barra final /, y luego agregar :80 al final. El formato final debe ser we*****.1751930*****.cn-hangzhou.pai-eas.aliyuncs.com:80.

Documentos relacionados