"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > تشغيل برنامج Jax من Dart باستخدام C ++ FFI

تشغيل برنامج Jax من Dart باستخدام C ++ FFI

نشر في 2025-03-23
تصفح:778

؟ لماذا تجمع بين Dart و Jax للتعلم الآلي؟

عند إنشاء التطبيقات ، يكون اختيار الأدوات الصحيحة أمرًا بالغ الأهمية. تريد الأداء العالي ، وتطوير سهلة ، ونشر منصة متعددة السلس. تقدم الأطر الشائعة مقايضات:

  • C يوفر السرعة ولكن يمكن أن يبطئ التطور.
  • Dart (مع رفرفة) أبطأ ولكنه يبسط إدارة الذاكرة وتطوير المنصات.

ولكن إليك The Catch: معظم الأطر تفتقر إلى الدعم التعلم الآلي الأصلي (ML) دعم. هذه الفجوة موجودة لأن هذه الأطر تسبق طفرة الذكاء الاصطناعي. السؤال هو:

كيف يمكننا دمج ML بكفاءة في التطبيقات؟

حلول شائعة مثل onnx Runtime تسمح بتصدير نماذج ML لتكامل التطبيق ، ولكن لم يتم تحسينها في وحدات المعالجة المركزية أو مرنة بما يكفي للخوارزميات المعممة.

أدخل Jax ، مكتبة Python التي:

  • يتيح كتابة خوارزميات ML المحسّنة والخوارزميات للأغراض العامة.
  • يوفر
  • تنفيذًا من النظام الأساسي على وحدات المعالجة المركزية ، وحدات معالجة الرسومات ، و TPUs.
  • يدعم الميزات المتطورة مثل autograd و jit compilation .

في هذه المقالة ، سنعرض لك كيفية:

  1. اكتب برامج Jax في Python.
  2. إنشاء مواصفات XLA.
  3. نشر رمز Jax المحسّن في Dart باستخدام C ffi .

؟ ما هو جاكس؟

jax يشبه numpy على المنشطات. تم تطويرها بواسطة Google ، وهي مكتبة منخفضة المستوى وعالية الأداء تجعل ML متاحة ولكنها قوية.

  • النظام الأساسي الأساسي : يتم تشغيل الكود على وحدات المعالجة المركزية ، وحدات معالجة الرسومات ، و TPUs دون تعديل.
  • السرعة : مدعوم من برنامج التحويل البرمجي 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)  

المعايير في Google Colab تكشف عن حافة أداء Jax:

  • CPU و GPU : Jax أسرع من Numpy.
  • TPU : تصبح عمليات السرعة ملحوظة للنماذج الكبيرة بسبب تكاليف نقل البيانات.

هذه المرونة والسرعة تجعل Jax مثالية لبيئات الإنتاج حيث يكون الأداء مفتاحًا.


Running a JAX Program from Dart Using C   FFI


️ إدخال جاكس في الإنتاج

الخدمات المجهرية السحابية مقابل النشر المحلي

  • Cloud : تعتبر الخدمات الدقيقة Python ذات الحاويات رائعة للحساب المستند إلى مجموعة النظراء.
  • Local : شحن مترجم Python ليس مثاليًا للتطبيقات المحلية.

الحل: استفادة من مجموعة XLA من Jax

يترجم Jax رمز Python إلى HLO (محسن المستوى العالي) المواصفات ، والتي يمكن تجميعها وتنفيذها باستخدام C XLA Libraries . هذا يمكّن:

  1. كتابة خوارزميات في بيثون.
  2. تشغيلها أصليًا عبر مكتبة C.
  3. الاندماج مع Dart عبر FFI (واجهة الوظيفة الأجنبية) .

✍ تكامل خطوة بخطوة

1. إنشاء بروتو HLO

اكتب وظيفة Jax الخاصة بك وتصدير تمثيل HLO الخاص بها. على سبيل المثال:

import jax.numpy as jnp  

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

لإنشاء HLO ، استخدم البرنامج النصي jax_to_ir.py من مستودع 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

ضع الملفات الناتجة (fn_hlo.txt و fn_hlo.pb) في دليل أصول التطبيق الخاص بك.


2. بناء مكتبة ديناميكية C

تعديل رمز مثال جاكس ج

استنساخ مستودع jax وانتقل إلى jax/أمثلة/jax_cpp .

  • أضف ملف رأس main.h:
#ifndef MAIN_H  
#define MAIN_H  

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

#endif  
  • قم بتحديث ملف
cc_shared_library ( name = "jax" ، DEPS = [": Main"] ، الرؤية = ["// الرؤية: عامة"] ، )
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  
ترجمة مع Bazel:


Bazel Build Ampruments/Jax_CPP: Jax
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  
ستجد libjax.dylib المترجمة في دليل الإخراج.


3. قم بتوصيل Dart باستخدام C باستخدام FFI

استخدم حزمة Dart's

ffi للتواصل مع مكتبة C. إنشاء ملف jax.dart:

استيراد 'dart: ffi' ؛ استيراد "الحزمة: Dynamic_Library/Dynamic_Library.dart" ؛ typedef foocfunc = int32 وظيفة (int32 شريط) ؛ typedef foodartfunc = int وظيفة (int bar) ؛ فئة jax { Dynamiclibrary النهائي المتأخر ؛ jax () { dylib = loadDynamicLibrary (LibraryName: 'Jax') ؛ } وظيفة الحصول على _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)) ؛
cc_shared_library(  
   name = "jax",  
   deps = [":main"],  
   visibility = ["//visibility:public"],  
)  
سترى الإخراج من مكتبة C في وحدة التحكم الخاصة بك.


؟ الخطوات التالية

مع هذا الإعداد ، يمكنك:

    تحسين نماذج ML مع Jax و XLA.
  • قم بتشغيل خوارزميات قوية محليًا.
تشمل حالات الاستخدام المحتملة:

  • بحث خوارزميات (على سبيل المثال ، A*).
  • التحسين التوافقي (على سبيل المثال ، الجدولة).
  • معالجة الصور (على سبيل المثال ، الكشف عن الحافة).
Jax يسد الفجوة بين التطوير القائم على 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] لحذفها.
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3