Xgboost: أفضل تثبيت XGBoost على نظام التشغيل Mac OSX؟

تم إنشاؤها على ١٧ مايو ٢٠١٩  ·  28تعليقات  ·  مصدر: dmlc/xgboost

القضية

حاليًا على نظام MacOS ، تكون عملية تثبيت حزمة python كما يلي.

$ brew install gcc<strong i="7">@5</strong>
$ export CC=/path/to/gcc-5; export CXX=/path/to/g++-5; pip install xgboost

سؤال

ما أود أن أتعلمه من مساهم أكثر خبرة هو ما إذا كانت هناك أية خطط لتبسيط عملية التثبيت هذه؟ ما ورد أعلاه غير صالح لنظام التثبيت الآلي لأي حزمة تعتمد على xgboost. ما هو المطلوب لجعل xgboost متوافقًا مع رنة Apple.

1.0.0 Blocking

التعليق الأكثر فائدة

تم قبول الصيغة بواسطة Homebrew ، لذلك يمكن لمستخدمي Mac الآن القيام بما يلي:

brew install xgboost

ال 28 كومينتر

لا تدعم رنة Apple OpenMP خارج الصندوق ، لذلك هناك حاجة إلى Homebrew GCC. لذا ، لا ، لن يكون XGBoost متوافقًا مع رنة Apple.

أعتقد أنه يمكننا تبسيط العملية من خلال توزيع العجلات الثنائية لنظام التشغيل Mac OSX. ستحتوي العجلات الثنائية على libxgboost.dylib مسبقة الصنع بحيث لا يحتاج المستخدم إلى أي مترجم. (هكذا لا يحتاج مستخدمو Windows إلى تثبيت Visual Studio لاستخدام XGBoost.)

ومع ذلك ، أخشى أن المشرفين (بما فيهم أنا) ليسوا على دراية بالتعبئة الثنائية مع نظام التشغيل Mac OSX ، أي كيفية إنشاء ثنائيات تكون متوافقة على نطاق واسع عبر إصدارات متعددة من OSX. هل لديك أي اقتراحات هنا؟

في الوقت الحالي ، يجب أن تفكر في استخدام conda-forge لأتمتة تثبيت XGBoost على نظام التشغيل Mac OSX.

@ hcho3 شكرا لاستجابتك السريعة! تعتبر Conda بالتأكيد خيارًا ولكن سيكون من الأسهل بكثير استخدام النقطة. سأبحث في الشكل الذي ستبدو عليه العبوات الثنائية على نظام macOS. أنا أيضًا لست على دراية بالتعبئة الثنائية ، لذا فإن مساهمة أي شخص آخر لديه خبرة في هذا المجال ستكون موضع تقدير كبير.

لقد واجهت بعض الصعوبة مع هذه المشكلة نظرًا لأن dylib الذي تنتجه عملية التجميع القياسية يعتمد بشدة على مكتبات homebrew gcc. إذا كان لدى أي شخص طريقة لتغيير هذه التبعية بعد التجميع (أو جعلها عامة عبر إصدارات دول مجلس التعاون الخليجي) فسيكون ذلك رائعًا ، لكنني لا أعتقد أن macOS يأتي مع libgomp (الذي يوفر دعم OpenMP) لذلك قد نحتاج إلى حزم ذلك على النحو التالي حسنًا ، مما يجعل الحياة صعبة.

Craigacp @ hcho3 هل هذا شيء يمكننا التفكير فيه حتى يتم العثور على حل بديل لـ cmakelists. https://github.com/netket/netket/issues/225#issuecomment -502714445. لست على دراية تامة بالأجزاء الداخلية لـ xgboost ، ما مدى أهمية OpenMP في أداء المكتبة.

بدا هذا أيضًا واعدًا ولكني لم أتمكن من تشغيله: https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp.

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

IMHO ، النقطة ليست مصممة للتعامل مع التبعيات الخارجية مثل libomp. من ناحية أخرى ، يمكن لـ conda التعامل مع التبعيات غير المتعلقة ببايثون بنفس السهولة. شاهد هذا المنشور: https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/

كيف يحل Microsoft / LightGBM المشكلة: يطلبون من المستخدمين تشغيل brew install libomp . لست متأكدًا مما إذا كان هذا أسهل من تثبيت GCC أو Conda ، لأنك ستحتاج أولاً إلى تثبيت Homebrew.

@ hcho3 قد يكون حل libomp لتثبيت الشراب أفضل لأنه يمكن توفيره في البرامج النصية للإعداد المسبق ، بينما يتعين حاليًا على المرء فصل xgboost في خطوط أنابيب CI لتحديد إصدارات gcc و g ++ المناسبة. بالتأكيد ، أتفق معك بقدر ما تذهب كوندا وقد ينتهي الأمر بأن يكون هذا هو الحل الوحيد ولكني أردت فقط استكشاف الخيارات الأخرى لمعرفة ما إذا كان أي شيء آخر ممكنًا.

آسف على السؤال المضحك ، ولكن هل OpenMP مطلوب في وقت التشغيل؟ على سبيل المثال ، هل يمكننا تجميع dmlc-core و xgboost مع تثبيت OpenMP ثم تجميع هذا الملف في عجلة بحيث لا يكون التجميع ضروريًا في وقت التثبيت باستخدام أداة مثل Audit_wheel ؟

https://stackoverflow.com/a/42106034

adithyabsk لقد حاولت للتو استخدام brew install libomp والآن يمكنني تجميع XGBoost باستخدام المترجم الافتراضي ، Apple Clang:

brew install libomp
mkdir build
cd build
cmake ..
make -j10

علاوة على ذلك ، فإن الثنائي الناتج libxgboost.dylib يعتمد فقط على /usr/local/opt/libomp/lib/libomp.dylib و libs نظام OSX. (لا مزيد من الاعتماد على إصدار معين من GCC! رائع!) لذلك أفترض أن brew install libomp هي الطريقة الأقل إيلامًا لتثبيت XGBoost على Mac OSX بدون Conda.

ومع ذلك ، لا يزال توزيع الثنائيات المترجمة مسبقًا أمرًا صعبًا. حتى لو قمنا بتضمين libomp.dylib داخل العجلة ، فلن يستخدم Mac OSX الملف ، نظرًا لأن تبعية المكتبة المشتركة محددة بالمسار الكامل :

hcho3<strong i="17">@localhost</strong>: xgboost$ otool -l libxgboost.dylib    # show list of library dependencies

libxgboost.dylib:
Mach header
      magic cputype cpusubtype  caps    filetype ncmds sizeofcmds      flags
 0xfeedfacf 16777223          3  0x00           6    15       2112 0x00918085
....
Load command 10
          cmd LC_LOAD_DYLIB
      cmdsize 64
         name /usr/local/opt/libomp/lib/libomp.dylib (offset 24)
   time stamp 2 Wed Dec 31 16:00:02 1969
      current version 5.0.0
compatibility version 5.0.0
Load command 11
          cmd LC_LOAD_DYLIB
      cmdsize 48
         name /usr/lib/libc++.1.dylib (offset 24)
   time stamp 2 Wed Dec 31 16:00:02 1969
      current version 400.9.0
compatibility version 1.0.0
Load command 12
          cmd LC_LOAD_DYLIB
      cmdsize 56
         name /usr/lib/libSystem.B.dylib (offset 24)
   time stamp 2 Wed Dec 31 16:00:02 1969
      current version 1252.50.4
compatibility version 1.0.0

من ناحية أخرى ، يكون Windows أكثر مرونة عندما يتعلق الأمر بتحديد موقع المكتبات المشتركة. لقد وجدت أنه يكفي تضمين vcomp140.dll (وقت تشغيل OpenMP) داخل العجلة.

@ hetong007 ملاحظة ذات صلة: يجب أيضًا تمكين brew install libomp متعدد مؤشرات الترابط لـ CRAN XGBoost على Mac OSX

@ hcho3 أعتقد ذلك. تستدعي حزمة XGBoost R نفس واجهة API الخلفية وبالتالي يجب أن تتصرف بنفس الطريقة.

@ hcho3 هذا تطور رائع! تتحرك بالفعل في الاتجاهات الصحيحة حيث يمكنني أن أشهد أن تثبيت xgboost في الكثير من معامل البحث والتطوير يمثل نقطة ألم لأولئك الذين ليسوا على دراية وثيقة بمتطلباتها الداخلية.

متابعة هذه الملاحظة:

لن يستخدم نظام التشغيل Mac OSX الملف ، حيث يتم تحديد تبعية المكتبة المشتركة بالمسار الكامل

ربما يمكننا النظر أكثر في هذه المشكلة بالذات لمعرفة ما إذا كان هناك أي حلول بديلة لإدخال libomp.dylib في العجلة الثنائية.

@ hcho3 يمكن أيضا أن يكون بسبب الامتداد نفسه؟ هل يجب أن نستخدم. يبدو أن مؤشر ترابط هذه المشكلة ومشاركة stackoverflow يشيران إلى ذلك.
https://stackoverflow.com/questions/2488016/how-to-make-python-load-dylib-on-osx
https://github.com/MoDeNa-EUProject/MoDeNa/issues/1

adithyabsk نظرًا لتعقيد شحن مكتبة وقت التشغيل في العجلة (وتحميلها) ، فلنستقر على brew install libomp .

  • يستخدم Homebrew على نطاق واسع بالفعل بين المستخدمين المحترفين (على ما أعتقد).
  • باستخدام libomp ، يمكننا استخدام Apple Clang لتجميع XGBoost ، وبالتالي التخلص من الاعتماد الشديد على إصدار معين من Homebrew GCC.
  • تم التحقق من هذه الطريقة من خلال مشاريع أخرى ، مثل LightGBM.

ملاحظة. أنا أنظر إلى https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ لفهم استخدام OpenMP في Apple Clang.

@ hcho3

ملاحظة. أنا أنظر إلى https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ لفهم استخدام OpenMP في Apple Clang.

قد تساعدك هذه العلاقات العامة على:
https://github.com/microsoft/LightGBM/pull/1501 ، https://github.com/microsoft/LightGBM/pull/1923.

adithyabsk هذه إحدى أولوياتي. أود إجراء إصلاح قبل إصدار 1.0.0.

@ hcho3 سعيد لسماع ذلك! سأرى ما إذا كان بإمكاني العبث بهذه المشكلة أيضًا.

adithyabsk إحدى المشكلات الدقيقة التي واجهتني في brew install libomp هي أنه سيتم تجميع XGBoost بدون OpenMP ، لأن CMakeLists.txt لم يتم تكوينه بشكل صحيح. (يمكنني معرفة ذلك من خلال تشغيل مهمة ثقيلة إلى حد ما على جهاز Macbook الخاص بي ؛ بدون برنامج OpenMP ، ستستغرق المهام 2-3x.) أحاول مراجعة CMakeLists.txt لتمكين OpenMP بشكل صحيح.

StrikerRUS شكرا على الرابط. يعد الحصول على نظام بناء يعمل أمرًا صعبًا للغاية ، ويساعدني كثيرًا في الحصول على نقطة مرجعية (LightGBM).

adithyabsk إحدى المشكلات الدقيقة التي واجهتني في brew install libomp هي أنه سيتم تجميع XGBoost بدون OpenMP ، لأن CMakeLists.txt لم يتم تكوينه بشكل صحيح. (يمكنني معرفة ذلك من خلال تشغيل مهمة ثقيلة إلى حد ما على جهاز Macbook الخاص بي ؛ بدون برنامج OpenMP ، ستستغرق المهام 2-3x.) أحاول مراجعة CMakeLists.txt لتمكين OpenMP بشكل صحيح.

أي حظ؟ السبب الذي أطلبه هو أن "تثبيت pip xgboost -U" فشل حتى بعد تثبيت libomp عبر "brew install libomp".

@ wel51x لم نقم بتعديل CMakeLists.txt حتى يعمل الحل الجديد. في الوقت الحالي ، يجب عليك اتباع التعليمات الواردة في https://xgboost.readthedocs.io/en/latest/build.html.

adithyabskCraigacp لقد وجدت https://github.com/matthew-brett/delocate. قد يكون هذا حلاً مفيدًا لإزالة تبعيات المكتبة ذات الترميز الثابت.

في حال وجد شخص ما أنه مفيد ... أفهم أنه ليس بأي حال من الأحوال نهجًا سائدًا ، ولكن يمكن تثبيت أحدث xgboost مع دعم OpenMP على نظام MacOS باستخدام Nix (https://nixos.org/nix/) بشكل تافه مثل

$ nix-shell -p python3Packages.xgboost

مرحبًا @ hcho3 ، لقد أنشأت صيغة Homebrew لـ XGBoost للمساعدة في تبسيط التثبيت على Mac ، بحيث يمكن للمستخدمين تشغيل brew install xgboost في المستقبل. إنه يعمل بشكل رائع ، ولكن للأسف لن يتم قبوله باستخدام إصدار أقدم من GCC.

مناقشة: https://github.com/Homebrew/homebrew-core/pull/43246

أحد الخيارات هو تعطيل OpenMP ، ولكن كما ذكرت ، فهو ليس رائعًا للأداء. إذا كنت قادرًا على تنفيذ التغييرات لجعلها تعمل مع libomp ، فيمكنني تحديث الصيغة ويمكننا دفع هذا إلى الأمام.

شكرا على التحديثات.

fwiw ، لقد قمت بتحديث الصيغة بحيث لم تعد تعتمد على GCC ولكنها تفتقر إلى دعم OpenMP. يمكننا تحديثه بمجرد إصدار دعم libomp .

تم قبول الصيغة بواسطة Homebrew ، لذلك يمكن لمستخدمي Mac الآن القيام بما يلي:

brew install xgboost

لقد استخدمت brew install xgboost ولكني ما زلت غير قادر على استيراد XGBoost. لا يوجد ملف __init__.py أو أي شيء داخل دليل XGBoost الفعلي المثبت حديثًا ، لذلك لا يمكنني استخدام أي من وظائف XGBoost. هل هناك خطوة أخرى بعد استخدام المشروب لتثبيت XGBoost؟

bnicholl راجع https://github.com/dmlc/xgboost/issues/4949#issuecomment -542333666 للحصول على حل مؤقت.

@ hcho3

شكرا على الرابط. يعد الحصول على نظام بناء يعمل أمرًا صعبًا للغاية ، ويساعدني كثيرًا في الحصول على نقطة مرجعية (LightGBM).

مع إصدار CMake 3.16 الوارد (في مرحلة RC الآن) ، يجب أن يكون الأمر أسهل: لن تكون هناك حاجة لتمرير حجج إضافية لمستخدمي Mojave> =. ارجع إلى https://gitlab.kitware.com/cmake/cmake/merge_requests/3916.

adithyabskCraigacp # 5146 يجب أن يتيح لك الآن استخدام OpenMP دون تثبيت Homebrew GCC. الآن سيعتمد XGBoost فقط على حزمة Homebrew libomp .

وبالتالي ، يجب أن نكون قادرين على إرسال الإصدار التالي من XGBoost (1.0) مع تمكين OpenMP.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات