BlogAzure Batch in der Praxis

Azure Batch in der Praxis

Azure Batch in der Praxis

OCR im Eigenbau mit Azure Batch und Azure Functions

Mit Azure Batch steht Entwicklern in Azure eine Plattform zur Verfügung, auf der sie unter anderem umfangreiche, auf Parallelverarbeitung ausgelegte HPC-Batchaufträge (High Performance Computing) in Azure ausführen können. So können Entwickler beispielsweise SaaS-Anwendungen oder Client-Apps erstellen, für die große Mengen von Ausführungen benötigt werden.

Vom Prinzip her gestaltet sich die Arbeitsweise mit dem Plattform-Dienst so, dass Azure Batch vollkommen automatisch einen Pool mit Compute-Knoten (VMs) bereitstellt, dort die gewünschten Anwendungen installiert und schließlich deren Ausführung als Aufträge auf den Compute-Knoten einplant.

Prominente Beispiele für den Einsatz von Batch-Processing sind Monte-Carlo-Risikosimulationen, welche häufig von Finanzdienstleistungsunternehmen eingesetzt werden oder allgemein das Erstellen von Diensten zur Verarbeitung großen Mengen von Bildern. Auch für so genannte eng gekoppelte Workloads wie FE-Analyse, Strömungssimulation oder das KI-Training mit mehreren Knoten eignet sich Azure Batch gut. Darüber hinaus unterstützt Azure Batch größere Mengen von Rendering-Workloads mit Rendering-Tools wie beispielsweise Autodesk Maya, 3ds Max oder V-Ray.

Haupteinsatzzweck ist aber sicher die Ausführung intrinsisch paralleler Workloads, also Anwendungen, die einerseits unabhängig voneinander ausgeführt werden, bei denen aber jede Instanz nur einen Teil der Arbeit erledigt. Beliebte Beispiele für intrinsisch parallele Workloads, die sich mit Azure Batch ausführen lassen, sind neben der bereits erwähnten Bildanalyse und -verarbeitung und der Modellierung von Finanzrisiken mit Monte Carlo-Simulationen, Medientranscodierung, die Datenerfassung-/Verarbeitung im Rahmen von ETL-Vorgängen, die Analyse genetischer Sequenzen, das Ausführen von Softwaretest oder die optische Zeichenerkennung (OCR). Letzte eignet sich im Rahmen dieses Beitrags gut für eine kurze Demo.

Grundlegende Konzepte von Azure Batch

Um erste Workloads mir Azure Batch erstellen zu können, brauchst du ein grundlegendes Verständnis der beteiligen Konzepte Batch Konto, Knoten und Pools sowie Aufträgen und Aufgaben. Zunächst musst du ein Azure Batch-Konto anlegen. Darunter versteht Microsoft eine eindeutig identifizierbare Entität innerhalb des Batch-Diensts. Da die meisten Batch-Lösungen Azure Storage zur Speicherung von Ressourcen- und Ausgabedateien nutzen, ist jedem Azure Batch-Konto in der Regel ein entsprechenden Speicherkonto zugeordnet. Die Zuordnung kannst du beim Anlegen des Batch-Account vornehmen. Du kannst ein Batch-Konto pro Region anlegen.

Zuerst müssen Sie ein Batch-Konto anlegen.

Wurde das Batch-Konto erstellt, kannst du darin Pools und Knoten erstellen. Dies erledigst du im Batch-Konto im Abschnitt „Features / Pools“

Prinzipiell lassen sich mehrere Batch-Workloads in einem einzelnen Batch-Konto ausführen, aber falls gewünscht auch auf mehrere Batch-Konten verteilen, sofern sich diese im gleichen Abonnement, aber in verschiedenen Azure-Regionen, befinden.

Pools

Erstelle nun einen neuen Pool mit dem Namen „ocr-pool“, wähle bei „Imagetyp“ den Eintrag „Marketplace“ und als „Herausgeber“ den Eintrag „canonical“. Optional stehen als Images „debian“, „microsoftwindowsserver“ oder „microsoft-azure-batch“ zur Verfügung, aber für dieses Beispiel benötigen wir ein einfaches „Linux“-System. Als „Angebot“ nutzen wir daher „ubuntuserver“ und als SKU „18.04-lts“.

Das Erstellen eines Pools.

Im Abschnitt „Knotengröße“ legst du zunächst die gewünschte VM-Größe fest. Dies verhält sich ähnlich wie beim Azure Kubernetes Service (AKS). Es handelt sich zwar im Prinzip um normale Azure-VMs, diese tauchen aber ausschließlich im Kontext von Azure Batch auf“. Im Normalfall empfiehlt sich bei Batch-Workloads ein Hardware-Typ, der besonders für HPC-Workloads geeignet ist, etwa ein System aus der F-Serie wie z. B. „Standard_f2s_v2“.  Für unser einfaches Beispiel genügt aber auch ein System aus der A-, B- oder D-Serie für Allzweck-Workloads. Verantwortlich für die letztlich erzielbare Performance ist nicht nur die Anzahl Kerne der gewählten Compute-Hardware, sondern auch die Anzahl der Konten im Pool. Dabei kannst du zwischen einer festen Größe des Pools und Autoscaling wählen: Wenn du auf eine festen Knotenzahl setzt, sind sicherlich 3 Knoten ein vernünftiger Ausgangspunkt; aus Kostengründen kannst du für das Nachvollziehen dieser Demo auch mit einem Knoten starten.

Entscheidend für unser Beispiel ist aber, dass du im Abschnitt „Starttask“ einen Startsequenz angibst, die auf jedem einzelnen Compute-Knoten ausgeführt wird, sobald dieser dem Pool hinzugefügt oder wenn der Knoten neu gestartet wird. Da wir es hier mit Linux-Instanzen zu tun haben, verwendest du für dieses Beispiel folgendes BASH-Skript als Starttask:

/bin/bash -c

"sudo update-locale LC_ALL=C.UTF-8 LANG=C.UTF-8; sudo apt-get update; sudo apt-get -y install ocrmypdf"

An der Installation des Linux-Paketes „ocrmypdf“ kannst du erahnen, dass unsere später zu verwendende Azure-Function, die beim Upload eines scanntes Dokumentes in ein Speicherkonto, eine OCR-Vorgang anstoßen soll, das populäre OpenSource-Tool verwenden wird.

Ein Starttask initialisiert die Knoten nach Wunsch.

Alle übrigen Einstellungen kannst du für dieses Beispiel auf den Default-Werten belassen. Wurde der Pool erstellt, wird er mitsamt der zugewiesenen dedizierten Knotenzahl im Abschnitt „Pools“ des Batch-Accounts angezeigt.

Ein vorhandener Knoten-Pool.

Ist das erledigt, kannst du im Abschnitt „Features / Aufträge“ einen Auftrag erstellen. Der benötigt erst einmal nur eine Auftrags-ID, z. B. „ocr-job“. Außerdem musst du den zu verwendenden Pool auswählen.

Das Erstellen eines Auftrags.

Speicherkonten und Azure Functions

Jetzt wechsel in das mit dem Batch-Account verknüpfte Speicherkonto und erstelle zwei Blob-Container mit dem Namen „input“ und „output“. Der Container „input“ dient dem Upload gescannter Dokumente und damit als Ereignis-Trigger für eine Azure-Function, die dann den ocr-Batch auslöst, während „output“ als Ziel-Container für die per ORC analysierten Dokumente dient. Wie man Container erstellt, haben wie dir schon in verschiedenen Artikel gezeigt. Für den sicheren anonymen Schreibzugriff auf den Ziel-Container „output“ erzeugst du noch eine SAS (Shared Access Signature), also eine signierte URL. Dies gelingt am einfachsten im https://azure.microsoft.com/en-us/features/storage-explorer/ Azure Storage Explorer. Durch einen Rechtsklick auf den gewünschten Container kannst du dann einfach den Eintrag „Shared Access Signature abrufen“ nutzen.

Das Erstellen einer SAS.

Du benötigst die Berechtigung „Schreiben“ und einen gewünschten Bereich für die Dauer der SAS-Gültigkeit.

Die Gültigkeit der SAS, nebst den gewünschten Berechtigungen.

Wurde die SAS abgerufen, kopiere SAS-URL und Abfragezeichenfolge in die Zwischenablage, da du diese später zum Autorisieren der Azure-Function benötigst.

Danach erstelle im Azure-Portal eine neue Azure Function (Function App) mit serverlosen Verbrauchsplan. Wie das geht, haben wie bereits in verschiedenen Artikeln demonstriert. Verwende diesmal .NET als Laufzeitstapel. Die für dieses Beispiel verwendete Function ist in C# geschrieben, um das Azure-Batch .NET SDK nutzen zu können. Wenn du den serverlosen Verbrauchsplan gewählt hast musst du im Abschnitt „Hosting“ des Bereitstellungsassistenten das Speicherkonto angeben, das du oben erstellst und welches du mit der Azure Function verknüpfen möchtest.

Der Hosting-Plan für die Function App benötig benötigt ein verknüpftes Speicherkonto.

Wurde die Function-App erstellt, musst du noch im Abschnitt „Funktionen“ einen neuen Trigger für Blob-Speicherkonten erstellen. Wähle bei „Entwicklungseinstellungen“ den Eintrag „im Portal entwickeln“. Im Abschnitt „Vorlagendetails“ wähle bei „neue Funktion“ einen beliebigen Namen für deinen Trigger, und bei „Pfad“ ersetze im Vorschlag „samples-workitems/{name}“ dem Eintrag „samples-workitems“ durch den Namen deines Eingangs-Containers, in unserem Beispiel „input“. Bei „Speicherkontoverbindung“ handelt es sich um den Namen der App-Einstellung, welche dann die Verbindungszeichenfolge für dein Speicherkonto enthält. Hier ist der Eintrag „AzureWebJobsStorage“ korrekt.

Das Konfigurieren eines Blob-Triggers.

Hast du den Trigger erstellt, kannst du den eigentlichen Funktionscode einfügen. Wähle dazu im Abschnitt „Funktionen“ den Eintrag „Funktionen“ und klicke dort auf den Link mit dem Namen deines Blob-Triggers. Klicke dann auf „Programmieren und testen“ und lade durch einen weiteren Klick auf „Hochladen“ oder mittels Copy&Paste deinen Funktionscode in die Datei „run.csx“ hoch. Den Demo-Code für diese Anwendung stellt Microsoft auf https://github.com/Azure-Samples/batch-functions-tutorial/blob/master/run.csx  Github zur Verfügung. Außerdem benötigst du noch eine Projekt-Datei. Auch deren Content ist auf https://github.com/Azure-Samples/batch-functions-tutorial/blob/master/function.proj Github zu finden, allerdings ist die Datei „function.proj“ im Azure-Portal standardmäßig nicht vorhanden, so dass du diese erst anlegen musst. Dort sind die externen Bibliotheken im Funktionscode, wie z. B. das Batch .NET SDK referenziert.

Schließlich musst du nur noch in der „run.csx“ die Platzhalter in der Funktion „Run()“ in der Zeile 25 …

BatchSharedKeyCredentials cred = new BatchSharedKeyCredentials("<YOUR_BATCH_URL_HERE>", "<YOUR_BATCH_ACCOUNT_HERE>", "<YOUR_BATCH_PRIMARY_KEY_HERE>");

… mit deinen Werten ersetzen. Das betrifft die „BatchSharedKeyCredentials”, welche sich aus der „Batch-URL“, der „Batch-Account-ID“ und dem „primären Batch-Account-Schlüssel“ zusammensetzen.

Das Ergänzen der Batch-Credentials

 Du findest die Informationen in deinem Batch-Account unter „Eigenschaften“.

Die Credential-Informationen holen Sie sich aus dem Batch-Account.

Außerdem musst du in den folgenden Zeilen 27,28 und 29 noch deine Speicherkonto-Verbindungszeichenfolge, den Namen deines Eingangs-Containers und die oben anlegte SAS für den Ausgabe-Container („output“) ergänzen.

Das Ergänzen der Speicherkonto-Credentials.

Achtung: Bei “SAS” handelt es sich um die SAS-URL, nicht nur das Token.

Ist alles erledigt, kannst du ein gescanntes Dokument in den Container „input“ hochladen und findest nach wenigen Sekunden das dekodierte Dokument im Container „output“.

Das Ergebnis der Batch-Verarbeitung liefert das dekodierte Dokument in den Ziel-Container aus.

Dass die Azure-Function erfolgreich gelaufen ist, siehst du in der Azure-Function selbst unter „Protokolle“ …

Die Logs zeigen das erfolgreiche Ausführen der Azure-Function.

… sowie in der Azure-Function im Blob-Trigger im Abschnitt „Überwachung“ …

Die Azure-Function wurde erfolgreich ausgeführt.

Dass der Batch selbst erfolgreich gelaufen ist, siehst du dagegen im Batch-Account unter „Aufträge / ocr-job“ …

Der Batch-Job ist erfolgreich gelaufen.

… oder im Azure-Batch-Explorer, den du dir von Microsoft für Windows, Linux oder Mac https://azure.github.io/BatchExplorer/ herunterladen kannst.

Der Batch-Job im Azure-Explorer.

Schulungen die dich interessieren könnten

Bewertungen

Kundenstimme
Wolfgang N.
ThyssenKrupp Nirosta
star-participantstar-participantstar-participantstar-participantstar-participant
Eine gute Adresse für das Erlernen scheinbar schwieriger und trockener Themen, die hier gut aufbereitet werden.
Kundenstimme
Philipp M.
Wacom Europe GmbH
star-participantstar-participantstar-participantstar-participantstar-participant
Sehr gute Organisation, guter Trainer - alles super!
Kundenstimme
Nina P.
GEUTEBRÜCK GmbH
star-participantstar-participantstar-participantstar-participantstar-participant
Das Seminar hat meine Erwartungen voll erfüllt. Man hat gemerkt, dass der Trainer Spaß an der Sache und sehr viel Ahnung vom Thema hat. Das Gefühl hat man nicht in allen Schulungen (auf Schulungen im Allgemeinen bezogen).
Kundenstimme
Markus H.
CARAT Dreieich
star-participantstar-participantstar-participantstar-participantstar-participant
Der Trainer machte einen sehr netten und kompetenten Eindruck und ging auf unsere Wünsche und Anregungen sehr praxisorientiert ein .