pop-web

スマートかつクールでアトラクティブなブログです

macOSでのprophetのインストールに苦労したので解決法のメモ

# macOSでのprophetのインストールに苦労したので解決法のメモ

prophetという時系列予測に使われるFacebookが作ったライブラリがある。
これを使いたくてインストールを半年前とかにも何度も試していたのだが、これがどうしてなかなかうまくいかず毎回諦めて困っていた。
やっと解決したのだがいろいろ試してどれが結果的にきいたのかよくわからんので試したことを全部書いていく。

環境は
macOS Mojave ->(途中でアプデート) -> macOS Catalina
Python 3.6.4


# try:1
まずprophetのインストール方法として

pip install fbprophet

を行えば良いと書いてある。
github.com

しかしこれを行っても一向にインストールができない。(1敗目)
いろいろ試して、アプデとかで再起している間にエラー出力が消えてしまって申し訳ないが、どうもC++コンパイル回りでうまくいっていっておらず、そのため依存関係のpystanの実行がうまくいかないらしいとエラー出力から判断した。
ここをどうにかできれば良さそうだ。


# try:2
エラー出力を読むとどうもpystanでC++コンパイルがうまくいっていないらしい。
調べてみると、pystanのインストールが見かけ上うまくいってもC++コンパイラとのフックがうまくいかないという問題があるらしい。これを解決できればうまくいきそうだ。
Fail to install fbprophet:INFO:pystan:COMPILING THE C++ CODE FOR MODEL anon_model_861b75c6337e237650a61ae58c4385ef NOW. error: command 'gcc' failed with exit status · Issue #1057 · facebook/prophet · GitHub

このissueによるとpystanをダウングレードしてみてくれと書いてある。試してみたが失敗した。(2敗目)


# try:3
pystanでC++コンパイルが本当にうまくいかないのか確かめるために、試しにpystanを使うテストコードを適当にコピペしてきて動かしてみた。確かに動かないことがわかった。なるほどね。

例によって失われたエラー出力から、gccのコマンドがうまくいかないというエラー出力が出ていた。
そういえば上のissueでも gcc-g++をインストールしてくれと書いてある。
いろいろ調べてみると、macOSでは、gccを使っているつもりが裏でclangが動いているらしい。C++では、メジャーなコンパイラgccとclangがあって、細かいとこでの挙動が違うらしい。これは競プロで知った。うーん、ここが問題点なのか???
Xcodeのgccでコンパイルしているつもりで実はclangでコンパイルしていた事実を今更知りました - Qiita

ということで、
Macのgcc, g++をHomebrewを使って最新版にする - Qiita
これを参考にgccをインストールしてパスを通してみる。
これでどうやらちゃんとgccが動くようになったぽい。張り切ってpystanをインストールし直して、prophetをインストールしようとする。失敗(3敗目)


# try:4
なんかもうどうしたらいいかよくわからん。
そうだ! macではc++コンパイラをどうこうするときにxcodeが絡んできたりする。
Can not install fbprophet on MacOS Mojave · Issue #643 · stan-dev/pystan · GitHub
こんなissueも見つけた。
大雑把に言って、C++のヘッダファイルがMojaveだと足りないのでxcodeをインストールして

xcode-select --install

しろ、という話だ。


この機会にxcodeもアプデしておくか...ということでxcodeを最新版にしようとしたら、xcodeアプデにはosのアプデが必要らしい。

...いいじゃねーか、この機会にosもアプデしてやるよ。ということでやたら遅い回線速度に泣かされながら、夜中ずっと通してCatalinaにアプデした。
起きてもアプデが終わってなくて泣いた。なぜかappstoreとかosとかmac関係のものとなると、やたら家のwifiのダウンロード速度が遅い、どういうことなの?
osアプデの次はxcodeのアプデ、しかしなぜか8GBのダウンロードに1日かかった。は?
xcodeのアプデも終わり、pystanのインストールからやり直した。ダメだった(4敗目)


# try:5
エラー出力を見ていると

今度はclang回りでおかしいらしい。どういうことなの。

error: command '/usr/bin/clang' failed with exit status 1 · Issue #115 · TokenMarketNet/smart-contracts · GitHub
ここを読むとopenssl周りの問題の可能性が示唆されていた。
そういえばopenssl周りで悩んだことが以前あったな...(遠い目)
メモが残されていないので、何したかは詳しく覚えていないがインストールしたり、パス通したりいろいろ面倒だった思い出ががが。...openssl周りの問題はすでに解決できていると考えたい。

そう考えながら、もう少し下を見てみると

So, you need to do this:

env LDFLAGS="-L$(brew --prefix openssl)/lib" CFLAGS="-I$(brew --prefix openssl)/include" pip install -r requirements.txt

と書いてある。
これを試してインストールし直してみたら、なんとうまくいった。やったーーー!!! ということで勝利


# 結論
prophetをインストールするために、

  • macOSgccを使おうとしても裏でclangが動いている問題を解決した
  • macOSxcodeをアプデした
  • clangの環境変数周りの設定をした