Machine Learning with Databricks on Azure

Einführung

Machine Learning ist äußerst wichtig, wenn es darum geht, den vollen Nutzen aus Daten zu ziehen. Fortgeschrittene Machine Learning Algorithmen können dafür verwendet werden, eine große Vielfalt von Informationen aus Daten unterschiedlichster Quellen zu extrahieren. Allerdings ist der Prozess der Datenerfassung, -umwandlung und des Trainings von Modellen sehr aufwendig und langwierig. Dementsprechend ist es ein vollständiger Machine-Learning-Lebenszyklus ein beeindruckendes Konstrukt, insbesondere dann, wenn dafür eine einzige Plattform verwendet werden kann, die jeden Schritt dieses Lebenszyklus auf einmal abbilden kann. Bei dieser Plattform handelt es sich um Databricks.

Databricks ist eine Cloud-Umgebung in der Data Engineers (Dateningenieure), Data Scientists (Datenwissenschaftler) und Data Analysts (Datenanalysten) gemeinsam arbeiten können. Sie kann mit verschiedenen Cloud-Anbietern, wie Azure oder AWS verwendet werden. Die Data Engineers arbeiten hauptsächlich mit Spark, die Data Scientists mit MLFlow und Python und die Data Analysts mir SQL. Somit erschließt sich, dass die Mittel vorhanden sind, um ganze Lebenszyklen von Datenanalysen in Databricks abzubilden, allerdings kann es hierbei zu einer Schwierigkeit kommen. Die Rechenleistung wird in Databricks von sogenannten Clustern zur Verfügung gestellt. Diese Cluster benötigen etwa drei bis fünf Minuten, um zu starten und können bei einem dauerhaften Betrieb (24/7 hochgefahren) recht teuer werden. Das ist in den meisten Anwendungsfällen, in denen Daten in Schüben verarbeitet und ausgewertet werden, kein Problem. Allerdings können immer erreichbare Services auf diese Weise nur äußerst ineffizient zur Verfügung gestellt werden.

In diesem Blog-Beitrag wird ein Experiment dargestellt, in dem ein Machine-Learning-Projekt durchgeführt wird, das Databricks zur Durchführung und azureml zur Bereitstellung verwendet. Das Ziel des Projekts ist es, auf Basis von Daten eines Team-gegen-Team-Videospiels vorherzusagen, welches von zwei Teams in Runden dieses Videospiels gewinnen wird. In dem gewählten Videospiel spielen zwei Teams, bestehend aus je fünf Spielern, gegeneinander. Das Ziel ist es, die Basis des Gegners zu eliminieren, indem vorher eine Reihe andererZiele zerstört werden. Dabei verbessern sich die Charaktere der Spieler im Laufe des Spiels und kämpfen auch mit den Charakteren der Gegner. Für die Vorhersage darüber, welches Team eine Runde gewinnen wird, sollen nur die Daten der ersten zehn Minuten verwendet werden. Offensichtliche Maße dafür, wie gut ein Team gerade steht, sind beispielsweise die Stärke der individuellen Charaktere zu bestimmten Zeitpunkten oder wie viele gegnerische Ziele bereits ausgeschaltet wurden.

Das ausgewählte Fallbeispiel mag eventuell ungewöhnlich im Kontext der sonst von biX behandelten Themen erscheinen, allerdings werden die Themen von Fallbeispielen meist frei von den Zuständigen ausgewählt. In diesem Fall wurde ein Videospiel für das Experiment aus Gründen des generellen Interesses, Verfügbarkeit der Daten und Komplexität des Fallbeispiels ausgewählt.

Datenextraktion und -transformation

Die Daten für das Experiment werden aus einer API extrahiert. Die Extraktion ist in einem Databricks Notebook gecodet. Dabei wird maßgeblich die requests Bibliothek von Python verwendet. Nach der Extraktion werden die Daten, bei denen es direkt möglich ist, in Spark Dataframes umgewandelt, die restlichen Daten werden mithilfe der pandas.json_normalize Funktion und anderen manuelleren Wegen der Umwandelung in Tabellenform abgeflacht. Dieser Schritt ist nötig, da die Daten im JSON-Format extrahiert werden. Wenn alle Daten als Dataframe vorliegen, werden sie als Delta Table im Azure Blob Storage persistiert (df.write.format(‘delta’).write(<file path>)). Das ausgewählte Format der Delta Tables hat hierbei den Vorteil, dass sie wie Tabellen aus relationalen Datenbanken verwendet werden können (inklusive Data-Warehouse-Funktionen, wie Change Data Capturing) und das, obwohl sie in einem Cloud Blob Storage liegen.

Natürlich werden die Daten ausführlich untersucht, bevor irgendwelche Aggregationen durchgeführt werden: Welche Spannen decken die Werte verschiedener Spalten ab? Welche Datentypen haben die Spalten? Korrelieren die Spalten miteinander? Welche Spalten werden benötigt und welche sind obsolet? Diese Fragen können alle beantwortet werden, indem die Daten in ein Databricks Notebook importiert werden und dort eine investigative Datenanalyse mit Spark, herkömmlichen Python oder SQL initiiert wird. Hierfür ist die einfache aber auch sehr nützliche display() Funktion ein passendes Mittel zur Visualisierung.

Im Machine Learning können selten die frisch extrahierten Daten direkt verwendet werden. Meistens müssen sie zunächst analysiert, aggregiert und vorbereitet werden. In dem präsentierten Fallbeispiel wird maßgeblich Folgendes unternommen: Viele Spalten werden mit Aggregationen auf ein Maximum kombiniert und anderen Spalten wird wiederum ein Gewicht (ein Faktor) hinzugefügt, um ihren Einfluss auf das später trainierte Modell zu erhöhen. Ein konkretes Beispiel zu den Gewichten: Die Werte der Spielercharaktere sind in den ersten Minuten weniger ausschlaggebend für den späteren Verlauf des Spiels als die Werte, die zum Beispiel bei der zehn-Minuten-Marke bestehen. Demensprechend werden Werte größer gewichtet, je später sie erfasst werden. Alle angewandten Aggregationen sind unkompliziert mit der Spark Dataframe API umzusetzen. 

Am Ende der Vorverarbeitung müssen die Daten gut zugänglich als Delta Table abgelegt werden. Zusätzlich werden die transformierten Daten allerdings auch in Databricks im Feature Store hinterlegt. Das hat Vorteile, da zum Beispiel aus Notebooks heraus auf hinterlegte Daten im Feature Store zugegriffen werden kann, womit Trainingsdatensätze für das Training eines Modells gebildet werden können. Die Daten im Feature Store enthalten eine versionierte Version des Codes, mit dem sie hergeleitet wurden, was eine Rückverfolgbarkeit für spätere Zeitpunkte garantiert. Außerdem müssen mit dem Feature Store keine aufwendigen Code-Abschnitte für den Import von Daten geschrieben werden, da diese einfach zugänglich und fertig verarbeitet vorliegen.

Machine Learning

Um mit dem Machine Learning anzufangen, wird zunächst die Beladung der transformierten Daten in ein neues Notebook vorgenommen. Wie bereits beschrieben, wird der Feature Store für diesen Schritt verwendet, damit die Beladung einfach replizierbar ist. Hierfür wird zunächst eine Instanz des feature_store erstellt. Danach wird mlflow autolog aktiviert, um die Parameter und Trainingsmetriken des später verwendeten Algorithmus zu erfassen. Daraufhin wird das mlflow Experiment gestartet, was bedeutet, dass die gesamte nachstehende Logik für das Machine Learning in der Experimente-Sektion von Databricks einsehbar und wiederverwendbar ist.

Innerhalb des Experiment-Verlaufs werden die definierte Beladung aus dem Feature Store ausgeführt, die frisch geladen Daten in Trainings- und Testdaten aufgeteilt, die Parameter für den Algorithmus festgelegt, das Modell trainiert und die Zuverlässigkeit des Modells ermittelt: Die Beladung aus dem Feature Store erfolgt über den create_training_set() Befehl. Danach wird die sklearn Funktion train_test_split() verwendet, um die Daten in einen Trainings- und Testanteil zu unterteilen. Die Parameter für den Algorithmus werden als nächstes definiert, in verschiedenen Durchläufen werden diese stetig verändert, um eine optimale Performance zu erreichen. Glücklicherweise werden sämtliche Parameter von mlflow erfasst, wodurch die Nachverfolgung der bestfunktionierenden Parameter später kein Problem mehr darstellt. Mit nur einer Zeile wird das Machine Learning Modell initialisiert und trainiert. Natürlich wird dieser Schritt in verschiedenen Durchläufen abgeändert, da Parameter und Art des Algorithmus angepasst werden. In diesem Fall werden Decision Trees, Random Forests und Support Vector Machines getestet. Am Ende des Experiments wird das neu trainierte Modell getestet. Die Testergebnisse werden erfasst und mit dem Befehl mlflow.log_metrics() gespeichert.

Der Screenshot zeigt die Metriken der Testläufe für den Random Forest, Decision Tree und Support Vector Machine in genannter Reihenfolge.

Obwohl viele Experimente durchgeführt werden, ist es dennoch sehr einfach, das beste Modell darunter auszuwählen, da in MLFlow Experimente nach unterschiedlichen Kriterien gefiltert und sortiert werden können. So kann in diesem Fall für die drei Arten der verwendeten Algorithmen zeitnah der jeweils beste Vertreter ausgesucht werden. Unter den drei Algorithmen hat der Random Forest am besten abgeschnitten (alle drei Arten liegen jedoch nahe beieinander), jedoch eignet sich der Decision Tree beispielsweise dennoch sehr gut dafür, zu visualisieren, wie wichtig unterschiedliche Kriterien in dem Datensatz für die Algorithmen sind. So zeigen genannte Visualisierungen, dass das Gold, welches durch das Ausschalten von feindlichen Charakteren und Zielen erhalten wird, ein sehr bedeutender Faktor ist. Je mehr Gold, desto besser. Auch der physische Schaden, der an Feinde verteilt wird, ist von großer Bedeutung. Das lässt sich daran ablesen, dass beide Faktoren vom Entscheidungsbaum am ehesten dafür verwendet werden, um Spiele in Sieg oder Niederlage einzuordnen. Dies klingt zunächst offensichtlich, wenn manmit solchen Spielen vertraut ist. Dies ist es jedoch nicht, wenn man bedenkt, dass es pro Spiel tausende Faktoren zu beachten gibt. Der Einfluss, oder zumindest die Korrelation der genannten Faktoren mit dem Sieg eines Teams, ist im Folgenden zu sehen:

Die Wahrscheinlichkeit zu gewinnen steigt signifikantmit der Höhe der gezeigten Werte. Wie beschrieben, gibt es pro Partie eine große Zahl an spielbeeinflussenden Faktoren. Daher ist es umso überraschender,  eine so deutliche Korrelation zwischen bestimmten Werten und der Siegeschance zu sehen.

Modellbereitstellung

Um das gerade erstellte Modell zugänglich zu machen, muss es ansprechbar gemacht werden. Natürlich wäre eine Methode, das Modell auf einem Databricks Cluster zur Verfügung zu stellen. Hierbei ergeben sich allerdings zwei Probleme: ein Databricks Cluster rund um die Uhr laufen zu lassen ist extrem teuer. Hinzu käme, dasswenn das Cluster flexibel starten soll, statt dauerhaft zu laufen, es etwa drei bis fünf Minuten benötigen würde. Diese Faktoren machen eine Bereitstellung über Databricks sehr ineffizient.

Um die genannten Probleme zu umgehen, wird das Modell stattdessen über azureml zu Verfügung gestellt. azureml ist ein Service, der über Azure verfügbar ist. Über diesen ist es möglich, das Modell permanent über einen Service bereitzustellen, ohne dafür viel zu bezahlen. Der Code zum Starten des Service kann allerdings problemlos in Databricks geschrieben werden. Als erstes werden alle notwendigen azureml Funktionen importiert:

Im Anschluss wird der Workspace definiert, indem der Service laufen soll. Bei diesem werden Informationen mitgetragen, wie beispielsweise die Form des Azure Abonnements, in dem der Service laufen soll:

Daraufhin wird das Machine Learning Modell in azureml registriert:

Anschließend folgt ein sehr interessanter Part: Code-Teile für die Initialisierung und den Aufruf des Service können definiert werden. In diesen Code-Teilen kann beispielsweise angegeben werden, auf welche Weise die Eingangsdaten verarbeitet werden, bevor sie vom Modell zur Vorhersage benutzt werden. Durch diesen benutzerdefinierten Code wird der Service sehr flexibel, da er extrem anpassbar ist:

Folglich müssen die Bedingungen zum Starten des Service erfüllt werden. Die Umgebung, in der der Service läuft, wird definiert (welche Pakete und Funktionen werden benötigt):

Die Konfiguration für die Vorhersage über das Modell wird angegeben (Pfad zum Code, frisch definierte Code-Teile und Workspace):

Die Konfiguration des Webservice wird erstellt (Anzahl der zu verwendenden CPU-Kerne, RAM):

Zuletzt wird der Webservice erstellt (Name, Konfiguration, Informationen zum Modell):

Wenn alle Anforderungen definiert sind und der Webservice ausgeführt wird, kann ein API-Schlüssel generiert werden, um auf den Service zuzugreifen. Dann können neue, zu analysierende Daten, an den Service geschickt werden , sodass eine Antwort ausgegeben wird, welches Team siegen wird.

Zusammengefasst bietet Databricks viele komfortable Features für das Machine Learning. Mit dem Feature Strore und mlflow können Experimente versioniert, repliziert und kontrolliert eingesetzt werden. Die Bereitstellung kann problemlos aus Databricks heraus mit azureml durchgeführt werden. Hierbei sorgt der flexible Code für reichlich Freiraum bei der Implementierung. Dazu kommt, dass Machine Learning, Data Engineering und Data Analysis gemeinsam in Databricks durchgeführt werden können, wodurch es Teams ermöglicht wird, schnittstellenfrei miteinander zu arbeiten.

Jetzt bleiben endlich weder die Siege unserer Lieblingsteams, noch die Effizienz unserer Machine Learning Services dem Zufall überlassen.

Sollten Sie Fragen zum Machine Learning oder Databricks-Funktionen, wie dem Feature Store, haben, können Sie sich jederzeit gerne bei uns melden. Wir freuen uns auf Sie.

Ansprechpartner

Oliver Ossenbrink

Geschäftsführung Vertrieb und HR

Data Products Setup

I’ll start with Data Products setup. If you’re new to the concept, this recent video is a great starting point, but here’s a short summary. A data product is a well-described, easily discoverable, and consumable collection of data sets.

Creating a Data Product in Datasphere

Note that in this article I create Data Products in the Data Sharing Cockpit in Datasphere. This functionality is expected to move into the Data Product Studio, but that had not taken place at the time writing.

Before creating a Data Product in Datasphere, I need to set up a Data Provider profile, collecting descriptive metadata like contact and address details, industry, regional coverage, and importantly define Data Product Visibility. Enabling Formations allows me to share the Data Product with systems across your BDC Formation – Databricks, in this case.

With the Data Provider set up, I can go ahead and create a Data Product. As with the Data Provider, I’ll need to add metadata about the product and define its artifacts – the datasets it contains. Only datasets from a space of SAP HANA Data Lake Files type can be selected. Since this Data Product is visible across the Formation, it is available free of charge.

For this demo, the artifact is a local table containing ten years of Ice Cream sales data. Since this is a File type space, importing a CSV file directly to create a local table isn’t an option (see documentation).

I used a Replication Flow to perform an initial load from a BW aDSO table into a local table.

Once Data Product is created and listed, it becomes available in the Catalog & Marketplace, from where it can be shared with Databricks by selecting the appropriate connection details.

Jump into Databricks

To use the shared object In Databricks, I need to mount it to the Catalog – either by creating a new Catalog or using an existing one.

Databricks appends a version number to the end of the schema – ‘:v1’ – to maintain versioning in case of any future changes to the Data Product.

Once the share is mounted, the schema is created automatically, and the Sales actual data table becomes available within it. From there, I can access the shared table directly in a Notebook.

Creating a Data Product in Databricks

To create a Data Product in Databricks, I first need to create a Share – which I can either do via the Delta Sharing settings in the Catalog:

Or directly out of the table which is going to become a part of the Share:

Since a single Share can contain multiple tables, I have the option to either add the table to an existing Share, or create a new one:

To publish the Share as a Data Product, I run a Python script where I define the target table for the forecast and describe the Share in CSN notation, setting the Primary Keys. Primary Keys are required for installing Data Products in Datasphere.

Jump back into Datasphere

Once the Databricks Data Product is available in Datasphere, I install it into a Space configured as a HANA Database space – since my intention is to build a view on top of the table and use it for planning in SAC.

There are two installation options: as a Remote table for live data access, or as a Replication Flow, in which case the data is physically copied into the object store in Datasphere.

Since I want live access, I install it as a Remote Table:

and build a Graphical view of type Fact on top:

Forecast calculation

With my Data Products set up and Sales actual data are available in Databricks, I create a Notebook to calculate the Sales Forecast.

The approach combines Sales and Weather data to train a Linear Regression model. I import the Weather data *https://zenodo.org/records/4770937 from an external server directly into Databricks, select the relevant features from the weather dataset, and combine them with the Sales actual data:

* Klein Tank, A.M.G. and Coauthors, 2002. Daily dataset of 20th-century surface
air temperature and precipitation series for the European Climate Assessment.
Int. J. of Climatol., 22, 1441-1453.
Data and metadata available at http://www.ecad.eu

Using the “sklearn” library, I build and train a Linear regression model:

Once trained, the model predicts the Sales forecast for Rome in June 2026 based on the weather forecast, and I save the results to my Catalog table:

Seamless planning data model

Seamless planning concept is built around physically storing planning data and public dimensions directly in Datasphere, keeping them alongside the actual data.

Since the QRC4 2025 SAC release, it has also been possible to use live versions and bring reference data into planning models without replication.

In this scenario, I build a seamless planning model on top of the Graphical view I created over the Remote table. This lets me use the forecast generated in Databricks as a reference for the final SAC Forecast version.

 

The model setup follows these steps:

Create a new model:

Start with data:

Select Datasphere as the data storage:

From there, I define the model structure and can review the data in the preview.

For a deeper dive into Seamless Planning, I recommend this biX blog.

Process Flow automation

Multi-action triggers Datasphere task chain

The final step is automating the entire forecast generation by using SAC Multi-actions and a Task-Chain in Datasphere – so that my user can trigger the calculation with a single button click from an SAC Story.

The model setup follows these steps:

Create a new model:

Triggering Task Chains from Multi-actions is a recent release. This blog post walks through how to set it up.

For details on how to trigger a Databricks Notebook from Datasphere, I recommend referring to this blog.

With everything in place, I create a Story, add my Seamless planning Model, and attach the Multi-action:

Running the Multi-action triggers the Task Chain, which in turn triggers the Databricks Notebook.

I can monitor the execution details in Datasphere:

and in Databricks:

Once the calculation completes, the updated forecast appears in the Story:

The end-to-end calculation took 2 minutes 45 seconds in total. The Task Chain in Datasphere is triggered almost instantly by the Multi-action, the Databricks Notebook execution itself took 1 minute 29 seconds, with the remaining time spent on Serverless Cluster startup.   

 

From here, I can copy the calculated forecast into a new private version:

adjust the numbers as needed, and publish it as a new public version to Datasphere:

Conclusion

With SAP Business Data Cloud, it is possible to build a forecasting workflow that feels seamless to the end user — even though it spans multiple systems under the hood.

Companies using BW as the main Data Warehouse and Databricks for ML calculations or Data Science tasks can benefit from using the platform, as the data no longer needs to be physically copied out of BW.

What this scenario demonstrates is that once wrapped as a Data Product, BW sales data can be shared with Databricks via the Delta Share protocol. Databricks, in turn, can then create its own Data Products on top of the calculation results and share them back with Datasphere as a Remote Table.

A Seamless Planning model in SAC sits on top of that Remote Table, giving planners live access to the generated forecast. A single Multi-action in an SAC Story ties it all together, triggering a Datasphere Task Chain that kicks off the Databricks Notebook — completing the full cycle in under three minutes.

As SAP Business Data Cloud continues to mature, scenarios like this one are becoming achievable – leaving the complexity in the architecture and not in the workflow.

Ansprech­partner

Ilya Kirzner
Consultant
biX Consulting
Datenschutz-Übersicht

Diese Website verwendet Cookies, damit wir dir die bestmögliche Benutzererfahrung bieten können. Cookie-Informationen werden in deinem Browser gespeichert und führen Funktionen aus, wie das Wiedererkennen von dir, wenn du auf unsere Website zurückkehrst, und hilft unserem Team zu verstehen, welche Abschnitte der Website für dich am interessantesten und nützlichsten sind.