NILMTKのdockerイメージ

MacIntelからApple Siliconに変わったこともあり、nilmtkを新しいマシンでも使えるようにしてみました。ただ、毎度、新規に環境構築をするのも面倒なのでdockerイメージを作ることにしました。

出来上がったものはこちら

github.com

NILMの代表的なデータセット(REDD, UKDALE, REFIT)を導入するためのスクリプトも入れてあるので素早く実験を開始することができます。

苦労した点

過去の記事 のときもうまくいかなかったように今回も公式手順 にある以下の conda install の方法はうまくいきませんでした 😞

$ conda config --add channels conda-forge
$ conda install -c nilmtk nilmtk

IntelマシンではなくMac M1でビルドしていることもありますが、 約15000秒(約4.2時間)かかったあとに無情のエラーでビルド失敗..

ERROR: failed to solve: process "/bin/sh -c conda install -c nilmtk nilmtk -y" did not complete successfully: exit code: 1

過去の手順でやるしかないのかな..と思っていたところ pip install でインストールできる方法が偶然見つかりました

Unable to download nilmtk · Issue #953 · nilmtk/nilmtk · GitHub

In summary, for the most up-to-date installation instructions, here're the steps

  1. Create environment for python=3.8
  2. pip install git+https://github.com/nilmtk/nilmtk@0.4.3 Ref from here
  3. pip install git+https://github.com/nilmtk/nilm_metadata@0.2.4 Verify installation
  4. startup python console environment and enter import nilmtk

これの通りやるとnilmtkを問題なくインストールできました✨

ただ、DNN系のアルゴリズムを使えるnilmtk-contribを合わせてインストールしようとするとパッケージの依存関係が解決できずエラーになってしまいます..

解決方法としては、依存パッケージをインストールせずに本体のみをまずpipインストールし、そのあとに依存パッケージを別途インストールすることにしました。

Dockerfileでの該当箇所は以下

COPY files/requirements.nilmtk_contrib.txt /tmp
RUN conda init bash && . ~/.bashrc && conda activate nilmtk-env \
  && pip install git+https://github.com/nilmtk/nilmtk@0.4.3 \
  && pip install git+https://github.com/nilmtk/nilm_metadata@0.2.4 \
  && pip install --no-deps git+https://github.com/nilmtk/nilmtk-contrib \
  && pip install -r /tmp/requirements.nilmtk_contrib.txt

あと、試しにPython3.8ではなくPython3.9に変えてみたところインスールNGだったので、Python3.8を使う必要があります

NILMデータセット

datasetディレクトリ以下に redd、refit、ukdaleのディレクトリがあり、各サブディレクトリに入って download.shconvert.py を実行すれば nilmtkで使えるh5形式のファイルが生成されます

ただ、REDDは配布サイトであるhttps://redd.csail.mit.edu/にアクセスしても応答が返ってこなくダウンロードできません(場所が変わったのだろうか? 🤔)

以前にダウンロードしたファイルが手元にあったのでconvertできることは確認しています。

あと、UKDALEも一部のファイルがでかいので(house_1のmains.datで4.1Gある)、Dockerのメモリが16GBぐらい必要です。足りないとconvert中に Killed されます

Python3.11版のdockerイメージ

pipの方法だとPython3.8でしか動かせないので Python3.11版のdockerイメージも作りました。

github.com

こちらは 過去の記事 の方法に沿ってやらないといけませんが、無事イメージ作成 & インストールすることができました。

こちらも依存関係が難しくオリジナルのsetup.py を改修したファイルをコピーしてインストールするようにしました。

また、nilmtk-contribが古いKerasベースのコードになっており 新しいKerasのバージョンではライブラリのロード時にエラーになってしまい、こちらに関しても修正したファイルを別途用意しておき上書きコピーしてインストールするようにしました。