PyTorchのImportError対処法

プログラミング
この記事は約8分で読めます。

MacにPytorchをインストールしようとしたときにいくつかエラーが発生したので、その対処法をまとめておきたいと思います。

実行環境

  • macOS Catalina 10.15.3
  • Python 3.8.2

Pytorch ImportErrorについて

以下のようにpytorchをimportしようとするとImportErrorが発生しました。

import torch

(実行結果)
ImportError: dlopen(/Users/hoge/.virtualenvs/py38/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so, 9): Library not loaded: @rpath/libc++.1.dylib
  Referenced from: /Users/hoge/.virtualenvs/py38/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so
  Reason: image not found

そもそもこのエラーが何を言っているかというと「/Users/〜darwin.soファイルをdlopenしようとしたけれど、libc++.1.dylibをロードできませんでした。」と言っています。よくわからないと思うので1つずつ説明してきます。

.soファイルについて

まず.soファイルというのはshared objectの略でMacなどのUNIX系OSでよく用いられる共有ライブラリのファイル形式のことです。共有ライブラリなので、色んな所から参照されて使われる便利なツールです。

dlopen関数について

dlopenというのは、dynamic load openの略だと思いますが、こちらもUNIX系OSの関数で、共有ライブラリの動的ロードに使われる関数です。
動的ロードというのは、共有ライブラリ内に含まれている関数を実際に利用する時点になって、初めて共有ライブラリをメモリにロードする方法らしいです。
今回は、〜darwin.soファイル内に記述されている「@rpath/libc++.1.dylib」という動的ライブラリをロードしようとして失敗しています。

.dylibファイルについて

.dylibファイルというのは動的ライブラリ(おそらくdynamic libraryの略)のことです。つまりdlopenで実行時にロードされるライブラリそのものです。

@rpathについて

@rpathはlibc++.1.dylibが置かれているフォルダを示すパスなのですが、Runpath Searth Pathsと呼ばれるもので、パスのリストになっているそうです。したがって、リスト内に複数のパスを設定すれば、そのリスト内のフォルダを探しにいってくれるようです。
そしてこのパスのリストはXcode(LD_RUNPATH_SEARCH_PATH設定)で設定するものだそうです。
※このあたりはあまり詳しくないので色々調べた上での私の理解です。

つまりこのパスリスト内に動的ライブラリが入っているパスが含まれていないので動的ライブラリ見つかりません!というエラーを吐いているようです。

エラー解消方法

ということで、やるべきことは、

libc++.1.dylibという動的ライブラリが現在どこにあるかを探してあげて、そのフォルダをパスリスト(Rupath Seart Paths)に加えてあげる

となります。

動的ライブラリを探す① otool -Lコマンド

ここで、便利なコマンドがあり、下記のコマンドにより、〜darwin.soファイルから参照されている.dylibファイルを検索することができます。

$ otool -L (ファイルパス)

(例)
$ otool -L /Users/hoge/.virtualenvs/py38/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so

(実行結果)
@rpath/libshm.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libtorch_python.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)

ここで、以下のxcrun:errorが出る人は更にしたを見てください。

本当はこれで、/usr/lib/libc++.1.dylibというのが表示されて欲しかったのですが、出てきておりません。

動的ライブラリを探す① find -Lコマンド

$ find (検索するディレクトリ) -name (検索したいファイル名)

(例)
$ find / -name libc++.1.dylib

(実行結果)
find: /usr/sbin/authserver: Permission denied
find: /usr/local/var/run/nginx/scgi_temp: Permission denied
find: /usr/local/var/run/nginx/uwsgi_temp: Permission denied
find: /usr/local/var/run/nginx/proxy_temp: Permission denied
find: /usr/local/var/run/nginx/fastcgi_temp: Permission denied
find: /usr/local/var/run/nginx/client_body_temp: Permission denied
find: /usr/local/mysql-5.7.18-macos10.12-x86_64/keyring: Permission denied
find: /usr/local/mysql-5.7.18-macos10.12-x86_64/data: Permission denied
/usr/local/Cellar/llvm/5.0.1/lib/libc++.1.dylib
/usr/lib/libc++.1.dylib
...

結局/usr/lib/の下にあったようです。
上記のコマンドは検索ディレクトリをルートにしているので、実行がすべて終わるのを待つとすごく時間かかるのでご注意ください。otool -Lで見つかれば一番よいんですけどね。

install_name_toolでrpathを追加する

とりあえず/usr/lib/の下にlibc++.1.dylibがあることがわかったので、/usr/lib/をrpathに追加します。rpathにパスを追加するのも便利なコマンドがあります。下記になります。

$ install_name_tool -add_rpath (参照されるファイルのパス) (参照するファイル)

(例)
$ install_name_tool -add_rpath /usr/lib /Users/hoge/.virtualenvs/py38/lib/python3.8/site-packages/torch/_C.cpython-38-darwin.so

(実行結果)
特に何も表示されない

これで、再度import torchを実行すればエラーが解消されているはずです。

xcrun: errorが発生した場合

otool -Lやinstall_name_toolコマンドはXcodeのコマンドのようで、Xcodeがインストールされていないと以下のようなエラーが発生します。

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

これは単純にXcodeをインストールすれば良いので以下のコマンドを実行すれば解決します。

$ xcode-select --install

参考リンク

最後に調べたページを貼り付けておきます。

タイトルとURLをコピーしました