Inferenza GPU

Scopri come utilizzare le distribuzioni dei modelli per eseguire l'inferenza sulle istanze GPU. La GPU offre maggiori vantaggi in termini di prestazioni con i modelli a uso intensivo di computazione rispetto alla CPU.

Le GPU sono l'ideale per alcuni casi d'uso di inferenza di apprendimento automatico, per lo più modelli di Deep Learning come Large Language Models, speech e riconoscimento delle immagini. Le GPU utilizzano funzionalità di elaborazione parallela e larghezza di banda della memoria elevata, che consentono loro di gestire grandi quantità di dati e calcoli complessi molto più velocemente delle CPU tradizionali. I risultati sono tempi di inferenza molto ridotti e prestazioni migliori.

La distribuzione dei modelli di Data Science supporta la distribuzione di modelli sulle forme GPU utilizzando diversi metodi:

Completamente gestito

Il servizio utilizza il server di inferenza predefinito per distribuire il modello nella forma GPU selezionata. È possibile controllare come utilizzare la GPU utilizzando il file score.py.

Basato su container

Utilizzare un contenitore personalizzato per il server inferenza. Utilizzare la GPU sia dal contenitore che dal file score.py.

Server di inferenza NVIDIA Triton

Il Triton Inference Server fornisce un eccellente utilizzo della GPU ed è costruito con facilità di utilizzo della GPU da zero. È possibile utilizzare un contenitore Triton quando si crea una distribuzione modello.

Prepara artifact modello

La distribuzione del modello richiede un artifact modello memorizzato nel catalogo modelli e che il modello sia in stato attivo. L'artifact score.py del modello deve esporre una variabile del dispositivo GPU. La funzione load_model deve spostare il modello nel dispositivo GPU selezionato. Quindi, la funzione predict deve spostare i tensore di input nel dispositivo GPU. Dopo che l'inferenza viene calcolata sul dispositivo GPU, deve spostare di nuovo il tensore di uscita alla CPU prima di tornare dalla funzione.

Suggerimento

Valutare la possibilità di utilizzare l'SDK ADS per generare automaticamente un artifact modello.

L'SDK ADS offre la generazione automatica del file score.py supportato dalla GPU per i framework PyTorch e TensorFlow.

L'esempio score.py riportato di seguito utilizza un dispositivo GPU disponibile per eseguire l'inferenza su un modello 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}

Ambiente Conda con dipendenze runtime modello

Il file runtime.yaml nell'artifact modello deve includere un ambiente Honda che include le dipendenze GPU.

Nell'esempio riportato di seguito, il file runtime.yaml indica alla distribuzione del modello di estrarre un ambiente Conda pubblicato dal percorso di storage degli oggetti definito dalla variabile di ambiente 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

Repliche del modello

Quando si utilizza un server inferenza gestito dal servizio, le distribuzioni dei modelli caricano più repliche dei modelli nelle schede GPU disponibili per ottenere un throughput migliore. Il numero di repliche del modello viene calcolato in base a

  • La dimensione del modello.

  • Memoria disponibile sulla scheda GPU.

  • Numero di schede GPU.

  • Memorie centrali CPU logiche disponibili nella forma di computazione.

Ad esempio, il modello impiega 2 GB nella memoria e viene selezionata la forma VM.GPU2.1 che dispone di 1 scheda GPU con memoria GPU da 16 GB. La distribuzione del modello alloca una percentuale (circa il 70%) della memoria GPU per caricare i modelli e la memoria rimanente viene salvata per il calcolo runtime durante l'inferenza. La distribuzione del modello carica cinque repliche su una scheda GPU (16*(0.7) / 2 GB di dimensione del modello in memoria). Se sono disponibili 2 schede, un totale di 10 repliche del modello vengono caricate con 5 modelli in ogni scheda.

Con i file score.py generati automaticamente, la distribuzione delle repliche del modello nelle schede GPU si basa su un algoritmo casuale, che posiziona statisticamente un numero quasi uguale di repliche su ogni scheda. Tuttavia, è possibile modificare il numero di repliche utilizzando la variabile di ambiente dell'applicazione WEB_CONCURRENCY.

Utilizzo di Triton per l'inferenza GPU

NVIDIA Triton Inference Server semplifica e standardizza l'inferenza AI consentendo AI team di distribuire, eseguire e ridimensionare modelli AI formati da qualsiasi framework su qualsiasi infrastruttura basata su GPU o CPU.

Impostare un server di inferenza NVIDIA Triton da utilizzare con le distribuzioni dei modelli.

Per abilitare l'inferenza GPU, config.pbtxt deve contenere KIND_GPU nel gruppo di istanze. La configurazione del gruppo di istanze può anche essere modificata per specificare il numero di repliche di un modello caricate sul dispositivo GPU