GPU-Inferenz

Erfahren Sie, wie Sie mit Modell-Deployments Inferenzen auf GPU-Instanzen ausführen. GPU bietet höhere Performancevorteile bei rechenintensiven Modellen im Vergleich zu CPU.

GPUs eignen sich hervorragend für einige Anwendungsfälle von Inferenzen für maschinelles Lernen, hauptsächlich Deep Learning-Modelle wie Large Language Models, Sprache und Bilderkennung. GPUs verwenden parallele Verarbeitungsfunktionen und eine hohe Speicherbandbreite, mit denen sie große Datenmengen und komplexe Berechnungen viel schneller verarbeiten können als herkömmliche CPUs. Die Ergebnisse sind deutlich reduzierte Inferenzzeiten und verbesserte Leistung.

Das Data Science-Modell-Deployment unterstützt das Deployment von Modellen auf GPU-Ausprägungen mit verschiedenen Methoden:

Vollständig verwaltet

Der Service verwendet den Standardinferenzserver, um das Modell auf der ausgewählten GPU-Ausprägung bereitzustellen. Sie können die Verwendung der GPU mit der Datei score.py steuern.

Containerbasiert

Verwenden Sie Ihren eigenen benutzerdefinierten Container für den Inferenzserver. Verwenden Sie die GPU sowohl aus dem Container als auch aus der Datei score.py.

NVIDIA Triton-Inferenzserver

Der Triton Inference Server bietet eine hervorragende GPU-Nutzung und ist von Grund auf mit einer einfachen GPU-Nutzung ausgestattet. Sie können einen Triton-Container verwenden, wenn Sie ein Modell-Deployment erstellen.

Modellartefakt vorbereiten

Für das Modell-Deployment ist ein Modellartefakt erforderlich, das im Modellkatalog gespeichert ist. Außerdem muss sich das Modell in einem aktiven Status befinden. Die score.py des Modellartefakts muss eine GPU-Gerätevariable angeben. Die Funktion load_model muss das Modell auf das ausgewählte GPU-Gerät verschieben. Dann muss die Funktion predict die eingegebenen Tensoren auf das GPU-Gerät verschieben. Nachdem die Inferenz auf dem GPU-Gerät berechnet wurde, muss der Ausgabetensor wieder in die CPU verschoben werden, bevor er von der Funktion zurückkehrt.

Tipp

Verwenden Sie das ADS-SDK, um automatisch ein Modellartefakt zu generieren.

Das ADS-SDK bietet die automatische Generierung der score.py-Datei, die GPU für PyTorch- und TensorFlow-Frameworks unterstützt.

Das folgende score.py-Beispiel verwendet ein verfügbares GPU-Gerät, um Inferenz für ein Resnet152 PyTorch-Modell auszuführen:

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}

Conda-Umgebung mit Modelllaufzeitabhängigkeiten

Die Datei runtime.yaml im Modellartefakt muss eine Conda-Umgebung enthalten, die die GPU-Abhängigkeiten enthält.

Im folgenden Beispiel weist die Datei runtime.yaml das Modell-Deployment an, eine veröffentlichte Conda-Umgebung aus dem Objektspeicherpfad abzurufen, der mit der Umgebungsvariablen INFERENCE_ENV_PATH definiert ist:

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

Replikate

Bei Verwendung eines von einem Service verwalteten Inferenzservers laden Modell-Deployments mehrere Modellreplikate auf verfügbare GPU-Karten, um einen besseren Durchsatz zu erzielen. Die Anzahl der Modellreplikate wird basierend auf

  • Die Größe des Modells.

  • Speicher auf der GPU-Karte verfügbar.

  • Anzahl der GPU-Karten.

  • Logische CPU-Cores, die auf der Compute-Ausprägung verfügbar sind.

Beispiel: Das Modell belegt 2 GB im Speicher, und die Ausprägung VM.GPU2.1 ist ausgewählt, die 1 GPU-Karte mit 16 GB GPU-Speicher enthält. Das Modell-Deployment weist einen Prozentsatz (rund 70%) des GPU-Speichers zum Laden von Modellen zu, und der verbleibende Speicher wird zur Laufzeitberechnung während der Inferenz gespeichert. Das Modell-Deployment lädt fünf Replikate auf einer GPU-Karte (16 * (0,7) / 2 GB Größe des Modells im Speicher). Wenn 2 Karten verfügbar sind, werden insgesamt 10 Modellreplikate mit 5 Modellen in jeder Karte geladen.

Bei automatisch generierten score.py-Dateien basiert die Verteilung von Modellreplikationen auf GPU-Karten auf einem zufälligen Algorithmus, der statistisch nahezu die gleiche Anzahl von Replikaten auf jeder Karte platziert. Sie können die Anzahl der Replikate jedoch mit der Anwendungsumgebungsvariablen WEB_CONCURRENCY ändern.

Verwenden von Triton für GPU-Inferenz

NVIDIA Triton Inference Server optimiert und standardisiert KI-Inferenz, indem Teams trainierte KI-Modelle aus jedem Framework auf einer beliebigen GPU- oder CPU-basierten Infrastruktur bereitstellen, ausführen und skalieren können.

NVIDIA Triton Inference Server einrichten für die Verwendung mit Modell-Deployments.

Um die GPU-Inferenz zu aktivieren, muss config.pbtxt KIND_GPU in der Instanzgruppe enthalten. Die Konfiguration der Instanzgruppe kann auch geändert werden, um die Anzahl der Replikate eines Modellladevorgangs auf das GPU-Gerät anzugeben