Azure DevOps CI/CD for AI-modeller | Steg-for-steg YAML-guide

22.06.2025

Vi vet at det kan føles både spennende og utfordrende å sette opp en CI/CD-pipeline for AI-modeller. Sammen tar vi steget fra idé til drift med en robust, Azure-integrert løsning – steg for steg. Automatisering gir trygghet, raskere leveranser og færre overraskelser underveis.

Refleksjon: Hva irriterer deg mest i dagens CI/CD-oppsett for AI-modeller?

1. Hvorfor CI/CD er helt nødvendig for AI-prosjekter

Manuell utrulling av AI-modeller gir ofte

  • uforutsigbare datakildeskift som knekker modellen
  • versjonskaos når hyperparametere og kode blandes
  • uoversiktlige modell-filer og navn
  • vanskeligheter med å gjenskape infrastruktur (GPU, Docker-images, Kubernetes)
  • skripter som sjelden testes for nøyaktighet, latency eller ressursbruk

Med en CI/CD-pipeline (MLOps) validerer vi hver commit automatisk, versjonerer modelldata entydig og deployer kontrollert uten manuell risiko. Vi er i dette sammen – hver feil er en læringsmulighet.

2. Azure DevOps i korte trekk

I Azure DevOps bruker vi hovedsakelig:

  • Azure Pipelines for multistage, YAML-definerte CI/CD-flyter

  • Agent-puljer (Microsoft-hosted og self-hosted GPU/CPU)

  • Environments med godkjenninger og audit-trail

  • Artefakter for modellfiler, Docker-images og rapporter

  • Integrerte tasks for Docker, Kubernetes, Azure CLI, Azure ML, DVC/MLflow

Alt som kode gir full oversikt fra bygg og test til deploy og overvåking.

3. Kodeeksempler: YAML-pipeline

trigger:

    branches:

        include:

          - main

# Trigger-pipeline ved hver commit til main (docs: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/triggers?view=azure-devops)

pool:

    vmImage: 'ubuntu-22.04'

# Standard Linux-agent. ubuntu-22.04 er eksplisitt og stabilt (docs: https://learn.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops)

steps:

        - task: UsePythonVersion@0

          displayName: 'Bruk Python 3.8'

          inputs:

            versionSpec: '3.8'

            architecture: 'x64'

            addToPath: true

# Velger og legger Python 3.8 til PATH fra verktøyscache (docs: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/use-python-version-v0?view=azure-pipelines)

        - script: |

            python -m pip install --upgrade pip setuptools wheel

            pip install -r requirements.txt

            pytest --maxfail=1 --disable-warnings -q

        displayName: 'Installer avhengigheter og kjør tester'

# Oppgraderer pip/verktøy, installerer dependencies og kjører tester

        - task: PublishPipelineArtifact@1

          displayName: 'Publiser pipeline-artifakter'

          inputs:

            targetPath: '$(Pipeline.Workspace)'

            artifact: 'drop'

            publishLocation: 'pipeline'

# Publiserer artefakter til Azure Pipelines for gjenbruk i CD (docs: https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/publish-pipeline-artifact-v1?view=azure-pipelines)

Vi inkluderer også

  • failover-tester for avhengige tjenester
  • sikkerhetsskanning med Trivy eller Snyk
  • ytelsestester med begrenset datasett


4. Eksempel på release-pipeline med staging og produksjon

stages:

   - stage: Staging

       jobs:

          - deployment: DeployStaging

              environment: 'staging'

              strategy:

                  runOnce:

                      deploy:

                          steps:

                              - download: current

                                  artifact: drop

                              - task: AzureCLI@2

                                  displayName: 'Registrer modell i Azure ML'

                                  inputs:

                                     azureSubscription: '$(AzureServiceConnection)'

                                     scriptType: bash

                                     scriptLocation: inlineScript

                                     inlineScript: |

                                         az extension add -n ml

                                         az ml model create \

                                             --name myModel \

                                             --version 1 \

                                             --path "$(Pipeline.Workspace)/model.pkl" \

                                              --resource-group "$(ResourceGroup)" \

                                              --workspace-name "$(WorkspaceName)"

- stage: Production

    dependsOn: Staging

    condition: succeeded()

    jobs:

       - deployment: DeployProd

           environment: 'production'

           strategy:

               runOnce:

                   deploy:

                       steps:

                          - download: current

                              artifact: drop

                          - task: AzureCLI@2

                             displayName: 'Opprett og oppdater online-endpoint'

                             inputs:

                                 azureSubscription: '$(AzureServiceConnection)'

                                 scriptType: bash

                                 scriptLocation: inlineScript

                                 inlineScript: |

                                     az extension add -n ml

                                     az ml online-endpoint create \

                                          --name myEndpoint \

                                          --resource-group "$(ResourceGroup)" \

                                          --workspace-name "$(WorkspaceName)" \

                                          --auth-mode aml_token

                                     az ml online-deployment create \

                                          --name blue \

                                          --endpoint-name myEndpoint \

                                          --model myModel:1 \

                                          --instance-type Standard_DS3_v2 \

                                          --instance-count 1

                                     az ml online-endpoint update \

                                          --name myEndpoint \

                                          --resource-group "$(ResourceGroup)" \

                                          --workspace-name "$(WorkspaceName)" \

                                          --traffic-split blue=100

5. Kostnads- og sikkerhetsaspekter

GPU-agenter

  • Auto-skalering: steng av idle GPU-agenter etter 30 minutter
  • Spot-instances: for eksperimentell trening med akseptabel risiko
  • Budsjettvarsler i Azure Cost Management

Service connections

6. Anbefalte testmetoder for robusthet

  • Enhetstester for kode og datatransformasjon
  • Integrasjonstester mot staging-miljø
  • Latency- og ressurs-tester for produksjonsmodell
  • Failover-tester ved avbrudd i eksterne tjenester
  • Sikkerhetstester (penetrasjonstesting, dependency scanning)

7. Modellovervåking og driftstesting

For å sikre kontinuerlig kvalitet i produksjon bør vi

  • detektere data-drift med Population Stability Index (PSI) eller Kolmogorov-Smirnov-test (KS-test)
  • konfigurere varsler i Application Insights eller Log Analytics ved PSI > 0,1
  • inkludere driftstesting som en del av pipeline (f.eks. retraining-trigger ved avvik)
  • samle telemetri for latency, feilrate og ressursbruk kontinuerlig

8. Case: kredittscoremodell i bank

Vi fulgte denne prosessen:

  1. Feature-branch: Data scientist pusher feature/credit-score
  2. CI kjører: lint → pytest → DVC pull → mini-train → artefakt
  3. Staging-CD: Docker build/push → AKS deploy → integrasjonstest → manuell godkjenning
  4. Prod-CD: 10/90 trafikk-splitting → full utrulling
  5. Overvåking: App Insights varsler ved PSI > 0,1
  6. Retraining: daglig pipeline kjører trening med ny data

9. Veien videre

  • GitOps for ML: deklarer pipelines og infrastruktur som kode
  • Serverless-inferens med Azure Functions for sporadiske spørringer
  • Feature Stores (Feast, Tecton) i trenings- og deploy-pipen
  • Explainable AI-verifisering i CI-steg for forklaringsstabilitet
  • Data-drift-triggered retraining med automatiske oppdateringer

Resultat: 25 % raskere utrulling og 40 % færre driftsavvik i første kvartal.

Start med denne malen, tilpass etter egne behov, og opplev hvor raskt dere kan flytte AI-modeller fra idé til pålitelig produksjon. Lykke til! 

*Forbehold om kode

Koden i denne guiden er levert som eksempler og utgangspunkt. Den er ikke testet mot alle tenkelige konfigurasjoner eller miljøer. Sørg derfor for å:

  • Validere og tilpasse alle YAML-filer og skript mot din egen Azure DevOps-instans, agent-pool, resource group, ACR, AKS-kluster og Azure ML-arbeidsområde

  • Kjøre fullstendige tester – enhet, integrasjon, ytelse og sikkerhet – i egne staging- eller test-miljøer før produksjonssetting

  • Gjennomføre grundig gjennomgang av service connections, rollebasert tilgang og godkjenningsregler i dine miljøer

Forfatteren påtar seg intet ansvar for uforutsette feil, tap av data, driftsavbrudd eller andre konsekvenser som måtte oppstå ved bruk av eksempelkoden. Leseren bruker den på egen risiko.

Les også