unxt: A Python package for unit-aware computing with JAX
تقدم الورقة البحثية **unxt**، وهي حزمة بلغة بايثون مبنية على إطار عمل **quax**، تدمج **astropy.units** مع **JAX** لتمكين الحوسبة العلمية السلسة وعالية الأداء والواعية بالوحدات.
المؤلفون الأصليون:Nathaniel Starkman, Adrian Price-Whelan, Jake Nibauer
تخيل أنك طاهٍ في مطبخ فائق السرعة. لديك مساعد آلي سريع للغاية (لنطلق عليه اسم JAX) يمكنه تقطيع، وخلط، وطهي المكونات بسرعة أكبر من أي إنسان يمكنه القيام بذلك. يمكنه حتى التنبؤ بدقة بكيفية تغير النكهات إذا قمت بتعديل الوصفة، وهو يفعل كل ذلك على أنواع مختلفة من المواقد (CPUs، GPUs، TPUs) دون أن يبذل مجهوداً يذكر.
ومع ذلك، هناك عقبة: JAX لا يفهم سوى الأرقام الخام. هو لا يعرف الفرق بين "5 أكواب من الدقيق" و"5 أرطال من السكر". إذا أخبرته أن يضيف 5 أكواب إلى 5 أرطال، فسيقوم ببساطة بجمع الأرقام معاً ليحصل على "10" ويقدم لك كارثة. في العالم الحقيقي، يمكن أن يؤدي الخلط بين الوحدات (مثل حادثة مسبار "مارس كليمت أوربيتر" الشهيرة، حيث استخدم أحد الفريقين النظام المتري والآخر الإمبراطوري) إلى إخفاقات كارثية.
إليك unxt.
ما هو unxt؟
فكر في unxt كمترجم ذكي وحارس سلامة يجلس بينك وبين الروبوت فائق السرعة.
المترجم: يأخذ تعليماتك من "العالم الحقيقي" (مثل "5 أمتار في الثانية") ويترجمها إلى تنسيق يفهمه الروبوت، مع الاحتفاظ بوسم (Tag) على كل رقم يقول: "مهلاً، هذا طول!" أو "هذا زمن!".
حارس السلامة: إذا حاولت القيام بشيء سخيف، مثل إضافة "5 أمتار" إلى "5 ثوانٍ"، فإن المترجم يوقفك فوراً ويقول: "مهلاً، لا يمكنك خلط هذين النوعين!". هذا يمنع الروبوت من ارتكاب خطأ قد يؤدي إلى إفساد تجربتك أو إرسال صاروخك إلى الكوكب الخطأ.
كيف يعمل؟
يشرح البحث أن unxt مبني فوق إطار عمل يسمى quax.
Quax هو بمثابة محول عالمي يسمح للروبوت (JAX) بالتحدث مع كائنات خاصة ومخصصة.
يستخدم unxt هذا المحول لإنشاء نوع خاص من "الأرقام الذكية" (يسمى Quantity) يعرف أن لديه وحدات مرفقة به.
كما يستخدم مكتبة Astropy (وهي موسوعة ضخمة وموثوقة للوحدات المستخدمة لدى علماء الفلك) كدماغ له لمعرفة معنى "الكيلوغرام" أو "السنة الضوئية".
لماذا نحتاج إليه؟
قبل ظهور unxt، كان على العلماء الذين يريدون استخدام الروبوت فائق السرعة (JAX) الاختيار بين:
الخيار أ: استخدام JAX من أجل السرعة، ولكن فقدان القدرة على التحقق من الوحدات (وهذا أمر خطير!).
الخيار ب: استخدام مكتبة مثل Astropy أو Pint للتحقق من الوحدات، ولكن فقدان سرعة وقوة JAX (وهذا أمر بطيء!).
يحل unxt هذه المشكلة من خلال السماح لك بالاستمتايد بالطرفين معاً. فهو يتيح لك كتابة كود برمجي يكون:
سريعاً: يعمل على محرك JAX عالي السرعة.
آمناً: يتحقق تلقائياً من أنك لا تخلط بين التفاح والبرتقال.
سهلاً: يبدو مألوفاً للعلماء الذين يستخدمون Astropy بالفعل، لذا ليس عليهم تعلم لغة جديدة تماماً.
الخلاصة
unxt هو جسر. إنه يربط بين العالم الفوضوي والمعقد للقياسات الفيزيائية (أمتار، ثوانٍ، كيلوغرامات) وبين العالم النظيف وفائق السرعة لعلوم الحاسوب الحديثة. إنه يضمن أنه عندما يقوم العلماء بتشغيل عمليات محاكاة معقدة — سواء كانت للتنبؤ بالطقس، أو الفيزياء الفلكية، أو الهندسة — فإن الرياضيات ليست سريعة فحسب، بل هي أيضاً صحيحة.
باختصار: إنه شبكة الأمان التي تسمح للروبوت فائق السرعة بالطهي دون حرق المطبخ.
بناءً على الورقة المقدمة، إليك ملخص تقني مفصل لـ unxt، يغطي بيان المشكلة، والمنهجية، والمساهمات الرئيسية، والنتائج، والأهمية.
1. بيان المشكلة
تحدد الورقة فجوة حرجة في منظومة الحوسبة العلمية عالية الأداء: غياب الدعم الأصيل لـ الحوسبة المدركة للوحدات (unit-aware computing) داخل إطار العمل JAX.
قصور JAX: بينما يتفوق JAX في التفاضل التلقائي، والترجمة الفورية (JIT)، والتسريع العتادي (CPUs, GPUs, TPUs)، إلا أنه يعمل أساساً على مصفوفات "نقية". فهو يفتقر إلى القدرة على تعريف كائنات تشبه المصفوفات تحمل وحدات فيزيائية (مثل الأمتار أو الثواني) دون كسر نموذج تنفيذ JAX.
قصور Astropy: توفر مكتبة Astropy، وهي المعيار القياسي لعلم الفلك والفيزياء، معالجة قوية للوحدات عبر astropy.units (المستخدمة في أكثر من 10,000 استشهاد). ومع ذلك، فإن astropy.units مبنية على NumPy ولا يمكن توسيعها مباشرة لتعمل مع أسلوب البرمجة الوظيفية لـ JAX أو متطلبات الترجمة الفورية (JIT) الخاصة به.
النتيجة: هذا الانفصال يجبر الباحثين على الاختيار بين قدرات الأداء والتفاضل في JAX وبين سلامة وصحة الحسابات المرتبطة بالوحدات. هذا المقايضة تزيد من خطر وقوع أخطاء كارثية في المحاكاة العلمية (مثل عدم تطابق الوحدات الذي تسبب في حادثة مسبار مارز كلايمت أوربيتر).
2. المنهجية
طوّر المؤلفون unxt كحزمة برمجية بلغة بايثون لسد هذه الفجوة عبر خلق تكامل سلس بين JAX وإدارة الوحدات. تعتمد المنهجية على بنية متعددة الطبقات:
الأساس على Quax: بُنيت unxt فوق إطار quax (Kidger, 2023)، وهو إطار مصمم لإنشاء كائنات تشبه المصفوفات متوافقة مع JAX. يسمح Quax بتعريف أنواع مخصصة يمكن لـ JAX التعرف عليها وتفريقها.
تكامل الخلفية (Backend): تستخدم unxt مكتبة astropy.units كخلفية لمعالجة تحويل الوحدات والمنطق الفيزيائي. يضمن هذا التوافق مع المعايير الراسخة في المجتمع العلمي.
فئة الكمية (The Quantity Class): الابتكار الجوهري هو تعريف فئة Quantity. تقوم هذه الفئة بتغليف مصفوفات البيانات وإلحاق بيانات وصفية (metadata) للوحدات بها.
التوزيع المتعدد والتجاوز (Multiple Dispatch & Overrides): لجعل كائنات Quantity تعمل مع JAX، تستفيد unxt من التوزيع المتعدد (multiple dispatch) لتوفير مجموعة شاملة من عمليات التجاوز (overrides) للعمليات الأولية في JAX. يتيح ذلك لوظائف JAX (مثل jnp.add و jnp.sin وما إلى ذلك) العمل بشفافية على كائنات Quantity مع نشر الوحدات تلقائياً عبر الحسابات.
تصميم الواجهة: تقدم الحزمة إطار عمل موجه نحو الوظائف (function-oriented) يتسق مع أسلوب JAX، مع الحفاظ على واجهة موجهة للكائنات (object-oriented) مألوفة لمستخدمي astropy.units. هذا النهج المزدوج يقلل من منحنى التعلم للمستخدمين الحاليين مع الالتزام بأفضل ممارسات JAX.
3. المساهمات الرئيسية
أول نظام وحدات أصيل لـ JAX: تعد unxt أول حزمة توفر طبقة حوسبة مدركة للوحدات تعمل بكامل طاقتها ومُحسّنة خصيصاً لمنظومة JAX.
التوافق السلس: تتيح استخدام منطق astropy.units داخل كود JAX دون الحاجة من المستخدمين لإدارة تحويلات الوحدات يدوياً أو القلق بشأن التداخل مع JAX.
المرونة في أنظمة الوحدات: تدعم الحزمة التعريفات الساكنة والديناميكية لأنظمة الوحدات، مما يوفر المرونة عبر مختلف البيئات الحسابية.
القابلية للتوسع: من خلال الاستفادة من التوزيع المتعدد، صُممت unxt لتكون قابلة للتوسع لتشمل مكتبات أخرى (تدعم حالياً astropy والكائنات الأخرى التي تشبه المصفوفات)، مما يجعلها مركزاً للتوافق المدرك للوحدات.
الحفاظ على الأداء: يضمن التصميم أن معالجة الوحدات لا تخل بمزايا JAX الأساسية: التفاضل التلقائي، والترجمة الفورية (JIT)، والتسريع العتادي.
4. النتائج
التكامل الوظيفي: تُظهر الورقة أن unxt تسمح للمستخدمين بنجاح بإجراء حسابات مدركة للوحدات دون عناء، حيث يتم التعامل مع العمليات المتعلقة بالكميات الفيزيائية بشكل صحيح ومتسق.
منع الأخطاء: من خلال فرض اتساق الوحدات على مستوى الكود، تخفف الحزمة من خطر أخطاء الأبعاد في الحسابات العلمية.
سهولة الاستخدام: وُصفت الواجهة بأنها بديهية وسهلة الاستخدام، مما يسهل التنفيذ المباشر للوحدات في قواعد أكواد JAX الحالية.
التحقق المجتمعي: يضم فريق التطوير المطورين الأساسيين لـ astropy.units مما يضمن توافق الحزمة مع المعايير العلمية الراسخة. تم عرض العمل ومناقشته في ورشة عمل JAXtronomy لعام 2024، مما يشير إلى التفاعل المبكر من المجتمع.
5. الأهمية
السلامة العلمية: تعالج unxt قضية سلامة جوهرية في العلوم الحسابية عبر منع الأخطاء المتعلقة بالوحدات التي قد تؤدي إلى إخفاقات علمية أو هندسية جسيمة.
تمكين الفيزياء المتقدمة: تفتح الآفاق الكاملة لـ JAX في التطبيقات العلمية التي تتطلب قيوداً فيزيائية صارمة، مثل الفيزياء الفلكية، وعلم الكونيات، والمحاكاة الهندسية، حيث يكون اتساق الوحدات أمراً غير قابل للتفاوض.
الربط بين المنظومات: تربك الفجوة بفعالية بين منظومة Astropy الغنية بالوحدات والناضجة، ومنظومة JAX عالية الأداء والقابلة للتفاضل.
الاستعداد للمستقبل: مع توجه الحوسبة العلمية نحو البرمجة التفاضلية والتعلم الآلي على الأنظمة الفيزيائية، توفر unxt البنية التحتية اللازمة لضمان بقاء هذه النماذج متجذرة فيزيائياً وقابلة للتفسير.
باختصار، تعد unxt أداة بنية تحتية حيوية تساهم في جعل الحوسبة عالية الأداء والمدركة للوحدات متاحة للجميع في JAX، حيث تجمع بين سرعة التسريع العتادي الحديث ودقة إدارة الوحدات الفيزيائية.