Inferencia de GPU

Descubra cómo utilizar despliegues de modelos para realizar inferencias en instancias de GPU. La GPU ofrece mayores ventajas de rendimiento con modelos de uso intensivo de recursos informáticos en comparación con la CPU.

Las GPU son excelentes para algunos casos de uso de inferencia de aprendizaje automático, en su mayoría modelos de aprendizaje profundo como modelos de lenguaje grande, reconocimiento de voz e imagen. Las GPU utilizan capacidades de procesamiento paralelo y alto ancho de banda de memoria, lo que les permite manejar grandes cantidades de datos y cálculos complejos mucho más rápido que las CPU tradicionales. Los resultados son tiempos de inferencia muy reducidos y un rendimiento mejorado.

El despliegue de modelos de Data Science soporta el despliegue de modelos en unidades de GPU mediante varios métodos:

Servicio totalmente gestionado

El servicio utiliza el servidor de inferencia por defecto para desplegar el modelo en la unidad de GPU seleccionada. Tiene control sobre cómo utilizar la GPU mediante el archivo score.py.

Basado en contenedor

Utilice su propio contenedor personalizado para el servidor de inferencia. Utilice la GPU tanto del contenedor como del archivo score.py.

Servidor de inferencia NVIDIA Triton

El Triton Inference Server proporciona un excelente uso de GPU, y está construido con facilidad de uso de GPU desde cero. Puede utilizar un contenedor Triton al crear un despliegue de modelo.

Preparación del artefacto de modelo

El despliegue del modelo requiere un artefacto de modelo almacenado en el catálogo de modelos y que el modelo esté en estado activo. score.py del artefacto de modelo debe exponer una variable de dispositivo de GPU. La función load_model debe mover el modelo al dispositivo de GPU seleccionado. A continuación, la función predict debe mover los tensores de entrada al dispositivo GPU. Después de calcular la inferencia en el dispositivo de GPU, debe mover el tensor de salida de nuevo a la CPU antes de volver de la función.

Consejo

Considere el uso del SDK de ADS para generar automáticamente un artefacto de modelo.

El SDK de ADS ofrece la generación automática del archivo score.py que soporta la GPU para los marcos PyTorch y TensorFlow.

En el siguiente ejemplo de score.py se utiliza un dispositivo de GPU disponible para realizar una inferencia en un modelo Resnet152 PyTorch:

import numpy as np
import os
import torch
from torch import nn
import io
from PIL import Image
import base64
from random import randint
  
  
Image.MAX_IMAGE_PIXELS = None
  
model_name = 'PyTorch_ResNet152.pth'
  
# get an available GPU device 
def get_torch_device():
    num_devices = torch.cuda.device_count()
    if num_devices == 0:
        return "cpu"
    if num_devices == 1:
        return "cuda:0"
    else:
        return f"cuda:{randint(0, num_devices-1)}"
  
print("Device selected for inference", get_torch_device())
device = torch.device(get_torch_device())
 
def load_model(model_file_name=model_name):
    """
    Loads model from the serialized format
  
    Returns
    -------
    model:  Pytorch model instance
    """
    print(f"Devcie {device}")
    model_dir = os.path.dirname(os.path.realpath(__file__))
    contents = os.listdir(model_dir)
    if model_file_name in contents:
        model.load_state_dict(torch.load(os.path.abspath(model_file_name)))    
        model = model.to(device)
        print(f"model saved to {model.get_device()}")
        return model
    else:
        raise FileNotFoundError(f'{model_file_name} is not found in model directory {model_dir}.')
 
def predict(data, model=load_model()):
    """
    Returns prediction given the model and data to predict
  
    Parameters
    ----------
    model: Model instance returned by load_model API
    data: Data format in json
  
    Returns
    -------
    predictions: Output from scoring server
        Format: {'prediction':output from model.predict method}
  
    """
  
    img_bytes = io.BytesIO(base64.b64decode(data.encode('utf-8')))
    image = Image.open(img_bytes).resize((224, 224))
    arr = np.array(image)
    X = torch.FloatTensor(np.transpose(arr, axes=(2, 0, 1))).unsqueeze(0)
    X = X.to(device)
    with torch.no_grad():
        Y = model(X).to("cpu")
        pred = torch.nn.functional.softmax(Y[0], dim=0).argmax().item()
    return {'prediction': pred}

Entorno Conda con dependencias de tiempo de ejecución de modelo

El archivo runtime.yaml del artefacto de modelo debe incluir un entorno conda que incluya las dependencias de GPU.

En el siguiente ejemplo, el archivo runtime.yaml indica al despliegue del modelo que recupere un entorno conda publicado de la ruta de Object Storage definida por la variable de entorno INFERENCE_ENV_PATH:

MODEL_ARTIFACT_VERSION: '3.0'
MODEL_DEPLOYMENT:
  INFERENCE_CONDA_ENV:
    INFERENCE_ENV_PATH: oci://service-conda-packs@id19sfcrra6z/service_pack/gpu/PyTorch_1.10_for_GPU_on_Python_3.8/1.0/pytorch110_p38_gpu_v1
    INFERENCE_ENV_SLUG: pytorch_pack_v1
    INFERENCE_ENV_TYPE: data_science
    INFERENCE_PYTHON_VERSION: 3.8

Réplicas de modelo

Al utilizar un servidor de inferencia gestionado por servicio, los despliegues de modelo cargan varias réplicas de modelo en las tarjetas GPU disponibles para lograr un mejor rendimiento. El número de réplicas de modelo se calcula en función de

  • El tamaño del modelo.

  • Memoria disponible en la tarjeta GPU.

  • Número de tarjetas GPU.

  • Núcleos de CPU lógicos disponibles en la unidad de computación.

Por ejemplo, el modelo tarda 2 GB en memoria y se selecciona la unidad VM.GPU2.1 que tiene 1 tarjeta GPU con 16 GB de memoria GPU. El despliegue del modelo asigna un porcentaje (alrededor del 70 %) de memoria de GPU para cargar modelos y la memoria restante se guarda para el cálculo en tiempo de ejecución durante la inferencia. El despliegue del modelo carga cinco réplicas en una tarjeta GPU (tamaño 16*(0.7) / 2 GB del modelo en memoria). Si hay 2 tarjetas disponibles, se cargan un total de 10 réplicas de modelos con 5 modelos en cada tarjeta.

Con los archivos score.py generados automáticamente, la distribución de réplicas de modelo a tarjetas de GPU se basa en un algoritmo aleatorio, que coloca estadísticamente un número casi igual de réplicas a cada tarjeta. Sin embargo, puede cambiar el número de réplicas mediante la variable de entorno de aplicación WEB_CONCURRENCY.

Uso de Triton para Inferencia de GPU

NVIDIA Triton Inference Server optimiza y estandariza la inferencia de IA al permitir a los equipos implementar, ejecutar y escalar modelos de IA entrenados desde cualquier marco en cualquier infraestructura basada en GPU o CPU.

Configure un servidor de inferencia NVIDIA Triton para utilizarlo con despliegues de modelos.

Para activar la inferencia de GPU, config.pbtxt debe contener KIND_GPU en el grupo de instancias. La configuración del grupo de instancias también se puede cambiar para especificar el número de réplicas de las cargas de un modelo en el dispositivo de GPU