らんだむな記憶

blogというものを体験してみようか!的なー

AttributeError: 'NoneType' object has no attribute 'cast'

まとめ

  • TensorFlow 2.1.0
  • JupyterLab 2.1.1
  • jupyterlab-variableInspector 0.5.0

を組み合わせて使うと、import tensorflow as tf のタイミングでロードされるであろう libnvinfer.so.6libnvinfer_plugin.so.6 がノートブックを開いた瞬間に先行してロードされてしまうかもしれず、この結果、tfNone になってしまうかもしれない。これは、該当セルを実行する時に、本来なら共有ライブラリをロードするのに一瞬かかるはずなのに、先行ロードされていることで一瞬でセルの実行が完了することで判別できる。

*****

調査内容

あれ?pyenv で作成した Python 3.7.7 の仮想環境上に TensorFlow 2.1.0 を入れると何か変なような・・・?

※以下はどうやら JupyerLab 上で使うと起こるっぽい

→ jupyterlab 2.1.1。jupyer notebook なら問題なさそう。 (後述の通り、extension と関係しそうなので notebook だからという理由とは言えなさそう)
特に、

2020-04-26 07:14:47.351116: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libnvinfer.so.6
2020-04-26 07:14:47.352801: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libnvinfer_plugin.so.6

みたいなのがノートブックを開いた時点で出力されるとダメっぽい。import tensorflow as tf のタイミングで表示されるなら問題なさそう。どうもこれ、jupyterlab-variableInspector をインストールすると起こるような気がする。何かの変数を先行して見に行く結果、上記の共有ライブラリのロードを想定外に早めてしまう??TensorFlow, JupyterLab, jupyterlab-variableInspector のバージョンの組み合わせにもよるかもしれないが詳細は不明。

は問題なく通るけど、

train = raw_train.map(format_example)
validation = raw_validation.map(format_example)
test = raw_test.map(format_example)

のところで

AttributeError: 'NoneType' object has no attribute 'cast'

になっちゃったぞ・・・?しかも format_example の中の tf.casttf だという。わけが分からない・・・。
Python 3.6.10 の仮想環境を作成したらいけた。 仮想環境の作成ミスか?
他のインスタンスでも確認してみよう・・・。
→ 試してみたけどやはりダメだった。こっちは 3.6.10 でもダメだった。なんで???

import tensorflow as tf

がすごく一瞬で終わるのがちょっと気になるな。(JupyterLab 経由ではなく、インタラクティブシェルで実行すると一瞬の遅延があって、たぶんそれがちゃんとロードできたという意味合い?)
in `import ... as ...`, "as" do not work · Issue #8197 · jupyterlab/jupyterlab · GitHubがかなり近いようには感じるが・・・。 tf が問題がある様子。どうやら
0.4.0 is "destroying" the tensorflow module import -> `AttributeError: 'NoneType' object has no attribute 'keras'` · Issue #131 · lckr/jupyterlab-variableInspector · GitHubが同じ問題の様子。

なお、Colaboratory の Python のバージョンは 3.6.9 であった。