الحوسبة المتوازية أو الموزعة هي في حد ذاتها شيء تافه للغاية. يجب دعم بيئة التطوير على حد سواء ، ويجب أن يكون لدى اختصاصي DS المهارات اللازمة لإجراء الحوسبة المتوازية ، ويجب تقليص المهمة إلى شكل يمكن تقسيمه إلى أجزاء ، في حالة وجودها. ولكن مع اتباع نهج كفء ، يمكنك تسريع حل المشكلة بشكل كبير من خلال R ذو الخيط المفرد ، إذا كان لديك على الأقل معالج متعدد النواة (ويوجد لدى الجميع تقريبًا الآن) ، معدلة وفقًا للحد الأقصى للتسريع النظري الذي يحدده قانون Amdal . ومع ذلك ، في بعض الحالات ، حتى يمكن التحايل عليه.
إنه استمرار للمنشورات السابقة .
نهج نموذجي
كقاعدة عامة ، عندما يحاول محلل (متخصص DS ، مطور ، أو يختار أي اسم مناسب لك) تسريع المهمة داخل جهاز كمبيوتر واحد ويبدأ في الانتقال من وضع مترابط واحد إلى وضع متعدد الخيوط ، فإنه يقوم بذلك بطريقة متقلبة. parApply
، foreach\%dopar%
، إلخ. يمكنك أن ترى بشكل مضغوط ومفهوم ، على سبيل المثال ، هنا: "Parallelism in R" . 3 خطوات:
- جعل
core-1
موضوع - تشغيل باستخدام
foreach
، - اجمع الإجابات واحصل على النتيجة.
بالنسبة لمهام الحوسبة النموذجية التي تشغل 100٪ من وحدة المعالجة المركزية ولا تتطلب نقل كمية كبيرة من معلومات الإدخال ، فهذه هي الطريقة الصحيحة. النقطة الرئيسية التي تحتاج إلى عناية هي توفير تسجيل الدخول داخل الخيوط من أجل التمكن من التحكم في العملية. بدون تسجيل ، سوف تستمر الرحلة حتى بدون أدوات.
في حالة المهام "المؤسسية" ، عند موازنتها ، تنشأ العديد من الصعوبات المنهجية الإضافية التي تقلل بشكل كبير من تأثير النهج المباشر أعلاه:
- احتمال عدم الاتزان القوي للحمل على التدفقات ؛
- يمكن تمزيق متطلبات أداء وحدة المعالجة المركزية ضمن مهمة واحدة مع بضع رشقات حادة فقط ؛
- قد تتطلب كل عملية حساب فردية مقدارًا كبيرًا من الذاكرة لإدخال وإخراج النتائج ذات الحجم الكبير أيضًا ؛
- كجزء من مهمة منفصلة ، قد يكون هناك مزيج بين الحوسبة والعمل مع القرص واستعلام الأنظمة الخارجية.
هذا سيناريو نموذجي تمامًا عندما تحتاج ، كجزء من العملية ، إلى الحصول على وظيفة ضخمة كمدخلات ، وقراءة البيانات من القرص ، والتقاط جزء كبير من قاعدة البيانات ، وطلب أنظمة خارجية وانتظر إجابة منها (الكلاسيكية - طلب REST API) ، ثم العودة N إلى العملية الأصل ميغابايت نتيجة لذلك.
Map-reduce
بواسطة المستخدمين والمواقع والمستندات وعناوين بروتوكول الإنترنت والتواريخ و ... (قم بإضافتها بنفسك). في معظم الحالات الحزينة ، قد يكون التنفيذ الموازي أطول من الخيوط المفردة. قد تحدث مشكلات نفاد الذاكرة. هل ذهب كل شيء؟ لا على الإطلاق.
طريقة بديلة
النظر في أطروحة وسيلة لتحسين الوضع جذريا. في نفس الوقت ، لا ننسى أننا نعيش في إطار حديقة حيوانات كاملة. دارة *nix
على *nix
، أجهزة DS المحمولة على Win * nix \ MacOS ، لكن من الضروري أن تعمل بشكل موحد في كل مكان.
- microtask: تلقى إدخال المستخدم ، وطلب قاعدة بيانات ، وطلب 2 المرحلية الخارجية عبر REST ، وتنزيلها وتحليلها دليل من القرص ، وأجرى عملية حسابية ، ملقاة النتيجة إلى disk \ database. المستخدمون ، على سبيل المثال ،
10^6
. - ننتقل إلى استخدام الحزمة
future
ومحول doFuture
العالمي. - إذا كانت المهام المنفصلة هي أنه في غضون المهام المنفصلة تكون هناك حاجة لوقت معالج في كمية صغيرة (ننتظر إجابات أنظمة الطرف الثالث) ، ثم يتيح لك
doFuture
التبديل من تقسيم التدفق إلى الانقسام إلى عمليات منفصلة في سطر واحد (يمكنك رؤية معلمات بدء التشغيل في *nix
في htop
) . - يمكن إنشاء هذه العمليات أكثر بكثير من النوى. لن يحدث أي حل لأن العمليات الفردية في وضع الاستعداد معظم الوقت. ولكن سيكون من الضروري تحديد العدد الأمثل للعمليات بشكل تجريبي استنادًا إلى سجل التدوير لعملية معالجة نموذجية.
النتيجة - المهمة الأصلية أسرع عدة مرات. يمكن أن يكون التسارع أكبر من عدد النوى المتاحة.
لا يوجد كود بوعي ، لأن المهمة الرئيسية للنشر هي مشاركة المقاربة ومجموعة ممتازة من الحزم future
.
PS
هناك بعض الفروق الدقيقة الصغيرة التي تحتاج أيضًا إلى تتبع:
- سوف تستهلك كل عملية الذاكرة ، بما في ذلك البيانات المستلمة والمعادة. ستؤدي زيادة عدد العمليات إلى مضاعفة متطلبات RAM المتوفرة.
- يستخدم
doFuture
"magic" لتحديد تكوين المتغيرات والحزم المنقولة تلقائيًا إلى العملية ، ولكن يجب ألا تدع كل شيء يسير بمفرده ، فمن الأفضل التحقق منه. - في العمليات ، لن يضر التحكم الصريح في
gc
العامة والحذف المتغير الصريح باستخدام rm
. هذه ليست حلاً سحريًا وقد لا تعمل ، ولكن الإشارة صراحةً إلى أن الكائنات المحذوفة ستساعد. - بعد اكتمال الحساب ،
plan(sequential)
الاتصال plan(sequential)
. سيؤدي هذا إلى إغلاق جميع العمليات وتحرير الذاكرة التي يشغلونها. - إذا كنت بحاجة إلى نقل كمية كبيرة من البيانات إلى العملية ، ففكر في استخدام وحدة تخزين خارجية (قرص ، قاعدة بيانات). لا تنس أنه لا يمكن نقل الواصفات ، يجب أن يتم فتح المصدر داخل العملية نفسها.
المنشور السابق - "العمليات التجارية في شركات المشاريع: المضاربة والواقع. لقد ألقينا الضوء على R " .