«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Запуск программы JAX из DART с использованием C ++ FFI

Запуск программы JAX из DART с использованием C ++ FFI

Опубликовано в 2025-03-23
Просматривать:923

] ? Зачем комбинировать Дарт и Джекс для машинного обучения?

]

При создании приложений выбор правильных инструментов имеет решающее значение. Вы хотите высокую производительность, легкую разработку и бесшовное кроссплатформенное развертывание. Популярные фреймворки предлагают компромиссы:

]
    ]
  • ] c обеспечивает скорость, но может замедлить разработку.
  • ]
  • ] dart (с Flutter) медленнее, но упрощает управление памятью и кроссплатформенную разработку.
  • ]
]

Но вот улов: большинству структур не хватает надежного Native Machine Learning (ML) поддержка. Этот разрыв существует, потому что эти рамки предшествует бум ИИ. Вопрос:

]

как мы можем эффективно интегрировать ML в приложения?

]

общие решения, такие как Onnx Runtime , разрешают экспортировать модели ML для интеграции приложений, но они не оптимизированы для процессоров или достаточно гибки для обобщенных алгоритмов.

]

enter jax , библиотека Python, которая:

    ]
  • позволяет записать оптимизированные алгоритмы ML и общего назначения.
  • ]
  • предлагает платформу-алкогольную выполнение на процессорах, графических процессорах и TPU.
  • ]
  • поддерживает передовые функции, такие как autograd и jit compilation .
  • ]
]

В этой статье мы покажем вам, как:

]
    ]
  1. написать программы JAX в Python.
  2. ]
  3. генерировать спецификации XLA.
  4. ]
  5. развернуть оптимизированный код JAX в DART с использованием c ffi .
  6. ]
]
]

] ? Что такое JAX?

]

jax похоже на Numpy на стероидах. Разработанная Google, это низкоуровневая, высокопроизводительная библиотека, которая делает ML доступной, но мощной.

]
    ]
  • ] платформу agnostic : код работает на процессорах, графических процессорах и TPU без модификации.
  • ]
  • ] speed : питание от компилятора XLA, JAX оптимизирует и ускоряет выполнение.
  • ]
  • ] гибкость : идеально подходит для моделей ML и общих алгоритмов.
  • ]
]

вот пример сравнения Numpy и 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 в Google Colab раскрывает Edge Jax's Performance:

]
    ]
  • ] CPU & gpu : JAX быстрее Numpy.
  • ]
  • ] TPU : ускорение становятся заметными для крупных моделей из-за затрат на передачу данных.
  • ]
]

Эта гибкость и скорость делают JAX идеальным для производственных сред, где производительность является ключевой.

]


] Running a JAX Program from Dart Using C   FFI

]
]

] ? ️ привлечение JAX в производство

]

] Облачные микросервисы против локального развертывания

]
    ]
  • ] Cloud : контейнерные микросервисы Python отлично подходят для облачной вычислительной работы.
  • ]
  • ] local : доставка интерпретатора Python не идеальна для локальных приложений.
  • ]
]

] Решение: используйте компиляцию JAX XLA

]

JAX переводит код Python в спецификации HLO (оптимизатор высокого уровня). Это включает: ] ] написание алгоритмов в Python.

]
    запустить их изначально через библиотеку C.
  1. ]
  2. интеграция с DART через
  3. ffi (интерфейс иностранной функции)
  4. .
  5. ] ] ]
  6. ] ✍ Пошаговая интеграция
]
] 1. Сгенерируйте прото HLO

]

напишите свою функцию JAX и экспортируйте его представление HLO. Например:

]

импортировать jax.numpy как jnp def fn (x, y, z): вернуть jnp.dot (x, y) / z
]

Чтобы сгенерировать HLO, используйте сценарий
import jax.numpy as jnp  

def fn(x, y, z):  
  return jnp.dot(x, y) / z  
из 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
]

поместите полученные файлы (fn_hlo.txt и fn_hlo.pb) в каталоге активов вашего приложения.
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
]

] 2. Создайте динамическую библиотеку C

]
] Изменить пример JAX C Пример кода

]

клонировать репозиторий JAX и перейдите к

jax/examples/jax_cpp

.

] ] добавить файл заголовка main.h:

]
    ]
  • #ifndef main_h #define main_h Внешний "C" { int bar (int foo); } #endif
  • ]
]
#ifndef MAIN_H  
#define MAIN_H  

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

#endif  
build
    для создания общей библиотеки:
  • ] ] cc_shared_library ( name = "jax", deps = [": main"], видимость = ["// видимость: public"], )
  • ]
компилируется с Bazel:
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  
]

Bazel Build Примеры/JAX_CPP: JAX
]

вы найдете скомпилированный libjax.dylib в выходном каталоге.
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
]

] 3. Подключите DART с C, используя FFI

]
используйте пакет Dart

ffi

, чтобы общаться с библиотекой C. Создайте файл jax.dart:

] import 'dart: ffi'; Import 'Package: dynamic_library/dynamic_library.dart'; typedef foocfunc = int32 функция (int32 bar); typedef foodartfunc = int function (int bar); класс jax { Поздняя окончательная динамика Dylib; Jax () { dylib = LoadDynamicLibrary (LibraryName: 'JAX'); } Функция get _bar => dylib.lookupfunction ('bar'); int bar (int foo) { вернуть _bar (foo); } }
]

включите динамическую библиотеку в свой каталог проектов. Проверьте это с помощью:
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  
]

final jax = jax (); Печать (JAX.BAR (42));
]

вы увидите выход из библиотеки C в вашей консоли.
final jax = JAX();  
print(jax.bar(42));  
]

] ? Следующие шаги

]
с этой настройкой вы можете:

]

]

оптимизируйте модели ML с JAX и XLA.

]
    запустить мощные алгоритмы локально.
  • ]
  • ]
  • потенциальные варианты использования включают:
]

]

алгоритмы поиска
    (например, a*).
  • ] ] комбинаторная оптимизация
  • (например, планирование).
  • ] ] обработка изображения
  • (например, обнаружение края).
  • ] ] JAX Brids Brids между разработкой на основе Python и производительности на уровне производства, позволяя инженерам ML сосредоточиться на алгоритмах, не беспокоясь о низком уровне C-коде.
  • ]
]

]

мы создаем передовую платформу ИИ с неограниченными токенами в чате и долговременной памятью, обеспечивая бесшовные, контекстные взаимодействия, которые развиваются со временем.
]
это полностью бесплатно, и вы также можете попробовать его внутри своей текущей IDE.

]

]

]

]
] Running a JAX Program from Dart Using C   FFI]

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/nikl/running-a-jax-program-from-dart-using-c-ffi-45po?1.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3