Tensorbibliothek Nx 0.1.0 macht Elixir fit fĂĽr ML
Die Numerical-Elixir-Library Nx soll Elixir-Programmierung und die Erlang-VM fĂĽr numerische Berechnungen und maschinelles Lernen nutzbar machen.
(Bild: vs148/Shutterstock.com)
Knapp ein Jahr nachdem das Entwicklerteam das Projekt Nx erstmals vorgestellt hat, liegt nun das erste öffentliche Release der Library auf GitHub bereit. Nx 0.1.0 soll Elixir-Entwicklerinnen und -Entwicklern die Kombination von funktionaler Programmierung mit Tensor-Compilern eröffnen, um neue Einsatzgebiete wie numerische Berechnungen und maschinelles Lernen zu erschließen.
Elixir und die Erlang-VM ausreizen
Obwohl sich das Nx-Entwicklerteam um José Valim und Sean Moriarity der Tatsache bewusst war, dass eine funktionale Programmiersprache wie Elixir bei numerischen Berechnungen problematisch sein kann, insbesondere wenn es um die Unveränderlichkeit (Immutability) bei der Arbeit mit großen Speicherblöcken geht, erschienen ihnen die potenziellen Vorteile verlockend. Denn die Programmiersprache Elixir, die kürzlich mit Version 1.13 semantische Neukompilierung eingeführt hat, und deren zugrundeliegende Erlang-VM versprechen geringe Latenz beim Betrieb in verteilten und fehlertoleranten Systemen, sodass sich auch flexibel skalierbare und leichter wartbare Anwendungen bauen lassen.
Videos by heise
Die auf mehrdimensionale Arrays (Tensoren) und Just-in-Time-Kompilierung von numerischem Elixir sowohl auf CPUs als auch GPUs ausgelegte Bibliothek Nx orientiert sich aus diesem Grund an Vorbildern wie NumPy und JAX aus dem Python-Ă–kosystem. Insbesondere JAX ist grundlegend auf funktionale Programmierung und Immutability-Prinzipien ausgerichtet.
Nx soll auf dieser Basis die Voraussetzungen schaffen, auch auf höheren Abstraktionsebenen wie beispielsweise numerischen Definitionen (defn) oder Berechnungsgraphen die Vorteile funktionaler Programmierung auszuschöpfen. Innerhalb von defn, das als Teilmenge von Elixir auf Numerical Computing zugeschnitten ist, lassen sich mit Nx auch reguläre Elixir-Operatoren verwenden und in die jeweils äquivalenten Tensor-Operationen übersetzen. Entwicklerinnen und Entwicklern stehen damit Sprachfunktionen und Datentypen wie Makros, der Pipe-Operator, Pattern Matching oder Maps zur Verfügung.
defmodule MyModule do
import Nx.Defn
defn softmax(t) do
normalized = t - Nx.max(t)
Nx.exp(normalized) / Nx.sum(Nx.exp(normalized))
end
end
Nach dem Aufruf kompiliert der Code aus dem vorangehenden Listing die Typen und Formen der Argumente beispielsweise über Googles XLA-Compiler zu optimiertem Code, der sich auf CPUs, GPUs oder auch Cloud TPUs ausführen lässt. Mehrdimensionale Tensoren lassen sich mit Nx aus vorzeichenlosen (u8, u16, u32, u64) und vorzeichenbehafteten Ganzzahlen (s8, s16, s32, s64) sowie vorzeichenlosen (f16, f32, f64) und vorzeichenbehafteten Gleitkommazahlen (bf16) erstellen.
Neue Funktionen fĂĽr ML-Projekte
Um Nx für den produktiven Einsatz in Machine-Learning-Projekten auszubauen, hat das Team in den zurückliegenden Monaten unter anderem Streaming-Funktionen implementiert, die es ermöglichen, eine Anwendung in GPUs und TPUs zu laden, während sie einen Stapel von Eingaben empfängt. Die Funktionen sollen zum effizienteren Durchführen von Inferenz beitragen, sich aber auch für verteiltes Lernen eignen.
Mit Blick auf Recurrent Neural Networks (RNN) und Modelle für Spracherkennung, semantisches Parsing, Gebärdensprachübersetzung und vergleichbare Einsatzgebiete haben die Nx-Macher die numerischen Definitionen um while-Schleifen erweitert. Sie sollen sowohl das statische als auch das dynamische Entflechten von Schleifen ermöglichen.
Axon: Nx-basierende neuronale Netze mit Elixir
Um zudem die Nx-Library und deren automatische Ableitungs-Engine gegen zahlreiche neuronale Netze testen zu können, hat Sean Moriarity Axon entwickelt. Axon stellt eine Functional API zur Verfügung, die als Low-level-API für numerische Definitionen (defn) dient und gleichzeitig die Voraussetzungen für weitere voneinander entkoppelte APIs zu Model Creation, Optimization und Training schafft, um auf Nx basierende neuronale Netze mit Elixir nutzen zu können. Das nachfolgende Listing zeigt das Modell eines mit Axon implementierten Convolutional Neural Network (CNN) zum Trainieren und Klassifizieren des CIFAR-10-Datensatzes:
Axon.input(input_shape)
|> Axon.conv(32, kernel_size: {3, 3}, activation: :relu)
|> Axon.batch_norm()
|> Axon.max_pool(kernel_size: {2, 2})
|> Axon.conv(64, kernel_size: {3, 3}, activation: :relu)
|> Axon.batch_norm()
|> Axon.max_pool(kernel_size: {2, 2})
|> Axon.flatten()
|> Axon.dense(64, activation: :relu)
|> Axon.dropout(rate: 0.5)
|> Axon.dense(10, activation: :softmax)
Weitergehende Informationen zu Nx 0.1.0 sowie dem gesamten Projekt finden sich im Blogbeitrag zum Release der ersten produktionsreifen Version sowie in der ursprünglichen Ankündigung zu Nx (Numerical Elixir). Die öffentlichen Repositorys des Projekts lassen sich auf GitHub einsehen.
(map)