Ultralytics YOLO27: Iscriviti alla lista d'attesa.
Get Started
Crea con Ultralytics Platform·Distribuire e monitorare·Lezione 7/10
Lezioneintermedio

Distribuire e chiamare un endpoint

Crea un endpoint dedicato in una delle 42 regioni, dimensionane le risorse in base al traffico e chiamalo con un client che gestisce avvii a freddo, errori 429 e chiavi non valide.

Un endpoint gratuito con scalabilità fino a zero può impiegare fino a un minuto per rispondere alla prima richiesta; un client ingenuo trasforma questo ritardo in un timeout visibile all'utente. Una chiave divulgata continua a funzionare anche dopo che l'hai eliminata. In questa lezione distribuirai il modello vincente, dimensionerai attentamente l'endpoint e scriverai il piccolo client necessario per ogni integrazione di produzione.

Esito

Puoi distribuire un modello su un endpoint dedicato, scegliere tra il piano gratuito e una dimensione personalizzata in base al profilo del traffico e chiamarlo con un client che riprova in caso di avvii a freddo ed errori 429 e si arresta rapidamente in presenza di errori reali.

Percorso rapido
Se sai già come muoverti, ecco la versione breve.
  1. Nella scheda Deploy del modello, fai clic su Deploy nella regione con la latenza più bassa.

  2. Inizia con la dimensione gratuita da 1 vCPU e 2 GiB; scegli una configurazione personalizzata solo per un traffico in tempo reale costante.

  3. Chiama /predict dal tuo server usando la chiave associata alla distribuzione; in caso di errori 429 e timeout, riprova con un backoff.

  4. Distribuisci i nuovi modelli con Replace model: URL, regione e chiave rimangono invariati.

Pratico

Inferenza condivisa o endpoint dedicato#

Ogni modello può già essere chiamato tramite l'API di inferenza condivisa di Platform, adatta ai test. Per il traffico di produzione, usa un endpoint dedicato:

Inferenza condivisaEndpoint dedicato
ServizioCondiviso tra gli utenti di PlatformUn modello, tenant singolo
RegioniLa tua regione dati (US, EU o AP)Una qualsiasi delle 42 regioni
Limite di frequenza20 richieste al minuto per chiaveNessun limite di Platform per le chiamate dirette
Dimensione della richiestaCirca 4.5 MB32 MB, fino a 1 ora per richiesta (supporta i video)
AutenticazioneQualsiasi chiave API dell'area di lavoroSolo la chiave associata alla distribuzione

Crea e dimensiona l'endpoint#

Apri la scheda Deploy del modello. Il browser misura la latenza verso tutte le 42 regioni (14 nelle Americhe, 13 in Europa, 12 nell'Asia-Pacifico, 3 in Medio Oriente e Africa) e ordina la tabella in base a questo valore:

Scheda Deploy del modello sulla piattaforma Ultralytics, con una mappa del mondo che mostra i pin delle regioni e una tabella della latenza per regione ordinata in base alla latenza misurata, ogni riga con un pulsante Deploy

Fai clic su Deploy nella riga più vicina ai tuoi utenti, controlla CPU, memoria, prezzo e nome generato (ad esempio yolo26n-iowa), quindi fai clic su Create Deployment. Puoi anche iniziare da New Deployment nella scheda Deployments del tuo profilo:

Finestra di dialogo New Deployment della piattaforma Ultralytics, con un selettore di modelli, una mini mappa delle regioni con una tabella della latenza e CPU impostata su 1 vCPU e memoria su 2 GiB

Scegli le dimensioni in base al tipo di traffico:

TrafficoDimensioneCosto
Processi batch, strumenti interni, demo con picchi di trafficoPredefinito: 1 vCPU, 2 GiB; scala fino a zeroGratis con tutti i piani
Traffico costante in tempo reale che non può attendere un avvio a freddoDimensioni personalizzate (1–8 vCPU, 2–32 GiB) con un'istanza sempre attivaFatturazione oraria dal momento in cui è pronta fino all'arresto, anche durante l'inattività: circa $0.12/h per 1 vCPU e 4 GiB in Iowa
Utenti in più continentiUn endpoint per regione, dietro il tuo routerOgni endpoint è fatturato in base alle sue dimensioni

Finestra di dialogo New Deployment della piattaforma Ultralytics, con una tabella della latenza delle regioni e i selettori di CPU e memoria impostati su dimensioni personalizzate di 1 vCPU e 4 GiB

I piani consentono 3 (Free), 10 (Pro) o un numero illimitato (Enterprise) di distribuzioni; anche gli endpoint arrestati vengono conteggiati. L'endpoint accetta traffico quando il badge indica Ready:

Esempio pratico: un client pronto per la produzione#

Pagina di distribuzione della piattaforma Ultralytics per exp-3-los-angeles con schede per richieste, tasso di errore e latenza P95, una mappa della posizione, la scheda Endpoint con l'URL dell'endpoint da copiare e le informazioni sulla distribuzione con i prezzi

Ogni endpoint ha un URL come https://predict-<id>-<hash>-<region>.a.run.app e serve /predict (POST), /health e una pagina interattiva /docs. Accetta solo la chiave API associata al momento della creazione; i proprietari dell'area di lavoro vedono quella chiave già compilata nella scheda Predict della distribuzione, sotto Docs, accanto agli snippet per Python, JavaScript e cURL. Gli snippet effettuano una singola richiesta; il codice di produzione deve gestire anche un avvio a freddo e un'istanza sotto carico:

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")

Lo abbiamo testato con uno stub locale che risponde una volta a 429 e poi restituisce un risultato reale di YOLO26n per bus.jpg nel formato di risposta dell'endpoint:

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

Ecco, riga per riga, le decisioni importanti:

  • timeout=90 copre un avvio a freddo che può durare fino a circa un minuto; i timeout predefiniti della maggior parte dei client HTTP sono molto più brevi.
  • Gli errori 429 e 5xx vengono ritentati, rispettando Retry-After quando l'endpoint lo invia. Ogni endpoint serve le richieste da una singola istanza e, quando è sotto carico, rifiuta le richieste con 429.
  • Gli altri errori 4xx interrompono subito l'operazione: 401 indica una chiave errata e 413 un corpo superiore a 32 MB; nessuno dei due problemi si risolve da solo.
  • La risposta contiene una voce per ogni immagine (o fotogramma video) in images, ciascuna con results (class, name, confidence, box con x1, y1, x2, y2) e speed in millisecondi.

I campi facoltativi del modulo sono conf (predefinito 0.25), iou (0.7), imgsz (la dimensione di addestramento del modello), vid_stride per i video e normalize=true per le coordinate da 0 a 1. L'equivalente in cURL prevede una riga per campo:

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"

Distribuisci nuove versioni senza cambiare l'URL#

Replace model nella pagina della distribuzione sostituisce il modello con un altro modello completato della stessa area di lavoro. Il vecchio modello continua a servire le richieste finché il nuovo non è pronto; URL, regione e chiave rimangono invariati e, se il rilascio non riesce, il modello precedente resta attivo. Per ripristinare la versione precedente basta eseguire la stessa operazione selezionando il modello precedente: conservalo quindi nel progetto. Update configuration modifica le dimensioni senza ricreare l'endpoint e Stop sospende la fatturazione mantenendo l'URL.

Alcune modifiche richiedono un nuovo endpoint: le regioni sono fisse (per spostarlo, devi eliminarlo e ricrearlo ottenendo un nuovo URL) e i domini personalizzati non sono supportati; se i client hanno bisogno di un nome host stabile e personalizzato, anteponi il tuo gateway. Per eseguire il modello al di fuori della piattaforma, esportalo (Esporta per la distribuzione) oppure ospitalo autonomamente dietro Triton Inference Server.

Insidie#

La chiave API viene inviata al browser

Sintomo: il tuo endpoint riceve traffico che non riesci a giustificare. Soluzione: non inserire mai la chiave in un'app web o mobile; chiama l'endpoint dal tuo backend. Eliminare o disattivare la chiave associata non blocca l'endpoint, perché continua ad accettare quella stringa della chiave. Per revocare l'accesso, interrompi o elimina il deployment e creane uno nuovo associato a una chiave appena generata.

La prima richiesta dopo una notte tranquilla va in timeout

Sintomo: la prima richiesta del mattino non va a buon fine, mentre il tentativo successivo riesce. Soluzione: gli endpoint di dimensione predefinita scalano fino a zero. Imposta un timeout di almeno 90 secondi, riscalda l'endpoint con una chiamata /health prima del traffico previsto oppure passa a una dimensione personalizzata se ogni richiesta deve essere rapida.

I video di grandi dimensioni vengono rifiutati

Sintomo: i caricamenti non vanno a buon fine con 413. Soluzione: gli endpoint dedicati accettano corpi delle richieste fino a 32 MB. Dividi i video lunghi in clip più brevi o invia fotogrammi campionati e passa vid_stride per saltare i fotogrammi sul server.

Provalo

Distribuisci il modello migliore con le dimensioni predefinite nella regione con la latenza più bassa. Chiamalo con client.py da un server o dal terminale, poi misura il tempo di una richiesta dopo che l'endpoint è rimasto inattivo per un'ora (senza aprire la relativa pagina) e di una subito dopo. Infine, sostituisci il modello con quello arrivato secondo e verifica che lo stesso URL risponda con i risultati del nuovo modello.

Criteri di completamento
La lezione è completata quando tutte le seguenti condizioni sono soddisfatte.
  • client.py stampa il conteggio degli oggetti restituito dall'endpoint.

  • Hai misurato una richiesta a freddo e una a caldo e hai annotato la decisione sulle dimensioni insieme al costo mensile.

  • La sostituzione del modello è stata completata e lo stesso URL ha servito il nuovo modello.

Mostra la soluzione

Esempio di risposta per la videocamera della linea di produzione delle pillole: distribuisci v2-finetune in europe-west1 (St. Ghislain, la regione con la latenza più bassa rispetto allo stabilimento tedesco) con le dimensioni predefinite. Richiesta a freddo dopo un'ora di inattività: 38 s, un tempo coperto dal timeout di 90 secondi; richiesta a caldo: 0.3 s. Decisione: durante i turni, il PLC della linea invia un fotogramma ogni 30 secondi, quindi l'endpoint rimane attivo per tutto il turno e solo il primo fotogramma subisce un avvio a freddo. Una chiamata /health dal controller della linea 2 minuti prima di ogni turno elimina anche questo ritardo, quindi manteniamo le dimensioni predefinite gratuite e risparmiamo circa $90 al mese rispetto a un'istanza personalizzata con 1 vCPU e 4 GiB. Sostituendo di nuovo il modello con v1-baseline, lo stesso URL restituisce i risultati di v1; sostituiscilo ancora con v2 per concludere.

Prossimi passi

La distribuzione è attiva. Ora creerai i due controlli che ti avvisano quando qualcosa non va nell'endpoint o nel modello.

Accedi per salvare i progressi