Alle afleveringen
S04E11 - Trends in MLOps - Deel 3 - Ops
S04E11

Trends in MLOps - Deel 3 - Ops

Seizoen 4 24 min Hosts: Joop Snijder & Niels Naglé
0:00

Wat leer je in deze aflevering?

Dit is het derde en laatste deel van een technische serie over MLOps-trends, gebaseerd op sessies van Q-CON San Francisco 2022. In deze aflevering staat het operations-aspect centraal, met focus op incidentanalyse en betrouwbaarheidstesten voor machine learning systemen in productie.

01
Verder kijken dan root cause analysis Bij incidenten moet je niet alleen zoeken naar wat fout ging, maar vooral begrijpen waarom het op dat moment een logisch besluit leek. Niemand maakt expres fouten; externe druk en shortcuts spelen vaak een rol.
02
Voorbeelden van grote outages Salesforce lag 5 uur wereldwijd plat door een DNS-wijziging, Atlassian had 14 dagen outage doordat iemand per ongeluk site-ID's in plaats van web-ID's verwijderde. Beide incidenten tonen hoe kleine beslissingen catastrofaal kunnen uitpakken.
03
Lean documentatie met Architecture Decision Records Gebruik eenvoudige Markdown-documenten met besluit, achtergrond en gevolgen. Check deze in via source control voor versiebeheer en review via pull requests.
04
Verschil tussen procedures en praktijk Er is altijd een kloof tussen hoe werk is opgeschreven en hoe het daadwerkelijk wordt uitgevoerd. Accepteer dat niet alles in procedures te vatten is en dat enige chaos onvermijdelijk is.

Kernbegrippen

Incident analysis
Onderzoek naar incidenten waarbij je niet alleen oorzaken achterhaal, maar ook begrijpt waarom beslissingen logisch leken.
Architecture Decision Records
Markdown-documenten waarin technische besluiten, achtergrond en gevolgen worden vastgelegd en versiebeheerd.
Chaos testing
Opzettelijk introduceren van fouten in productiesystemen om betrouwbaarheid en foutafhandeling te valideren.
Root cause analysis
Traditionele methode om de directe oorzaak van een incident op te sporen zonder context van besluitvorming.

Interview: Willem Meints

Willem Meints
Willem Meints Chief AI Architect bij Aigency Bekijk gastprofiel →

Willem, we zijn aangekomen bij het derde en laatste deel over MLOps. Kun je jezelf even voorstellen aan de luisteraar?

Zeker. Ik ben Willem Meints. Ik werk als Chief AI Architect voor Aigency, onderdeel van Info Support. Daarnaast ben ik ook actief als Chapter Lead Data & AI voor de Business Unit Finance binnen Info Support. In deze rol help ik teams bij het opzetten van machine learning oplossingen die niet alleen werken, maar ook schaalbaar en beheersbaar zijn in productie.

Je was bij een sessie op Q-CON San Francisco die ging over het begrijpen van beslissingen achteraf. Wat was daar het centrale thema?

Ja, ik heb een hele interessante sessie bijgewoond die "How Did It Make Sense At That Time" heette, oftewel HDMI SATT. Het ging vooral over die laatste vraag: hoe heeft het op dat moment zin gemaakt? Het bijzondere was dat deze sessie niet specifiek over machine learning ging, maar de lessen zijn zeker toepasbaar op ons vakgebied. De kern was: als er iets fout gaat in je systeem, dan heeft dat meestal te maken met een beslissing die iemand op een bepaald moment heeft genomen. En op dat moment leek die beslissing volkomen logisch. De spreker benadrukte dat niemand 's ochtends uit bed stapt met de gedachte "zo, ik ga vandaag de boel eens lekker kapot maken". Toch gaan dingen regelmatig mis, soms op spectaculaire wijze. Hij gaf twee voorbeelden van grote bedrijven waar dingen echt fout zijn gegaan.

Wat waren die voorbeelden waar het zo mis ging?

Het eerste voorbeeld was van Salesforce. Iemand had daar iets met de DNS-configuratie veranderd, en dat werd vervolgens wereldwijd uitgerold. Het resultaat? Salesforce was vijf uur lang volledig offline, wereldwijd. Dat is natuurlijk enorm pijnlijk voor zo'n groot bedrijf. Maar het kan nog erger. Het tweede voorbeeld was van Atlassian, en dat was echt heftig. Daar was iemand bezig met het opruimen van test-omgevingen. Hij had een lijst gekregen van 883 ID's die verwijderd moesten worden. Hij had de procedure gevolgd, vijftien ID's gepakt, alles getest in acceptatie, alles volgens het boekje gedaan. Maar toen hij de rest van die lijst verwerkte, bleek dat het geen test-ID's waren maar daadwerkelijke site-ID's van klanten. Hij gooide dus per ongeluk een groot aantal klant-sites weg. De meesten waren niet meer terug te halen. Het resultaat? Veertien dagen outage. Dat is echt catastrofaal.

Hoe wordt er normaal gesproken naar zulke incidenten gekeken, en wat was het alternatief dat deze spreker voorstelde?

Normaal gesproken wordt er een root cause analysis gedaan, maar vaak wordt het zelfs een blame game: wie is de schuldige? Bij beide incidenten waren de analyses openbaar gemaakt. In die van Salesforce stond bijvoorbeeld dat iemand zich niet aan de policies had gehouden. Maar de spreker stelde de cruciale vraag: waarom leek het voor diegene op dat moment een goed idee? Hij gebruikte een hele herkenbare analogie. Hij zei: "Ik loop ook regelmatig door het rood. Mag niet, maar we doen het toch." En hoe meer haast je hebt, hoe vaker je het doet. Want bijna altijd gaat door rood lopen goed. Je kijkt naar links, naar rechts, nog een keer naar links, en je denkt: er komt niks aan, het is veilig om over te steken. Datzelfde geldt voor shortcuts in je dagelijks werk. Als je iets vaker hebt gedaan en het ging altijd goed, dan ben je geneigd om het weer te doen. En hoe drukker je bent, hoe meer risico's je neemt. Misschien had bij dat DNS-incident een belangrijke manager wel gezegd: "Pas die DNS even aan, ik heb straks een cruciale demo en ik kom er niet doorheen." Dan denk je: ik heb links gekeken, rechts gekeken, ik heb veel druk, dit kan vast wel even. Maar dat soort context staat niet in die publieke rapporten.

Dus je moet eigenlijk verder kijken dan alleen de technische root cause?

Precies. Het gaat erom dat je blijft doorvragen: waarom leek het op dat moment een goed idee? Dit geldt ook heel direct voor machine learning in productie. Als je problemen tegenkomt, moet je niet alleen naar de root cause kijken, maar ook naar de context waarin beslissingen zijn genomen. Wat was de druk? Wat waren de beperkingen? Wat leek logisch op dat moment? De spreker had nog een mooi statement, in het Engels: "Complex systems are intrinsically hazardous." Complexe systemen zijn van nature gevaarlijk. En hier komt het: je kan nog zoveel preventie doen, de catastrofe ligt altijd op de loer. Het is altijd net om de hoek. Je kunt nooit alles voorkomen, hoe goed je ook je best doet.

Wat is dan de oplossing? Hoe kunnen we leren van beslissingen die in het verleden zijn genomen?

Om dit soort situaties beter te begrijpen en er misschien wel van te voorkomen, is het belangrijk om documentatie te hebben voor jezelf, voor je toekomstige zelf. Je wilt documenteren waarom op dat moment dingen een goed idee leken. Dat brengt ons bij architectuurbesluitdocumentatie, wat eigenlijk een soort documentatie voor je toekomstige zelf is.

Hoe documenteer je dit dan concreet? Wat gebruik je daarvoor?

Een van de technieken die we veel gebruiken binnen Info Support zijn Architecture Decision Records, of ADR's. Het zijn hele eenvoudige documenten. Daarin staat: we hebben dit besluit genomen, dit was de achtergrond van het besluit, en dit zijn de gevolgen van het besluit. Omdat het zo eenvoudig is, gebruik je het ook echt. Het zijn geen Word-documenten, maar gewoon Markdown-bestanden. Markdown is een eenvoudige opmaaktaal waarbij je met simpele symbolen voor de tekst kunt aangeven: dit is een groot kopje, een middelgroot kopje, een opsomming, enzovoort. Maar het blijft gewoon platte tekst, helemaal niet fancy. We hebben ook geen fancy portalen of zo, dat is allemaal niet nodig.

Schrijf je dan hele verhalen in die documenten?

Nee, zeker niet. Het is heel kort en bondig. Geen proza. Vanmorgen was ik bijvoorbeeld bezig met het opzetten van een platformarchitectuur voor machine learning. Dat stond ook in Markdown en dat kon ik gewoon omzetten naar een mooi leesbaar document. Het was heel kort: dit zijn de besluiten, dit is het plaatje wat erbij hoort. Lean en mean, maar wel super duidelijk.

Welke tools gebruik je om die plaatjes te maken?

Ik gebruik Markdown voor de beschrijving, en die kun je in de meeste tools zoals GitHub, Azure DevOps of GitLab gewoon gebruiken. Die zetten het automatisch om naar HTML, zodat je het netjes kunt lezen. En omdat het Markdown is, heb je ook automatisch version control. Dat is niet iedereen misschien gewend, maar het werkt fantastisch. Je kunt de verschillen tussen versies heel makkelijk checken. Ik kan ook tegen een ontwikkelaar zeggen: "Hé, we hebben dit besproken in de meeting, maak even een aanpassing en geef me een pull request." Dan kan ik het zelfs reviewen voordat het in mijn documentatie komt te staan. Voor afbeeldingen gebruik ik PlantUML. Dat is een taal waarmee je declaratief kunt aangeven: ik heb een systeem, ik heb een gebruiker, ik heb een netwerkverbinding, ik heb een relatie, ik heb een context. Die dingen kun je in elkaar stapelen en met PlantUML genereer je daar dan een plaatje van. Het plaatje sla ik ook op in source control omdat dat makkelijk is, maar dat is niet het belangrijkste. Die originele definitie in PlantUML, die is belangrijk voor me. Dat is de documentatie voor je toekomstige zelf.

Dus het idee is dat je vastlegt waarom op dit moment, at this time, dit een goed besluit was?

Exact. Als er na een jaar of twee dingen kapot gaan, dan kun je teruggaan in je documentatie. Dan denk je misschien: "Welke idioot heeft dit bedacht?" En dan ontdek je: "Oh, die idioot was ik zelf." Maar dan zie je ook: "Oh, maar dat en dat en dat. Daarom heb ik het op die manier gedaan." Dat was inderdaad op dat moment de juiste keuze. En daar kun je dan van leren. Ik vond het een heel mooi idee: lean and mean documenteren, vooral geen blame game spelen, en verder gaan dan alleen een root cause analysis. Je vraagt je af: hoe komt het dat iemand tot dat besluit is gekomen om zo'n grove fout te maken? Want niemand komt 's ochtends uit bed met de gedachte: "Zo, ik ga eens even een grove fout maken waardoor alles veertien dagen uitvalt."

Er is toch ook een verschil tussen hoe werk op papier staat en hoe het in de praktijk wordt uitgevoerd?

Ja, dat was ook een belangrijk punt. Je kunt nog zoveel policies, guidelines, handleidingen en SOP's hebben. Maar er is een groot verschil tussen hoe het werk is opgeschreven en hoe het werk uiteindelijk wordt uitgevoerd. De spreker had daar een mooi plaatje bij van IKEA-meubels in elkaar zetten. Iedereen kent die handleidingen wel. In de praktijk zie je jezelf vaak denken: "Oh ja, ik had stap vier toch eigenlijk al gedaan," of "misschien pak ik hier eventjes een hamer bij." Je denkt: "Dat kan wel even zo." En halverwege kom je erachter: "Oh ja, maar nu zit iets toch een beetje scheef of andersom." En je houdt er krassen of groefjes aan over. Je kunt niet alles vangen in procedures. Dus accepteer een beetje chaos en ga ook weer terug naar waarom dingen gebeurd zijn. Dat vond ik een hele mooie insteek.

Je was ook bij een sessie over reliability testing. Wat hield die in?

Ja, ik was naar een sessie toegegaan van Vanguard, een Amerikaanse investeringsmaatschappij. Die hadden een sessie over chaos testing. Het idee is dat je expres fouten in een omgeving gaat introduceren. Je zet een server uit, of je maakt een netwerkverbinding kapot, of je gooit een database weg. En dan ga je kijken hoe je systeem reageert. De reden hiervoor is wat we eerder zeiden: je kunt nooit honderd procent weten wat er gaat gebeuren in productie. Je hebt het allemaal goed ontworpen, allemaal goed gedocumenteerd, oké, dat kan zo zijn. Maar het zou wel mooi zijn als je ook nog een paar testen kunt draaien op je infrastructuur om te controleren: wat gebeurt er als het fout gaat?

Is het dan de bedoeling dat het systeem zichzelf automatisch herstelt?

Nee, dat was niet haar verhaal. Zij zei: het gaat er juist om dat je je bewust wordt van wat de gevolgen zijn als het fout gaat. En ook of je het überhaupt kunt detecteren. Het hoeft niet automatisch up-and-running te blijven, als je maar verwacht dat het niet up-and-running is. Maar je moet het wel kunnen zien in je logging, bijvoorbeeld. Als je zo'n test gaat draaien, kun je van tevoren kijken welke signalen je dan al hebt. Tijdens de test kijk je welke signalen je uit dat systeem krijgt. En wat gebeurt er daarna? Komt het systeem bijvoorbeeld weer terug? Was dat de bedoeling dat het terugkwam? Of misschien was dat helemaal niet de bedoeling.

Waar kijk je dan precies naar in die testen?

In normale unit tests kijken we vooral naar: krijgen we het verwachte resultaat? Eén plus één wordt twee. Maar in dit geval kijk je naar: krijg ik uit mijn monitoring de juiste alerts terug? Krijg ik in de logfiles de juiste dingen terug? Kan ik dat ook bekijken? En je kijkt naar het juiste gedrag. Het kan zijn dat je verwacht dat iets na vijf minuten weer up komt. Dat zit ook in die flow, dat je dan vijf minuten wacht en checkt of bijvoorbeeld een database weer hersteld is waar je uit put met je machine learning model. En dan kan die verder.

Hoe zet je zo'n chaos test op? Is dat ook declaratief?

Ja, en dat was het mooie eraan. We hebben in deel één en deel twee allerlei declaratieve manieren gezien, en hier was ook een declaratieve aanpak. Ze maakten gebruik van Amazon AWS en gebruikten workflows om dat in elkaar te zetten. Je kunt dan blokken erin slepen die bepaalde standaardoperaties doen, standaardchecks en bijvoorbeeld die wachttijden. Dat hij vijf minuten gaat wachten totdat het systeem weer terug is. Dat zit er allemaal ingetekend. Het mooie daarvan is ook dat je het direct kunt documenteren en kunt laten zien aan anderen. Kijk, dit is hoe het gegaan is, het is gelukt of het is niet gelukt. Dat vond ik wel heel sterk aan haar verhaal.

Hoe verhoudt deze aanpak zich tot de Netflix Chaos Monkey? Dat is toch vergelijkbaar?

Het is wezenlijk anders. Chaos Monkey is willekeurig en die laat je los op je productieomgeving. Hopelijk is je systeem sterk genoeg om ertegen te kunnen. Deze benadering van Vanguard gaat niet op productie, maar op een staging-omgeving. En het is van tevoren uitgedacht. Ze legde niet heel precies uit hoe ze tot het ontwerp van die testen komen, maar wat wij in het verleden hebben gedaan is dat we een meeting hadden op ons team: The Wheel of Misfortune. Er werd van tevoren aan iemand van het team gevraagd: wil jij eens iets bedenken waarmee ons systeem kapot kan? Bijvoorbeeld het weggooien van de database. En dan gaan we met het team nadenken: wat gebeurt er dan allemaal volgens ons? Als je gaat nadenken over "stel, die database gaat kapot, wat gebeurt er dan allemaal?", dan kan je dat helpen om een ontwerp te maken voor zo'n chaos test.

Hoe werkt het concreet met die hypotheses?

Ze deden het hypothese-gebaseerd. Dit is de hypothese, die leggen ze vast, ook weer in YAML op een declaratieve manier. Dan gaat het systeem eronder werken. En dan kun je uiteindelijk checken of je hypothese uitkomt. Dus of je systeem weer up-and-running is, of dat je juist verwacht dat die dat niet is. Wat ik wel slim bedacht vond, is dat ze vooraf, voor het uitvoeren, toch een killswitch hadden. Want als er ergens een productieprobleem voorbijkomt en mensen willen ook door staging heen, dan willen die niet in de weg zitten met zo'n chaostest. Want je moet ook niet vergeten: het is niet gewoon even een korte test draaien. Zo'n chaostest kan echt enkele uren in beslag nemen als je een uitgebreid scenario hebt. Dan is die killswitch van wezenlijk belang om het goed te laten lopen.

Dus dit geeft weer inspiratie voor het ops-deel van MLOps?

Ja, absoluut. Het zorgt voor inspiratie hoe je hierover nadenkt op het gebied van het ops-deel van MLOps. Je kunt zo testen hoe robuust je machine learning pipeline is als er dingen misgaan. Wat gebeurt er als een model-server crasht? Wat als je feature store niet bereikbaar is? Dat zijn essentiële vragen voor machine learning in productie.

Nu komen we bij Ray, dat in bijna alle MLOps-sessies terugkwam. Kun je uitleggen wat Ray precies is?

Ray is een distributed runtime voor Python. Met die library kun je bestaande code over meerdere machines heen laten draaien. Waarom is dat handig? Nou, waar wij in machine learning vaak tegenaan lopen, is dat datasets niet meer passen in het geheugen van één computer. Dan is het fijn dat je kunt zeggen: ik knip die dataset in een aantal partities op, en ik laat meerdere machines daaraan rekenen. Er zijn meer tools die dit kunnen, maar het unieke aan Ray is dat je begint met een eenvoudig Python-programma, zonder speciale instructies. En als je merkt dat het niet meer past, dan kun je met speciale decorators aangeven: deze code moet je nu gaan uitschalen over meerdere machines. Je zet "@ray.remote" boven je functie, en dan is die functie remote geworden. Dan werkt dat heel mooi voor het uitschalen.

Doet Ray alleen task-distributie, of kan het meer?

Ray doet nog wel meer. Wat ik net noemde, dat noemen ze tasks. Die zijn stateless. Maar je kunt in Ray ook het actor pattern gebruiken. Dan verander je je code in een soort actor die van zichzelf weet in welke staat hij verkeert. Die wordt ergens op een machine gedraaid en er kunnen berichten naartoe gestuurd worden. Zo kun je zowel stateless programma's als stateful programma's draaien, wat je soms in machine learning echt wel nodig hebt. Het is een heel krachtig mechanisme en een heel simpel te gebruiken framework. Het werkt op je laptop, maar je kunt het ook naar de cloud brengen, naar duizend of tweeduizend nodes als je dat wilt, wat bedrijven als DoorDash ook zeker doen. Dat is een heel mooi framework, moet ik wel zeggen.

Maar hoe plaats je Ray in het operations-deel? Het klinkt meer als development. Wat is de operationele kant ervan?

Dat is een goede vraag. Kijk, wat je wel ziet is dat iedereen die grote systemen heeft gebouwd, ook in productie merkt: er is altijd wat aan de hand, er valt altijd wel wat om. Een van de dingen die Ray heel slim doet, is dat als een van zijn taken die ergens op een node draait omvalt, hij hem automatisch op een andere node opnieuw inplant, opnieuw schedule. Als je operations moet doen, is dat heel erg prettig. Die fault tolerance en de automatische recovery van de spullen, dat zit er allemaal ingebouwd, dus je krijgt dat gewoon cadeau. Dat is een enorm voordeel voor de operationele kant.

En hoe zit het met monitoring van Ray-jobs?

Wat ook heel erg opviel aan Ray, is de manier waarop je het kunt monitoren. Je kunt aan de buitenkant heel goed in de gaten houden: hoe ver is die eigenlijk met het uitvoeren van alle stappen? Want er is niks vervelenders dan dat je een job hebt van vijf uur en je vijf uur lang niks te zien krijgt. Dat wil je niet. Je wilt op al die individuele stappen kunnen monitoren, zodat je ook weet: wat duurt er nou precies te lang, of welk stuk gaat er precies mis? Dat soort vraagstukken kun je dan allemaal beantwoorden. Die monitoring zit er allemaal ingebouwd voor je. Je krijgt inzicht in resource-gebruik per task, je ziet waar bottlenecks zitten, je kunt precies zien welke nodes druk bezig zijn en welke idle zijn.

Dus Ray helpt eigenlijk met zowel de schaalbaarheid als de betrouwbaarheid van machine learning systemen in productie?

Precies. Het combineert schaalbaarheid met fault tolerance en observeerbaarheid. Dat zijn essentiële eigenschappen voor productiesystemen. Je kunt beginnen met simpele Python-code op je laptop, en als je systeem groeit kun je het geleidelijk uitschalen naar een cluster zonder je code fundamenteel te hoeven herschrijven. En doordat de monitoring en fault tolerance ingebakken zitten, kun je het ook daadwerkelijk betrouwbaar operationeel houden. Voor MLOps is dat essentieel. Je wilt niet dat je trainings-pipeline of je batch-inference job crasht omdat één machine uitvalt. Met Ray blijft je job gewoon doorlopen, en je krijgt inzicht in wat er gebeurt. Dat maakt het verschil tussen een systeem dat je constant moet babystten en een systeem dat robuust in productie draait.

Wat zijn de belangrijkste lessen uit deze hele serie over MLOps trends?

Als ik terugkijk op alle drie de delen, dan zie ik een duidelijk patroon. Ten eerste: declaratieve benaderingen winnen het van imperatieve code. Of het nu gaat om infrastructure as code, workflow-definities of chaos tests, overal zien we dat declaratieve aanpakken de voorkeur krijgen omdat ze beter te begrijpen, te onderhouden en te versie-controleren zijn. Ten tweede: documentatie is niet alleen voor anderen, maar vooral voor je toekomstige zelf. Architecture Decision Records en goede logging van waarom beslissingen zijn genomen, zijn essentieel. Niet om te blamen, maar om te leren en te begrijpen. Ten derde: chaos en falen zijn onvermijdelijk in complexe systemen. De kunst is niet om alle fouten te voorkomen, maar om te zorgen dat je systeem graceful kan omgaan met fouten, dat je ze kunt detecteren en dat je begrijpt wat er gebeurt als het misgaat. Vandaar het belang van chaos testing. En tot slot: tooling zoals Ray die schaalbaarheid, fault tolerance en observeerbaarheid combineert, wordt steeds belangrijker. Machine learning systemen worden groter en complexer, en we hebben tooling nodig die ons helpt om die complexiteit beheersbaar te houden zonder dat we alles vanaf nul moeten bouwen. Al deze trends samen laten zien dat MLOps volwassener wordt. We leren van de lessen uit traditionele software operations, maar passen die aan voor de specifieke uitdagingen van machine learning. Het gaat niet meer alleen om het trainen van modellen, maar om het bouwen van complete, betrouwbare systemen die waarde blijven leveren in productie. Kernpunten en Praktische Adviezen Documenteer beslissingen voor je toekomstige zelf: Gebruik Architecture Decision Records (ADR's) in Markdown om vast te leggen waarom je bepaalde keuzes hebt gemaakt. Focus op de context en waarom het op dat moment logisch leek. Ga verder dan blame games: Bij incidenten moet je niet alleen naar de root cause kijken, maar ook begrijpen waarom iemand dacht dat een bepaalde actie een goed idee was. Begrijp de druk en context waarin beslissingen werden genomen. Gebruik declaratieve tools waar mogelijk: Of het nu gaat om PlantUML voor diagrammen, YAML voor configuraties of workflows voor chaos tests - declaratieve benaderingen zijn beter te begrijpen en te onderhouden dan imperatieve code. Implementeer chaos testing: Test niet alleen of je systeem werkt wanneer alles goed gaat, maar vooral wat er gebeurt als dingen fout gaan. Doe dit hypothese-gebaseerd op staging-omgevingen met een killswitch. Accepteer dat chaos onvermijdelijk is: Complexe systemen zijn intrinsiek gevaarlijk. Je kunt niet alle fouten voorkomen, maar je kunt wel zorgen dat je systeem robuust is en dat je fouten kunt detecteren en begrijpen. Monitor op het juiste niveau: Bij lange-lopende jobs wil je niet vijf uur wachten op een resultaat. Zorg dat je op individuele stappen kunt monitoren om te zien wat lang duurt of waar het misgaat. Kies voor schaalbaarheid met fault tolerance: Ray biedt een unieke combinatie van eenvoud (begint met normale Python-code), schaalbaarheid (van laptop tot duizenden nodes) en ingebouwde fault tolerance. Ideaal voor machine learning workloads. Gebruik version control voor documentatie: Door je documentatie in Markdown in Git te zetten, kun je verschillen tracken, pull requests reviewen en heb je automatisch een geschiedenis van je beslissingen. Test je monitoring: Het is niet genoeg dat je systeem blijft draaien - je moet ook kunnen zien of het blijft draaien en de juiste alerts krijgen als het niet zo is. Begrijp het verschil tussen werk zoals opgeschreven en werk zoals uitgevoerd: Procedures en policies zijn belangrijk, maar in de praktijk neemt iedereen wel eens shortcuts. Houd daar rekening mee in je ontwerp en documentatie. AIToday Live is een podcast die zich richt op de nieuwste ontwikkelingen in AI en de impact ervan op verschillende sectoren. In elke aflevering spreken hosts Niels Naglé en Joop Snijder met experts uit het veld om inzicht te krijgen in de mogelijkheden en uitdagingen van AI-technologie. Luister via je favoriete podcast app: Spotify, Apple podcasts, YouTube Music, en meer.

Over de gast

Willem Meints
Willem Meints
Chief AI Architect bij Aigency

Willem Mijns is Chief AI Architect en Chapter Lead Data & AI. In deze aflevering bespreekt hij de operationele aspecten van MLOps, met een focus op documentatie en het belang van het begrijpen van beslissingen in het ontwikkelingsproces. Hij benadrukt het nut van chaos testing en het gebruik van Ray voor schaalbaarheid en fouttolerantie in machine learning omgevingen.

Bekijk gastprofiel

Transcript

Je luistert naar het derde en laatste deel van de driedelige serie over trends in MLOps. Mijn naam is Joke Snijder, CTO bij Agency. In deze aflevering staat het operations deel van MLOps centraal. Voordat we beginnen wil ik opmerken dat deze aflevering wel technischer is dan je van ons gewend bent, maar blijf vooral luisteren en laat weten of je vaker een technische afleggen in mijn lijst. Veel plezier. Zo, we zijn toegekomen aan deel 3 van onze speciale reeks Q-CON San Francisco 2022. We hebben het over MLops, de trends in MLops. MLops, een set van tools en best practices om van het ontwerp van je machine learning tot aan productie te komen. En hoe hou houd je de machine learning modellen ook waardevol in productie en hoe beheers je die. Vandaag het laatste deel, het opsige deel, samen met Willem Mijns. Willem, wil jij je eerst even voorstellen aan de luisteraar? Zeker. Ik ben Willem Mijns. Ik werk als Chief AI Architect voor Agency, onderdeel van InfoSupport. Daarnaast ben ik ook actief als Chapter Lead Data & AI voor de Business Unit Finance binnen InfoSupport. Ja, we hebben veel gezien, veel gehoord en we vinden ook best wel een hele hoop over een aantal dingen. Dus laten we het op z'n deeltes eventjes behandelen. Zal ik even starten? Ja, ik denk dat het goed is, ja. Ja, want ik heb een sessie gehad en die sessie heette eigenlijk, die noemden ze HDMI SATT. Zo had 'ie het ook te heten erover. Wat een tennis. Ja, want dan was het natuurlijk een afkorting en dat was 'How did it make sense at that time?' En vooral dat laatste vond hij heel erg belangrijk. Dat gaat erover, en het is niet machine learning specifiek, maar denk ik ook heel goed toepasbaar voor machine learning, is wat als er nou iets fout is gegaan? Ja, dat heeft te maken gehad met dat er ergens op een moment iemand gedacht heeft om iets te ontwerpen, iets te doen, Wat op dat moment heel logisch leek, op dat moment. O, ja. Snap je? Niemand, zei hij ook, stapt 's ochtends uit bed van 'zo, ik ga dit boel dus even helemaal kapot maken'. En er waren twee voorbeelden van hoe stuk iets kan gaan, wat hij pakte. De eerste was van Salesforce. Iemand had daar iets met de DNS'en veranderd. En dat werd even globaal, werd dat... Ja, globaal, echt wereldwijd zeg maar, uitgerold. En Salesforce was 14... Nee, ik moet zeggen, 5 uur wereldwijd offline. Auw. Ja, pijn hè. Kan nog erger. Atlassian. Ik ben even kwijt wat daar fout was gegaan, maakt het niet zo heel veel uit. Het probleem was 14 dagen een outage. Oh ja, dat is helemaal heel verkeerd. Oh ja, nee, dat was een mooie ja. Wat daar gebeurde, nu weet ik het weer, is dat iemand die... Er waren heel veel sites, Adlessing sites opgespint. En wat hij gedaan had, is dat hij... Dan krijg je web-ids. had 883 ID's lijst gekregen en dat moest allemaal weggegooid worden. Maar het probleem en er zaten 15 diegenen had 15 ID's gepakt, getest, alles, alle procedures gevolgd in acceptatie, alles goed en vervolgens zat over de rest van die 883 maar dat bleken site-id's te zijn. Dus hij gooide gewoon heel veel sites gewoon weg. Dat lijkt me vrij pijnlijk. Dat was heel pijnlijk. De meesten waren ook niet meer terug te halen. Dus de vraag was bij beide, wat is er nou fout gegaan? Wat hij zei is, van er wordt heel vaak een root cause analysis gedaan. Nog erger vaak wordt het een blame game van wie is de schuldige. Maar die root cause analysis waren ook allemaal openbaar. Ja en dan stonden daar dingen in zoals bij die DNS behandeling van iemand had zich niet aan de aan de policies gehouden en er was nog een reden. Maar hij zei van ja maar er is niet, er staat nergens in van waarom leek het voor diegene op dat moment een goed idee. Ja het is eigenlijk niet zozeer de hood calls maar meer wat is eraan vooraf gegaan nog zelfs. Ja en hij zei als voorbeeld van als jij Hij zei, ik loop ook regelmatig door het rood. Zegt hij, mag niet. Doen we toch. Doen we toch. En hoe meer haast je hebt. Want bijna altijd door het rood lopen gaat goed. Want je kijkt eerst naar links, je kijkt naar rechts, je kijkt nog een keer naar links. Je denkt, niks komt eraan. Het kan. Het is veilig om over te steken. Datzelfde geldt natuurlijk ook voor de shortcuts die je neemt in je dagelijks werk. Dat je denkt, oh dat heb ik vaker gedaan. Maar ook hoe drukker je bent, dus als je haast hebt op straat, ben je geneigd om meer risico's te nemen. Dat je denkt, nou, ik steek even snel over. En misschien ren je ook wat harder de straat over. Dat had hij als analogie. En dat zou bij zo iemand best gebeurd kunnen zijn. We weten het niet, want dat staat niet in die publieke rapporten. Wat nou als het een goed idee bleek omdat er bijvoorbeeld een hele belangrijke manager heeft gezegd "Pas die DNS even aan want ik heb straks een hele belangrijke demo en ik kom er even niet doorheen." En je denkt, nou ik heb links gekeken, rechts gekeken, hoe heel veel druk, ik denk dat dat best even kan. Ja precies. Dus het ging er echt heel erg om van dat je door blijft denken van waarom bleek het op dat moment een goed idee. Dus ook als je zo direct in productie met je machine learning problemen tegenkomt en je moet nagaan denken van wat is nou het probleem. Dus niet je root cause analysis ook maar nog verder van waarom leek het op dat moment een goed idee. En omdat dat nou ja tegen tegengaan kan niet. Dat je kan nog zo goed, ik pak even het statement erbij. In het Engels was het complex systems are Heel veel mensen zijn op de hoogte van hun verliezenheid, maar de catastrofe is altijd net rond de hoek. Het ligt altijd op de loer. Hoeveel je ook aan preventie hebt gedaan, er kan altijd wat gebeuren. Nou, dan ga je terug. Maar om dat misschien wel te voorkomen, is het wel handig om in ieder geval een vorm van documentatie te hebben voor jezelf, voor je future self, dat je op zijn minst documenteert waarom op dat moment dingen een goed idee lijken. Dus architectuurbesluiten. Daar weet jij denk ik alles van. Ja, ik doe zelf nog steeds veel met softwarearchitectuur natuurlijk. En sowieso als AI architect ben je eigenlijk een softwarearchitect die dan specifiek voor AI projecten bezig is. Kijk, een van de dingen die ik zelf heel belangrijk vind is aan de ene kant, ik wil graag documentatie die mensen gebruiken. zodat als we willen weten waarom die keuze was gemaakt, waarom het een goed idee was, dat we dat altijd kunnen terughalen en dat dat makkelijk is te vinden. En aan de andere kant, ja, je wilt toch een soort geschiedenis vastleggen. Dus een van de technieken die we veel gebruiken binnen InfoSupport ook, is Architecture Decision Records. Het zijn hele eenvoudige documentjes eigenlijk. Daar staat in, we hebben dit besluit genomen, dit was de achtergrond van het besluit, en dit zijn de gevolgen van het besluit. En omdat dat heel eenvoudig is... Zijn dat Word documenten? Nee, Markdown. Gewoon platte tekst. Wij gebruiken Markdown, dat is een taal eigenlijk die... waarbij je met eenvoudige symbolen voor de tekst kan aangeven. Dit is een groot kopje, middelgroot kopje, klein kopje, opsomming en dat soort dingen. Maar het is gewoon platte tekst. Dus het is helemaal niet zo fancy. We hebben ook geen hele fancy portalen of zo, dat is allemaal niet nodig. En je schrijft ook geen proza, hè? Nee, zeker niet. Het is heel kort. Ik zag jou vanochtend, was je bezig met het opzetten van een platformarchitectuur voor machine learning. Dat stond ook in Markdown en dat kon je gewoon omzetten. Wat gebruikte je daarvoor? Want dat zag er heel mooi uit. Dus je had heel kort beschreven van dit zijn de besluiten, dit is het plaatje wat erbij hoort. Dat is eigenlijk lean en mean, maar wel super duidelijk. Ja, dus ik gebruik zelf, er zijn een aantal dingen die ik gebruik. Ik gebruik Markdown voor de beschrijving. En die kun je in de meeste tools, als je bijvoorbeeld GitHub of als je DevOps of GitLab gebruikt, die zetten hem automatisch onder HTML, zodat je het netjes kan lezen. En door de Markdown heb je ook version control en dat soort zaken, hè? Ja, ik check het in in source control. Dat is niet iedereen misschien gewend, maar dat werkt fantastisch. En je kan de verschillen dus dan heel makkelijk checken. Ik kan ook zeggen tegen een ontwikkelaar, "Hé, we hebben dit besproken in de meeting, maak even een aanpassing en geef me een pull request." Dan kan ik het reviewen zelfs voordat het in mijn documentatie komt te staan. Dus dat is de reden dat ik dat gebruik. Als je dat thema doortrekt, van "Ik wil het gefashioneerd hebben", afbeeldingen maak ik niet als plaatjes. Maar ik gebruik dat plant.uml voor. En dat is een taal, daar kan ik declaratief aan geven. Ik heb een systeem. Ik heb een user. Ik heb een netwerkverbinding. Ik heb een relatie. Ik heb een context. En die dingen die kun je in elkaar stapelen en je kun je met behulp van Plain2ML kun je dan een plaatje daarvan genereren. Het plaatje sla ik ook op in source control, want dat is makkelijk. Maar dat is echt niet belangrijk. Dat diagram, die originele definitie, die is belangrijk voor me. En dat is de documentatie voor je future zelf, dat je vast hebt gelegd, dit zijn de keuzes. Op dit moment, at this moment, at this time, is dat hoe ik erover denk, waarom het een goed besluit is. Dus dat betekent als we straks iets, na een jaar, twee jaar, dingen kapot gaan, waarvan misschien dan dat je echt denkt van, hoe heb ik dat bedacht? Ja, hoe dan? Weet je? Welke idioot, dat je teruggaat, maar ja, die idioot was ik zelf. "Oh, maar dat dat en dan en dat." En dat was inderdaad op dat moment, was dat, ja, daarom heb ik dat gedaan. Dat je, en daar kan je dan van leren. Dus ik vond dat wel een heel mooi idee. Dus lean and mean documenteren, maar vooral eigenlijk is geen blame game. En nog verder dan je root cause analysis van, ja, Hoe komt het nou dat iemand tot dat besluit is gekomen om tussen aanhalingstekens zo'n grove fout te maken? Want niemand komt uit bed 's ochtends van zo ik ga eens even een grove fout maken waarbij 14 dagen even alles eruit ligt. Ja toch? Echt een mooi idee. En wat hij ook nog aangaf is van er is ook een heel groot verschil. Want je kan nog zoveel policies, guidelines, handleidingen, werk SOW's hebben. Of SOW's, SOP's hebben. Maar er is een heel verschil tussen hoe het werk is opgeschreven en hoe het werk uiteindelijk uit wordt gevoerd. Het mooiste vond ik een plaatje van het werk hoe het is beschreven. heb je de kast binnen je in elkaar zetten. Iedereen kent dat wel, de beschrijvingen van IKEA. En dat je misschien jezelf op een gegeven moment ziet van, oh ja ik had toch eigenlijk stap 4 even gedaan en misschien pak ik hier eventjes een hamer erbij. Je denkt altijd van, oh ja ik kan dat wel even zo, dat je de halve weg achterkomt van, oh ja maar nou zit toch iets een beetje scheef andersom. Je houdt er pas groefjes over. - Ik houd er pas groefjes over, dat. Dus dat vond ik wel een mooie, weet je, van je kan niet alles vatten in procedures, dus ga ook weer terug. Dus dat vond ik heel erg leuk. Accepteer een beetje chaos, toch wel. Ja, ja. Hé, jij was ook nog naar een sessie geweest over eigenlijk reliability testen, hè? Wat we ook heel, ik bedoel, dat is een algemeen iets, maar kunnen we ook heel goed gebruiken bij de machine learning. Ja, ik was naar die sessie toe gegaan, van ik ben toch wel eens benieuwd. Vanguard, een Amerikaanse investeringsmaatschappij, die had een sessie over chaos testing. Het idee dat je expres fouten in een omgeving gaat introduceren. Je gaat een server uitzetten, of een netwerkverbinding kapot maken, of een database weggooien. En dan ga je kijken hoe je systeem reageert. En dat doen ze met de als reden van, wat wij eerder zeiden, je kan nooit helemaal 100% weten wat er gaat gebeuren in productie. Je hebt het allemaal goed ontworpen, je hebt het allemaal goed gedocumenteerd, oké, dat kan zo zijn. Maar het zou wel mooi zijn als je ook nog een paar testen kan draaien op je infrastructuur om te controleren van, wat nou als het fout gaat? Wat gebeurt er dan? En dan niet zozeer dat het dan allemaal automagisch is, zelf weer moet herstellen ofzo. Dat was niet haar verhaal. Zij zei van het gaat er juist om dat je je bewust wordt als het fout gaat, wat zijn dan de gevolgen van die fout? Nou, en zij... - En kun je het ook detecteren, hè? Dus het is net zo, zei je inderdaad van het hoeft inderdaad niet up and running te blijven, als je ook verwacht dat het niet up and running is, maar dat je het bijvoorbeeld wel in je logging terug ziet ofzo. Ja, je kan als je zo'n test gaat draaien, kun je gewoon kijken Van tevoren, van wat voor signalen heb ik dan al. Je kan tijdens de test kijken welke signalen krijg je uit dat systeem. En wat gebeurt er daarna? Komt ie bijvoorbeeld weer terug? Was dat de bedoeling dat ie terugkwam? Misschien was dat wel helemaal niet de bedoeling dat ie weer terugkwam. Dat zit allemaal in die testen. Dus die testen die kijken, nou helemaal afsproken in testen in code, kijken we vooral naar, krijgen we het verwachte resultaat? 1+1 wordt het automatisch 2. Maar in dit geval kijk je naar, krijg ik uit mijn monitoring de juiste alerts terug? Krijg ik in de logfase de juiste dingen terug? Kan ik dat bekijken ook nog? En het juiste gedrag, want het kan wel zijn dat je verwacht dat iets bijvoorbeeld na 5 minuten weer up komt. Dat zat ook helemaal in die flow, dus dat je dan 5 minuten wacht, checkt of bijvoorbeeld een database weer hersteld is, waar je uit put, misschien met je machine learning. En dan kan die verder. En het mooie was, ook dat ging weer via een declinatieve manier om dat op te schrijven. We hebben in deel 1 en deel 2 allerlei declinatieve manieren gezien van aanpak. Hier zat ook een declinatieve aanpak. Ja, ze hadden hier een workflow. Ze maakten gebruik van Amazon AWS. En zij gebruikten workflows om dat in elkaar te zetten, dat ding. Je kan dan blokken erin slepen die bepaalde standaard operaties doen, standaardchecks en bijvoorbeeld die wachttijden ook, dat hij vijf minuten gaat wachten totdat hij weer terug is. Dat zit er allemaal ingetekend. En het mooie daarvan is ook, je kan het direct documenteren gewoon, je kan het vastleggen en laten zien aan anderen. Kijk, dit is hoe het gegaan is. Het is gelukt of het is niet gelukt. Dat vond ik wel heel sterk aan haar verhaal. Misschien dat de luisteraars ook de Netflix Chaos Monkey kennen. Die doet dat eigenlijk een soort van willekeurig. Die gaat zeg maar door je productiesysteem heen. En als een wilde aap trekt hij gewoon alles eruit. En dit was wel wezenlijk anders toch? Ja, dit was zeker wel anders. Chaos Monkey is willekeurig en die laat jouw productie los. En hopelijk is je systeem sterk genoeg om er tegen te kunnen tegen die aap. Dit gaat niet op productie, dit gaat op een staging omgeving. En dit is van tevoren uitgedacht. Ze heeft dat niet heel precies uitgelegd hoe ze tot het design van die testen komen. Een van de dingen die wij in het verleden hebben gedaan, is dat wij een meeting hadden op ons team, The Wheel of Misfortune. Er werd van tevoren een van het team gevraagd... ...wil jij eens iets bedenken waarmee ons systeem kapot kan? Bijvoorbeeld het database weggooien. Nou, wat gebeurt er dan allemaal volgens ons? En met zo'n meeting, als je gaat nadenken over van... ...oké, stel dit gaat kapot, die database. Wat gebeurt er dan allemaal? Dat kan jou helpen om een ontwerp te maken voor zo'n chaos test. Ze deden het eigenlijk hypothese gebaseerd. Ja, dit is de hypothese, die leggen we in, ook weer in YAML, leggen we dat vast. Op een declaratieve manier. Dan gaat het systeem eronder, die gaat werken. En dan kan je uiteindelijk checken of je hypothese uitkomt. Dus of uiteindelijk je systeem weer up-and-running is, of dat je juist verwacht dat die dat niet is. Dus dat was er wel heel mooi aan. En wat ik wel slim bedacht vond, is dat ze vooraf, voor het uitvoeren, dat ze toch een killswitch hadden. Dat ze van als anderen op staging, ja, er komt ergens een productieprobleem of weet ik veel wat voorbij en die willen ook even door staging heen. Ja, dat die niet in de weg zitten met zo'n, nou ja, ook zo'n chaosdeel. Ja, dat vond ik wel een hele goede set. Omdat je ook niet moet vergeten, het is niet gewoon even, ik draai even een hele korte test, zo'n chaostest kan echt enkele uren in beslag nemen Als je een uitgebreid scenario hebt, dan is die kill switch van wezenlijk belang om het goed te laten lopen. Ja. Maar ik vond het wel een heel knappe dag. Ja, was leuk. En zorgt ook wel weer voor inspiratie hoe je hierover nadenkt op het gebied van het opsdeel van MLOps. Ja. Nou, dan zijn we echt bij het laatste onderdeel van de laatste speciale aflevering van deze driedelige serie. en dat is dat we in bijna alle specifieke MLOps-sessies kwam steeds Ray terug. Ja, die komt steeds terug. Ik heb ons er ook al vaker over horen praten. In de vorige twee afleveringen is hij ook al voorbij gekomen. Het is een ding. Het is echt wel belangrijk geworden dat... Ja, heel veel grote spelers gebruikten Ray of de tooling die wij genoemd hebben hebben Ray optioneel eronder voor de schaalbaarheid. Dus misschien kun je even nog uitleggen van de mensen die misschien afleveringen hiervoor niet gehoord hebben. Wat is Ray? Ja, Ray is een distributed runtime voor Python. En met die library kun je bestaande code over meerdere machines heen laten draaien. En waarom is dat dan handig om dat te kunnen doen? Nou, waar wij in de machine learning vaak tegenaan lopen, dat datasets niet meer passen in het geheugen van één computer. En dan is het fijn dat je kan zeggen, ik knip die dataset in een aantal partities op, en ik laat meerdere machines daaraan rekenen. Dat kan al met heel veel tools, er zijn meer tools die dit doen, alleen het unieke aan Ray is dat je begint met een eenvoudig Python programma, zonder speciale instructies, en als je merkt dat het niet meer past, dan kun je met speciale declaraties, met decorators kun je aangeven, Deze code moet je nu gaan uitschalen over meerdere machines in. En dan zeg je, app start je ray.remote, zet je het boven je functie, en dan is die functie is remote geworden. Nou, dat werkt dan heel mooi voor het uitschalen. Ray doet nog wel meer. Ray die heeft namelijk, dit wat ik net noemde, dat noemen ze tasks. Die zijn stateless ook. Maar je kan in Ray ook het actor pattern gebruiken. Dan verander je je code in een soort acteur, die van zichzelf weet wat voor staat hij inverkeert. Die wordt ergens op een machine gedraaid en er kunnen berichten naartoe gestuurd worden. En dan kun je zowel stateless programma's als stateful programma's draaien. Wat je soms ook in machine learning echt wel nodig hebt. Dat is een heel krachtig mechanisme, een heel simpel te gebruiken framework, want het werkt op je laptop, maar je kan er ook pdcloud in, naar 1000, 2000 nodes als je dat wilt, wat ze bij bedrijven als DoorDash ook zeker doen. Dat is een heel mooi framework, moet ik wel zeggen. Ja, en hoe moet ik dit plaatsen in het operations deel? Want zeg maar zeggen van dat die gedistribueerd moet worden en dat soort zaken is dan misschien wat iets meer def. Wat is de operations deel hiervan? Nou ja, kijk, wat je wel ziet is dat iedereen die grote systemen heeft gebouwd, merkt ook wel in productie, er is altijd wat aan de hand. Er valt altijd wel wat om. Een van de dingen die Ray heel slim doet, is dat als een van zijn taken die ergens op het noden draait omvalt, dan schedule hij hem automatisch op een andere. Als je operations moet doen, is dat wel heel erg prettig dat hij dat doet. Die full tolerance en automatisch de recovery van de spullen, dat zit er allemaal in gebouwd, dus je krijgt dat gewoon niet terug. Daarnaast wat ook heel erg opviel aan Ray, is de manier waarop je het kan monitoren. Je kan aan de buitenkant heel goed in de gaten houden, hoe ver is die eigenlijk met uitvoeren van alle stappen. Want ja, er is niks vervelende dat als je een job hebt van vijf uur, dat je vijf uur lang niks te zien krijgt. Dat wil je niet. Je wilt op al die individuele stappen kunnen monitoren, zodat je ook weet van wat duurt er nou precies te lang of welke stuk gaat er precies mis. Dat soort vraagstukken kun je dan allemaal beantwoorden. Dus dat zit er allemaal in gebouwd voor je. - Mooi. Nou, ik denk dat we een en hoop gezien, hoop geleerd, hoop geïnspireerd ook zijn. Mocht je nou de vorige aflevering nog niet geluisterd hebben, dan beveel ik die wel aan. Dus we hebben net een deel ML, deel Dev en nu dan de Ops. Hiermee is deze speciale Q-con San Francisco 2022 trilogie is het bijna. Lord of the Rings, Lord of the VR is nu klaar. Dankjewel voor het luisteren. Zorg dat je ons volgt, dan mis je geen aflevering. Spotify, Apple Music, kan je dat aanzetten. En dan krijg je even een ping als er weer een nieuwe aflevering online staat. Dankjewel voor het luisteren. En Willem, jij dankjewel voor de drie delen. Hopelijk dat je weer eens een keer snel te gast bent in de podcast. Zeker.