Google ColaboratoryでJModelica

概要

Google Colaboratoryは機械学習の研究や教育用途であれば無償で使用できるツールで、Googleのアカウントがあればブラウザを使用してJupyter Notebookをクラウド上で動かすことができる。JModelicaが使用できたからといって何かいいことがあるかはよく分からないけれど、以下の記事でOpenFOAMを動かしているのを見て面白いと思ったのでJModelicaでもやってみた。時間帯にもよるかもしれないが、けっこう時間がかかった(30~40分くらい)ので決して手軽ではない。

qiita.com

注意点

基本的にはユーザーガイドのインストールの方法でよいが以下の部分だけ注意。

  • Python2のノートブックを使う。
  • ホームディレクトリ(~)が/rootになっているが初期位置の/contentでビルドした。
  • apt-getのときにfileとjccもインストールする。
  • JModelica.org/external/Assimuloをダウンロードしてくる。

JModelicaをビルドしてサンプルを実行

まずはGoogle ColaboratoryGoogleのアカウントにログインした状態で「ファイル→Python2の新しいノートブックを開く」で新規ファイルを作成する。あとは以下のコードのまとまりをそれぞれ入力してShift+Enterを押していけばよいだけである。前の処理が終わって無くてもShift+Enterを押しておけば順番に逐次実行していってくれる。
JModelicaをビルドしたらサンプルとしてBuildingsライブラリのBuildings.Examples.Tutorial.SpaceCooling.System3(室温をオンオフ制御して空調するもの)を実行してみる。

ビルドの環境を整える

%%bash
apt-get update
apt-get -y install g++ subversion gfortran ipython cmake swig ant openjdk-8-jdk python-dev python-numpy python-scipy python-matplotlib cython python-lxml python-nose python-jpype zlib1g-dev libboost-dev jcc file

Ipoptのビルド(JModelicaのビルドの前に必要)

%%bash
mkdir /content/Ipopt
cd /content/Ipopt
wget http://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.12.tgz
tar xzf Ipopt-3.12.12.tgz
cd Ipopt-3.12.12/ThirdParty/Blas
./get.Blas
cd ../Lapack
./get.Lapack
cd ../Mumps
./get.Mumps
cd ../Metis
./get.Metis
cd ../../
mkdir build
cd build
../configure --prefix=/content/Ipopt/
make install

JModelicaのビルド

%%bash
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64:$JAVA_HOME/jre/lib/amd64/server
mkdir -p /content/JModelica
cd /content/JModelica
svn co https://svn.jmodelica.org/trunk JModelica.org
svn co https://svn.jmodelica.org/assimulo/trunk JModelica.org/external/Assimulo
cd JModelica.org
mkdir build
cd build
../configure --prefix=/content/JModelica --with-ipopt=/content/Ipopt/
make install
make casadi_interface

Buildingsライブラリの用意

%%bash
mkdir -p /content/JModelica/work
cd /content/JModelica/work
wget https://github.com/lbl-srg/modelica-buildings/releases/download/v5.1.0/Buildings-v5.1.0.zip
unzip Buildings-v5.1.0.zip
mv "Buildings 5.1.0" Buildings

JModelicaの計算設定ファイルの書き出し

with open('/content/JModelica/work/settings.py', 'w') as f:
    f.write('import os\n')
    f.write('from pymodelica import compile_fmu\n')
    f.write('from pyfmi import load_fmu\n')
    f.write('os.chdir(\'/content/JModelica/work\')\n')
    f.write('fmufile = compile_fmu(\'Buildings.Examples.Tutorial.SpaceCooling.System3\',\'Buildings\')\n')
    f.write('model = load_fmu(\'Buildings_Examples_Tutorial_SpaceCooling_System3.fmu\')\n')
    f.write('opts = model.simulate_options()\n')
    f.write('opts[\'ncp\'] = 144\n')
    f.write('opts[\'solver\'] = \'Radau5ODE\'\n')
    f.write('opts[\'Radau5ODE_options\'][\'rtol\'] = 1.0e-6 \n')
    f.write('model.simulate(start_time=15552000.,final_time=15638400., options=opts)\n')

計算の実行

%%bash
/content/JModelica/bin/jm_ipython.sh /content/JModelica/work/settings.py

計算結果のダウンロード

from google.colab import files
files.download('/content/JModelica/work/Buildings_Examples_Tutorial_SpaceCooling_System3_result.mat')

以上で結果ファイルをダウンロードできるので自分のPCで結果を見る。

f:id:kinonotofu:20181212004921p:plain

問題なく計算ができていそうである。

ファイルの入力方法

今回はpythonで設定ファイルを書き出したが、実際はファイルを用意してアップロードする方が楽だと思われる。以下を実行するとファイル選択ダイアログを開くことができる。

from google.colab import files
uploaded = files.upload()

または以下を実行して出たリンクからアカウント認証をしてコードを取得し、入力することでGoogleドライブのマウントができる。"/content/drive/My Drive"にマウントされるので自分のGoogleドライブに置いたファイルを使用することができるようになる。

from google.colab import drive
drive.mount('/content/drive')

時間の把握

時間は以下のようにして把握する。これが0.5daysを超えるとインスタンスが落とされるらしい。

!cat /proc/uptime | awk '{print $1 /60 /60 /24 "days (" $1 "sec)"}'

おわりに

Google Colaboratoryはセッションをはじめに立ち上げてから12時間、またはPCのスリープやブラウザを閉じるなどでセッションが切れて90分のどちらかでインスタンスが落ちるので注意が必要である。
Buildingsライブラリのユーザーガイドに熱流体を扱う場合のソルバーはDymolaだとデフォルトの残差1e-4のdasslでなく残差1e-6のradauがよいと書いてあったので、JModelicaでRadau5ODEにしてみた。別にデフォルトでも計算は問題なくできる。ちなみにJModelicaのデフォルトのソルバーは相対残差1e-4のCVodeというものになっている。アウトプットの時間間隔は10分になるように回数を144に設定した。
ポスト処理は自分のPC上で行ったが、matファイルはたぶんpythonで処理できると思うので、Google Colaboratory上でできるのではないかと思う。とりあえずJModelicaは動いたのでFMIを使った計算もできると思われる。Google Colaboratoryの本来の目的の機械学習との連携についてはまだよくわからない。