تسريع numpy ، scikit و pandas 100 مرة مع Rust و LLVM: مقابلة مع المطور Weld

مرحبا يا هابر! أقدم لكم ترجمة المقال "مقابلة مع المساهم الرئيسي في Weld: تسريع numpy ، scikit و pandas بقدر 100x مع Rust و LLVM" .

بعد العمل لعدة أسابيع باستخدام أدوات علوم البيانات في Python و R ، بدأت أتساءل عما إذا كان هناك أي تمثيل وسيط (IR) مثل CUDA يمكن استخدامه بلغات مختلفة. يجب أن يكون هناك شيء أفضل من إعادة التطبيق وتحسين نفس الأساليب في كل لغة. بالإضافة إلى ذلك ، سيكون من الجيد أن يكون لديك وقت تشغيل مشترك لتحسين البرنامج بالكامل ، بدلاً من كل وظيفة على حدة.

بعد عدة أيام من البحث واختبار المشاريع المختلفة ، وجدت Weld(يمكنك قراءة المقال الأكاديمي ).

لدهشتي ، أحد مؤلف Weld هو Matei Zaharia (Matei Zaharia) ، مبتكر Spark.

لذا ، اتصلت بشوميك بالكار ، المساهم الرئيسي في ويلد ، وأجريت معه مقابلة. Showmick هو طالب دراسات عليا في قسم علوم الكمبيوتر في جامعة ستانفورد ، حيث دخل بناء على نصيحة Matey Zakharia.

Weld ليس جاهزًا بعد للاستخدام الصناعي ، ولكنه واعد جدًا. إذا كنت مهتمًا بمستقبل علوم البيانات ورست على وجه الخصوص ، فستحب هذه المقابلة.

إعلان عن كاتب المقال الأصلي
image
«Not a Monad Tutorial», Weld . !

, mail@fcarrone.com @unbalancedparen.

ما الذي تم تصميمه من أجل Weld ، ما هي المشاكل التي يحلها؟


هدف Weld هو زيادة الإنتاجية للتطبيقات التي تستخدم واجهات برمجة تطبيقات عالية المستوى مثل NumPy و Pandas. المشكلة الرئيسية التي يحلها هي التحسينات عبر الوظائف والمكتبات المختلفة التي لا توفرها المكتبات الأخرى اليوم. على وجه الخصوص ، تحتوي العديد من المكتبات المستخدمة على نطاق واسع على تطبيقات حديثة للخوارزميات للوظائف الفردية (على سبيل المثال ، خوارزمية الانضمام السريع التي يتم تنفيذها في Pandas بواسطة C ، أو مضاعفة المصفوفة السريعة في NumPy) ، لكنها لا توفر إمكانية تحسين مزيج هذه الوظائف. على سبيل المثال ، منع عمليات مسح الذاكرة غير الضرورية عند إجراء ضرب المصفوفة متبوعًا بالتجميع.

يوفر Weld بيئة تشغيل مشتركة تسمح للمكتبات بالتعبير عن الحسابات في تمثيل وسيط مشترك (IR). يمكن بعد ذلك تحسين IR باستخدام مُحسِّن المترجم ، ثم تجميعه على الفور (JIT) في رمز آلة متوازية مع تحسينات مثل دمج الحلقة ، والتوجيه ، إلخ. يكون IR الخاص بـ Weld متوازيًا مبدئيًا ، لذا يمكن دائمًا موازاة البرامج التي تم التعبير عنها فيه بشكل بسيط.

لدينا أيضًا مشروع جديد يسمى التعليقات التوضيحية المنفصلة ، والذي سيتم دمجه مع Weld ومصمم لتقليل العائق أمام إدراج مثل هذه التحسينات في المكتبات الحالية.

ألن يكون من الأسهل تحسين numpy و pandas و scikit؟ كم أسرع؟


يوفر Weld تحسين مجموعة الوظائف في هذه المكتبات ، بينما يمكن أن يؤدي تحسين المكتبات إلى تسريع استدعاءات الوظائف الفردية فقط. في الواقع ، تم تحسين العديد من هذه المكتبات بشكل جيد للغاية لكل وظيفة فردية ، ولكنها تقدم أداءًا دون حدود المعدات الحديثة ، لأنها لا تستخدم التوازي أو لا تستخدم التسلسل الهرمي للذاكرة بكفاءة.

على سبيل المثال ، يتم تنفيذ العديد من وظائف NumPy للصفائف متعددة الأبعاد (ndarray) في لغة C ذات المستوى المنخفض ، ولكن استدعاء كل وظيفة يتطلب مسحًا كاملاً لبيانات الإدخال. إذا كانت هذه المصفوفات لا تتناسب مع ذاكرة التخزين المؤقت لوحدة المعالجة المركزية ، يمكن قضاء معظم وقت التنفيذ في تحميل البيانات من الذاكرة الرئيسية ، بدلاً من إجراء العمليات الحسابية. يمكن لـ Weld عرض مكالمات الوظائف الفردية وتنفيذ التحسينات ، مثل دمج الحلقات التي ستقوم بتخزين البيانات في ذاكرة التخزين المؤقت أو سجلات وحدة المعالجة المركزية. يمكن لهذه التحسينات تحسين الأداء بأكثر من ترتيب الحجم في الأنظمة متعددة النواة ، لأنها توفر قابلية تطوير أفضل.

صورة

تكامل نماذج Weld الأولية مع Spark (أعلى اليسار) و NumPy (أعلى اليمين) و TensorFlow (أسفل اليسار) تظهر تحسنًا يصل إلى 30 ضعفًا على تطبيقات البنية التحتية الخاصة بهم دون تغيير رمز تطبيق المستخدم. يمكن أن يؤدي التحسين عبر المكتبات لكل من Pandas و NumPy (أسفل اليمين) إلى تحسين الأداء بمقدار أمرين.

ما هو بالو؟


Baloo هي مكتبة تنفذ مجموعة فرعية من Pandas API باستخدام Weld. تم تطويره من قبل Radu Jica ، ماجستير في CWI (Centrum Wiskunde & Informatica ، أمستردام). الهدف من Baloo هو تطبيق أنواع التحسين المذكورة أعلاه على Pandas لتحسين الأداء المفرد ، وتقليل استخدام الذاكرة ، وضمان التزامن.

هل يدعم Weld / Baloo العمليات الخارجية (مثل Dask مثلاً) لمعالجة البيانات التي لا تتناسب مع الذاكرة؟


لا يدعم Weld و Baloo حاليًا العمليات الخارجية (خارج الذاكرة ، الذاكرة الخارجية) ، على الرغم من أننا سنكون سعداء بتلقي تطوير المصادر المفتوحة في هذا الاتجاه!

لماذا اخترت Rust و LLVM لتطبيق Weld؟ أتيت إلى روست على الفور؟


اخترنا الصدأ للأسباب التالية:

  • لديها وقت تشغيل ضئيل (في الواقع ، إنها ببساطة تتحقق من حدود المصفوفات) ومن السهل تضمينها في لغات أخرى مثل Java و Python
  • يحتوي على نماذج برمجة وظيفية ، مثل مطابقة الأنماط ، مما يجعل كتابة التعليمات البرمجية أسهل ، على سبيل المثال ، لتحسين مترجم مطابقة الأنماط
  • ( Rust crates), .

لقد اخترنا LLVM لأنه إطار تجميع مفتوح المصدر يستخدم ويدعم على نطاق واسع. نقوم بإنشاء LLVM مباشرة بدلاً من C / C ++ ، لذلك لا نحتاج إلى المترجم C. كما أنه يقلل من وقت الترجمة ، حيث لا نقوم بتحليل كود C / C ++.

لم تكن الصدأ هي اللغة الأولى التي تم فيها تطبيق Weld. كان التطبيق الأول على Scala ، والذي تم اختياره بسبب أنواع البيانات الجبرية ووجود ميزة قوية مثل مطابقة الأنماط. أدى ذلك إلى تبسيط كتابة المُحسِّن ، وهو الجزء الرئيسي من المترجم. تم تصنيع المُحسِّن الأصلي لدينا مثل Catalyst ، وهو مُحسِّن قابل للتوسيع في Spark SQL.

ابتعدنا عن سكالا لأنه كان من الصعب جدًا تضمين اللغة المعتمدة على JVM في أوقات التشغيل واللغات الأخرى.

Weld CPU GPU, RAPIDS, data science Python GPU?


والفرق الرئيسي بين Weld وأنظمة مثل RAPIDS هو أنه يهدف إلى تحسين التطبيقات التي تحتوي على نوى مختلفة (وظائف بشروط CUDA) من خلال الترجمة الفورية ، وليس في تحسين تنفيذ الوظائف الفردية. على سبيل المثال ، ستقوم الواجهة الخلفية لـ Weld GPU بتجميع نواة CUDA واحدة محسنة للتطبيق النهائي ، بدلاً من استدعاء نواة منفصلة.

بالإضافة إلى ذلك ، Weld IR مستقل عن الأجهزة ، مما يسمح باستخدامه لكل من وحدة معالجة الرسومات ووحدة المعالجة المركزية ، بالإضافة إلى المعدات غير القياسية مثل المعالجات الموجهة.
بالطبع ، يتقاطع Weld بشكل أساسي مع مشاريع أخرى في نفس المجال ، بما في ذلك RAPIDS ، ويتم إنشاؤه تحت تأثيرهم.

تشارك بيئات وقت التشغيل مثل Bohrium (تنفذ الحوسبة البطيئة في NumPy) و Numba (مكتبة Python ، مترجم كود JIT) أهداف Weld عالية المستوى. وتؤثر أنظمة التحسين مثل Spark SQL بشكل مباشر على تصميم Weld.

هل لدى Weld استخدامات أخرى إلى جانب تحسينات مكتبة علوم البيانات؟


أحد أكثر جوانب Weld IR إثارة هو أنه يدعم تزامن البيانات. هذا يعني أن التوازي العرقي في Weld IR آمن دائمًا. هذا يجعل Weld IR جذابة لأنواع جديدة من المعدات.

على سبيل المثال ، استخدم موظفو NEC Weld لتشغيل أحمال عمل Python على معالج متجه مخصص لعرض النطاق الترددي العالي ، ببساطة إضافة خلفية خلفية جديدة إلى Weld IR موجود.

يمكن أيضًا استخدام IR لتنفيذ طبقة من العمليات الفعلية في قاعدة بيانات. ونخطط لإضافة ميزات تسمح لنا أيضًا بتجميع مجموعة فرعية من Python في رمز Weld.

هل المكتبات جاهزة للاستخدام في المشاريع الحقيقية؟ وإذا لم يكن الأمر كذلك ، فمتى يمكنك توقع نتيجة نهائية؟


يتم أخذ العديد من الأمثلة والمعايير التي اختبرنا عليها هذه المكتبات من عبء العمل الحقيقي. لذلك ، نود حقًا أن يقوم المستخدمون بتجربة الإصدار الحالي في تطبيقاتهم ، وترك ملاحظاتهم. وأفضل ما في الأمر أنهم اقترحوا تصحيحات خاصة بهم.

بشكل عام ، في الوقت الحالي لا يمكن القول أنه في التطبيقات الحقيقية سيعمل كل شيء خارج الصندوق.

ستركز إصداراتنا القادمة على مدار الأشهر القليلة القادمة حصريًا على سهولة وموثوقية مكتبات Python. هدفنا هو جعل المكتبات جيدة بما يكفي لإدراجها في المشاريع الحقيقية. وكذلك القدرة على استخدام إصدارات مكتبة غير ملحومة في أماكن لم يتم إضافة الدعم فيها بعد.

وكما أشرت في السؤال الأول، مشروع الشروح سبليت ( شفرة المصدر و المادة الأكاديمية يجب) تبسيط هذه المرحلة الانتقالية.

انقسام التعليقات التوضيحية هو نظام يسمح لك بإضافة التعليقات التوضيحية إلى التعليمات البرمجية الموجودة لتحديد كيفية تقسيمها وتحويلها وموازنتها. يوفر التحسين الذي نعتبره أكثر فاعلية في Weld (تخزين قطع البيانات في ذاكرة التخزين المؤقت لوحدة المعالجة المركزية بين المكالمات الوظيفية ، بدلاً من مسح مجموعة البيانات بالكامل). لكن التعليقات التوضيحية المنفصلة أسهل بكثير من الدمج من Weld ، لأنها تستخدم كود المكتبة الحالي دون الاعتماد على مترجم IR. كما أنه يسهل الصيانة والتصحيح ، مما يحسن من الموثوقية.

يمكن للمكتبات التي ليس لديها دعم Weld الكامل حتى الآن استخدام التعليقات التوضيحية المنقسمة. سيسمح لنا هذا بإضافة دعم Weld تدريجيًا بناءً على ملاحظات المستخدم ، مع دمج تحسينات جديدة.

All Articles