Procedura per pubblicare la nuova versione di un modello accanto a quella in uso, sullo stesso endpoint, e spostarle il traffico per gradi: prima una copia delle richieste, poi una parte, poi tutto, con il ritorno alla versione precedente. Una console .NET chiama l'endpoint cento volte e conta quale versione ha risposto.

Occorre: l'area di lavoro mlw-guide-extranet-01 con il modello iris-model registrato nelle versioni 1 e 2, cioè i passi da 1 a 8 della guida Addestrare una rete neurale su Azure Machine Learning e chiamarla da .NET, e .NET 10 sul computer. Durata: circa un'ora, quasi tutta di attesa: nella prova la prima pubblicazione ha richiesto 25 minuti e la seconda 11. Costo: meno di un dollaro, se elimini le risorse alla fine. Lo studio indica 0,12 dollari l'ora per ciascuna delle due macchine dell'endpoint.

Lo studio delle schermate è in inglese: i nomi dei comandi sono riportati come appaiono a schermo.

Le due versioni sullo stesso endpoint

1. Pubblica la versione 1 come blue

Nello studio apri Models > iris-model, versione 1, premi Use this model > Real-time endpoint e compila:

  • Instance count: 1
  • Virtual machine: Standard_D2as_v4, quella proposta
  • Endpoint: New
  • Endpoint name: un nome tuo, unico nella regione, qui iris-rollout-extranet-01
  • Deployment name: blue

La pubblicazione della versione 1 come blue

Premi Deploy. Al termine blue riceve il 100% del traffico.

2. Aggiungi la versione 2 come green

Apri Models > iris-model, versione 2, premi Use this model > Real-time endpoint e compila:

  • Instance count: 1
  • Endpoint: Existing; in Endpoint name lo studio propone iris-rollout-extranet-01
  • Deployment name: green

In Virtual machine lascia quella proposta, Standard_D2a_v4. Nella prova l'unica istanza di blue occupava 4 dei 4 core della quota della famiglia di Standard_D2as_v4, e lo studio ha proposto una macchina di un'altra famiglia, allo stesso prezzo.

L'aggiunta della versione 2 come green sull'endpoint esistente

Premi Deploy. Al termine, in Endpoints > iris-rollout-extranet-01, scheda Details, green compare con lo 0% del traffico.

L'endpoint con blue al 100% e green allo 0%

3. Copia indirizzo e chiave

Nella scheda Consume copia REST endpoint e Primary key. La chiave dà accesso al modello: non scriverla nel codice e non pubblicarla.

La console .NET

4. Crea la console

dotnet new console -n iris-rollout
cd iris-rollout

Sostituisce Program.cs. Manda cento volte lo stesso fiore, una versicolor, e conta le risposte in base all'intestazione azureml-model-deployment, che l'endpoint aggiunge a ogni risposta con il nome della distribuzione. Con un argomento, manda la stessa intestazione nella richiesta e chiama solo quella distribuzione.

using System.Net.Http.Headers;
using System.Net.Http.Json;

string scoringUri = Environment.GetEnvironmentVariable("SCORING_URI")!;
string key = Environment.GetEnvironmentVariable("ENDPOINT_KEY")!;
string? deployment = args.Length > 0 ? args[0] : null;

var request = new
{
    input_data = new
    {
        columns = new[] { "sepal_length", "sepal_width", "petal_length", "petal_width" },
        index = new[] { 0 },
        data = new[] { new[] { 6.0, 2.9, 4.5, 1.5 } },
    },
};

using HttpClient http = new();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
if (deployment is not null)
{
    http.DefaultRequestHeaders.Add("azureml-model-deployment", deployment);
}

Dictionary<string, int> count = [];
Dictionary<string, string> lastAnswer = [];

for (int i = 0; i < 100; i++)
{
    using HttpResponseMessage response = await http.PostAsJsonAsync(scoringUri, request);
    response.EnsureSuccessStatusCode();
    string name = response.Headers.GetValues("azureml-model-deployment").First();
    count[name] = count.GetValueOrDefault(name) + 1;
    lastAnswer[name] = await response.Content.ReadAsStringAsync();
}

foreach (string name in count.Keys.Order())
{
    Console.WriteLine($"{name}: {count[name]} responses, last {lastAnswer[name]}");
}

5. Prova le due versioni

Imposta le due variabili con i valori copiati e avvia:

export SCORING_URI=https://iris-rollout-extranet-01.westeurope.inference.ml.azure.com/score
export ENDPOINT_KEY=<chiave>
dotnet run
dotnet run -- green

In PowerShell le prime due righe sono $env:SCORING_URI = "..." e $env:ENDPOINT_KEY = "...". Nella prova:

blue: 100 responses, last [{"0": 0.5591238737106323, "1": 0.3279431164264679, "2": 0.11293303966522217}]
green: 100 responses, last [{"0": 0.006401204038411379, "1": 0.7643778324127197, "2": 0.22922095656394958}]

Senza argomento risponde sempre blue, che dà il fiore come setosa al 56%. Chiamata direttamente, green lo riconosce come versicolor al 76%.

Il traffico

6. Copia una parte del traffico su green

Nella scheda Details premi Update traffic, attiva Enable mirrored traffic, scegli green in Deployment name, scrivi 20 in Traffic allocation % e premi Update.

Il 20% del traffico copiato su green

Il pannello accetta valori dall'1% al 50% e non permette di copiare il traffico su una distribuzione che riceve già traffico reale.

Avvia di nuovo dotnet run. Le risposte arrivano tutte da blue:

blue: 100 responses, last [{"0": 0.5591238737106323, "1": 0.3279431164264679, "2": 0.11293303966522217}]

Le copie si vedono nella scheda Logs, scegliendo green: ogni richiesta ricevuta lascia una riga azmlinfsrv - POST /score 200. Nella prova, per le 100 chiamate, green ne ha ricevute 23.

7. Dai a green il 10% del traffico

Premi Update traffic, disattiva Enable mirrored traffic, scrivi 90 per blue e 10 per green e premi Update.

Il traffico diviso fra blue al 90% e green al 10%

Con dotnet run, nella prova:

blue: 87 responses, last [{"0": 0.5591238737106323, "1": 0.3279431164264679, "2": 0.11293303966522217}]
green: 13 responses, last [{"0": 0.006401204038411379, "1": 0.7643778324127197, "2": 0.22922095656394958}]

8. Torna alla versione precedente

Premi Update traffic, scrivi 100 per blue e 0 per green e premi Update.

Tutto il traffico di nuovo su blue

Con dotnet run le 100 risposte arrivano di nuovo da blue; green resta pubblicata.

9. Passa tutto il traffico a green

Premi Update traffic, scrivi 0 per blue e 100 per green e premi Update.

Tutto il traffico su green

Con dotnet run, nella prova:

green: 100 responses, last [{"0": 0.006401204038411379, "1": 0.7643778324127197, "2": 0.22922095656394958}]

Nella prova ogni cambio di traffico è stato applicato in meno di due minuti.

10. Elimina blue

Nella scheda Details, nel riquadro Deployment blue, premi l'icona del cestino, spunta Delete deployment: blue e premi Delete.

La conferma dell'eliminazione di blue

Nella prova l'eliminazione ha richiesto 6 minuti. Dopo, dotnet run -- blue termina con 404 (Not Found).

Eliminare le risorse

11. Elimina il gruppo

Elimina il gruppo rg-guide-ml-01 come al passo 13 della guida di partenza.

12. Elimina in modo definitivo l'area di lavoro

Eliminato il gruppo, Azure tiene l'area di lavoro tra quelle eliminate per 14 giorni. Finché resta lì, la creazione di una nuova area di lavoro con lo stesso nome fallisce con Soft-deleted workspace exists. Please purge or recover it.

Sul portale cerca Azure Machine Learning, premi Recently deleted, scegli la sottoscrizione e, in Location, West Europe. Spunta mlw-guide-extranet-01 e premi Permanently delete.

L'area di lavoro tra quelle eliminate di recente

Nomi dei comandi, schermate e risposte rilevati il 12 novembre 2026, regione West Europe, con .NET 10.0.401.