日々精進

新しく学んだことを書き留めていきます

tf.estimator.Estimatorのevaluateを呼ぶと「Fatal Python error: Segmentation fault」エラー

TensorFlowのバージョンは1.15.0。 原因はevaluateメソッドのinput_fnに精度検証のinputを返す関数を渡していたが、その関数がNoneから空配列的なものを返していたため。 今回はtf.data.TFRecordDatasetに検証用データを渡してそのeval_input_fnを以下のように渡していたがtf.data.TFRecordDatasetが保持しているデータが0件だったのでエラーになった。

estimator.evaluate(input_fn=dataset.eval_input_fn)

データをdatasetに渡すようにすると直った。

tensorflowのモデルをtensorflow liteに変換してx86 cpuで動かすと変換前より速度が低下する問題

tensorflow liteで動かせば速くなると思っていたのになぜ・・ 調べてみたら、tfliteはARMプロセッサに最適化されているのでx86 cpuでは遅いという情報がありました。 自分が動かしたい環境はx86 cpu。。

stackoverflow.com

x86 cpuサポートは計画されているようだけどいつリリースかは見付からなかった。

www.tensorflow.org

以下によるとx86 supportはTF2.3でリリースされると言っている人がいる。もう対応済??

github.com

x86 cpuで動かす場合、高速化の選択肢は二つあるっぽい。

一つはOpenVINOを使って高速化する方法。これはIntel製なのでx86 cpuに最適化されている。

www.intel.co.jp

もう一つはtensorflow liteにXNNPACKという拡張機能を加えてビルドし、使う方法。

towardsdatascience.com

上記の記事でOpenVINOとXNNPACKのパフォーマンスが比較されているがそんなに変わらなさそう。

linuxでzipを解凍すると「start of central directory not found」エラー

原因はunzipコマンドが4GB以上のファイルの解凍に対応していないため。 以下のように7zipをインストールして解凍すると解凍できた。

sudo yum install p7zip
7za x hoge.zip

参考:

qiita.com

dockerのnetwork_mode: “host”とbridgeの違い

network_mode: “host”はホストとdockerコンテナのIPアドレスが同一になる。以下で分かりやすく説明されています。

qiita.com

なので、例えばdockerコンテナ内のプロセスから8888ポートをlistenすると、ホストの8888ポートをlistenすることになる。 port mappingは不要。

デフォルトのmodeのbridgeではホストとコンテナのIPアドレスは異なる。外部からのリクエストを受信するためにはport mapping設定をする必要がある。 port mapping設定をするとホストへのリクエストをコンテナにforwardしてくれるイメージ。

pickle.dumpを呼ぶと「PicklingError: Can't pickle typing.List[~]: it's not the same object as typing.List」エラー

pickleの代わりにcloudpickleを使うと直った。dillというライブラリも使ってみたが、そちらは解決しなかった。

参考:

gitmemory.com

windowsでRotatingFileHandlerでログを出力すると「PermissionError: [WinError 32] プロセスはファイルにアクセスできません。別のプロセスが使用中です。」エラー

RotatingFileHandlerがwindows環境で上手く動かないっぽい。 代わりにConcurrentLogHandler を使うと直った。

参考:

pypi.org