ms-ai-architect/skills/ms-ai-engineering/references/mlops-genaiops/model-deployment-strategies-azure.md
Kjell Tore Guttormsen de0d94cbc1 feat(ms-ai-architect): R22 decision-b Enhet 3 — Status-backfill 25 none + ai-act dual-header-dedup 4 (Missing Status/Last-updated 29+4→0) [skip-docs]
To operasjoner, én økt (⊥ R7), begge ren metadata-normalisering (verdi aldri fabrikkert).

Premiss-korreksjon (ground truth 2026-07-07): roadmap sa «27 none + 4 ai-act».
Målt: 29 mangler bold **Status:** = 25 rene none + 4 ai-act (plain Status: GA).
De «27» inkluderte 2 for mye — 2 filer (custom-dashboards-ai-operations,
zero-trust-ai-services) har bold **Status:** KUN forbi byte 500 (present for
full-fil-audit, usynlig for 500B header-parser) → egen header-slanking-residual
(§8-register), utenfor Enhet 3.

Op A — Status-backfill 25 rene none: utvidet backfill-status.mjs MANIFEST 14→39
(samme statusForFile + insertMetaField + hard per-fil-invariant, idempotent skip
på de 14 R21-gjorte). Alle 25 → **Status:** Established Practice (ingen matcher
template|matrix|benchmarks|register). Diff +25/-0.

Op B — ai-act dual-header-dedup (4 filer): ny driver dedup-plain-header.mjs + 2
rene primitiver i transform.mjs — boldifyPlainField (plain→bold, verdi bevart
byte-eksakt, header-scoped, idempotent) + dropRedundantPlainField (sletter plain
KUN når bold m/ identisk verdi beviser redundans; kaster ved avvik/manglende bold).
Per fil: plain Last updated: + Status: GA → bold (2026-06-18/2026-02, GA bevart),
redundant plain Category: fjernet. Hard per-fil-invariant (net -1 linje, begge
felt bold m/ bevart verdi, ingen plain-header igjen, body byte-identisk). Diff -12/+8.

Verifisering: test-backfill-status 8/8 + test-dedup-plain-header 13/13; audit
Missing Status 29→0, Missing English Last updated 4→0; skills-diff 29 filer
+33/-12 (kun **Status:** + 8 bold-swaps), diff-kontekst inspisert per fil; begge
drivere idempotent (re-run 0 writes); suite 806/806 exit 0; none=8 uendret (Enhet 4).
2026-07-07 07:45:27 +02:00

1109 lines
39 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Model Deployment Strategies on Azure
**Område:** MLOps & GenAIOps
**Dato:** 2026-02-04
**Målgruppe:** Arkitekter som planlegger ML-modellutplassering i produksjon
**Konfidensgrad:** ⚡️⚡️⚡️ Høy (basert på Microsoft Learn + offisielle code samples)
**Type:** reference
**Source:** https://learn.microsoft.com/azure/machine-learning/concept-model-management-and-deployment
**Category:** MLOps & GenAIOps
**Status:** Established Practice
**Last updated:** 2026-04
## Innhold
- [Introduksjon](#introduksjon)
- [Kjernekomponenter](#kjernekomponenter)
- [Arkitekturmønstre](#arkitekturmønstre)
- [Beslutningsveiledning](#beslutningsveiledning)
- [Integrasjon med Microsoft-stakken](#integrasjon-med-microsoft-stakken)
- [Offentlig sektor (Norge)](#offentlig-sektor-norge)
- [Kostnad og lisensiering](#kostnad-og-lisensiering)
- [For arkitekten (Cosmo)](#for-arkitekten-cosmo)
- [Kilder og verifisering](#kilder-og-verifisering)
## Introduksjon
Model deployment strategies handler om hvordan man trygt og effektivt ruller ut nye ML-modeller eller modellversjoner til produksjon uten å forårsake nedetid eller forringet brukeropplevelse. Azure Machine Learning tilbyr flere deployment patterns som støtter **progressive exposure**, **traffic routing**, og **rollback-mekanismer**.
Korrekt valg av deployment strategy reduserer risiko, muliggjør raskere iterasjoner, og sikrer at feil oppdages tidlig før full produksjonsrullering. Dette er spesielt kritisk for GenAI-løsninger hvor modelloppførsel kan variere betydelig mellom versjoner.
**Hovedutfordringer:**
- Unngå service disruption ved modellbytte
- Validere ny modell mot reell produksjonstrafikk
- Kunne rulle tilbake raskt ved feil
- Sammenligne modellytelse mellom versjoner (A/B testing)
- Håndtere stateful components (databaser, schemas) ved rollback
## Kjernekomponenter
### 1. Azure Machine Learning Online Endpoints
**Online endpoints** er det primære konseptet for real-time inferencing i Azure ML. Et endpoint fungerer som et API som klienter kan konsumere, mens underliggende **deployments** representerer den faktiske implementasjonen.
**Nøkkelkonsept:**
- **Endpoint** = API-kontrakten (URL, autentisering)
- **Deployment** = Konkret modellversjon + infrastruktur + scoring script
- Ett endpoint kan ha **flere deployments** samtidig
- Traffic routing styres på endpoint-nivå
**To typer online endpoints:**
1. **Managed Online Endpoints** Azure administrerer infrastruktur (anbefalt)
2. **Kubernetes Online Endpoints** Du administrerer AKS-cluster
**Eksempel (Python SDK):**
```python
from azure.ai.ml.entities import ManagedOnlineEndpoint, ManagedOnlineDeployment
# Opprett endpoint
endpoint = ManagedOnlineEndpoint(
name="heart-classifier-endpoint",
auth_mode="key",
description="Production endpoint for heart disease classifier"
)
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
# Deployment (med modell, environment, scoring script)
blue_deployment = ManagedOnlineDeployment(
name="blue",
endpoint_name="heart-classifier-endpoint",
model=model,
environment=env,
code_configuration=CodeConfiguration(code="./src", scoring_script="score.py"),
instance_type="Standard_DS3_v2",
instance_count=2
)
ml_client.online_deployments.begin_create_or_update(blue_deployment).result()
# Allokér all trafikk til blue
endpoint.traffic = {"blue": 100}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Referanse:** [Managed online endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints-online?view=azureml-api-2)
---
### 2. Blue-Green Deployment
**Blue-green deployment** er en strategi der to identiske miljøer (blue = nåværende, green = ny) kjører parallelt. Trafikken byttes gradvis fra blue til green, og man kan raskt rulle tilbake ved feil.
**Workflow:**
1. **Blue (v1)** kjører i produksjon med 100% trafikk
2. Deploy **Green (v2)** til samme endpoint med 0% trafikk
3. Test Green isolert (via deployment-name parameter)
4. Allokér små andeler trafikk til Green (10%, 25%, 50%)
5. Monitorér health metrics, error rates, latency
6. Gradvis øk til 100% Green
7. Fjern Blue deployment når Green er stabil
**Eksempel (Azure CLI):**
```bash
# Deploy green deployment (0% traffic)
az ml online-deployment create --name green \
--endpoint-name $ENDPOINT_NAME \
-f green-deployment.yml
# Test green isolert
az ml online-endpoint invoke --name $ENDPOINT_NAME \
--deployment-name green \
--request-file sample.json
# Allokér 10% trafikk til green
az ml online-endpoint update --name $ENDPOINT_NAME \
--traffic "blue=90 green=10"
# Monitorér, deretter 100% til green
az ml online-endpoint update --name $ENDPOINT_NAME \
--traffic "blue=0 green=100"
# Slett blue deployment
az ml online-deployment delete --name blue \
--endpoint-name $ENDPOINT_NAME --yes
```
**Fordeler:**
- Null downtime
- Enkel rollback (bare bytt trafikk tilbake)
- Tester mot reell produksjonstrafikk
- Støtter gradvis rollout
**Ulemper:**
- Krever dobbelt ressurskapasitet under rullering
- Komplisert ved stateful components (database migrations)
**Referanse:** [Safe rollout for real-time inference](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2)
---
### 3. Canary Deployment
**Canary deployment** er en variant av progressive exposure der en liten "kanari-gruppe" av brukere får tilgang til den nye versjonen først. Dette kan være interne brukere, beta-testere, eller en geografisk region.
**Workflow:**
1. Deploy ny versjon til subset av infrastruktur (f.eks. én AKS-node)
2. Route 5-10% av trafikk til canary
3. Samle metrics og feedback fra canary-gruppen
4. Utvid gradvis til 25%, 50%, 100%
5. Rulle tilbake hvis canary viser feil
**Azure implementering:**
- For **AKS deployments**: Bruk Kubernetes Deployment Stamps pattern
- For **Managed Endpoints**: Samme som blue-green, men fokus på små initial percentages
**Eksempel (Azure DevOps Pipelines):**
```yaml
# Deploy canary with 10% traffic
- task: KubernetesManifest@1
inputs:
action: 'deploy'
strategy: 'canary'
percentage: '10'
manifests: 'manifests/deployment.yml'
```
**Fordeler:**
- Tidlig feil-deteksjon
- Begrenset blast radius ved feil
- God for testing av nye features med ekte brukere
**Ulemper:**
- Krever sofistikert traffic routing (feature flags, load balancer)
- Kan være vanskelig å isolere canary-trafikk for debugging
**Referanse:** [Canary deployment for Kubernetes](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/kubernetes/canary-demo?view=azure-devops)
---
### 4. Shadow Deployment (Traffic Mirroring)
**Shadow deployment** kopierer en prosentandel av live trafikk til en ny deployment uten å returnere resultater til klienten. Dette lar deg validere ny modell mot reell produksjonsdata uten å påvirke brukere.
**Nøkkelkonsept:**
- **Mirror traffic** = Kopier requests til shadow deployment
- Klienten får alltid svar fra primær deployment (blue)
- Shadow deployment (green) logger metrics, men påvirker ikke response
- Maks 50% mirror traffic (bandwidth quota limits)
**Eksempel (Python SDK):**
```python
# Mirror 10% av trafikk til green
endpoint.mirror_traffic = {"green": 10}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
# Invoke endpoint flere ganger (trafikk går til blue, 10% mirrors til green)
for i in range(100):
ml_client.online_endpoints.invoke(
endpoint_name=endpoint_name,
request_file="sample.json"
)
# Sjekk green logs for validering
ml_client.online_deployments.get_logs(
name="green",
endpoint_name=endpoint_name,
lines=100
)
# Disable mirroring
endpoint.mirror_traffic = {"green": 0}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Begrensninger:**
- **Ikke støttet** for Kubernetes online endpoints
- Maks 50% mirror traffic (p.g.a. endpoint bandwidth quota)
- Kun én deployment kan motta mirrored traffic
- En deployment kan **ikke** motta både live og mirrored traffic
**Use cases:**
- Validere latency for ny modell
- Sjekke for HTTP errors før live traffic
- Sammenligne predictions mellom modeller (offline analysis)
**Referanse:** [Traffic mirroring documentation](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2#test-the-deployment-with-mirrored-traffic)
---
### 5. A/B Testing
**A/B testing** router trafikk mellom to (eller flere) modellversjoner for å sammenligne performance metrics, conversion rates, eller brukeropplevelse.
**Implementering i Azure ML:**
```python
# 50/50 split mellom v1 og v2
endpoint.traffic = {"model-v1": 50, "model-v2": 50}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Viktige poeng:**
- Total traffic **må** summere til 100% (eller 0% for disable)
- Bruk Application Insights for å tracke metrics per deployment
- Samle nok data før konklusjon (statistisk signifikans)
**Advanced: Target specific deployment via HTTP header:**
```python
# Klient kan overstyre traffic routing med header:
# azureml-model-deployment: model-v2
```
**Referanse:** [Controlled rollout for online endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/concept-model-management-and-deployment?view=azureml-api-2#model-registration,-packaging,-and-deployment)
---
## Arkitekturmønstre
### Mønster 1: Progressive Rollout for Managed Endpoints
**Scenario:** Du har en produksjonsmodell (v1) og vil deploye v2 med minimal risiko.
**Steg:**
1. **Deploy v2 med 0% traffic**
```bash
az ml online-deployment create --name v2 \
--endpoint-name prod-endpoint -f v2-deployment.yml
```
2. **Test isolert**
```bash
az ml online-endpoint invoke --name prod-endpoint \
--deployment-name v2 --request-file test-data.json
```
3. **Mirror 10% trafikk for validation** (valgfritt)
```bash
az ml online-endpoint update --name prod-endpoint \
--mirror-traffic "v2=10"
```
**Bake time:** 6-12 timer. Sjekk logs for errors, latency, HTTP 500s.
4. **Start live traffic med 10%**
```bash
az ml online-endpoint update --name prod-endpoint \
--traffic "v1=90 v2=10" --mirror-traffic "v2=0"
```
**Bake time:** 24 timer. Monitorér Application Insights metrics.
5. **Øk gradvis til 25%, 50%, 100%**
```bash
# 50/50 split
az ml online-endpoint update --name prod-endpoint \
--traffic "v1=50 v2=50"
# Full rollout
az ml online-endpoint update --name prod-endpoint \
--traffic "v1=0 v2=100"
```
**Bake time:** Øk mellom hver fase (24-48 timer for 50%, 72 timer før 100%).
6. **Fjern v1 deployment**
```bash
az ml online-deployment delete --name v1 \
--endpoint-name prod-endpoint --yes
```
**Health checks per fase:**
- HTTP error rate < 0.1%
- p95 latency < SLA threshold
- Model prediction drift innenfor toleranse
- No increase in retry/timeout errors
---
### Mønster 2: Blue-Green med Database Migrations
**Utfordring:** Stateful components (database schema endringer) kompliserer rollback.
**Løsning: Backward-compatible schema migrations**
**Steg:**
1. **Deploy database schema v2 (backward compatible)**
- Nye kolonner har default values
- Gamle kolonner beholdes (deprecated, ikke fjernet)
- Applikasjonen kan kjøre mot begge schemas
2. **Deploy blue (v1) og green (v2) parallelt**
- Begge deployments bruker samme database
- v1 ignorerer nye kolonner
- v2 populerer nye kolonner
3. **Gradvis trafikk-bytte (som tidligere)**
4. **Cleanup fase (etter 100% green)**
- Kjør datamigrasjon script for å fylle nye kolonner (for gamle rader)
- Etter 1-2 uker, fjern deprecated kolonner
**Rollback-strategi:**
- Hvis feil oppdages før cleanup: Bare bytt trafikk tilbake til blue
- Hvis feil oppdages etter cleanup: Krever restore fra backup (derfor lang bake time)
---
### Mønster 3: Multi-Region Deployment with Canary
**Scenario:** Global produksjonsmodell med brukere i Europa, USA, Asia.
**Arkitektur:**
```
Azure Front Door (global load balancer)
├── Region: West Europe
│ ├── Endpoint: eu-prod-endpoint
│ │ ├── Deployment: blue (v1)
│ │ └── Deployment: green (v2) [canary]
├── Region: East US
│ └── Endpoint: us-prod-endpoint
│ └── Deployment: blue (v1)
└── Region: Southeast Asia
└── Endpoint: asia-prod-endpoint
└── Deployment: blue (v1)
```
**Rollout plan:**
1. **Deploy green til West Europe endpoint** (10% trafikk)
2. **Bake time:** 48 timer (dekker ulike tidssoner i Europa)
3. **Hvis OK:** Øk til 100% i West Europe
4. **Deploy green til East US** (10% trafikk)
5. **Bake time:** 48 timer
6. **Hvis OK:** Øk til 100% i East US
7. **Deploy green til Southeast Asia** (10% trafikk)
8. **Final bake:** 48 timer, deretter 100%
**Fordel:** Begrenser blast radius til én region. Hvis West Europe feiler, USA og Asia er upåvirket.
---
## Beslutningsveiledning
### Når bruke hvilken strategi?
| Strategi | Bruk når... | Ikke bruk når... |
|----------|-------------|------------------|
| **Blue-Green** | - Kritisk produksjonsmodell<br>- Trenger rask rollback<br>- Kan doble infrastruktur midlertidig | - Svært stateful (kompleks database)<br>- Knappe ressurser (cost constraints) |
| **Canary** | - Ny feature med ukjent impact<br>- Interne brukere kan teste først<br>- Geografisk segmenterte brukere | - Alle brukere må få samme versjon<br>- Real-time consistency krav |
| **Shadow Deployment** | - Validere ytelse før live traffic<br>- Sammenligne modellpredictions offline<br>- Testing av latency/throughput | - Bandwidth quotas er trange<br>- Trenger immediate feedback fra brukere |
| **A/B Testing** | - Business-critical decision (f.eks. recommendation model)<br>- Trenger statistisk signifikant sammenligning | - Raskt behov for rollout<br>- Ikke nok trafikk for statistisk kraft |
| **Progressive Rollout** | - Standard for alle produksjonsdeployments<br>- Alltid kombinert med en av strategiene over | - (Alltid bruk progressive rollout!) |
---
### Beslutningstre
```
START: Skal deploye ny modellversjon?
├─ Er dette første produksjonsdeployment?
│ └─ JA → Deploy single deployment (100% traffic) → Ferdig
├─ Har du stateful components (database)?
│ ├─ JA → Implementer backward-compatible migrations først
│ └─ NEI → Fortsett
├─ Trenger du sammenligne to versjoner for business metrics?
│ ├─ JA → A/B Testing (50/50 eller annen split)
│ └─ NEI → Fortsett
├─ Er modellen kritisk (høy blast radius ved feil)?
│ ├─ JA → Shadow deployment først (mirror 10-50%)
│ │ → Deretter Blue-Green med canary percentages (10% → 25% → 50% → 100%)
│ └─ NEI → Blue-Green med standard rollout (10% → 100%)
└─ Er brukerbasen geografisk spredt?
├─ JA → Multi-region canary (én region om gangen)
└─ NEI → Single-region progressive rollout
```
---
## Integrasjon med Microsoft-stakken
### 1. Azure DevOps Pipelines
**CI/CD for ML model deployment:**
```yaml
# azure-pipelines.yml
trigger:
branches:
include:
- main
stages:
- stage: Build
jobs:
- job: TrainModel
steps:
- task: AzureCLI@2
inputs:
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
az ml job create -f training-job.yml
- stage: DeployCanary
dependsOn: Build
jobs:
- deployment: DeployGreen
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
displayName: 'Deploy green (0% traffic)'
inputs:
scriptType: 'bash'
inlineScript: |
az ml online-deployment create --name green \
--endpoint-name prod-endpoint -f green.yml
- stage: Canary10Percent
dependsOn: DeployCanary
jobs:
- job: UpdateTraffic
steps:
- task: AzureCLI@2
displayName: 'Route 10% to green'
inputs:
scriptType: 'bash'
inlineScript: |
az ml online-endpoint update --name prod-endpoint \
--traffic "blue=90 green=10"
- task: Delay@1
inputs:
delayForMinutes: '60' # Bake time
- stage: ValidateCanary
dependsOn: Canary10Percent
jobs:
- job: CheckMetrics
steps:
- task: AzureCLI@2
displayName: 'Query Application Insights'
inputs:
scriptType: 'bash'
inlineScript: |
# Sjekk error rate for green deployment
ERROR_RATE=$(az monitor app-insights metrics show \
--app my-app-insights \
--metric "requests/failed" \
--filter "cloud/roleName eq 'green'" \
--aggregation avg --query value -o tsv)
if (( $(echo "$ERROR_RATE > 0.01" | bc -l) )); then
echo "Error rate too high, failing pipeline"
exit 1
fi
- stage: RolloutFull
dependsOn: ValidateCanary
condition: succeeded()
jobs:
- deployment: FullRollout
environment: 'production-approval' # Manual approval gate
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
inputs:
scriptType: 'bash'
inlineScript: |
az ml online-endpoint update --name prod-endpoint \
--traffic "blue=0 green=100"
```
**Approval gates:**
- **Environment protection rules** i Azure DevOps sikrer manuell godkjenning før full rollout
- Integrer med **Azure Monitor alerts** for automatisk rollback ved feil
---
### 2. Azure Monitor & Application Insights
**Health metrics for deployment validation:**
```python
# Python-script for å sjekke deployment health
from azure.monitor.query import MetricsQueryClient, MetricAggregationType
from azure.identity import DefaultAzureCredential
from datetime import timedelta
credential = DefaultAzureCredential()
client = MetricsQueryClient(credential)
# Hent metrics for green deployment (siste time)
response = client.query_resource(
resource_uri=f"/subscriptions/{subscription_id}/resourceGroups/{rg}/providers/Microsoft.MachineLearningServices/workspaces/{ws}/onlineEndpoints/{endpoint}/deployments/green",
metric_names=["RequestLatency", "RequestsPerSecond", "CpuUtilizationPercentage"],
timespan=timedelta(hours=1),
aggregations=[MetricAggregationType.AVERAGE, MetricAggregationType.P95]
)
for metric in response.metrics:
print(f"{metric.name}: {metric.timeseries[0].data[0].average}")
```
**Alerts for automatic rollback:**
```bash
# Opprett alert rule for høy error rate
az monitor metrics alert create \
--name "green-deployment-high-errors" \
--resource-group myRG \
--scopes /subscriptions/.../onlineEndpoints/prod-endpoint/deployments/green \
--condition "avg requests/failed > 5" \
--window-size 5m \
--evaluation-frequency 1m \
--action /subscriptions/.../actionGroups/rollback-webhook
```
---
### 3. Azure Machine Learning Registries (MLOps maturity)
**Shared model registry på tvers av workspaces:**
```python
# Register model i shared registry (én gang)
from azure.ai.ml import MLClient
from azure.ai.ml.entities import Model
registry_client = MLClient(credential, registry_name="company-ml-registry")
model = Model(
name="heart-classifier",
version="2.0",
path="./model",
type="mlflow_model",
tags={"production-ready": "true"}
)
registry_client.models.create_or_update(model)
# Deploy fra registry i flere workspaces (dev, staging, prod)
prod_client = MLClient(credential, subscription_id, "prod-rg", "prod-ws")
deployment = ManagedOnlineDeployment(
name="green",
endpoint_name="prod-endpoint",
model=f"azureml://registries/company-ml-registry/models/heart-classifier/versions/2.0",
instance_type="Standard_DS3_v2",
instance_count=2
)
prod_client.online_deployments.begin_create_or_update(deployment).result()
```
**Fordeler:**
- Én kilde til sannhet for produksjonsmodeller
- Deploy samme modell-artifact til dev/staging/prod (consistency)
- Støtter multi-region deployment med samme modellversjon
**Referanse:** [Machine Learning Registries for MLOps](https://learn.microsoft.com/en-us/azure/machine-learning/concept-machine-learning-registries-mlops)
---
### 4. MLflow for Model Packaging
**No-code deployment av MLflow-modeller:**
```python
# Registrer MLflow model (inkluderer dependencies)
import mlflow
mlflow.set_tracking_uri(workspace.get_mlflow_tracking_uri())
with mlflow.start_run():
mlflow.sklearn.log_model(
sk_model=model,
artifact_path="model",
registered_model_name="heart-classifier",
signature=signature,
conda_env=conda_env
)
# Deploy uten scoring script (Azure ML genererer automatisk)
deployment = ManagedOnlineDeployment(
name="green",
endpoint_name="prod-endpoint",
model="azureml:heart-classifier@latest", # MLflow model
instance_type="Standard_DS3_v2",
instance_count=2
# Ingen code_configuration eller environment nødvendig!
)
```
**Fordeler:**
- Raskere deployment (ingen custom scoring script)
- Built-in support for scikit-learn, TensorFlow, PyTorch
- Enklere rollback (bare endre model version)
**Auth note (Verified MCP 2026-04):** For production deployments, use Microsoft Entra token-based authentication (`aad_token`) instead of key-based auth — provides identity-based access control.
**Referanse:** [Deploy MLflow models to online endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-deploy-mlflow-models-online-endpoints?view=azureml-api-2)
---
## Offentlig sektor (Norge)
### 1. Krav til endringshåndtering (Digdir)
**Utredningsinstruksen (2016) § 5:**
- Alle større IT-endringer (inkludert ML-modellutplasseringer) må dokumenteres med beslutningsgrunnlag
- **ADR (Architecture Decision Record)** bør inkludere valg av deployment strategy
**Eksempel ADR for deployment strategy:**
```markdown
# ADR-023: Blue-Green Deployment for Kredittscoring-modell
## Status
Akseptert (2026-02-04)
## Kontekst
Vi må deploye v2 av kredittscoring-modellen til produksjon. Modellen
påvirker 50 000 søknader per måned. Feil kan føre til feilaktige
kredittvurderinger med økonomiske og juridiske konsekvenser.
## Beslutning
Vi bruker **blue-green deployment** med følgende faser:
1. Shadow deployment (mirror 10%) i 48 timer
2. Live traffic 10% i 72 timer
3. Live traffic 50% i 72 timer
4. Live traffic 100%
## Konsekvenser
+ Redusert risiko for feil (gradvis rollout)
+ Rask rollback (bare bytt trafikk)
- Økte infrastrukturkostnader i rollout-perioden (2x compute)
- Krever 1 uke total rollout-tid
## Compliance
- Personvernforordningen (GDPR): Logging av alle modellpredictions
- Arkivloven: Bevaring av modellversjon-metadata i 5 år
```
---
### 2. Logging og Etterprøvbarhet
**Krav (GDPR Art. 22 + Arkivloven):**
- Alle automatiserte beslutninger må kunne etterprøves
- Ved modellbytte: Logg hvilken versjon som ga hver prediction
**Implementering:**
```python
# Custom scoring script med versjon-logging
import json
import logging
from datetime import datetime
def init():
global model, model_version
model = mlflow.pyfunc.load_model(model_path)
model_version = os.getenv("MODEL_VERSION", "unknown")
def run(raw_data):
data = json.loads(raw_data)
predictions = model.predict(data["input"])
# Logg hver prediction med modellversjon
for i, pred in enumerate(predictions):
logging.info(json.dumps({
"timestamp": datetime.utcnow().isoformat(),
"model_version": model_version,
"deployment_name": os.getenv("DEPLOYMENT_NAME"),
"input_hash": hashlib.sha256(str(data["input"][i]).encode()).hexdigest(),
"prediction": float(pred),
"user_id": data.get("user_id", [None])[i]
}))
return predictions.tolist()
```
**Log Analytics query for å finne alle predictions fra en deployment:**
```kql
AppTraces
| where TimeGenerated > ago(7d)
| extend LogData = parse_json(Message)
| where LogData.deployment_name == "green"
| project TimeGenerated, LogData.model_version, LogData.prediction, LogData.user_id
| summarize PredictionCount = count() by model_version
```
---
### 3. Risikovurdering (ROS-analyse)
**Trussel: Feil i ny modellversjon gir feilaktige beslutninger**
| Sannsynlighet | Konsekvens | Risiko | Tiltak |
|---------------|------------|--------|--------|
| Middels (3/5) | Høy (4/5) | 12 (Rød) | - Progressive rollout med 48t bake time<br>- Shadow deployment før live<br>- Automated rollback ved error rate > 0.1%<br>- Manual approval gate før 100% rollout |
**Implementering av tiltak:**
1. **Automated rollback** via Azure Monitor alert + Logic App
2. **Manual approval** via Azure DevOps environment protection
3. **Shadow deployment** i 48 timer (dekker helg + hverdag)
---
### 4. Kostnader for Progressive Rollout
**Scenario:** Blue-green deployment i 1 uke rollout-periode
| Fase | Blue Instances | Green Instances | Varighet | Cost (NOK/mnd)* |
|------|---------------|----------------|----------|-----------------|
| Shadow (mirror 10%) | 2x DS3_v2 | 2x DS3_v2 | 2 dager | ~520 NOK |
| Live 10% | 2x DS3_v2 | 2x DS3_v2 | 3 dager | ~780 NOK |
| Live 50% | 2x DS3_v2 | 2x DS3_v2 | 2 dager | ~520 NOK |
| Live 100% (cleanup) | 0 | 2x DS3_v2 | - | 0 NOK (baseline) |
**Total ekstra kostnad:** ~1 820 NOK for 1 ukes rollout (dobbelt kapasitet i 7 dager).
**Optimalisering:**
- Bruk **autoscaling** på green deployment (start med 1 instance, skaler ved behov)
- **Scheduled scaling**: Reducer instances utenfor kontortid (hvis batch-scoring)
*Basert på DS3_v2 = ~2 600 NOK/mnd (per instance)
---
## Kostnad og lisensiering
### 1. Compute-kostnader
**Managed Online Endpoints (Pay-as-you-go):**
| VM Type | vCPU | RAM | Cost (NOK/time)* | Anbefalt for |
|---------|------|-----|------------------|--------------|
| Standard_DS2_v2 | 2 | 7 GB | ~1,10 | Dev/test, små modeller |
| Standard_DS3_v2 | 4 | 14 GB | ~2,20 | Produksjon (medium load) |
| Standard_DS4_v2 | 8 | 28 GB | ~4,40 | Produksjon (høy load) |
| Standard_NC6s_v3 (GPU) | 6 | 112 GB | ~25,00 | Deep learning inferencing |
**Blue-green deployment cost multiplier:**
- Under rollout: **2x compute cost** (begge deployments kjører)
- Varighet: 1-2 uker (avhengig av bake times)
- **Total overhead:** ~5-10% av årlig compute-kostnad
**Eksempel:**
- Baseline produksjon: 2x DS3_v2 (24/7) = ~5 200 NOK/mnd
- Med 4 rollouts per år (1 uke each): 5 200 + (1 820 × 4/12) = ~5 807 NOK/mnd
- **Overhead: ~12%**
*Priser er estimat per jan 2026, Norway East region.
---
### 2. Bandwidth og Storage
**Endpoint bandwidth quota:**
- Default: **5 MBps per endpoint**
- Shadow deployment: Teller mot bandwidth (derfor 50% max mirror traffic)
- Overskridelse: Throttling (HTTP 429 errors)
**Kostnad ved throttling:**
- Ikke direkte kostnad, men **reduced throughput**
- Løsning: Øk quota (support ticket) eller optimaliser payload size
**Model registry storage:**
- Gratis for første 10 GB
- Deretter: ~0,50 NOK/GB/mnd
- Ved mange modellversjoner: Implementer retention policy (slett gamle versjoner)
---
### 3. Lisensiering
**Azure Machine Learning workspace:**
- Gratis (betaler kun for underliggende compute/storage)
- Alle deployment-features (blue-green, mirroring, A/B) inkludert
**MLflow:**
- Open source, gratis
- Azure ML har innebygd MLflow tracking (ingen ekstra kostnad)
**Azure DevOps:**
- **Gratis tier:** 1 hosted pipeline (Microsoft-hosted agent)
- **Basic plan:** ~50 NOK/bruker/mnd + pipeline minutes
- Deployment-pipelines krever parallel jobs (ekstra cost hvis mange pipelines)
---
## For arkitekten (Cosmo)
### 1. Checklist før du velger deployment strategy
**Spørsmål å stille stakeholders:**
1. **Hva er maksimal akseptabel downtime?**
- 0 minutter → Blue-Green eller Canary
- <30 minutter → In-place deployment med rolling update
2. **Hvor kritisk er modellen for business?**
- Kritisk (påvirker revenue/compliance) → Shadow først, deretter gradvis rollout
- Medium → Blue-Green med 10% → 100%
- Lav → Direct deployment med basic smoke test
3. **Har du stateful components (database)?**
- Ja → Implementer backward-compatible migrations først
- Nei → Enklere rollback-strategi
4. **Trenger dere sammenligne modellversjoner for metrics?**
- Ja → A/B testing (50/50 eller annen split)
- Nei → Blue-Green
5. **Hva er budget for ekstra compute under rollout?**
- Begrenset → Canary (én node om gangen)
- Fleksibelt → Blue-Green (full parallell kapasitet)
6. **Hvor lang tid har dere for å rulle ut?**
- 1-2 dager → Aggressiv rollout (10% → 100% raskt)
- 1-2 uker → Konservativ (shadow + bake times)
---
### 2. Anti-patterns (hva du IKKE skal gjøre)
**❌ Direct swap uten testing:**
```python
# IKKE GJØR DETTE!
endpoint.traffic = {"blue": 0, "green": 100} # 0% → 100% instant
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
**Problem:** Ingen validering, ingen rollback-mulighet, høy blast radius.
**✅ Gjør dette isteden:**
```python
# Shadow først
endpoint.mirror_traffic = {"green": 10}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
time.sleep(3600 * 24) # 24 timer bake time
# Så gradvis live
endpoint.mirror_traffic = {"green": 0}
endpoint.traffic = {"blue": 90, "green": 10}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
```
---
**❌ Ingen health metrics monitoring:**
- Deploye ny versjon uten å sjekke error rates, latency, throughput
**✅ Implementer automated health checks:**
```python
def check_deployment_health(deployment_name, threshold_error_rate=0.01):
"""Sjekk health metrics for deployment."""
response = metrics_client.query_resource(
resource_uri=f".../{deployment_name}",
metric_names=["RequestLatency", "RequestsPerSecond", "RequestsFailed"],
timespan=timedelta(hours=1)
)
error_rate = response.metrics["RequestsFailed"].average / response.metrics["RequestsPerSecond"].average
if error_rate > threshold_error_rate:
raise Exception(f"Error rate {error_rate:.2%} exceeds threshold {threshold_error_rate:.2%}")
return True
```
---
**❌ Slett blue deployment for tidlig:**
- Fjerne blue deployment rett etter 100% green rollout
**✅ Behold blue i minst 1 uke:**
```python
# Vent 1 uke etter 100% rollout før cleanup
endpoint.traffic = {"blue": 0, "green": 100}
ml_client.online_endpoints.begin_create_or_update(endpoint).result()
# Sett reminder: Cleanup blue deployment etter 2026-02-11
```
**Rasjonale:** Hvis kritisk bug oppdages etter 3 dager, kan du raskt rulle tilbake til blue uten redeployment.
---
### 3. Rollback-playbook
**Scenario: Green deployment viser økt error rate under 50% rollout**
**Steg:**
1. **Immediate action (< 5 min):**
```bash
# Bytt tilbake til 100% blue
az ml online-endpoint update --name prod-endpoint \
--traffic "blue=100 green=0"
```
2. **Verifiser rollback (< 10 min):**
```bash
# Sjekk at error rate går ned
az monitor app-insights query \
--app my-app-insights \
--analytics-query "requests | where timestamp > ago(5m) | summarize ErrorRate = countif(success == false) / count()"
```
3. **Incident postmortem (< 24 timer):**
- Hva var root cause? (sjekk logs: `az ml online-deployment get-logs --name green`)
- Hvorfor fanget vi ikke dette i shadow phase?
- Oppdater deployment checklist med ny validering
4. **Fix og redeploy (< 1 uke):**
- Fix bug i kode/modell
- Re-run training/testing
- Start ny rollout fra steg 1 (shadow deployment)
---
### 4. Conversation starters med kunden
**Når kunden sier: "Vi vil bare deploye den nye modellen nå."**
**Cosmo:** "Jeg forstår at dere er klare for produksjon. La meg stille noen raske spørsmål for å sikre en trygg deployment:
1. Hvis den nye modellen viser seg å ha feil i produksjon, hvor raskt må vi kunne rulle tilbake? 5 minutter? 1 time? 1 dag?
2. Har dere monitoring satt opp for å oppdage feil? Hvilke metrics ser dere på error rate, latency, modell-drift?
3. Er det OK å kjøre begge modellversjonene parallelt i 1-2 uker (dvs. dobbel infrastrukturkostnad)? Eller må vi optimalisere for kostnad?
Basert på svarene kan vi velge rett strategi f.eks. blue-green med gradvis rollout hvis dere trenger rask rollback, eller canary hvis kostnadsoptimalisering er prioritet."
---
**Når kunden sier: "Vi har ikke tid til langsom rollout, vi må ha 100% i produksjon i morgen."**
**Cosmo:** "Jeg skjønner at time-to-market er kritisk. La oss se på risiko vs. hastighet:
**Rask rollout (1-2 dager):**
- Deploy green med 0% traffic i kveld
- Test isolert i natt (automated smoke tests)
- 50% traffic i morgen tidlig (kl 09:00)
- 100% traffic samme dag (kl 15:00) hvis ingen kritiske feil
- **Risiko:** Hvis feil oppdages kl 16:00, har 50% av brukere fått dårlig service hele dagen
**Balansert rollout (3-4 dager):**
- Shadow deployment i 24 timer (validere mot real traffic)
- 10% live traffic dag 2
- 50% live traffic dag 3
- 100% live traffic dag 4
- **Risiko:** Redusert blast radius (maks 10% brukere påvirket hvis feil)
Hva er konsekvensen hvis 50% av brukere får feil predictions i ett døgn? Hvis det er akseptabelt, kan vi kjøre rask rollout. Hvis ikke, anbefaler jeg balansert."
---
### 5. Teknisk deep-dive: Hvordan traffic routing fungerer
**Under panseret på Azure ML Online Endpoints:**
```
Client Request (HTTP POST)
Azure Front Door (global load balancer)
Endpoint (prod-endpoint.norwayeast.inference.ml.azure.com)
Traffic Routing Logic:
- Hvis HTTP header "azureml-model-deployment: green" → Route til green
- Ellers: Bruk traffic percentage (f.eks. 90% blue, 10% green)
Deployment (blue eller green)
Scoring Container (Docker image med model + scoring script)
Return Prediction
```
**Mirror traffic flow:**
```
Client Request
Endpoint
├─→ Primary Deployment (blue) → Return Response til client
└─→ Shadow Deployment (green) → Logg metrics, IKKE return response
```
**Viktig implementasjonsdetalje:**
- Traffic routing skjer **før** request når deployment container
- Mirror traffic er **async** (non-blocking for primary deployment)
- Hvis shadow deployment crasher, påvirker det **ikke** client response
---
## Kilder og verifisering
Denne kunnskapsreferansen er basert på følgende Microsoft Learn-artikler og code samples (verifisert 2026-02-04):
**Primære kilder:**
1. [Perform safe rollout of new deployments for real-time inference](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-safely-rollout-online-endpoints?view=azureml-api-2)
→ Komplett guide til blue-green deployment og traffic mirroring (Verified MCP 2026-04)
2. [MLOps model management with Azure Machine Learning](https://learn.microsoft.com/en-us/azure/machine-learning/concept-model-management-and-deployment?view=azureml-api-2)
→ Oversikt over deployment capabilities og controlled rollout
3. [Online endpoint deployment for real-time inferencing](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints-online?view=azureml-api-2)
→ Konsepter: endpoints vs. deployments, traffic routing, mirroring
4. [Tutorial: Use a canary deployment strategy for Kubernetes](https://learn.microsoft.com/en-us/azure/devops/pipelines/ecosystems/kubernetes/canary-demo?view=azure-devops)
→ Canary deployment med Azure DevOps Pipelines
5. [Progressive rollout of MLflow models to Online Endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/how-to-deploy-mlflow-models-online-progressive?view=azureml-api-2)
→ MLflow-spesifikk progressive rollout; supports model packaging (--with-package) for endpoints without egress connectivity (Verified MCP 2026-04)
**Code samples:**
- [azureml-examples/sdk/python/endpoints/online/managed/online-endpoints-safe-rollout.ipynb](https://github.com/Azure/azureml-examples/blob/main/sdk/python/endpoints/online/managed/online-endpoints-safe-rollout.ipynb)
- [azureml-examples/cli/endpoints/online/managed/sample/](https://github.com/Azure/azureml-examples/tree/main/cli/endpoints/online/managed/sample)
**Well-Architected Framework:**
- [Architecture strategies for safe deployment practices](https://learn.microsoft.com/en-us/azure/well-architected/operational-excellence/safe-deployments)
→ Progressive exposure model, bake times, rollback strategies (Verified MCP 2026-04 — adds safe decommissioning guidance + AI opportunity note for GenAI-assisted rollout tuning)
**Pricing (sist verifisert: 2026-02-04):**
- [Azure Machine Learning pricing](https://azure.microsoft.com/en-us/pricing/details/machine-learning/)
→ Compute costs for managed endpoints
**MCP-kall utført:** 8 (microsoft_docs_search × 5, microsoft_docs_fetch × 2, microsoft_code_sample_search × 1)
---
**Sist oppdatert:** 2026-04-10
**Neste review:** 2026-07-10 (eller ved større endringer i Azure ML deployment capabilities)
### Safe Rollout / Blue-Green Deployment (Azure Well-Architected 2026)
Azure ML managed online endpoints support blue-green (safe rollout) deployments natively:
```bash
# Deploy green deployment with 0% traffic initially
az ml online-deployment create --name green --endpoint my-endpoint --traffic-allocation 0
# Test green deployment in isolation (direct routing)
az ml online-endpoint invoke --name my-endpoint --deployment-name green
# Mirror 10% of live traffic to green for shadow testing
# Then progressively shift: 10% → 50% → 100%
az ml online-endpoint update --name my-endpoint --traffic blue=90 green=10
```
**Azure Well-Architected SDP principles (OE:11)**:
- **Progressive exposure**: Canary → Blue-Green → Deployment Stamps
- **Health models**: Pass health checks before each rollout phase
- **Bake time**: Hours/days between phases (not minutes) to capture time-zone usage patterns
- **Failure detection**: Automatic halt + investigation when health signals degrade
- **Recovery options**: Roll back (revert), roll forward (hotfix), or redeploy last known good
**Azure facilitation**:
- `Azure Pipelines` + `GitHub Actions` support multi-stage deployments with approval gates
- `Azure App Configuration` for feature flag management
- `Azure Load Balancers` for traffic routing and health monitoring
- Point-in-time restore available for Azure SQL, Cosmos DB, MySQL, PostgreSQL
**Emergency SDP**: Prescriptive protocols for hotfix acceleration — approval stage and bake time reduction — with explicit approval criteria.
**Safe decommissioning (new in 2026-04)**: Removing components is highest-risk. Steps: validate inactivity → preserve state (backup/export) → disable before deleting → monitor watch window covering full usage cycle → clean up residual references. Skip disable only if compliance requires immediate removal.
**AI opportunity**: AI can assist rollout tuning — analyze deployment docs, code reviews, incident history to suggest rollout strategies and parameters (low/medium GenAI approach). Advanced agentic solutions can auto-update rollout configurations.