【RaspberryPi4/HTM】ストリーミングデータの教師なしリアルタイム異常検出

## Raspberry Pi OS (64 bit) beta test version

RapberryPiは世代を重ねるごと高性能になり、ついに公式から64BitOSがリリースされ（[Raspberry Pi OS (64 bit) beta test version](https://www.raspberrypi.org/forums/viewtopic.php?t=275370)）、様々なライブラリが使えるようになりました。

[Numenta](https://numenta.com/)社が開発している[HTM](https://numenta.com/resources/biological-and-machine-intelligence/)システムもそのひとつで、64Bitでしか使えなかったライブラリを動作させることができました。

![pi-screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47128/ef9cd082-1e66-e8d3-c747-b373a4d37475.png)

これはRaspberryPi4のCPU温度を「教師なしリアルタイム異常検出」しているグラフです。大脳新皮質をモデルとしたアルゴリズムが、ラズパイの小さな基盤で動いていると考えると、何ともいえない不思議な感覚になります。

さて、中身を少し詳しくみてまましょう。

## ストリーミングデータの教師なしリアルタイム異常検出

概要は以下の論文で確認することができます。（ありがたいことに、機械翻訳の精度が飛躍的に向上したため、私でも海外の論文を読むことができます。）以下冒頭部分のDeepL翻訳を引用します。

[Unsupervised Real-Time Anomaly Detection for Streaming Data](https://numenta.com/neuroscience-research/research-publications/papers/unsupervised-real-time-anomaly-detection-for-streaming-data/)

> あらゆる業界で、接続されたリアルタイム・データ・ソースによって生成されるストリーミング、時系列データの量が増加しています。これらのストリームを監視なしでリアルタイムに異常を検出することで、価値を導き出すことができます。
>
>これは実用的で大きな価値があります。例えば、医療センサーを使用して患者の状態を把握したり、ITインフラストラクチャのボトルネックを発見したりすることができます。ほとんどの人が、リアルタイムで異常を検出することが重要であることに同意していますが、それを実現するのは難しいことでもあります。
>
>そのためには、バッチではなくリアルタイムでデータを処理し、継続的に学習し、完全に自動化された異常検出システムが必要です。この論文では、Numentaのオンライン・シーケンス・メモリ・アルゴリズムである階層的一時記憶 **Hierarchical Temporal Memory（HTM）**が、どのようにしてこれらの要件を満たしているかを示します。また、最初のオープンソースのベンチマークである**Numenta Anomaly Benchmark (NAB)**を使用した結果も紹介しています。

HTMシステムはC++で動作しますが、Pyhon3のラッパーが用意されています。（開発はコミュニティーの有志が作成しています）以下のリンクからサンプルアプリを確認できます。

[htm/examples/hotgym.py](https://github.com/htm-community/htm.core/blob/master/py/htm/examples/hotgym.py)

## 仕組み

仕組みを理解するため、サンプルアプリを試してみましょう。Numentaはベンチマーク用に異常値を含むデータを数多く公開しているので、ここでは、センサーが読み取った機械の内部温度の推移データをつかってみます。データは以下のリンクより取得できます。

[machine_temperature_system_failure.csv](https://github.com/numenta/NAB/blob/master/data/realKnownCause/machine_temperature_system_failure.csv)

これをHTMシステムの異常検出アルゴリズムに入力してみます。ノートブックは以下のリンクを参照ください。

[htm-beginners-guidebook-6-5.ipynb](https://github.com/StudioIdenticalTwins/HTM-Beginners-Notebook/blob/master/chapter-6/htm-beginners-guidebook-6-5.ipynb)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47128/0feca523-0691-82c9-ba25-7ac4227555e3.png)

上のグラフは前回のQiita投稿 『[機械知能ワタナベ（仮）](https://qiita.com/PonDad/items/e376539ff676c26115be)』でワタナベが音符を予測したのと同じ仕組みです。緑が入力温度、赤がHTMシステムをつかった次のステップ予測値をしめします。

下のグラフは、異常値をHTMシステムが算出し、異常予測をNABがおこなった結果です。異常値は青、異常予測はオレンジで示されます。

ここではサンプル22,693データ（5分おきに3ヶ月ほど）の範囲内で、2箇所異常予測されているのが確認できます。異常予測には範囲指定（10,000回以上が目安になります）が必要になります。

HTMは学習と予測を同時におこなうので、データの状態変化に柔軟に対応します。NABは指定された期間の異常値を尤度で計測するため、このように教師なしで異常検知をおこなうことができます。

HTMシステムは商用利用もされていおり（いままで知らなかったのですが）、商用ライセンスを取得したGrok社が、AWSの異常検知システムを運用しているようです。

[Numenta Releases Grok for IT Analytics on AWS](https://numenta.com/press/2014/03/25/numenta-releases-grok-for-it-analytics-on-aws/)

## 必要なライブラリ

さて、RaspberryPiでサンプルアプリを動かしてみましょう。私は『RaspberryPi4ModelB/4GB』をつかいました。必要なライブラリは以下のとおりです。

- [htm.core](https://github.com/htm-community/htm.core) 
- [numpy](https://numpy.org/) 
- [matplotlib](https://matplotlib.org/users/installing.html)

htm.coreのインストールは以下のノートブックを参照ください。

[htm-beginners-guidebook-1-1.ipynb](https://github.com/StudioIdenticalTwins/HTM-Beginners-Notebook/blob/master/chapter-1/htm-beginners-guidebook-1-1.ipynb)

64bitOS（ベータ版）は以下のリンクより取得しました。

[Raspberry Pi OS (64 bit) beta test version](https://www.raspberrypi.org/forums/viewtopic.php?t=275370)

64BitOSを使うとCPUの温度が非常に高くなります。私のラズパイも常時70度〜80度近くになり、少々危険なのでファンを取り付けました。

![pi4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47128/c44995ce-01ef-dc6a-2bec-f09749a599ef.jpeg)


ファンを制御できるものを探してみたらこちら （[Fan SHIM](https://www.switch-science.com/catalog/5990/)） が良さそうだったので取り付けてみました。自動制御できるライブラリもあります（[rpi-fanshim](https://github.com/jane-t/rpi-fanshim)）。今のところ55度〜60度で設定し、問題なく動作しています。ただし、I2C接続ができなくなってしまいます。

## データの取得とライブラリの実行

ライブラリのインストールさえできれば、実行は比較的簡単におこなうことができます。

[`vcgencmd`](https://www.raspberrypi.org/documentation/raspbian/applications/vcgencmd.md)を`subprocess()`モジュールで実行し、CPUの温度を取得します。また、日時は`datetime.datetime.now()`モジュールで取得します。それらのデータを`time.sleep()`をつかったループ処理をつかいHTMシステムに入力します。

[RaspberryPi4-Unsupervised-Real-Time-Anomaly-Detection.py ](https://github.com/PonDad/RaspberryPi4-Unsupervised-Real-Time-Anomaly-Detection/blob/master/RaspberryPi4-Unsupervised-Real-Time-Anomaly-Detection.py)

matplotlobの可視化を含めても130行弱で実行できます。

![raspi-screenshot-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47128/8755b824-f6f8-18c2-0c7e-855c8af08c01.png)

5秒に1回の実行でのCPU使用率は4〜5%といったところです。

## まとめ

RaspberryPiが64Bit対応したことで、センサーのデータをリアルタイムで教師なし学習できるようになりました。

音・光・超音波をはじめとしたセンサーのデータはもとより、ディープラーニングを併用すれば画像認識や音声認識データをセンサー代わりにつかうこともできそうですね。

HTMは日本語の情報がほとんどなく、基本的な使い方を知るのも大変でした。同じような方がいるかも知れないので、GitBookにまとめてみました。（個人的な興味でまとめたものなので、もちろん非公式ですが）

[HTM / Hierarchical Temporal Memory 非公式ビギナーズガイドブック（日本語版）](https://studioidenticaltwins.gitbook.io/htm-beginners/)

興味を持たれた方が、ちょっと試してみたいときに参考になれば幸いです。ではまた。