Codebeez

Microsoft en Python Machine Learning, een modern liefdesverhaal, Deel 1

VSCode-devcontainers en de Python AzureML SDK

Microsoft maakt grote stappen in het veroveren van onze harten en het mengen met het open source-ecosysteem. Hetzelfde ecosysteem waar ze in de jaren ‘00 openlijk tegen werkten. Ik beken dat ik bezig ben geassimileerd te worden in de Microsoft-wereld en dat voelt goed. In deze blog beschrijf ik een ontwikkelworkflow om ML-modellen in de cloud te draaien (AzureML) en code te ontwikkelen in VSCode, waar dan ook. Ik geef redenen om te waarderen wat er gebeurt.

1 VSCode ML-devcontainer

Omdat ik vrij laat bij VSCode aankwam, overviel het me na mijn gebruikelijke periode van ontkenning. De remote development-functionaliteit die in Q2 2019 werd geïntroduceerd (vscode-dev-blog) gaf voor mij echt de doorslag. Er zijn hiervan drie smaken:

  1. Draai de VSCode-server binnen het Windows subsystem for Linux (WSL) en draai de client op het Windows-bureaublad
  2. Draai de VSCode-server binnen een Docker-container en draai de client op het Windows-bureaublad
  3. Draai de VSCode-server op een SSH-target en draai de client lokaal
    1. Je kunt binnen een docker-container op de SSH-target draaien (remote-ception)

Dit is zeer rijke functionaliteit die niet teleurstelt qua betrouwbaarheid. Laten we het van dichterbij bekijken.

1.1 VSCode en WSL2

Windows subsystem for Linux (WSL) bestaat al jaren. WSL2 verenigt het draaien van Linux-gebaseerde docker-containers en WSL Linux op dezelfde architectuur (docker-wsl2-backend). Belangrijk is dat het complexe virtualisatie uit de architectuur haalde en dat WSL Linux vrijwel native draait. VSCode kan werken aan code op het Windows-bestandssysteem en zijn server draaien op WSL; naadloos integrerend met Python-interpreters en shells.

In deze blog stellen we voor om de VSCode-server binnen een docker-container op de WSL2-backend te draaien, met de GUI draaiend op het Windows-bureaublad. WSL2 is de toekomst en heeft voordelen, zoals ondersteuning voor Windows Home (docker-windows-home), resource management en het potentieel voor GPU- en GIU-ondersteuning (WSL2-dev-blog). Wat we bespreken werkt ook op de historische Docker-backend.

vscode-in-devcontainer.png

1.2 VSCode binnen een AzureML-devcontainer

Microsoft levert goed onderhouden Dockerfiles met veelgebruikte ontwikkeltools voor taal- en taalonafhankelijke scenario’s (vscode-dev-containers). We kozen de azure-machine-learning-python-3 container (azureml-dev-container), vanwege de Conda Python-interpreter met het azureml-sdk package geïnstalleerd. De image is afgeleid van Ubuntu. Als we de ./.devcontainer-map in een van onze projecten opnemen, zal VSCode:

  1. de aanwezigheid van ”./.devcontainer” en de inhoud ervan detecteren
  2. een container bouwen uit de ”./.devcontainer/Dockerfile`
  3. de VSCode-server en optionele extensies installeren
  4. verbinden met de container die is geconfigureerd met ”./.devcontainer/devcontainer.json”.

De instellingen voor VSCode-containerintegratie worden opgeslagen in ./.devcontainer/devcontainer.json en maken het mogelijk om elke Dockerfile zonder aanpassing te integreren.

1.2.1 Aanpasbaar

We kunnen onze favoriete ontwikkeltools aan deze devcontainers toevoegen als extra lagen in de Dockerfile. Of we kunnen voortbouwen op een base image door “FROM” aan te roepen in onze eigen “Dockerfile”. Bijvoorbeeld door de Azure CLI met extensies en Terraform toe te voegen met “RUN”-commando’s. Een image met je favoriete ontwikkelomgeving kan een goede metgezel zijn. Optioneel kunnen we onze eigen image op één plek beheren en vanuit elk van onze projecten symbolische links ernaartoe voorzien.

1.2.2 Een VSCode Python AzureML-project opzetten

  1. Installeer docker desktop op windows
  2. Installeer git for windows
  3. Installeer VSCode en de “Remote – Containers”-extensie
  4. Ga naar een geschikte dev-map (hier “dev”) op het Windows-bestandssysteem
  5. git clone https://github.com/microsoft/vscode-dev-containers/tree/master/containers/azure-machine-learning-python-3
  6. symlink binnen een bestaand Python-project de .devcontainer in Powershell
    1. New-Item -ItemType Junction -Path “c:\dev\path\to\your\project.devcontainer” -Target “c:\dev\vscode-dev-containers\containers\azure-machine-learning-python-3.devcontainer”
  7. Start binnen de basismap van het project vscode met “code .”
  8. VSCode detecteert de “.devcontainer” en vraagt om opnieuw te openen in de container -> ja
  9. VSCode bouwt de container, installeert zijn server en opent opnieuw
  10. Bevestig je omgeving in de linkeronderhoek, een groen vierkant zegt “Dev Container: Azure Machine Learning”

1.3 Samenvatting VSCode-devcontainer

We kunnen ontwikkelen met volledig reproduceerbare Linux-toolchains en toch op een windows-laptop werken. Dit is voor een Linux- of MacOS-gebruiker waarschijnlijk niet overtuigend, maar als je je eenmaal vertrouwd voelt met deze tools, heb je ze vrijwel overal beschikbaar. Dit is waardevol als je werkt voor bedrijven die je de infrastructuur en een laptop verschaffen. Een ander scenario zou zijn het trainen van deep learning-modellen met GPU’s op je windows-gamingdesktop, aangezien GPU-ondersteuning voor WSL2 is aangekondigd (WSL2-dev-blog).

2 De Azureml Python SDK is chic

Een voorwaarde voor dit onderdeel is een actief Azure-abonnement. Je kunt eenvoudig een gratis azure-account met startkrediet krijgen als je over een creditcard beschikt.

VSCode draait nu binnen een devcontainer met Python en de AzureML Python SDK. De SDK bevat een uitgebreide API die de hele levenscyclus van een ML-model omspant. Van verkenning in notebooks, het trainen van het model en tracking tot artifactbeheer en deployment. Dit omvat het provisionen en configureren van de compute voor modeltraining en de deployment-targets voor model scoring. Pfoe.. Enkele van de tools (azure CLI) waar ik naar verwijs, heb ik in mijn eigen branches toegevoegd (my-fork).

In het onderstaande diagram staat wat we voor ogen hebben. We starten een experiment vanuit VSCode met de AzureML SDK binnen onze decontainer en via de SDK voert code uit op de compute target. Afhankelijk van de details van de omgeving draait de compute target zijn code ook binnen een docker-container. De specifieke details van de omgeving zijn iets wat we in Deel 2 van deze blog zullen bespreken.

vscode-in-devcontainer-execute-azureml.png

2.1 Registreer je container bij Azure

  1. Open een terminal in VSCode: menu Terminal -> New Terminal
  2. Voer “az login” uit op de shell. Ga naar www.microsoft.com/devicelogin en vul de secret in die in de console-output wordt gegeven
  3. We hebben onze omgeving nu gekoppeld aan een Azure-abonnement
  4. De accountinformatie wordt opgeslagen in ”~/.azure/azureProfile.json” binnen de container.

2.2 Laat ons de code zien!

Laten we kijken naar Python AzureML SDK-code om:

  1. Een AzureML Workspace te maken
  2. Een compute cluster als training target te maken
  3. Een Python-script op de compute target te draaien

2.2.1 Een AzureML workspace maken

Een AzureML workspace bestaat uit een storage account, een docker image registry en de eigenlijke workspace met een rijke UI op portal.azure.com. Een nieuwe, gerelateerde Machine Learning studio zit in open Beta en ziet er echt goed uit (https://ml.azure.com). De volgende code maakt de workspace en de benodigde services aan en koppelt ze aan een nieuwe resource group.

create_workspace.PNG

2.2.2 Een compute cluster maken

We hebben compute-resources nodig om ons ML-model te trainen. We kunnen de compute clusters maken en orkestreren met de AzureML Python SDK. De workspace om de resources in te maken wordt gedefinieerd door het config.json-bestand in de working directory (configure-workspace). We maken een compute cluster bestaande uit tussen de 0 en MAX_NODES virtuele machines (VM’s) die docker draaien. “AmlCompute” staat voor Azure Machine Learning Compute en is de configuratieklasse voor het cluster. We geven de provisioning-configuratie door aan de create-methode van de “ComputeTarget”-klasse, die een ComputeTarget-object teruggeeft. Dit object wordt gebruikt wanneer we berekeningen willen uitvoeren. Je kunt deze code als oefening inpakken om het verkrijgen van de compute_target reproduceerbaar te maken.

create_compute.PNG

2.2.3 Een Python-script op de compute target draaien

We willen een Python-script op ons compute cluster draaien. In deel 2 van deze serie gaan we in op het configureren van de remote Environment, waarbij Docker en Conda betrokken zijn (amlcompute-docs). Hier slaan we de meeste details over zonder de code te breken.

run_script.PNG

2.3 Samenvatting AzureML SDK

We hebben gezien hoe eenvoudig het is om een Azure ML-service te maken, gevolgd door het opspinnen van het compute cluster en het draaien van een Python-script daarop in de context van een getrackt experiment binnen de ML studio. Deel 2 van deze blogserie zal de AzureML Python run Environment (azureml-environment-docs) in detail bespreken. Vervolgblogs gaan van training tot deployment met de AzureML SDK.

3 Afronding

Microsoft gaat all-in op Machine Learning en Python en dat is te merken. Voor onze workflow hebben we Docker/WSL2 aan de mix toegevoegd. Vanuit het perspectief van een developer is het belangrijk dat alle onderdelen betrouwbaar samenwerken zodat er daadwerkelijk werk verzet kan worden. Ik ben onder de indruk van de kwaliteit van de diverse onderdelen van het ecosysteem: Docker/WSL2, VSCode en AzureML en hun integratie in een workflow. Natuurlijk zijn er onderweg enkele valkuilen, en daarmee sluiten we deel 1 van deze serie af.

3.1 Enkele valkuilen van Docker en WSL2 op Windows 10:

  • Het mappen van bestandsrechten tussen het Linux- en Windows-bestandssysteem is vreemd (wsl-chmod-dev-blog)
    • Bind mounts vallen onder root:root
  • Crontab-gebruikers moeten mogelijk de windows Task Scheduler aanraken (wsl-scheduling)
  • GPU-ondersteuning is onderweg maar nog niet beschikbaar (2020)
  • Linux GUI-applicaties staan op de roadmap maar zijn er nog niet (2021)
Blog