Triton Inference Server

Triton Inference Server hostuje repozytorium modeli i odpowiada na żądania inferencji po HTTP. LibreYOLO eksportuje graf ONNX, generuje config.pbtxt, który przenosi metadane eksportu jako jeden parametr Triton, i traktuje adres URL modelu jako wczytywalną ścieżkę modelu.

Wywołanie
LibreYOLO("http://127.0.0.1:8000/yolo9")
Funkcja pomocnicza
create_triton_config(onnx_path, config_path, model_name=..., max_batch_size=8)
Extra
pip install "libreyolo[onnx,triton]"
Protokół
Tylko inferencja HTTP i HTTPS V2. Bez gRPC, uwierzytelniania, pamięci współdzielonej oraz wczytywania i wyładowywania modeli.
Limity czasu
Limity czasu połączenia i sieci domyślnie wynoszą 30 sekund

Instalacja

Instalacja
pip install "libreyolo[onnx,triton]"

Extra triton instaluje tritonclient[http]. Extra dla gRPC i pamięci współdzielonej są celowo pominięte: ta integracja obsługuje wyłącznie inferencję HTTP i HTTPS V2. onnx jest potrzebny, ponieważ zarówno serwowany artefakt, jak i generator konfiguracji pracują na grafie ONNX.

Budowa repozytorium modeli

Eksport z dynamiczną osią batcha, do układu katalogów oczekiwanego przez Triton.

Eksport do układu repozytorium
from pathlib import Path from libreyolo import LibreYOLO model_dir = Path("triton_repo/yolo9/1")model_dir.mkdir(parents=True, exist_ok=True) LibreYOLO("LibreYOLO9t.pt").export(    format="onnx",    output_path=str(model_dir / "model.onnx"),    dynamic=True,    simplify=False,)
Generowanie config.pbtxt
from libreyolo import create_triton_config create_triton_config(    "triton_repo/yolo9/1/model.onnx",    "triton_repo/yolo9/config.pbtxt",    model_name="yolo9",    max_batch_size=8,)
Wynikowy układ
triton_repo/  yolo9/    config.pbtxt    1/      model.onnx

Triton nie zachowuje niestandardowych metadanych ONNX w odpowiedzi z konfiguracją modelu, więc komplet wyeksportowanych metadanych musi dotrzeć inną drogą. create_triton_config koduje je jako jeden parametr tekstowy JSON o nazwie libreyolo_metadata w config.pbtxt, wypisuje deklaracje wejść i wyjść w kolejności z grafu, obsługuje escapowanie JSON i przypina model do KIND_CPU.

Funkcja pomocnicza waliduje dane przed zapisem. Wymaga dokładnie jednego wejścia grafu ONNX, co najmniej jednego wyjścia, rozstrzygalnych kształtów tensorów oraz metadanych, w których mapa names definiuje każdy indeks klasy od 0 do nc - 1. Model, który nie przejdzie któregokolwiek z tych sprawdzeń, zostaje odrzucony na etapie konfiguracji, a nie przy pierwszym żądaniu.

max_batch_size: 8 odpowiada eksportowi dynamicznemu i pozwala serwerowi grupować do ośmiu obrazów na żądanie. Dla grafu ONNX ze stałym batchem 1 należy użyć max_batch_size=0; LibreYOLO wysyła wtedy obrazy sekwencyjnie.

Uruchomienie serwera

Uruchomienie serwera
docker run --rm --name libreyolo-triton \  -p 8000:8000 -p 8002:8002 \  -v "$(pwd)/triton_repo:/models:ro" \  nvcr.io/nvidia/tritonserver:26.04-py3 \  tritonserver --model-repository=/models --exit-on-error=true
Oczekiwanie na gotowość
until curl --fail --silent http://127.0.0.1:8000/v2/health/ready; do sleep 1; done
Zatrzymanie
docker stop libreyolo-triton

Polecenia przypinają Triton Server 26.04 i celowo pomijają flagi GPU dla Dockera, ponieważ KIND_CPU w wygenerowanej konfiguracji i tak blokuje umieszczenie na GPU.

Uruchomienie artefaktu

Adres URL modelu w Triton jest ścieżką modelu. LibreYOLO() sprawdza schemat http lub https przed jakąkolwiek obsługą ścieżek lokalnych i zwraca backend komunikujący się z serwerem, więc miejsce wywołania jest identyczne jak dla lokalnego checkpointu, podobnie jak zwracany obiekt Results.

Predykcja na serwowanym modelu
from libreyolo import LibreYOLO, SAMPLE_IMAGE remote = LibreYOLO("http://127.0.0.1:8000/yolo9")result = remote.predict(SAMPLE_IMAGE)print(result.boxes.xyxy[:3])
Porównanie z modelem lokalnym
from libreyolo import LibreYOLO, SAMPLE_IMAGE remote = LibreYOLO("http://127.0.0.1:8000/yolo9").predict(SAMPLE_IMAGE)native = LibreYOLO("LibreYOLO9t.pt").predict(SAMPLE_IMAGE) print(len(remote.boxes), len(native.boxes))print(remote.boxes.xyxy[:3])print(native.boxes.xyxy[:3])
Przypięcie wersji lub zmiana limitu czasu
from libreyolo import LibreYOLOfrom libreyolo.backends.triton import TritonBackend # Drugi segment ścieżki wybiera wersję modelu. Bez niego# decyduje skonfigurowana w Triton polityka wersji.pinned = LibreYOLO("http://127.0.0.1:8000/yolo9/1") # Limity czasu połączenia i sieci domyślnie wynoszą 30 sekund.patient = TritonBackend("http://127.0.0.1:8000/yolo9", timeout=120)

Format adresu to http(s)://host:port/model z opcjonalnym segmentem wersji. Port musi być podany wprost. Osadzone dane uwierzytelniające, ciąg zapytania i fragment są odrzucane, podobnie jak ścieżka z więcej niż dwoma segmentami.

device jest przyjmowany i ignorowany z wpisem w logu, ponieważ o umieszczeniu decyduje serwer.

Ograniczenia

Backend zgłasza wprost błąd zamiast zwracać pogorszony wynik, gdy kontrakt nie jest spełniony: brak metadanych LibreYOLO w konfiguracji modelu, więcej niż jedno wejście modelu, niezgodność między skonfigurowanymi wyjściami a metadanymi modelu, nieobsługiwany typ danych wejściowych albo serwer lub model, który nie jest gotowy.

Poza kontraktem w tej wersji pozostają: gRPC, uwierzytelnianie, pamięć współdzielona oraz wczytywanie i wyładowywanie modeli przez API.

Serwować można każdy format obsługiwany przez sam Triton, ale parametr z metadanymi i wygenerowana konfiguracja są tutaj dopasowane do ONNX, więc ścieżką LibreYOLO jest ONNX do repozytorium. Dla pełnego pipeline'u wideo zamiast serwera typu żądanie-odpowiedź zobacz DeepStream.

Odczytane z libreyolo/backends/triton.py, libreyolo/models/__init__.py, docs/triton.md i pyproject.toml na gałęzi dev. Polecenia kontenera są tymi przypiętymi w docs/triton.md.