de en
Zurück

Online Magazine

GitHub Copilot für Machine Learning Engineering

Ein Tool, das Codeschnipsel automatisch vervollständigt – der Traum eines jeden Programmierers. GitHub Copilot macht genau das und hilft so z.B. beim Web Scraping. Aber kann es auch als KI-Paarprogrammierer fungieren? Wir haben das neue Trend-Tool getestet.


von Felix Kleine Bösing

Key Learnings

  • Copilot kann bei gängigen Aufgaben im Bereich des maschinellen Lernens Zeit sparen. Vor allem, wenn du etwas (für dich) Unbekanntes tust und normalerweise mindestens ein paar Trial and Error-Iterationen durchlaufen würdest.
  • Vertrauen ist gut, Kontrolle ist besser. Copilot ist nicht perfekt und kann es einem etwas zu einfach machen, sich darauf zu verlassen, nachdem es ein paar gute Vermutungen angestellt hat. Betrachte es – wie der Name schon sagt – als die Arbeit deines KI-Paarprogrammierers. Wenn du die Sprache oder das Ziel nicht kennst, wirst du sehr wahrscheinlich nicht in der Lage sein, Fehler zu erkennen. Bleib wachsam und überprüfe den Output.
  • Dies ist ein sich schnell entwickelnder Bereich, in dem regelmässig neue Funktionalitäten, Akteure und Fragen auftauchen. Vieles wird sich ändern, sobald Konkurrenten und Verbesserungen die Arena betreten.

Hintergrund

Viele Aspekte der Softwareentwicklung sind mühsam – repetitiv genug, um langweilig zu sein, aber immer noch zu komplex für einfaches Templating. Als GitHub Copilot im letzten Jahr aufkam, sah ich darin eine Möglichkeit, mich von den "weniger spassigen" Teilen der Entwicklung zu befreien. Wie es der Zufall wollte, hatte unser MLE Lead David Louis Hollembaek denselben Gedanken, und so beschlossen wir, Copilot anhand einiger Beispiele aus unserer Arbeit zu evaluieren und die Erfahrungen mit euch zu teilen.

Einleitung von David – Vor ein paar Jahren begann ich für ein persönliches Projekt mit Web Scraping zu experimentieren. Für Python gibt es grossartige Bibliotheken zum Sammeln von Webinhalten, und bs4 bietet komfortable Tools für die Arbeit mit HTML-Inhalten. Allerdings brauchte ich mehrere Stunden mit Trial and Error, um die Grundlagen der Extraktion von Werten aus Meta-Headern zu verstehen. Vor ein paar Monaten erhielt ich dann Zugang zur Copilot-Preview: Ich dachte sofort, dass mein Kampf mit den Meta-Kopfzeilen eine gute Anwendung wäre, um diese neue Funktion zu testen. Mein v.1-Notebook war ein einziges Chaos, und ich beschloss, so zu tun, als würde ich bei Null anfangen. Ich importierte bs4, forderte eine Seite an, und siehe da – Copilot schlug Blöcke vor, um die URLs abzurufen, die ich in einer bestehenden Liste hatte. bs4 zum Lesen von Metadaten? Kaum hatte ich den Namen des gesuchten Wertes eingetippt, schlug Copilot schon die ganze Zeile vor, die ich zuvor stundenlang durch Ausprobieren erstellt hatte. Langsam kam mir das Ganze ein wenig verrückt vor. Das Scraping von Webinhalten ist jedoch eine weit verbreitete Tätigkeit, und bs4 ist eine sehr beliebte Bibliothek mit vielen veröffentlichten Projekten, die sie verwenden. "Natürlich ist das Programm gut darin", dachte ich, aber was ist mit etwas Unbekannterem – inoffizielle Google-Search-Bibliotheken mit sehr wenigen Sternen auf PyPi vielleicht? Ich fügte den Import hinzu, und als ich eine neue Zeile begann, schlug Copilot den benötigten Code vor, um nach neuen Seiten zu suchen und mit der Ergebnisliste zu arbeiten.

Video 1: Web Scraping für Zigarrenläden in der Nähe

 

In weniger als einer Stunde hatte ich eine funktionierende Kopie meiner ursprünglichen Anwendung mit denselben Funktionen, die mich zuvor viele Stunden kosteten. Keine der Aufgaben war komplex, aber ich war trotzdem beeindruckt und fragte mich, wie weit das gehen könnte. Könnte Copilot spezialisierte Aufgaben übernehmen, wie die Aufgaben des maschinellen Lernens, die wir in unseren täglichen Arbeitsprojekten sehen? Das sind hochwertige Tätigkeiten, die von Spezialisten ausgeführt werden. Könnten ML-Engineers und Data Scientists in ähnlicher Weise von Copilot profitieren? Nach einer Diskussion in einer Teambesprechung stellte ich fest, dass Felix sich dieselben Fragen stellte, und so machten wir uns daran, herauszufinden, ob Copilot den Engineers in unserem Team bei Aufgaben des maschinellen Lernens jeglicher Art helfen könnte.

Auf der Grundlage unserer Erfahrungen werden wir im folgenden Abschnitt drei Beispiele beschreiben, welche die Fähigkeiten und Schwächen von Copilot aufzeigen.

MACHINE LEARNING IN ACTION

GitHub Copilot unterstützt Machine Learning Engineers beim Programmieren ihrer Lösungen. Mithilfe von Machine Learning können zum Beispiel Einzelhändler ihren Kundinnen und Kunden passende Produktempfehlungen abgeben – so auch der Schweizer Online-Markt LeShop.ch.

Wie das funktioniert und welche Vorteile das LeShop bringt? Erfahre es hier.

Bewertung anhand von Beispielen

EDA (Explorative Datenanalyse) und Modell-Prototyping
Github Copilot liebt verschachtelte Anweisungen. Stellen dir vor, du willst einen Datensatz analysieren und schnell ein Basismodell für einen Anwendungsfall entwickeln, um eine Art Grundlinie zu erhalten. EDA und Modell-Prototyping bestehen aus vielen einzelnen Anweisungen wie:

  • Datensatz importieren
  • Zeichnen einer Korrelations-Heatmap
  • Eine kategorische Variable hotencodieren
  • Aufteilung der Daten in Train und Test
  • Trainieren eines XGBoostClassifiers
  • Vorhersagen auswerten

Video 2: Explorative Datenanalyse und Modellentwicklung mit GitHub Copilot


Was ich hier gemacht habe, war nur eine schnelle Untersuchung. Dennoch war ich beeindruckt, wie gut Copilot in der Lage ist, Kommentare in Code zu übersetzen und meine Absichten vorherzusagen. Für das Skript habe ich drei Minuten gebraucht, während ich ohne Copilot diese Zeit allein für die Suche nach Heatmap-Visualisierungen benötigt hätte (Schande über mich, dass ich mich immer mehr auf Dashboard-Setups statt auf Python-Viz-Bibliotheken verlasse).

Eine weitere Sache, die mir auffiel, war die Empfehlung für Datenspalten. GPT-3 hatte offensichtlich einen sehr starken Fokus auf "Spalten" und den Datensatznamen "pima-indians-diabetes" und rief die erinnerten Spaltennamen korrekt ab. Solange es nur um Spaltennamen geht, aber was ist, wenn Copilot "versehentlich" Trainingsdaten neu erstellt? Der rechtliche Aspekt bezüglich des Urheberrechts ist immer noch fraglich und muss bei der Arbeit mit GitHub Copilot berücksichtigt werden.

Meta-Programmierung
In der Theorie ist die Meta-Programmierung die Generierung von Code mit Code auf der Grundlage von Daten. Sie ist unter anderem nützlich, um viel Boilerplate-Code zu vermeiden und ist durch ihre Dynamik auch hoch flexibel.
In diesem Beispiel (Abbildung 1) habe ich eine Basisklasse "Fruit" und Objekte, die von der Basisklasse erben und sich bei jedem Simulationslauf ändern können.

Abbildung 1: CLASS_NAMES enthält die Objekte, die erstellt werden müssen, während Fruit die Basisklasse ist (die im realen Use Case dynamisch war).


GitHub Copilot empfiehlt die einfache Klassendefinition für jedes Element in der Liste CLASS_NAMES. Das ist zwar einfach zu lesen (wie in Abbildung 2 zu sehen), hätte aber eine Menge unnötigen Code erzeugt.

Abbildung 2: Empfehlung von GitHub Copilot für die Erstellung von Klassen


Um dies zu vermeiden, können die Klassen mit dem in Abbildung 3 dargestellten Codeschnipsel dynamisch erstellt werden. Damit wird für jeden String in CLASS_NAMES eine Klasse erzeugt, die von der Klasse Fruit erbt.

Abbildung 3: Dynamische Klassengenerierung


Copilot verhält sich auch in anderen Fällen so, was bei dieser Art der Implementierung nur natürlich ist. Da Copilot immer die nächste(n) Zeile(n) empfiehlt, ist das Programm nicht in der Lage, die Logik auf magische Weise in eine andere Klasse oder Funktion zu trennen. Die Engineers müssen sich darüber im Klaren sein, wie sie ihren Code für ein sauberes Projekt strukturieren müssen. Wenn ich die Logik vorher abtrenne, wird Copilot dies erkennen und stattdessen die abgetrennte Funktion verwenden. Ein Sonderfall sind Dekoratoren, die Copilot in manchen Situationen zu verwirren scheinen. Dies könnte daran liegen, dass die Ausführung von Dekoratoren und die dekorierte Funktion nicht an die Zeilenfolge gebunden sind.

REST-Schnittstellen
Die Implementierung aller CRUD-Endpunkte in einer REST-Schnittstelle führt oft zu einer Menge an Boilerplate-Code. Copilot spart viel Zeit, indem es die bereits geschriebenen Endpunkte analysiert, um neue Endpunkte einfach durch eine kurze Beschreibung abzuleiten.

Video 3: Demo REST-API für einen Bildbeschriftungsdienst


Aufmerksamen Beobachtern und Beobachterinnen ist aufgefallen, dass Copilot bei 0:52 plötzlich die Path-Klasse aus dem pathlib-Paket benutzt, während es im ersten Endpunkt einen einfachen String verwendet hat. Ich habe Path während des zweiten Endpunkts importiert (da Copilot fälschlicherweise davon ausging, dass der Dateipfad vom Typ Path ist), was Copilot schnell übernommen hat.

Schliesslich gibt es noch einen weiteren wichtigen Aspekt, der zeigt, dass Copilot nicht an Best Practices gebunden ist, sondern nur so kompetent ist wie der oder die durchschnittliche GitHub-User oder -Userin. Statt unterschiedlicher Namen für die Endpunkte hätte man lieber "/image" für jeden Endpunkt verwenden sollen, aber diese mit der HTTP-Methode differenzieren.

DU WILLST DEINE MACHINE LEARNING-LÖSUNG IN DIE PRODUKTION BRINGEN?

Dann brauchst du eine Machine Learning-Plattform.
Was das ist und was dir eine solche Plattform nützt? Informiere dich hier.

Welche Plattform die richtige für dich ist?
Das findest du mithilfe eines Evaluation-Frameworks heraus: Lies dazu diesen Artikel.

Fazit

GitHub Copilot befindet sich seit einigen Monaten in der geschlossenen Beta-Phase und wird kontinuierlich verbessert. Es ist keineswegs perfekt und produziert von Zeit zu Zeit nicht funktionierenden Code, aber wenn man sich dessen bewusst ist und den generierten Code überprüft, sollte man in der Lage sein, seine Entwicklungseffizienz zu steigern.

Der rechtliche Aspekt ist zwar noch fraglich, da Copilot teilweise auch auf Code trainiert wurde, der nicht für die Verwendung durch Dritte gedacht war, aber wir sind zuversichtlich, dass dies in Zukunft geklärt werden wird.[1] [2]

In jüngster Zeit ist auch DeepMind mit seinem neuesten Modell "AlphaCode" in den Wettbewerb eingestiegen. Es ist also sehr wahrscheinlich, dass sich die Produkte zur Codevervollständigung in naher Zukunft stark verbessern werden.

Zusatzgedanken

Während des Schreibens dieses Artikels hatten wir die Gelegenheit, mit einigen anderen Anwendungen zu arbeiten, von denen wir denken, dass sie für die MLE-Crowd interessant sein könnten:

Arduino IoT Sketches
Wie bereits erwähnt, schlug Copilot einfache Strukturen schnell und präzise vor, aber wir lernten, ihm ein wenig zu sehr zu vertrauen, und mehrere grössere Vorschläge, die auf den ersten Blick gut aussahen, liessen sich nicht compilen. Das führte zu einer nervenaufreibenden C++-Fehlersuche. Wie in unseren Key Learnings am Anfang des Artikels erwähnt, ist Copilot kein Ersatz dafür, die Programmiersprache zu kennen, die man benutzt oder zu verstehen, wie die Struktur des eigenen Programms aussehen sollte.

Tensorflow Extended
Wir haben beobachtet, dass Copilot mehrere korrekte Vorschläge für gängige TFX-Workflows in den letzten Labor-Setups gemacht hat. Die meisten Vermutungen waren richtig, wobei die grösste Zeitersparnis die Vorschläge für Eingaben in komplexe Prozesse waren. Wie habe ich dieses Schema vor 20 Minuten genannt, als ich ein Beispiel für eine tf-Modellanalyse einrichtete? Copilot erinnerte sich und schien genau zu wissen, wie die anderen Eingaben für Funktionen mit begrenztem Kontext lauten sollten:

csv_to_tfrecord(exampleSchema, csv_file, tfrecord_file)

Nicht schlecht.

Deine Ansprechperson

MEHR TECH-THEMEN:

TechTalk
Data Analytics Machine Learning

7 Habits zur Verkürzung der Time-to-Value im Process Mining
TechTalk
KI im Business Data Analytics Machine Learning

Wie können Banken wirklich KI-getrieben werden?
TechTalk
KI-Ethik KI im Business

TechTalk Audio: Responsible AI & ChatGPT
Gelesen