Xgboost: Instalasi XGBoost yang lebih baik di Mac OSX?

Dibuat pada 17 Mei 2019  ·  28Komentar  ·  Sumber: dmlc/xgboost

Masalah

Saat ini di MacOS proses untuk menginstal paket python adalah sebagai berikut.

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

Pertanyaan

Apa yang ingin saya pelajari dari kontributor yang lebih berpengalaman adalah apakah ada rencana untuk menyederhanakan proses instalasi ini? Di atas tidak dapat dipertahankan untuk sistem instalasi otomatis untuk paket apa pun yang bergantung pada xgboost. Apa yang diperlukan untuk membuat xgboost kompatibel dengan dentang Apple.

1.0.0 Blocking

Komentar yang paling membantu

Rumus diterima oleh Homebrew, sehingga pengguna Mac sekarang dapat melakukan:

brew install xgboost

Semua 28 komentar

Dentang Apple tidak mendukung OpenMP di luar kotak, sehingga diperlukan Homebrew GCC. Jadi, tidak, XGBoost tidak akan kompatibel dengan dentang Apple.

Saya pikir kita dapat menyederhanakan prosesnya dengan mendistribusikan roda biner untuk Mac OSX. Roda biner akan berisi libxgboost.dylib yang sudah dibuat sebelumnya sehingga pengguna tidak perlu memiliki kompiler apa pun. (Beginilah cara pengguna Windows tidak perlu menginstal Visual Studio untuk menggunakan XGBoost.)

Namun, saya khawatir pengelola (termasuk saya) saat ini tidak terbiasa dengan pengemasan biner dengan Mac OSX, yaitu bagaimana membuat biner yang akan kompatibel secara luas di beberapa versi OSX. Apakah Anda punya saran di sini?

Untuk saat ini, Anda harus mempertimbangkan untuk menggunakan conda-forge untuk mengotomatiskan instalasi XGBoost di Mac OSX.

@hcho3 terima kasih atas tanggapan cepat Anda! Conda tentu saja merupakan opsi tetapi akan lebih mudah menggunakan pip. Saya akan melihat seperti apa kemasan biner pada macos. Saya juga tidak terbiasa dengan pengemasan biner, jadi masukan siapa pun yang memiliki pengalaman di bidang itu akan sangat dihargai.

Saya mengalami beberapa kesulitan dengan masalah ini karena dylib yang dihasilkan oleh proses kompilasi standar memiliki ketergantungan yang kuat pada perpustakaan gcc homebrew. Jika ada yang memiliki cara untuk mengubah ketergantungan itu setelah kompilasi (atau menjadikannya generik di seluruh versi gcc) itu akan bagus, tapi saya tidak berpikir macOS dikirimkan dengan libgomp (yang menyediakan dukungan OpenMP) jadi kami mungkin perlu mengemasnya sebagai baik, yang membuat hidup sulit.

@Craigacp @hcho3 Apakah ini sesuatu yang dapat kami pertimbangkan sampai solusi cmakelist ditemukan. https://github.com/netket/netket/issues/225#issuecomment-502714445 . Saya tidak terlalu akrab dengan internal xgboost, betapa pentingnya OpenMP untuk kinerja perpustakaan.

Ini juga tampak menjanjikan tetapi saya tidak dapat membuatnya berfungsi: https://stackoverflow.com/questions/46414660/macos-cmake-and-openmp .

@adithyabsk @Craigacp OpenMP sangat penting untuk kinerja XGBoost, karena kami ingin menggunakan semua inti yang tersedia dari CPU multi-inti yang umumnya tersedia di sistem pengguna. Tanpa OpenMP, Anda hanya dapat menggunakan satu inti CPU.

IMHO, pip tidak dirancang untuk menangani dependensi eksternal seperti libomp. Di sisi lain, conda mampu menangani dependensi non-Python dengan mudah. Lihat posting ini: https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/

Bagaimana Microsoft/LightGBM memecahkan masalah: mereka meminta pengguna untuk menjalankan brew install libomp . Saya tidak yakin apakah ini lebih mudah daripada menginstal GCC atau Conda, karena Anda harus menginstal Homebrew terlebih dahulu.

@ hcho3 solusi brew install libomp mungkin lebih baik karena dapat disediakan dalam skrip penyiapan pra-instal sedangkan, saat ini, seseorang harus memisahkan xgboost di saluran pipa CI untuk menentukan versi gcc dan g++ yang sesuai. Jelas, setuju dengan Anda sejauh conda pergi dan itu mungkin menjadi satu-satunya solusi tetapi saya hanya ingin menjelajahi opsi lain untuk melihat apakah ada hal lain yang mungkin.

Maaf untuk pertanyaan konyol, tetapi apakah OpenMP diperlukan saat runtime? Misalnya, dapatkah kita mengkompilasi dmlc-core dan xgboost dengan OpenMP yang terinstal dan kemudian menggabungkan file itu ke dalam sebuah roda sehingga kompilasi tidak diperlukan pada waktu penginstalan menggunakan alat seperti audit_wheel ?

https://stackoverflow.com/a/42106034

@adithyabsk Saya baru saja mencoba menggunakan brew install libomp dan sekarang saya dapat mengkompilasi XGBoost dengan kompiler default, Apple Clang:

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

Terlebih lagi, biner yang dihasilkan libxgboost.dylib hanya bergantung pada /usr/local/opt/libomp/lib/libomp.dylib dan lib sistem OSX. (Tidak ada lagi ketergantungan pada versi tertentu dari GCC! Hore!) Jadi saya kira brew install libomp adalah cara yang paling tidak menyakitkan untuk menginstal XGBoost di Mac OSX tanpa Conda.

Mendistribusikan binari yang telah dikompilasi sebelumnya masih rumit. Bahkan jika kita memasukkan libomp.dylib di dalam roda, Mac OSX tidak akan menggunakan file tersebut, karena ketergantungan perpustakaan bersama ditentukan dengan path lengkap :

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

Di sisi lain, Windows lebih fleksibel dalam hal menemukan perpustakaan bersama. Saya merasa cukup dengan memasukkan vcomp140.dll (OpenMP runtime) di dalam roda.

@hetong007 Catatan terkait: brew install libomp juga harus mengaktifkan multi-threading untuk CRAN XGBoost di Mac OSX

@hcho3 saya pikir begitu. Paket XGBoost R memanggil API backend yang sama sehingga harus berperilaku sama.

@hcho3 Itu perkembangan yang luar biasa! Sudah bergerak ke arah yang benar karena saya dapat membuktikan bahwa di banyak lab R&D menginstal xgboost adalah titik sakit bagi mereka yang tidak terlalu akrab dengan persyaratan internalnya.

Menindaklanjuti catatan ini:

Mac OSX tidak akan menggunakan file tersebut, karena ketergantungan perpustakaan bersama ditentukan dengan path lengkap

Mungkin kita bisa melihat lebih dalam masalah khusus ini untuk melihat apakah ada solusi untuk memasukkan libomp.dylib ke roda biner.

@hcho3 juga bisa karena ekstensi itu sendiri? Haruskah kita menggunakan .so di macOS juga. Utas masalah ini dan posting stackoverflow tampaknya menunjukkan demikian.
https://stackoverflow.com/questions/2488016/how-to-make-python-load-dylib-on-osx
https://github.com/MoDeNa-EUProject/MoDeNa/issues/1

@adithyabsk Mengingat kerumitan pengiriman perpustakaan runtime di roda (dan membuatnya dimuat), mari kita selesaikan dengan brew install libomp .

  • Homebrew sudah cukup banyak digunakan di kalangan pengguna listrik (saya pikir).
  • Dengan libomp , kita dapat menggunakan Apple Clang untuk mengkompilasi XGBoost, sehingga menghilangkan ketergantungan keras pada versi Homebrew GCC tertentu.
  • Metode ini telah diverifikasi oleh proyek lain, seperti LightGBM.

hal. Saya melihat https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ untuk memahami penggunaan OpenMP di Apple Clang.

@hcho3

hal. Saya melihat https://iscinumpy.gitlab.io/post/omp-on-high-sierra/ untuk memahami penggunaan OpenMP di Apple Clang.

PR ini dapat membantu Anda:
https://github.com/microsoft/LightGBM/pull/1501 , https://github.com/microsoft/LightGBM/pull/1923.

@adithyabsk Ini adalah salah satu prioritas saya. Saya ingin melakukan perbaikan sebelum rilis 1.0.0.

@hcho3 Senang mendengarnya! Saya akan melihat apakah saya bisa bermain-main dengan masalah ini juga.

@adithyabsk Satu masalah kecil yang saya alami brew install libomp adalah bahwa XGBoost akan dikompilasi tanpa OpenMP, karena CMakeLists.txt tidak dikonfigurasi dengan benar. (Saya tahu dengan menjalankan pekerjaan yang cukup berat di Macbook saya; tanpa OpenMP, pekerjaan akan memakan waktu 2-3x lebih lama.) Saya mencoba merevisi CMakeLists.txt untuk mengaktifkan OpenMP dengan benar.

@StrikerRUS Terima kasih atas tautannya. Membuat sistem build bekerja cukup sulit, dan sangat membantu saya untuk memiliki titik referensi (LightGBM).

@adithyabsk Satu masalah kecil yang saya alami brew install libomp adalah bahwa XGBoost akan dikompilasi tanpa OpenMP, karena CMakeLists.txt tidak dikonfigurasi dengan benar. (Saya tahu dengan menjalankan pekerjaan yang cukup berat di Macbook saya; tanpa OpenMP, pekerjaan akan memakan waktu 2-3x lebih lama.) Saya mencoba merevisi CMakeLists.txt untuk mengaktifkan OpenMP dengan benar.

Ada keberuntungan? Alasan saya bertanya adalah bahwa "pip install xgboost -U" gagal bahkan setelah menginstal libomp melalui "brew install libomp".

@wel51x Kami belum memodifikasi CMakeLists.txt agar solusi baru berfungsi. Untuk saat ini, Anda harus mengikuti petunjuk di https://xgboost.readthedocs.io/en/latest/build.html.

@adithyabsk @Craigacp Saya menemukan https://github.com/matthew-brett/delocate. Ini mungkin solusi yang berguna untuk menghapus dependensi perpustakaan hard-coded.

Jika ada yang merasa terbantu... Saya mengerti bahwa ini sama sekali bukan pendekatan mainstream, tetapi xgboost terbaru dengan dukungan OpenMP dapat diinstal di MacOS menggunakan Nix (https://nixos.org/nix/) sama sepelenya

$ nix-shell -p python3Packages.xgboost

Hai @hcho3 , saya membuat formula Homebrew untuk XGBoost untuk membantu menyederhanakan instalasi di Mac, sehingga pengguna dapat menjalankan brew install xgboost di masa mendatang. Ini berfungsi dengan baik, tetapi sayangnya tidak akan diterima menggunakan versi GCC yang lebih lama.

Diskusi: https://github.com/Homebrew/homebrew-core/pull/43246

Salah satu opsi adalah menonaktifkan OpenMP, tetapi seperti yang Anda sebutkan, itu tidak bagus untuk kinerja. Jika Anda dapat melakukan perubahan untuk membuatnya bekerja dengan libomp , saya dapat memperbarui rumus dan kami dapat mendorong ini ke depan.

Terima kasih atas pembaruannya.

fwiw, saya update formulanya jadi tidak lagi tergantung GCC tapi kurang support OpenMP. Kami dapat memperbaruinya setelah dukungan untuk libomp dirilis.

Rumus diterima oleh Homebrew, sehingga pengguna Mac sekarang dapat melakukan:

brew install xgboost

Saya menggunakan brew install xgboost tetapi saya masih tidak dapat mengimpor XGBoost. Tidak ada file __init__.py atau apa pun di dalam direktori XGBoost yang baru diinstal, jadi saya tidak dapat menggunakan salah satu fungsi XGBoost. Apakah ada langkah lain setelah menggunakan brew untuk menginstal XGBoost?

@bnicholl Lihat https://github.com/dmlc/xgboost/issues/4949#issuecomment -542333666 untuk solusi sementara.

@hcho3

Terima kasih untuk tautannya. Membuat sistem build bekerja cukup sulit, dan sangat membantu saya untuk memiliki titik referensi (LightGBM).

Dengan rilis CMake 3.16 yang akan datang (dalam fase RC sekarang) seharusnya lebih mudah: tidak perlu memberikan argumen tambahan untuk pengguna >=Mojave. Lihat https://gitlab.kitware.com/cmake/cmake/merge_requests/3916.

@adithyabsk @Craigacp #5146 sekarang seharusnya membiarkan Anda menggunakan OpenMP tanpa menginstal Homebrew GCC. Sekarang XGBoost hanya akan bergantung pada paket Homebrew libomp .

@ankane Akibatnya, kami harus dapat mengirimkan rilis XGBoost (1.0) berikutnya dengan OpenMP diaktifkan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat