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

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.

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

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-rolloutSostituisce 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 -- greenIn 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 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.

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.

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.

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.

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.

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