Ultralytics YOLO27: Trag dich in die Warteliste ein.
Get Started
Mit der Ultralytics Platform entwickeln·Bereitstellen und überwachen·Lektion 7/10
LektionFortgeschrittene

Einen Endpunkt bereitstellen und aufrufen

Erstelle in einer von 42 Regionen einen dedizierten Endpunkt, passe seine Größe an dein Anfrageaufkommen an und rufe ihn mit einem Client auf, der Kaltstarts, 429-Antworten und ungültige Schlüssel zuverlässig behandelt.

Bei einem kostenlosen Endpunkt, der bis auf null skaliert, kann die erste Anfrage bis zu einer Minute dauern. Ein einfacher Client führt dann zu einer Zeitüberschreitung, die Nutzer sehen. Ein durchgesickerter Schlüssel funktioniert auch nach dem Löschen weiter. In dieser Lektion stellst du dein Gewinner-Modell bereit, wählst bewusst die passende Endpunktgröße und schreibst einen kleinen Client, den jede Integration für den Produktionseinsatz benötigt.

Lernergebnis

Du kannst ein Modell an einem dedizierten Endpunkt bereitstellen, anhand deines Anfrageaufkommens zwischen der kostenlosen und einer benutzerdefinierten Größe wählen und den Endpunkt mit einem Client aufrufen, der Kaltstarts und 429-Antworten erneut versucht und bei echten Fehlern sofort abbricht.

Schnellkurs
Wenn du dich bereits auskennst, findest du hier die Kurzfassung.
  1. Klicke im Tab Deploy des Modells auf „Bereitstellen“ und wähle die Region mit der niedrigsten Latenz.

  2. Beginne mit der kostenlosen Größe von 1 vCPU und 2 GiB. Wähle nur bei gleichmäßigem Echtzeit-Anfrageaufkommen eine benutzerdefinierte Größe.

  3. Rufe /predict von deinem Server aus mit dem an die Bereitstellung gebundenen Schlüssel auf. Wiederhole Anfragen bei 429-Antworten und Zeitüberschreitungen mit zunehmenden Wartezeiten.

  4. Stelle neue Modelle mit Modell ersetzen bereit: URL, Region und Schlüssel bleiben unverändert.

Praxisnah

Gemeinsame Inferenz oder dedizierter Endpunkt#

Jedes Modell lässt sich bereits über die gemeinsame Inferenz-API von Platform aufrufen, die sich für Tests eignet. Für den Produktionseinsatz solltest du einen dedizierten Endpunkt verwenden:

Gemeinsame InferenzDedizierter Endpunkt
DienstVon Platform-Nutzern gemeinsam genutztEin Modell, einzelner Mandant
RegionenDeine Datenregion (US, EU oder AP)Eine von 42 Regionen
Ratenbegrenzung20 Anfragen pro Minute und SchlüsselKeine Platform-Begrenzung für direkte Aufrufe
AnfragegrößeEtwa 4.5 MB32 MB, bis zu 1 Stunde pro Anfrage (Video wird unterstützt)
AuthentifizierungBeliebiger API-Schlüssel des ArbeitsbereichsNur der an die Bereitstellung gebundene Schlüssel

Endpunkt erstellen und dimensionieren#

Öffne den Tab Deploy des Modells. Dein Browser misst die Latenz zu allen 42 Regionen (14 in Amerika, 13 in Europa, 12 im asiatisch-pazifischen Raum, 3 im Nahen Osten und in Afrika) und sortiert die Tabelle danach:

Deploy-Tab des Modells in der Ultralytics Platform mit einer Weltkarte mit Regionsmarkierungen und einer nach gemessener Latenz sortierten Tabelle der Regionslatenzen, jede Zeile mit einer Deploy-Schaltfläche

Klicke in der Zeile der Region, die deinen Aufrufern am nächsten liegt, auf Deploy, überprüfe CPU, Arbeitsspeicher, Preis und den generierten Namen (z. B. yolo26n-iowa) und klicke auf Create Deployment. Du kannst auch über New Deployment im Tab „Deployments“ deines Profils beginnen:

Dialog „New Deployment“ in der Ultralytics Platform mit einer Modellauswahl, einer Regions-Mini-Karte mit Latenztabelle sowie CPU auf 1 vCPU und Arbeitsspeicher auf 2 GiB eingestellt

Dimensioniere nach dem Verkehrsmuster:

VerkehrUmfangKosten
Batch-Aufträge, interne Tools, Demos mit LastspitzenStandardmäßig 1 vCPU, 2 GiB; skaliert auf nullBei jedem Tarif kostenlos
Gleichmäßiger Echtzeitverkehr, der nicht auf einen Kaltstart warten kannBenutzerdefinierte Größe (1–8 vCPU, 2–32 GiB) mit einer warm gehaltenen InstanzAb Betriebsbereitschaft bis zum Stoppen stündliche Abrechnung, auch bei Leerlauf: etwa 0,12 $/h für 1 vCPU, 4 GiB in Iowa
Nutzer auf mehreren KontinentenEin Endpunkt pro Region hinter deinem eigenen RouterJeder Endpunkt wird entsprechend seiner Größe abgerechnet

Dialog „New Deployment“ in der Ultralytics Platform mit einer Regionslatenztabelle und CPU- und Arbeitsspeicherauswahl auf eine benutzerdefinierte Größe von 1 vCPU und 4 GiB eingestellt

Die Tarife erlauben 3 (Free), 10 (Pro) oder unbegrenzt viele (Enterprise) Bereitstellungen; auch gestoppte Endpunkte werden mitgezählt. Der Endpunkt nimmt Traffic entgegen, sobald sein Status Ready anzeigt:

Praxisbeispiel: Ein Client, der den Produktivbetrieb übersteht#

Bereitstellungsseite der Ultralytics Platform für exp-3-los-angeles mit Karten zu Anfragen, Fehlerrate und P95-Latenz, einer Standortkarte, der Endpunktkarte mit kopierbarer Endpunkt-URL und Bereitstellungsinformationen mit Preisen

Jeder Endpunkt hat eine URL wie https://predict-<id>-<hash>-<region>.a.run.app und stellt /predict (POST), /health sowie eine interaktive Seite /docs bereit. Er akzeptiert nur den bei der Erstellung gebundenen API-Schlüssel; Eigentümer des Arbeitsbereichs sehen diesen Schlüssel im Tab Predict der Bereitstellung unter Docs vorausgefüllt, neben Codebeispielen für Python, JavaScript und cURL. Die Codebeispiele senden jeweils eine Anfrage; Produktivcode muss auch einen Kaltstart und eine ausgelastete Instanz überstehen:

import os
import time
from collections import Counter

import httpx

URL = "https://YOUR_DEPLOYMENT_URL.run.app/predict"
HEADERS = {"Authorization": f"Bearer {os.environ['ULTRALYTICS_API_KEY']}"}  # the deployment's bound key, server-side only

def predict(client, path, conf=0.25, attempts=4):
    """POST one image; retry timeouts, 429, and 5xx with backoff; fail fast on other errors."""
    for attempt in range(attempts):
        try:
            with open(path, "rb") as f:
                r = client.post(URL, headers=HEADERS, data={"conf": conf}, files={"file": f}, timeout=90)
            if r.status_code < 400:
                return r.json()
            if r.status_code != 429 and r.status_code < 500:
                r.raise_for_status()  # 401 wrong key, 413 too large: retrying won't help
            wait, reason = float(r.headers.get("Retry-After", 2**attempt)), r.status_code
        except httpx.TimeoutException:  # a scaled-to-zero endpoint can take up to a minute to wake
            wait, reason = 2**attempt, "timeout"
        print(f"attempt {attempt + 1}: {reason}, retrying in {wait:.0f} s")
        time.sleep(wait)
    raise RuntimeError(f"endpoint still unavailable after {attempts} attempts")

with httpx.Client() as client:
    response = predict(client, "bus.jpg")
for image in response["images"]:
    counts = Counter(d["name"] for d in image["results"])
    print(f"{sum(counts.values())} objects {dict(counts)} in {image['speed']['inference']:.1f} ms")

Wir haben den Code mit einem lokalen Stub getestet, der einmal 429 zurückgibt und danach ein echtes YOLO26n-Ergebnis für bus.jpg im Antwortformat des Endpunkts liefert:

attempt 1: 429, retrying in 2 s
5 objects {'bus': 1, 'person': 4} in 34.9 ms

Die wichtigen Entscheidungen im Einzelnen:

  • timeout=90 deckt einen Kaltstart von bis zu etwa einer Minute ab; die Standard-Timeouts der meisten HTTP-Clients sind viel kürzer.
  • 429- und 5xx-Fehler werden erneut versucht; dabei wird Retry-After berücksichtigt, wenn der Endpunkt diesen Wert sendet. Jeder Endpunkt verarbeitet Anfragen über eine einzelne Instanz und weist bei hoher Auslastung mit 429 Last ab.
  • Bei anderen 4xx-Fehlern wird der Vorgang sofort abgebrochen: 401 bedeutet, dass der falsche Schlüssel verwendet wurde, und 413, dass der Inhalt mehr als 32 MB umfasst. Keiner dieser Fehler behebt sich von selbst.
  • Die Antwort enthält in images einen Eintrag pro Bild (oder Videobild), jeweils mit results (class, name, confidence, box mit x1, y1, x2, y2) und speed in Millisekunden.

Optionale Formularfelder sind conf (Standardwert 0.25), iou (0.7), imgsz (Trainingsgröße des Modells), vid_stride für Video und normalize=true für Koordinaten im Bereich 0–1. Das entsprechende cURL-Beispiel enthält eine Zeile pro Feld:

curl -X POST "https://YOUR_DEPLOYMENT_URL.run.app/predict" \
  -H "Authorization: Bearer $ULTRALYTICS_API_KEY" \
  -F "file=@bus.jpg" -F "conf=0.25" -F "iou=0.7" -F "imgsz=640"

Neue Versionen bereitstellen, ohne die URL zu ändern#

Mit Replace model auf der Bereitstellungsseite wird ein anderes fertiggestelltes Modell aus demselben Arbeitsbereich eingesetzt. Das alte Modell wird weiterverwendet, bis das neue bereit ist; URL, Region und Schlüssel bleiben gleich. Schlägt die Einführung fehl, bleibt das vorherige Modell aktiv. Für ein Rollback verwendest du dieselbe Aktion mit dem vorherigen Modell. Lass es daher im Projekt. Mit Update configuration änderst du die Größe direkt, und Stop pausiert die Abrechnung und behält die URL bei.

Für manche Änderungen brauchst du einen neuen Endpunkt: Regionen sind festgelegt (für einen Wechsel musst du den Endpunkt löschen und neu erstellen, wobei eine neue URL entsteht), und benutzerdefinierte Domains werden nicht unterstützt. Schalte daher dein eigenes Gateway vor, wenn Aufrufer einen stabilen, gebrandeten Hostnamen benötigen. Um das Modell außerhalb der Platform auszuführen, exportiere das Modell (Für die Bereitstellung exportieren) oder hoste es selbst hinter dem Triton Inference Server.

Stolperfallen#

Der API-Schlüssel gelangt in den Browser

Symptom: Dein Endpunkt erhält Zugriffe, die du nicht zuordnen kannst. Lösung: Hinterlege den Schlüssel niemals in einer Web- oder Mobilanwendung, sondern rufe den Endpunkt von deinem Backend aus auf. Das Löschen oder Deaktivieren des gebundenen Schlüssels sperrt den Endpunkt nicht, da dieser weiterhin genau diese Schlüsselzeichenfolge akzeptiert. Um den Zugriff zu widerrufen, stoppe oder lösche die Bereitstellung und erstelle eine neue, an einen neuen Schlüssel gebundene Bereitstellung.

Die erste Anfrage nach einer ruhigen Nacht läuft in ein Zeitlimit

Symptom: Die erste Anfrage am Morgen schlägt fehl, beim erneuten Versuch funktioniert es. Lösung: Endpunkte in der Standardgröße skalieren auf null herunter. Verwende ein Zeitlimit von mindestens 90 Sekunden, wärme den Endpunkt mit einem /health-Aufruf vor dem erwarteten Datenverkehr auf oder wechsle zu einer benutzerdefinierten Größe, wenn jede Anfrage schnell beantwortet werden muss.

Große Videos werden abgelehnt

Symptom: Uploads schlagen mit 413 fehl. Lösung: Dedizierte Endpunkte akzeptieren Anfrageinhalte mit einer Größe von bis zu 32 MB. Teile lange Videos in kürzere Clips auf oder sende ausgewählte Einzelbilder und übergib vid_stride, damit Einzelbilder serverseitig übersprungen werden.

Ausprobieren

Stelle dein leistungsstärkstes Modell mit der Standardgröße in der Region mit der niedrigsten Latenz bereit. Rufe es von einem Server oder deinem Terminal aus mit client.py auf und miss dann die Zeit für eine Anfrage, nachdem der Endpunkt eine Stunde lang inaktiv war (ohne seine Seite zu öffnen), und für eine Anfrage direkt danach. Ersetze schließlich das Modell durch dein zweitbestes Modell und überprüfe, ob dieselbe URL Antworten mit den Ergebnissen des neuen Modells liefert.

Abgeschlossen, wenn
Du hast die Lektion abgeschlossen, wenn alle folgenden Punkte zutreffen.
  • client.py gibt die Objektanzahl deines Endpunkts aus.

  • Du hast eine Kaltstart- und eine Warmstart-Anfrage gemessen und deine Entscheidung zur Dimensionierung samt monatlichen Kosten dokumentiert.

  • Ein Modellwechsel wurde abgeschlossen, und dieselbe URL lieferte das neue Modell aus.

Lösung anzeigen

Beispielantwort für die Pillenlinienkamera: Stelle v2-finetune in europe-west1 (St. Ghislain, die Region mit der niedrigsten Latenz zum deutschen Werk) mit der Standardgröße bereit. Kaltstart-Anfrage nach einer Stunde Leerlauf: 38 s, was der Timeout von 90 Sekunden abfängt; Warmstart-Anfrage: 0,3 s. Entscheidung: Die SPS der Linie sendet während der Schichten alle 30 Sekunden ein Bild, sodass der Endpunkt während der gesamten Schicht warm bleibt und nur beim ersten Bild ein Kaltstart anfällt. Ein Aufruf von /health durch den Liniencontroller 2 Minuten vor jeder Schicht verhindert auch das, sodass die kostenlose Standardgröße ausreicht und gegenüber einer benutzerdefinierten Instanz mit 1 vCPU und 4 GiB etwa 90 $ pro Monat gespart werden. Wenn du das Modell wieder durch v1-baseline ersetzt, liefert dieselbe URL die Ergebnisse von v1; ersetze es zum Abschluss erneut durch v2.

Wie es weitergeht

Dein Endpunkt ist live. Als Nächstes erstellst du zwei Prüfungen, die dich warnen, wenn mit dem Endpunkt oder dem Modell etwas nicht stimmt.