"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Ejecutar un programa JAX de DART usando C ++ FFI

Ejecutar un programa JAX de DART usando C ++ FFI

Publicado el 2025-03-23
Navegar:712

? ¿Por qué combinar Dart y Jax para el aprendizaje automático?

Al construir aplicaciones, seleccionar las herramientas correctas es crucial. Desea un alto rendimiento, un fácil desarrollo y una implementación multiplataforma perfecta. Los marcos populares ofrecen compensaciones:

  • c proporciona velocidad pero puede ralentizar el desarrollo.
  • dart (con Flutter) es más lento pero simplifica la gestión de la memoria y el desarrollo multiplataforma.

Pero aquí está la captura: la mayoría de los marcos carecen de soporte robuste nativo de aprendizaje automático (ml) . Esta brecha existe porque estos marcos son anteriores al auge de la IA. La pregunta es:

¿Cómo podemos integrar eficientemente ML en aplicaciones?

soluciones comunes como Onnx Runtime Permitir exportación de modelos ML para la integración de aplicaciones, pero no están optimizados para CPU o lo suficientemente flexibles para algoritmos generalizados.

Enter jax , una biblioteca de python que:

  • habilita la escritura de ML optimizados y algoritmos de uso general.
  • ofrece ejecución de plataforma-agnóstica en CPU, GPU y TPUS.
  • admite funciones de cablean como autograd y jit compilation .

En este artículo, le mostraremos cómo:

  1. Escriba programas Jax en Python.
  2. Genere las especificaciones XLA.
  3. implementa el código Jax optimizado en dart usando c ffi .

? ¿Qué es Jax?

jax es como Numpy en esteroides. Desarrollado por Google, es una biblioteca de bajo nivel y de alto rendimiento que hace que ML sea accesible pero poderoso.

  • Plataforma Agnostic : el código se ejecuta en CPUS, GPU y TPUS sin modificación.
  • velocidad : alimentado por el compilador XLA, Jax optimiza y acelera la ejecución.
  • flexibilidad : perfecto para modelos ML y algoritmos generales por igual.

Aquí hay un ejemplo que compara Numpy y 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 en Google Colab revela el borde de rendimiento de Jax:

  • cpu & gpu : jax es más rápido que numpy.
  • tpu : las aceleraciones se vuelven notables para modelos grandes debido a los costos de transferencia de datos.

Esta flexibilidad y velocidad hacen que Jax sea ideal para entornos de producción donde el rendimiento es clave.


Running a JAX Program from Dart Using C   FFI


? ️ Traer a Jax a la producción

Microservicios en la nube versus implementación local

  • nube : los microservicios de python contenedores son excelentes para el cómputo basado en la nube.
  • local : enviar un intérprete de Python no es ideal para aplicaciones locales.

Solución: Aproveche la compilación XLA de Jax

Jax traduce el código Python en HLO (Optimizador de alto nivel) Especificaciones , que se pueden compilar y ejecutar usando c xla bibliotecas . Esto habilita:

  1. escribiendo algoritmos en Python.
  2. ejecutándolos de forma nativa a través de una biblioteca C.
  3. integrando con DART a través de ffi (interfaz de función extranjera) .

✍️ Integración paso a paso

1. Generar un Hlo Proto

Escriba su función Jax y exporte su representación HLO. Por ejemplo:

import jax.numpy as jnp  

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

para generar el script HLO, use el script jax_to_ir.py desde el repositorio de jax:

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

Coloque los archivos resultantes (fn_hlo.txt y fn_hlo.pb) en el directorio de activos de su aplicación.


2. Construye una biblioteca dinámica C C

Modificar el código de ejemplo C de Jax

Clone el repositorio de Jax y navegue a jax/ejemplos/jax_cpp .

  • Agregue un archivo de encabezado Main.h:
#ifndef MAIN_H  
#define MAIN_H  

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

#endif  
  • actualice el archivo build para crear una biblioteca compartida:
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  

compilar con bazel:

bazel build examples/jax_cpp:jax  

encontrará el compilado libjax.dylib en el directorio de salida.


3. Conecte Dart con C usando FFI

use el paquete de dart ffi para comunicarse con la biblioteca C. Cree un archivo jax.dart:

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);  
  }  
}  

Incluya la biblioteca dinámica en su directorio de proyecto. Pruébelo con:

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

verá la salida de la biblioteca C en su consola.


? Siguientes pasos

con esta configuración, puede:

  • optimizar los modelos ML con Jax y XLA.
  • Ejecute algoritmos poderosos localmente.

Los casos de uso potenciales incluyen:

  • Search Algorithms (por ejemplo, a*).
  • Optimización combinatoria (por ejemplo, programación).
  • Procesamiento de imágenes (por ejemplo, detección de borde).

Jax une la brecha entre el desarrollo basado en Python y el rendimiento de nivel de producción, permitiendo que los ingenieros de ML se centren en los algoritmos sin preocuparse por el código C de bajo nivel.


Estamos construyendo una plataforma de IA de vanguardia con tokens de chat ilimitados y memoria a largo plazo, asegurando interacciones sin contexto sin contexto que evolucionan con el tiempo.

es completamente gratis, y también puede probarlo dentro de su ide actual.


Running a JAX Program from Dart Using C   FFI

Declaración de liberación Este artículo se reproduce en: https://dev.to/nikl/running-a-jax-program-from-dart-using-c-ffi-45po?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarlo.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3