見出し画像

TWSNMPのAIがサボっている疑惑は濡れ衣だった!

TWSNMPにはAI分析機能

画像1

を搭載しています。ポーリングの履歴を学習していつもと違う状況の日時を色を変えて教えてくれます。青いところが普通、赤いところがおかしい。


今週、このTWSNMPのAI分析が止まっていることに気づいてい調べていました。

AIに聞いてみようとAIのデバッグ画面を表示すると、やっぱり止まっていてデバック画面を表示した瞬間から動き始めました。どうも私が見ていないとサボっているのではという疑いの目で見るようになりました。詳しく調べるためにプログラムを修正して動作状況の情報を少し多く表示するようにしました。一度プログラムを止めて修正したプログラムを起動すると。「あれ、ちゃんと動いている」誤解だったのかもしれません。しばらく様子を見ることにしました。

メモリ使用量が増えていく

しばらく動かしているとなんとなくメモリの使用量が増えているような気がしてきたのでメモリ使用量を表示しながら、またしばらく様子を見ることにしました。しばらくして、またメモリ使用量を見ると確かに増えていました。それも尋常じない。数GB!

画像2

そのまま動かしているとMacが操作不能になってしまいました。
お!これは私が最近悩まされているMacの操作が重くなったり再起動したりする問題の原因では?

そう考えると沢山思い当たることがありました。プログラム編集中に操作できないぐらいMacが重くなり強制終了や再起動することが、最近増えてきて、そろそろ新しいMacを買わなきゃだめかなと思っていました。でも、Macが古くなった問題ではなかったようです。

厄介なメモリーリーク再び

さて、メモリーの使用量が増え続ける厄介なメモリーリーク問題をまた調べることになりました。手がかりはAI分析を行う毎にメモリ使用量が増えるということぐらいしかないので、どこから調べればよいか困ってしまいました。とりあえず、メモリが増えるプロセスをkillコマンドで止めてみました。

kill <メモリが増大するプロセス番号>

そうするとAI分析のデバック画面に、"WebGL"が使えないというようなメッセージが表示されました。おお、大きな手がかりが得られました。そこで、ドキュメントを真面目に読むという何日か前の教訓を生かして、

を読んでみると驚くことが書いてありました。

One caveat when using the WebGL backend is the need for explicit memory management. WebGLTextures, which is where Tensor data is ultimately stored, are not automatically garbage collected by the browser.

WebGLバックエンドを使っている場合は、自動でメモリの開放をやってくれない!自分でやってね!
このドキュメントに書いてある解決策や、

を見ていろいろ試してみましたが効果はありませんでした。ますます、困った。

WebGLバックエンドをやめる

さっきのドキュメントの注意書きに

Note: there is no downside of using dispose() or tidy() in non-webgl environments (like Node.js or a CPU backend) that have automatic garbage collection. In fact, it often can be a performance win to free tensor memory faster than would naturally happen with garbage collection.

と書いてあったので試しにCPUバックエンドに変えてみました。

tf.setBackend("cpu");
console.log(tf.getBackend());

あれ、WebGLより速い気がする。何となくメモリ使用量の増大もなくなったような気がする。

AIの労働環境改善

疑ったお詫びにAIの労働環境を改善することにしました。
この問題を調べる時にいろいろ試行錯誤しているうちに使っているライブラリが古いことに気が付きました。

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.0.0/dist/tf.min.js"></script>

をそのまま信用するとV1.0.0のライブラリを使うことになってしまいます。これを書いている時点の最新は、V1.7.2なので、

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@1.7.2/dist/tf.min.js"></script>

とする必要がありました。
そこで、TWSNMPで使うライブラリも最新に更新しました。

さらに、APIドキュメントを読んでいるうちに、

を見つけました。学習の効果がなくなったら早めに学習を打ち切るためのものです。AIに無駄な学習を強いることがないようにするものです。これを組み込んで学習する部分を

      const h = await autoencoder.fit(x_train, x_train, 
       { epochs: 20, batchSize: 24,
         callbacks: tf.callbacks.earlyStopping({monitor: 'loss'}),
       });

のようにしました。これで学習時間(AIの労働時間)が少なくなりました。

しばらく様子を見ます

これを書いている時点では、メモリ増加問題も起こっていません。Macの操作が重くなる問題も起こっていません。
この状態でしばらく様子をみることにします。Macを買わずに済むかもしれません。

つづく


開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。