2018年09月01日

Tensorflowインストール不具合解決方法

Tensorflowをインストールした際に
下記のような不具合が発生し、
Tensorflowライブラリが使用できない問題を
解決する方法を紹介します。

今回の不具合原因は古いCPUや一部の廉価版CPU
(PentiumN3700、N4200など)に起因します。
それ以外の最近のCPUではこの不具合は発生しません。

AnacondaからTensorflowをインストールしましたが、
動作確認のコードを実行すると
「ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました。」
というエラーが出て、正常に実行されません。

原因を調査すると結論は
CPUの最近の拡張命令が古いCPUや一部の廉価版CPUでは使用できないために
発生する原因と分かりました。

ライブラリ処理でAVX2命令を使用しており、
通常のフローでTensorflowをインストールすると
AVX2対応CPUのライブラリがデフォルトでインストールされます。

古いCPUや廉価版CPUではAVX2といった拡張命令を搭載していないため、
DLLエラーが発生します。

この場合は手動でAVX2のライブラリを削除し、
SSE2のライブラリを手動でインストールします。


ライブラリを入れなおして実行すると正常に動作することが確認できました。
インストール時にCPUの種別までは自動で判断してくれないようです。

実験環境として使用している廉価版CPUに
古いCPUや廉価版CPUを搭載しているPCでTensorflowで遊んでみる
という方はご注意です。

エラー詳細
(tensorflow17) C:\Users\***>python
Python 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Traceback (most recent call last):
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "C:\Users\***\Anaconda3\envs\tensorflow17\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\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 17, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Users\***\Anaconda3\envs\tensorflow17\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\***\Anaconda3\envs\tensorflow17\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
ModuleNotFoundError: No module named '_pywrap_tensorflow_internal'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\__init__.py", line 24, in <module>
from tensorflow.python import * # pylint: disable=redefined-builtin
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\__init__.py", line 49, in <module>
from tensorflow.python import pywrap_tensorflow
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 74, in <module>
raise ImportError(msg)
ImportError: Traceback (most recent call last):
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 14, in swig_import_helper
return importlib.import_module(mname)
File "C:\Users\***\Anaconda3\envs\tensorflow17\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\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow.py", line 58, in <module>
from tensorflow.python.pywrap_tensorflow_internal import *
File "C:\Users\***\Anaconda3\envs\tensorflow17\lib\site-packages\tensorflow\python\pywrap_tensorflow_internal.py", line 17, in <module>
_pywrap_tensorflow_internal = swig_import_helper()
File "C:\Users\***\Anaconda3\envs\tensorflow17\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\***\Anaconda3\envs\tensorflow17\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.
for some common reasons and solutions. Include the entire stack trace
above this error message when asking for help.
>>>

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月25日

Kibanaコード更新方法

OSS版のKibanaで可視化ツールとして使用する場合に
ちょっと表示の挙動を変えたい、
表示文字列を変えたい
ということがある場合に今回、紹介する方法が役立ちます。


Kibanaはhtmlやjsのコードを最適化して
最適化したファイルから起動します。
そのため、Kibanaのsrcフォルダといったコードのフォルダを
修正、更新しても反映されません。



修正を反映させるポイントは
kibanaフォルダ直下のoptimizeフォルダ内のファイルを全部消す
ことです。

次回の起動時に自動的にsrcフォルダ等からoptimizeデータが生成され、
修正を反映させることができます。


なお、OSS版のKibanaはApache2のため、
修正箇所を外部に公開する必要はありませんが、
ユーザー側に修正箇所を知らせる必要があります。

posted by Crescent at 21:28| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月18日

WIZnet ioLibrary NTPの不具合

W5500などのEthenetr IC用のCライブラリ、
WIZnet ioLibraryの中でNTPの不具合の対処方法を紹介します。

ネットワークから時刻を取得して同期する機能として
NTPがあります。クライアント側のみに対応したSNTPの関数が
WIZnet ioLibraryの中に用意されています。


ArduinoではC++サンプルコードがあり、
NTPの不具合は受けません。


不具合としては
NTPで時刻を取得できない現象です。

原因としてはリトライカウントが増えず、
リクエストの再送信が行われませんでした。
1回目の時刻取得のリクエスト以降、
再送されず、ずっと返答待ち状態になってしまいます。

特に接続直後のネットワークが確立していない状態で
NTPで時刻取得のリクエストすると
1回目のリクエストを落としてしまう可能性が非常に高く、
リクエストの再送信が重要となります。



Cライブラリで用意されているSNTP関数の中に
int8_t SNTP_run(datetime *time)があり、
リトライカウントに応じた処理をしています。

【修正前】
〜〜〜〜〜〜〜〜〜〜
if(ntp_retry_cnt<0xFFFF)
{
  if(ntp_retry_cnt==0)//first send request, no need to wait
  {
    sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
    ntp_retry_cnt++;
  }
  else // send request again? it should wait for a while
  {
    if((ntp_retry_cnt % 0xFFF) == 0) //wait time
〜〜〜〜〜〜〜〜〜〜


【修正後】
〜〜〜〜〜〜〜〜〜〜
if(ntp_retry_cnt<0xFFFF)
{
  if(ntp_retry_cnt==0)//first send request, no need to wait
  {
    sendto(NTP_SOCKET,ntpmessage,sizeof(ntpmessage),NTPformat.dstaddr,ntp_port);
    ntp_retry_cnt++;
  }
  else // send request again? it should wait for a while
  {
     ntp_retry_cnt++;//追加
     if((ntp_retry_cnt % 0xFFF) == 0) //wait time
〜〜〜〜〜〜〜〜〜〜

上記の修正である間隔でリクエストの再送信が行われるようになります。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年08月04日

Arduino& W5500からelasticsearchへのデータ投入

今回はArduino&W5500からelasticsearchへデータ投入する方法を紹介します。

W5500の代わりにESP32やESP02などのWiFiモジュールでもほとんど同じです。


httpクライアントからpostしてデータを
elasticsearchへ投入するのが正統派の方法です。

今回はコードを減らすため、
httpクライアントを使用せずにTCPのみでデータを投入します。

httpのpostは結局、TCPで下記の文字列送っているだけなので、
単純な処理であればTCPのみで実装できます。


POST /test_index1/data HTTP/1.1
Content-Type: application/json
Content-Length: 99
Host: 192.168.XXX.XXX:9200
Connection: close

{
"index":"test_index",
"type":"data",
"date": "2018-07-10T13:56:06.000Z",
"temp": 28.5,
"humd": 70.2
}


1. Elasticsearch側の設定
 Elasticsearchを起動させているPCのLANといった外部からデータを投入するため、
 config/elasticsearch.ymlファイルに下記の文字を追記します。

# ---------------------------------- Network -----------------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 0.0.0.0
http.port: 9200
transport.host: localhost
transport.tcp.port: 9300


2. Elasticsearchを起動させているPCのLANを設定します。
 今回はW5500とPCをLANケーブルで直結します。
 最近のLANは自動的に接続状態を判別するため、
 クロスケーブルでなくても、普通のストレートケーブルが使用できます。

 直結でDHCP無効のため、PC 192.168.1.1と設定します。

elastic-arduino0.png

 なお、W5500側は192.168.1.2を設定しています。

3. W5500&Arduinoの設定
 W5500のシールドを乗せたArduinoに下記のコードを書き込みます。
 今回のコードはデータ送信後のhttp post成功の有無を確認していません。
 実際の運用ではデータ送信後の200、201などの成功有無確認が必要です。

 処理の流れ
 [W5500初期化]→[接続]→[データ送信]→[切断]

4. 動作確認
 PCとW5500をLANケーブルで接続し、Elasticsearchを起動させます。
 この状態でコードを書き込んだArduinoの電源を入れ、
 シリアルモニタで確認するとデータが投入されます。
 成功すると下記のように
 「HTTP/1.1 201 Created…」
 と成功したことが分かります。

elastic-arduino.png

5. Elasticsearch Kibanaの動作確認
 kibanaを起動させます。
 最初はインデックスパターンが何も設定されていないため、
 データを投入しても何も表示されません。
 Manegementから今回の「test_index」を欄に入れ、
 「Next Step」をクリックします。

 kibana-1.png


 続いて送信データ内の日付情報のデータを選択します。
 「Create index pattern」をクリックして設定を完了します。



 「Discover」に戻って、右上の時間範囲を「This year」などを選択すると
 データが入っていることが分かります。



  kibanaは未来のデータは表示できません。
 また、今回投入したデータの日付は固定時刻ですが、
 実際はRTC等からUTC時刻を取得して送信する必要があります。

 このようにArduinoからElasticsearchに簡単にデータ投入が可能です。
 W5500でなくても同様のシリーズの他、
 無線LANでTCP送信可能なESP-WROOM-02やESP-WROOM-32からでも簡単に
   Elasticsearchにデータ投入して、kibanaで可視化することができます。
posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする

2018年07月28日

Node-Redからelasticsearchへのデータ投入

今回はNode-Redからelasticsearchにデータを投入する方を紹介します。

elasticsearchはhttpメソッドを使用してjson形式でデータを投入します。

今回はタイムスタンプボタンを押すとその時の時刻とサンプルデータを
elasticsearchに投入する例を紹介します。



使用するノードは主に
「http request」のノード
「function」のノード
です。




node.jpg






「function」のノード内で投入先のelasticsearch、
インデックス、データ等を定義してpayloadに投入します。


今回はelasticsearchとNode-Redが同一マシン上にあるため、
elasticsearch の宛先はlocalhostに設定しています。
また標準のポート番号は9200です。

今回の例ではインデックス
「test_data」
と設定して温度と湿度を投入します。

今回は例として定数ですが、
実際には定数でなくセンサから読んだデータを投入します。



func.jpg



「http request」ノードは
POSTメソッドを選択します。

URLはfunctionノードで設定しているため、
空欄にします。



post.jpg


上記の設定をしてデプロイ後、
タイムスタンプボタンをクリックすると
データがelasticsearchに投入されます。

ブラウザからkibanaにアクセスして、
discoverから投入されたデータを確認できます。
必要に応じて、右上の期間設定や更新タイミングを変更してください。



discover.jpg

今回のサンプルコードは下記のリンクです。
メモ帳等で開いてNode-Redの
「読み込み」→「クリップボード」からインポートしてください。

posted by Crescent at 00:00| Comment(0) | 電子工作 | このブログの読者になる | 更新情報をチェックする