„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Ausführen eines JAX -Programms von DART mit C ++ FFI ausführen

Ausführen eines JAX -Programms von DART mit C ++ FFI ausführen

Gepostet am 2025-03-23
Durchsuche:962

? Warum Dart und Jax für maschinelles Lernen kombinieren?

beim Erstellen von Anwendungen ist die Auswahl der richtigen Werkzeuge von entscheidender Bedeutung. Sie möchten hohe Leistung, einfache Entwicklung und nahtlose plattformübergreifende Bereitstellung. Beliebte Frameworks bieten Kompromisse:

  • c bietet Geschwindigkeit, kann aber die Entwicklung verlangsamen.
  • dart (mit flattern) ist langsamer, vereinfacht aber die Speicherverwaltung und plattformübergreifende Entwicklung.

Aber hier ist der Fang: Die meisten Frameworks fehlen robust natives maschinelles Lernen (ml) Unterstützung. Diese Lücke existiert, weil diese Frameworks vor dem KI -Boom gehen. Die Frage ist:

Wie können wir ML effizient in Anwendungen integrieren?

Gemeinsame Lösungen wie onnx runTime erlauben das Exportieren von ML -Modellen für die Anwendungsintegration, sie sind jedoch nicht für CPUs oder flexibel genug für generalisierte Algorithmen.

Enter jax , eine Python -Bibliothek, die:

  • ermöglicht das Schreiben optimierter ML- und allgemeine Algorithmen.
  • bietet Plattform-agnostische Ausführung auf CPUs, GPUs und TPUs an.
  • unterstützt modernste Funktionen wie autograd und jit compilation .

In diesem Artikel zeigen wir Ihnen, wie zu:

  1. Schreiben Sie JAX -Programme in Python.
  2. generieren XLA -Spezifikationen.
  3. Optimierten JAX -Code in Dart einsetzen c ffi .

? Was ist Jax?

jax ist wie numpy auf Steroiden. Von Google entwickelt, handelt es sich um eine low-Level-Hochleistungsbibliothek, die ML zugänglich macht und dennoch leistungsfähig ist.

  • Plattform Agnostic : Code wird ohne Änderung auf CPUs, GPUs und TPUs ausgeführt.
  • speed : vom XLA -Compiler angetrieben, JAX optimiert und beschleunigt die Ausführung.
  • Flexibilität : perfekt für ML -Modelle und allgemeine Algorithmen.

Hier ist ein Beispiel zum Vergleich von Numpy und Jax:

# NumPy version
import numpy as np  
def assign_numpy():  
  a = np.empty(1000000)  
  a[:] = 1  
  return a  

# JAX version
import jax.numpy as jnp  
import jax  

@jax.jit  
def assign_jax():  
  a = jnp.empty(1000000)  
  return a.at[:].set(1)  

Benchmarking in Google Colab enthüllt Jaxs Performance Edge:

  • cpu & gpu : Jax ist schneller als Numph.
  • tpu : Beschleunigungen werden aufgrund von Datenübertragungskosten für große Modelle spürbar.

Diese Flexibilität und Geschwindigkeit machen JAX ideal für Produktionsumgebungen, in denen die Leistung der Schlüssel ist.


Running a JAX Program from Dart Using C   FFI


? ️ Jax in Produktion bringen

Cloud Microservices im Vergleich zur lokalen Bereitstellung

  • cloud : Containerisierte Python-Microservices eignen sich hervorragend für Cloud-basierte Computer.
  • local : Der Versand eines Python -Interpreter ist nicht ideal für lokale Apps.

Lösung: Nutzen Sie die XLA -Zusammenstellung von JAX

jax übersetzt Python-Code in hlo (hochrangige Optimierer) Spezifikationen , die mit c xla bibliotheken kompiliert und ausgeführt werden können. Dies ermöglicht:

  1. Schreiben von Algorithmen in Python.
  2. sie nativ über eine C -Bibliothek ausführen.
  3. integrieren in dart über ffi (fremdfunktion interface) .

✍️ Schritt-für-Schritt-Integration

1. Erzeugen Sie einen HLO -Proto

Schreiben Sie Ihre JAX -Funktion und exportieren Sie seine HLO -Darstellung. Zum Beispiel:

import jax.numpy as jnp  

def fn(x, y, z):  
  return jnp.dot(x, y) / z  

Um das HLO zu generieren, verwenden Sie das Skript jax_to_ir.py aus dem JAX -Repository:

python jax_to_ir.py \
  --fn jax_example.prog.fn \
  --input_shapes '[("x", "f32[2,2]"), ("y", "f32[2,2")]' \
  --constants '{"z": 2.0}' \
  --ir_format HLO \
  --ir_human_dest /tmp/fn_hlo.txt \
  --ir_dest /tmp/fn_hlo.pb

platzieren Sie die resultierenden Dateien (fn_hlo.txt und fn_hlo.pb) in das Verzeichnis der Assets Ihrer App.


2. Erstellen Sie eine C -dynamische Bibliothek

Ändern Sie den C -Beispielcode von JAX.

klonen Sie das JAX -Repository und navigieren Sie zu JAX/Beispiele/jax_cpp .

  • fügen Sie eine main.h -Header -Datei hinzu:
#ifndef MAIN_H  
#define MAIN_H  

extern "C" {  
  int bar(int foo);  
}  

#endif  
  • Aktualisieren Sie die build Datei, um eine gemeinsame Bibliothek zu erstellen:
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  

kompilieren mit bazel:

bazel build examples/jax_cpp:jax  

Sie finden die kompilierte libjax.dylib im Ausgabeverzeichnis.


3. Schließen Sie Dart mit C mit FFI an

Verwenden Sie Darts ffi paket , um mit der C -Bibliothek zu kommunizieren. Erstellen Sie eine jax.dart -Datei:

import 'dart:ffi';  
import 'package:dynamic_library/dynamic_library.dart';  

typedef FooCFunc = Int32 Function(Int32 bar);  
typedef FooDartFunc = int Function(int bar);  

class JAX {  
  late final DynamicLibrary dylib;  

  JAX() {  
    dylib = loadDynamicLibrary(libraryName: 'jax');  
  }  

  Function get _bar => dylib.lookupFunction('bar');  

  int bar(int foo) {  
    return _bar(foo);  
  }  
}  

Fügen Sie die dynamische Bibliothek in Ihr Projektverzeichnis ein. Testen Sie es mit:

final jax = JAX();  
print(jax.bar(42));  

Sie sehen die Ausgabe aus der C -Bibliothek in Ihrer Konsole.


? Nächste Schritte

Mit diesem Setup können Sie:

  • optimieren Sie ML -Modelle mit JAX und XLA.
  • Führen Sie leistungsstarke Algorithmen lokal aus.

potenzielle Anwendungsfälle gehören:

  • suchen algorithmen (z. B. a*).
  • kombinatorische Optimierung (z. B. Planung).
  • Bildverarbeitung (z. B. Kantenerkennung).

Jax überbrückt die Lücke zwischen pythonbasiertem Entwicklungs- und Produktionsebene, und lassen Sie sich ML-Ingenieure auf Algorithmen konzentrieren, ohne sich über C-Code mit niedrigem Niveau zu sorgen.


Wir erstellen eine hochmoderne KI-Plattform mit unbegrenzten Chat-Token und Langzeitgedächtnis, um nahtlose, kontextbewusste Interaktionen zu gewährleisten, die sich im Laufe der Zeit entwickeln.

Es ist völlig kostenlos und Sie können es auch in Ihrer aktuellen IDE versuchen.


Running a JAX Program from Dart Using C   FFI

Freigabeerklärung Dieser Artikel ist reproduziert unter: https://dev.to/nikl/running-ax-program-from-dart-using-c-ffi-45po?1 Wenn es zu Verstößen besteht, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3