Der gesamte Machine-Lear­ning (ML) Pro­zess zeich­net sich in vie­len Fäl­len durch eine außer­or­dent­lich hohe Kom­ple­xi­tät aus, wel­che sich haupt­säch­lich durch fol­gende Ursa­chen erklä­ren lässt:

  • Wach­sen­der Para­me­ter­um­fang: Mit immer leis­tungs­stär­ke­rer Hard- und Soft­ware wächst auch die Anzahl unter­schied­li­cher Para­me­ter, wel­che im ML Pro­zess berück­sich­tigt wer­den. Den Über­blick dar­über zu behal­ten, wel­che Para­me­ter­kom­bi­na­tio­nen wel­che Resul­tate lie­fern, kann bei gro­ßer Para­me­ter­zahl schnell zu einer Her­aus­for­de­rung werden.
  • Keine Stan­dar­di­sie­rung: Für die Gestalt eines ML Modells gibt es kaum bzw. gar keine Stan­dards. Dadurch wird es wesent­lich erschwert unter­schied­li­che Modelle von ande­ren Ent­wick­lern in den eige­nen Work­flows und Pro­jek­ten mit repro­du­zier­ba­ren Resul­ta­ten zu verwenden.
  • Eine enorme Viel­zahl an Tools und APIs: Im ML Umfeld haben sich für ver­schie­dene Pro­blem­stel­lun­gen, Pro­jekt­schritte und Lösungs­an­sätze die unter­schied­lichs­ten Tools eta­bliert. Diese erfor­dern für ihren Ein­satz unzäh­lige ver­schie­dene Appli­ka­tio­nen, Biblio­the­ken und Implementierungen.

Um der Kom­ple­xi­tät Herr zu wer­den, hat Dat­ab­ricks mit MLf­low ein Open-Source-Tool ent­wi­ckelt, wel­ches die Kom­ple­xi­tät im gesam­ten ML Lebens­zy­klus redu­zie­ren soll. Dabei glie­dert sich MLf­low in drei Kom­po­nen­ten, wel­che zwar dahin­ge­hend ent­wi­ckelt wor­den sind im Ver­bund zu arbei­ten, aber auch unab­hän­gig von­ein­an­der ver­wen­det wer­den können:

  • Track­ing
  • Pro­jects
  • Models

In die­sem Blog­bei­trag wol­len wir die Kom­po­nen­ten von MLf­low näher beleuch­ten und die Funk­tio­nen beschrei­ben, sowie einige Anwen­dungs­fälle skizzieren.

Track­ing

Der Ein­fluss von unter­schied­li­chen Para­me­tern und etwa­igen wei­te­ren Umstän­den auf das Resul­tat eines ML Algo­rith­mus ist auf­grund der schie­ren Anzahl der zu berück­sich­ti­gen­den Fak­to­ren nur schwie­rig zu erfas­sen. Hier ver­schafft MLf­low Track­ing Abhilfe.

Mit Track­ing wird dazu eine API und ein UI bereit­ge­stellt, wel­che zum Log­ging von Para­me­tern, Code­ver­sio­nen, resul­tie­ren­den Metri­ken und ent­spre­chen­den Out­put Files sowie deren Visua­li­sie­rung genutzt wer­den kann. Dabei kann Track­ing in Python, REST, R API und JAVA API ver­wen­det wer­den, wobei der Ort der Code­aus­füh­rung, etwa in einem allein­ste­hen­den Pro­gramm, auf einer Maschine in der Cloud oder in einem inter­ak­ti­ven Work­book, keine Rolle spielt. Auf diese Weise ist ein gro­ßes Anwen­dungs­spek­trum gewährleistet.

Der Nut­zer kon­fi­gu­riert Track­ing basie­rend auf soge­nann­ten Runs, wobei ein Run die Aus­füh­rung eines Stü­ckes von Data Sci­ence Code, meist eine Trai­ning­si­te­ra­tion, dar­stellt. Für einen Run wer­den dann die Infor­ma­tio­nen zu Start- und End­zeit­punkt, Code­ver­sion, Para­me­tern, Metri­ken und Arte­fak­ten wie bei­spiels­weise Bild­da­teien oder Modell­in­for­ma­tio­nen in einem Log per­sis­tiert. Es kann dabei genau aus­ge­wählt wer­den, wel­che Werte tat­säch­lich in der Log­da­tei fest­ge­hal­ten wer­den sol­len und dar­über hin­aus, an wel­chem Ort diese abge­legt wer­den soll, zum Bei­spiel auf der loka­len Maschine, in S3, Azure, Google Cloud Sto­rage oder HDFS. Auf diese Weise las­sen sich die Para­me­ter­in­for­ma­tio­nen auch zen­tral auf einem Ser­ver able­gen und für diverse Nut­zer zugäng­lich speichern.

Die Aus­wahl der in den Log auf­zu­neh­men­den Infor­ma­tio­nen erfolgt bei­spiels­weise in der Python API sehr ein­fach über mlflow.log_param() oder mlflow.log_metric().

Mit der Track­ing UI kön­nen die Resul­tate dann sehr über­sicht­lich dar­ge­stellt wer­den, wie in den bei­gefüg­ten Abbil­dun­gen zu sehen ist. Dabei bie­tet die UI nicht nur eine tabel­la­ri­sche Über­sicht, son­dern auch ver­schie­dene Dar­stel­lun­gen mit Plots.

Machine Learning mit MLflow Bild1
Abbil­dung 1 Ver­glei­chende Über­sicht der Resul­tate von drei Runs
Machine Learning mit MLflow Bild2
Abbil­dung 2 Über­sicht der Runs

Pro­jects

Um eine Stan­dar­di­sie­rung des For­mats zum Pack­a­ging von Data Sci­ence Code zu erzie­len, kann MLf­low Pro­jects ver­wen­det wer­den. Dabei stellt jedes Pro­jekt schlicht ein Ver­zeich­nis oder ein Git-Repo­si­tory dar und nutzt gän­gige Kon­ven­tio­nen oder aber ein soge­nann­tes descrip­tor file, um seine Abhän­gig­kei­ten und wie der Code aus­ge­führt wer­den soll zu spe­zi­fi­zie­ren. Die Stan­dar­di­sie­rung soll es dabei ermög­li­chen, den Code auch in ande­ren Pro­jek­ten und Work­flows schnell und unkom­pli­ziert ein­set­zen zu kön­nen, ohne alle abhän­gi­gen Kom­po­nen­ten manu­ell zu konfigurieren.

Ein Pro­jekt kann im Detail die fol­gen­den Eigen­schaf­ten spe­zi­fi­zie­ren: einen Namen, Entry Points für das Pro­gramm (d.h. Anwei­sun­gen, wel­che zum Aus­füh­ren des Pro­gramms auf­ge­ru­fen wer­den kön­nen), sowie Umge­bungs­in­for­ma­tio­nen (d.h. Library Depen­den­cies in Form von Conda Umge­bun­gen, Docker Con­tai­ner Umge­bun­gen oder Sys­tem Umge­bun­gen). Das Aus­füh­ren eines erstell­ten Pro­jek­tes erfolgt sehr ein­fach über die Ver­wen­dung des mlf­low run Com­mands in der Kon­sole oder die Python API mit­tels mlflow.projects.run() und bie­tet somit die Mög­lich­keit, dass auch uner­fah­rene Nut­zer die Pro­jekte ein­fach aus­füh­ren können.

Ein Pro­jekt bie­tet dar­über hin­aus die Mög­lich­keit Arte­fakte aus MLf­low Track­ing auf­zu­grei­fen und als Ein­gabe zu ver­wen­den. Auf diese Weise kön­nen mehr­stu­fige Work­flows kon­stru­iert wer­den, in wel­chen der Out­put eines Pro­jek­tes mit­tels Track­ing in Form von Arte­fak­ten direkt an das nächste Pro­jekt wei­ter­ge­ge­ben wird.

Models

Für das Pack­a­ging und Deploy­ment von ML Model­len bie­tet MLf­low Models eine Stan­dar­di­sie­rung an, wel­che in einer Viel­zahl von Down­stream Tools ver­wen­det wer­den kann, bei­spiels­weise mit einer REST API in Apa­che Spark. Ein Model ist dabei ein Ver­zeich­nis, wel­ches diverse Dateien nebst einer MLmo­del-Datei ent­hält, wel­che die soge­nann­ten Fla­vors vor­gibt in wel­cher das ML Modell betrach­tet wer­den kann.

Diese Fla­vors sind die Schlüs­sel­kom­po­nente, wel­che die MLf­low Models aus­ma­chen, denn sie bil­den eine Kon­ven­tion, wel­che von Deploy­ment Tools genutzt wer­den kann, um das ML Modell zu ver­ste­hen, was die Ent­wick­lung von Tools erlaubt, wel­che mit ML Model­len aus belie­bi­gen ML Biblio­the­ken umge­hen kön­nen ohne die Not­wen­dig­keit, das Tool für jede ein­zelne Biblio­thek anzupassen.

Es ste­hen diverse Fla­vors zur Ver­fü­gung, etwa „Python func­tion“. Die Ver­wen­dung die­ses Fla­vors sorgt dafür, dass das ML Modell als Python Funk­tion beschrie­ben wird. Somit kann das Modell nun durch Tools ver­wen­det wer­den, wel­che das Modell ledig­lich auf­ru­fen müs­sen. Auch Biblio­the­ken kön­nen als Fla­vor ver­wen­det wer­den, etwa der „sci­kit-learn“ Fla­vor. Die­ser erlaubt es, ML Modelle als sci­kit-learn Pipe­line Objekt zu laden zur Ver­wen­dung in Tools, wel­che sci­kit-learn ver­ste­hen, oder als gene­ri­sche Python Funktion.

Anwen­dungs­fälle

  • Bei der Umset­zung der DSGVO sind Unter­neh­men gemäß Art. 15 dazu ver­pflich­tet, bei der Ver­wen­dung von Scoring Model­len dem Kun­den Aus­kunft über die ver­wen­de­ten Para­me­ter zu ertei­len. In die­sem Fall kann Track­ing auf einem Ser­ver ver­wen­det wer­den, um die ver­wen­de­ten Para­me­ter zur Erfül­lung der gesetz­li­chen Pflich­ten zu speichern.
  • Ein ein­zel­ner Data Sci­en­tist kann Track­ing auf sei­nem Rech­ner ver­wen­den, um einen Über­blick über seine Para­me­ter und deren Effekt zu behal­ten. Pro­jects kön­nen hilf­reich sein, um die ent­wor­fe­nen Modelle für die wei­tere Ver­wen­dung struk­tu­riert abzu­le­gen. Sol­len die Resul­tate deployt wer­den, um etwa von einem Data Engi­neer genutzt zu wer­den, kann dafür Models her­an­ge­zo­gen werden.
  • Ein Team von Data Sci­en­tists kann einen Track­ing Ser­ver ver­wen­den, um die Resul­tate bei ver­schie­de­nen Para­me­tern für alle Mit­glie­der stets ver­füg­bar zu hal­ten. Durch die Ver­wen­dung inter­ner Kon­ven­tio­nen kön­nen die ein­zel­nen Ent­wick­ler ihre Modelle nach per­sön­li­chen Prä­fe­ren­zen anpas­sen und letzt­lich mit Pro­jects und Models stan­dar­di­siert den übri­gen Team­mit­glie­dern zur Ver­fü­gung stellen.
  • In der For­schung und nicht-kom­mer­zi­el­len Ent­wick­lung kön­nen Resul­tate und Modelle via Git­Hub geteilt wer­den. Unter Ver­wen­dung der Pro­ject Funk­tio­na­li­tä­ten las­sen sich die Modelle dabei von jedem leicht ausführen.

Gene­rel­les

Die Instal­la­tion von MLf­low kann über pip vor­ge­nom­men wer­den und erfolgt daher unkom­pli­ziert. Zur Ver­wen­dung kann man die Doku­men­ta­tion des Pro­jek­tes zu Rate zie­hen, wel­che zudem mit einem Quick­start Guide und Tuto­ri­als zu den Funk­tio­na­li­tä­ten aufwartet.

Resü­mee

Bereits für kleine Pro­jekte kön­nen die Funk­tio­na­li­tä­ten, ins­be­son­dere Track­ing, inter­es­sant sein, um einen Über­blick über die Para­me­ter und deren Ein­fluss auf das Resul­tat zu behal­ten. Für grö­ßere Pro­jekte gewin­nen dar­über hin­aus die Funk­tio­na­li­tä­ten aus Pro­jects und Models an Inter­esse, da diese den Aus­tausch unter meh­re­ren Ent­wick­lern deut­lich ver­ein­fa­chen. Auf­grund der open-source Cha­rak­te­ris­tik des Pro­jek­tes ist MLf­low dar­über hin­aus für nicht-kom­mer­zi­elle und klei­nere Pro­jekte von beson­de­rem Interesse.

Die Ver­wen­dung der MLf­low Funk­tio­na­li­tä­ten gestal­tet sich vor­wie­gend ein­fach, wobei die gute Doku­men­ta­tion dabei sehr hilf­reich ist.

Beson­ders gut gefällt die über­sicht­li­che Dar­stel­lung der Aus­wir­kung unter­schied­li­cher Para­me­ter auf das Resul­tat des ML Modells durch MLf­low Tracking.