機械学習系ライブラリのインストールはハマりやすい
最近pythonの扱いにも慣れてきたので、本命であるpythonを使った機械学習・深層学習に挑戦しようと思い立ち、よく機械学習で名前の聞くtensorflowとその機能を使ったkerasをWindows10・Anaconda3.5環境の自分のPCにインストールしようと思い立ちました。
ですが、実際にインストールするところで自分史上一番ハマったのでその時のハマった内容と解決法を今後別のPCでもう一回環境を作ることもあると思うので、備忘録も兼ねてメモっておこうと思います。
まずディープラーニングをPCで行う場合、計算リソースがかなり必要なので機械学習用ライブラリのTensorflowをインストールする場合、CPU版かGPU版かを選択する必要があります、自分としては計算処理が速くなるGPU版をインストールしたかったのですが、NVIDIAのGPUはなかったので、とりあえずCPU版の方をインストール。
なんかわからんけど、ほかのパッケージと同じようにアナコンダプロンプトからroot環境(デフォルト)に$pip install tensorflowで、インストール。ここでは特にエラーもなくインストールできたのですが、ここからが地獄の始まりで、インストールしたtensorflowをjupyternotebook上でインポートして使おうとしたら、インポートエラー。
今までPIPのバージョンなどが原因でモジュールのインストールで詰まったことは何度かありましたが、インポートで詰まるのは初めてでした。またエラー内容もNo moduleとかではなく、怒涛の長文で数日間解消する気も起こりませんでしたが、機械学習しようとしているのにtensorflowが入れられないで頓挫とか始まる前に終了なので、さすがに頑張ろうと思い、エラー内容をGoogleで検索。
ちなみに僕の出たエラー内容は以下のような感じ。
ImportError Traceback (most recent call last)
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py in swig_import_helper()
13 try:
---> 14 return importlib.import_module(mname)
15 except ImportError:
~\Anaconda3\envs\tensorflow\lib\importlib\__init__.py in import_module(name, package)
125 level += 1
--> 126 return _bootstrap._gcd_import(name[level:], package, level)
127
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap.py in _gcd_import(name, package, level)
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap.py in _find_and_load(name, import_)
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap.py in _find_and_load_unlocked(name, import_)
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap.py in _load_unlocked(spec)
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap.py in module_from_spec(spec)
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap_external.py in create_module(self, spec)
~\Anaconda3\envs\tensorflow\lib\importlib\_bootstrap.py in _call_with_frames_removed(f, *args, **kwds)
ImportError: DLL load failed: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。
During handling of the above exception, another exception occurred:
ModuleNotFoundError Traceback (most recent call last)
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow.py in <module>()
57
---> 58 from tensorflow.python.pywrap_tensorflow_internal import *
59 from tensorflow.python.pywrap_tensorflow_internal import __version__
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py in <module>()
16 return importlib.import_module('_pywrap_tensorflow_internal')
---> 17 _pywrap_tensorflow_internal = swig_import_helper()
18 del swig_import_helper
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py in swig_import_helper()
15 except ImportError:
---> 16 return importlib.import_module('_pywrap_tensorflow_internal')
17 _pywrap_tensorflow_internal = swig_import_helper()
~\Anaconda3\envs\tensorflow\lib\importlib\__init__.py in import_module(name, package)
125 level += 1
--> 126 return _bootstrap._gcd_import(name[level:], package, level)
127
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
During handling of the above exception, another exception occurred:
ImportError Traceback (most recent call last)
<ipython-input-1-25b92e4d5dec> in <module>()
----> 1 import tensorflow as tf
2 hello = tf.constant('Hello, TensorFlow!')
3 sess = tf.Session()
4 print(sess.run(hello))
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\__init__.py in <module>()
22
23 # pylint: disable=g-bad-import-order
---> 24 from tensorflow.python import pywrap_tensorflow # pylint: disable=unused-import
25 # pylint: disable=wildcard-import
26 from tensorflow.tools.api.generator.api import * # pylint: disable=redefined-builtin
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\__init__.py in <module>()
47 import numpy as np
48
---> 49 from tensorflow.python import pywrap_tensorflow
50
51 # Protocol buffers
~\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow.py in <module>()
72 for some common reasons and solutions. Include the entire stack trace
73 above this error message when asking for help.""" % traceback.format_exc()
---> 74 raise ImportError(msg)
75
76 # pylint: enable=wildcard-import,g-import-not-at-top,unused-import,line-too-long
ImportError: Traceback (most recent call last):
File "C:\Users\taku\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "C:\Users\taku\Anaconda3\envs\tensorflow\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_load
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 658, in _load_unlocked
File "<frozen importlib._bootstrap>", line 571, in module_from_spec
File "<frozen importlib._bootstrap_external>", line 922, in create_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
ImportError: DLL load failed: ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "C:\Users\taku\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Users\taku\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 17, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Users\taku\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 16, in swig_import_helper
return importlib.import_module('_pywrap_tensorflow_internal')
File "C:\Users\taku\Anaconda3\envs\tensorflow\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
Failed to load the native TensorFlow runtime.
See https://www.tensorflow.org/install/install_sources#common_installation_problems
for some common reasons and solutions. Include the entire stack trace
above this error message when asking for help.
その結果、分かってきたのは、Tensorflowのインポートができない大まかな原因は「ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。」というところにある点。
まあそうはいってもdllってC++とかの領域なので、PCにわかにはさっぱり・・・。まあPATHが通ってないってことなんですけどなんでPATHが通ってないのかがわからない・・・。とりあえずエラー内容でググった結果以下の件が原因だったのでは?という結論に到達。
現象
Microsoft Visual C++ .NET 2003、Microsoft Visual C++ 2005、または Microsoft Visual C++ 2008 でビルドされたアプリケーションが 128 個程度以上の DLL のロードを行った場合、LoadLibrary 関数が失敗する可能性があります。本現象は、Fiber Local Storage (以下、FLS) をサポートした Microsoft Windows Server 2003 以降のオペレーティング システムで発生する可能性があります。
この問題が発生したときに GetLastError 関数で得られる詳細エラー コードは次の通りです。
1114 : ERROR_DLL_INIT_FAILED (ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。)
引用元:https://support.microsoft.com/ja-jp/help/969933
どうやらマイクロソフト公認のバグが原因?かもということなので、https://www.microsoft.com/ja-JP/download/details.aspx?id=53587からMicrosoft Visual C++ の修正版をDLしてインストール。
これでいけたかと!?と思って再起動してもう一回tensorflowをインポートしましたが、またまたエラー。。。。
なので、他の原因を探し今度はそもそものAnaconda環境がダメなのでは?説に至りました。というのも現在自分が使っていたAnaconda環境はAnaconda3.5.0のpython3.6で、どうやらtensorflowはWindows10環境だとpython3.6では動かないという現象が報告されているみたいです。
なので、Anaconda Navigaterからenvironmentから適当な名前でpython3.5の新環境を作り、その環境でjupyter labsを起動し、terminalで、pipでtensor flowを再インストールしました。Anacondaは仮想環境を作りやすいので便利ですが、またまたまたエラー・・・・。
正直心が折れたのですが、最後にダメ元でチラッと書いてあったcondaコマンドでインストールすればいいんじゃね?的なアドバイスを参考にして、上述した環境で$conda install tensorflow
でインストールし、以下のコマンドをjupyter notebookに入力したところ
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()
print(sess.run(hello))
なんとエラーなし!ついに僕のWindows10にTensorflowがインストール/インポートができました!!!!ついでにconda install kerasでkerasも一緒にインストールして動きましたし、ようやく機械学習が始められそうです。
ここまで約1週間・・・機械学習自体も統計学の知識が必要ですし、ニューラルネットワークやその発展形のリカレントネットワークの理解も超難しいのに、始めるための環境構築がこんなに難しいとは思いませんでした。
というかそもそもANACONDAのターミナルでpipでもほとんどのライブラリがエラーなくインストールできるし、pipでいいじゃーーんとpipを多用し続けていたのも今回ハマった原因だったのではないかと今にしてみれば思います。やっぱりちゃんと常日頃からcondaコマンドでインストールしておいたほうがいいと思います。
他にもscipy云々とかもTensorflowやkerasがインポートできないエラーの原因にあるみたいですが、僕はそこではハマりませんでした。まあおとなしくNVIDIAのGPU付きのMAC買っとけってことなのかもしれませんけど、とりあえず動いたのでこの環境を死守したいと思います笑
まとめ
長くなってしまったので、まとめるとPythonでtensorflowのインポートできない場合は、以下の点を意識すればうまくインポートできるようになるかもしれません。
- PIPでインストールしたものをアンインストールしcondaでインストールしなおす
- C++のビルドパッケージをインストールする
- Pythonの環境をバージョン3.5以下にする
- tensorflowのバージョンを1.5以下にする
最後はダイナミックルーチンの初期化の失敗原因にはtensorflow1.6以降からバイナリでの命令方式が変わっており、CPUそのものが古くて対応できていない可能性を考慮してのものです。
# 古いtensorflowをインストールする
$pip install tensorflow==1.13
それでもインポートできない場合はstack over flowのtensorflowコラムで質問してみるのも手だと思います。
pythonの高度なライブラリは後ろでC++が動いていることがあり、その時にこのC++のビルドパッケージをインストールしていないとライブラリのインストール・インポートができないことがあるらしいです。
機械学習・深層学習で使うTensorflowなどがインストールできない原因もこいつにある人がほとんどだと思うので参考になれば幸いです。
コメント
Thanks for sharing your thoughts. I truly appreciate
your efforts and I will be waiting for your next write ups thank you once again.