現在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のclangと互換性を持たせるために必要なもの。
AppleのclangはOpenMPをそのままサポートしていないため、HomebrewGCCが必要です。 したがって、いいえ、XGBoostはAppleのclangと互換性がありません。
Mac OSX用のバイナリホイールを配布することで、プロセスを簡素化できると思います。 バイナリホイールにはビルド済みのlibxgboost.dylibが含まれているため、ユーザーはコンパイラを使用する必要がありません。 (これは、WindowsユーザーがXGBoostを使用するためにVisual Studioをインストールする必要がない方法です。)
ただし、現在、メンテナ(私を含む)はMac OSXでのバイナリパッケージング、つまりOSXの複数のバージョン間で広く互換性のあるバイナリを作成する方法に精通していないのではないかと思います。 ここに何か提案はありますか?
今のところ、conda-forgeを使用してMacOSXへのXGBoostのインストールを自動化することを検討する必要があります。
@ hcho3迅速な対応に感謝します! Condaは確かにオプションですが、pipを使用する方がはるかに簡単です。 macosのバイナリパッケージがどのようになるかを調べます。 また、私はバイナリパッケージングに精通していないので、その分野での経験を持っている他の人の意見をいただければ幸いです。
標準のコンパイルプロセスによって生成されたdylibは、自作のgccのライブラリに大きく依存しているため、この問題にはいくつかの問題がありました。 誰かがコンパイル後にその依存関係を変更する(または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。
@adithyabsk @Craigacp OpenMPは、ユーザーのシステムで一般的に利用可能なマルチコアCPUの利用可能なすべてのコアを使用するため、XGBoostのパフォーマンスにとって非常に重要です。 OpenMPがなければ、使用できるCPUコアは1つだけです。
私見ですが、pipはlibompなどの外部依存関係を処理するようには設計されていません。 一方、condaはPython以外の依存関係も同じように簡単に処理できます。 この投稿を参照してください: https ://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/
Microsoft / LightGBMが問題を解決する方法:ユーザーにbrew install libomp
を実行するように要求します。 最初にHomebrewをインストールする必要があるため、これがGCCまたはCondaをインストールするよりも簡単かどうかはわかりません。
@ hcho3 brew install libompソリューションは、プレインストールセットアップスクリプトで提供できるため、より優れている可能性がありますが、現在、適切なgccおよびg ++バージョンを指定するには、CIパイプラインでxgboostを分離する必要があります。 確かに、condaに関する限りあなたに同意し、それが唯一の解決策になるかもしれませんが、他に何か可能かどうかを確認するために他のオプションを調べたかっただけです。
ばかげた質問で申し訳ありませんが、実行時にOpenMPが必要ですか? たとえば、OpenMPがインストールされた状態でdmlc-coreとxgboostをコンパイルし、そのファイルをホイールにバンドルして、 audit_wheelなどのツールを使用してインストール時にコンパイルが不要になるようにすることはできますか?
@adithyabsk brew install libomp
を使ってみたところ、デフォルトのコンパイラであるAppleClangでXGBoostをコンパイルできるようになりました。
brew install libomp
mkdir build
cd build
cmake ..
make -j10
さらに、結果のバイナリlibxgboost.dylib
は、 /usr/local/opt/libomp/lib/libomp.dylib
とOSXシステムライブラリのみに依存します。 (GCCの特定のバージョンに依存する必要はもうありません!Hooray!)したがって、 brew install libomp
は、Condaを使用せずにMacOSXにXGBoostをインストールする最も簡単な方法だと思います。
ただし、コンパイル済みのバイナリを配布するのはまだ難しいです。 ホイール内にlibomp.dylib
を含めたとしても、共有ライブラリの依存関係はフルパスで指定されているため、MacOSXはファイルを使用しません。
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
は、MacOSX上のCRANXGBoostのマルチスレッドも有効にする必要があります
@ hcho3そう思います。 XGBoost Rパッケージは同じバックエンドAPIを呼び出すため、同じように動作する必要があります。
@ hcho3それは素晴らしい開発です! 多くのR&Dラボで、xgboostをインストールすることは、その内部要件に精通していない人にとっては問題点であることを証明できるので、すでに正しい方向に進んでいます。
このメモのフォローアップ:
共有ライブラリの依存関係がフルパスで指定されているため、MacOSXはファイルを使用しません
たぶん、この特定の問題をさらに調べて、libomp.dylibをバイナリホイールに取り込むための回避策があるかどうかを確認することができます。
@ hcho3は、拡張機能自体が原因である可能性もありますか? macOSでも.soを使用する必要があります。 この問題のスレッドと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
で解決しましょう。
libomp
を使用すると、Apple Clangを使用してXGBoostをコンパイルできるため、HomebrewGCCの特定のバージョンへの強い依存関係を排除できます。追伸 Apple ClangでのOpenMPの使用を理解するために、 https://iscinumpy.gitlab.io/post/omp-on-high-sierra/を見ています。
@ hcho3
追伸 Apple ClangでのOpenMPの使用を理解するために、 https://iscinumpy.gitlab.io/post/omp-on-high-sierra/を見ています。
これらのPRはあなたを助けるかもしれません:
https://github.com/microsoft/LightGBM/pull/1501、https://github.com/microsoft/LightGBM/pull/1923 。
@adithyabskこれは私の優先事項の1つです。 1.0.0リリースの前に修正したいのですが。
@ hcho3聞いてよかった! この問題もいじくり回すことができるかどうかを確認します。
@adithyabsk brew install libomp
に遭遇した微妙な問題の1つは、CMakeLists.txtが正しく構成されていないため、XGBoostがOpenMPなしでコンパイルされることです。 (Macbookで適度に重いジョブを実行することでわかります。OpenMPがないと、ジョブに2〜3倍の時間がかかります。)OpenMPを適切に有効にするためにCMakeLists.txtを修正しようとしています。
@StrikerRUSリンクをありがとう。 ビルドシステムを機能させるのは非常に難しく、参照ポイント(LightGBM)を用意するのに大いに役立ちます。
@adithyabsk
brew install libomp
に遭遇した微妙な問題の1つは、CMakeLists.txtが正しく構成されていないため、XGBoostがOpenMPなしでコンパイルされることです。 (Macbookで適度に重いジョブを実行することでわかります。OpenMPがないと、ジョブに2〜3倍の時間がかかります。)OpenMPを適切に有効にするためにCMakeLists.txtを修正しようとしています。運が良ければ? 私が尋ねる理由は、「brew installlibomp」を介してlibompをインストールした後でも、「pip installxgboost-U」が失敗するためです。
@ wel51x新しいソリューションを機能させるためにCMakeLists.txtをまだ変更していません。 今のところ、 https://xgboost.readthedocs.io/en/latest/build.htmlの指示に従う必要があります。
@ adithyabsk @ Craigacphttps ://github.com/matthew-brett/delocateを見つけました。 これは、ハードコードされたライブラリの依存関係を削除するための便利なソリューションになる可能性があります。
誰かがそれが役立つと思った場合...私はそれが決して主流のアプローチではないことを理解していますが、OpenMPをサポートする最新のxgboostはNix(https://nixos.org/nix/)を使用してMacOSに簡単にインストールできます
$ nix-shell -p python3Packages.xgboost
ねえ@ hcho3 、私はXGBoostのHomebrew式を作成して、Macでのインストールを簡素化し、ユーザーが将来brew install xgboost
を実行できるようにしました。 それはうまく機能しますが、残念ながら古いバージョンのGCCを使用して受け入れられることはありません。
ディスカッション: https ://github.com/Homebrew/homebrew-core/pull/43246
1つのオプションは、OpenMPを無効にすることですが、おっしゃるように、パフォーマンスにはあまり適していません。 libomp
で機能するように変更をコミットできる場合は、数式を更新して、これを進めることができます。
更新していただきありがとうございます。
fwiw、式を更新したので、GCCに依存しなくなりましたが、OpenMPのサポートがありません。 libomp
のサポートがリリースされたら、更新できます。
数式はHomebrewに受け入れられたため、Macユーザーは次のことができるようになりました。
brew install xgboost
brew install xgboost
を使用しましたが、XGBoostをインポートできません。 実際に新しくインストールされたXGBoostディレクトリ内には__init__.pyファイルなどがないため、XGBoost関数を使用できません。 brewを使用してXGBoostをインストールした後、別のステップはありますか?
@bnicholl一時的な解決策については、 https: //github.com/dmlc/xgboost/issues/4949#issuecomment-542333666を参照してください。
@ hcho3
リンクをありがとう。 ビルドシステムを機能させるのは非常に難しく、参照ポイント(LightGBM)を用意するのに大いに役立ちます。
今後のCMake3.16リリース(現在RCフェーズ)では、さらに簡単になるはずです。> = Mojaveユーザーに追加の引数を渡す必要はありません。 https://gitlab.kitware.com/cmake/cmake/merge_requests/3916を参照してください。
@adithyabsk @ Craigacp #5146で、HomebrewGCCをインストールせずにOpenMPを使用できるようになりました。 これで、XGBoostはlibomp
Homebrewパッケージのみに依存します。
@ankaneしたがって、OpenMPが有効になっているXGBoost(1.0)の次のリリースを送信できるはずです。
最も参考になるコメント
数式はHomebrewに受け入れられたため、Macユーザーは次のことができるようになりました。