JModelica.org の Docker イメージ を作って Jupyter Notebook で利用する
Table of Contents
はじめに
JModelica.org は、Modelica 言語に基づいて複雑な動的システムのモデル化、シミュレーション、最適化および分析などを行うプラットフォームとなるソフトウェアです。Lund 大学などの学術機関と民間企業の協力を得て、Modelon AB によってオープンソースソフトウェアとして維持開発されてきました。Modelon は、2019年12月18日に、Assimulo, PyFMI, FMI Library を除くコンパイラや最適化機能など含む部分を一般に使用可能なオープンソースとすることを止めてしまいました。今後も開発は続けられて商用および学術的用途で利用は可能だそうです。
現在、https://jmodelica.org/ のフォームに登録することによって、最後のオープンソースバージョンのソースコードと Windows用バイナリのダウンロードが可能です。
ここでは、この最後のオープンソースバージョンのソースコードである JModelica.org-2.14 をインストールした Dockerイメージを作成します。Dockerfile は作成せず、手作業でJModelica.org と Jupyter Notebook をインストールしたコンテナからイメージを作成します。そして、Jupyter Notebook を使用して Mac のブラウザから利用する環境を構築します。
作業環境
ここでは最近 Mac にインストールした Docker Desktop for Mac を使用しますが、Docker が使用できる環境であれば、Linux や Windows でも同様の作業が行えます。MacへのDockerアプリのインストールの手順は、Docker Desktop for Mac のアンインストールと再インストール に記しました。
JModelica.org のソースコードのダウンロードする
https://jmodelica.org/ の form に登録し、ソースコードの zipファイル JModelica-2.14.zip をダウンロードします。任意の作業フォルダを作成して、この zip ファイルをコピーします。ここでは、作業フォルダを /Users/xxxxx/jmodelica とします。(xxxxxはユーザ名)
# cd /Users/xxxxx/jmodelica # ls JModelica.org-2.14.zip
Dockder コンテナを作成する
Docker Desktop for Mac を起動し、サインインした状態にします。
Dicjerコンテナを作成するために、ターミナルから以下を実行します。
# docker run -it --name jm0 -p 8888:8888 -u root -v /Users/xxxxx/jmodelica:/home/jmodelica/jmodelica ubuntu:18.04
docker run コマンドは、ベースとなるDockerイメージからDockerコンテナを生成して起動します。
- -it は、コンテナの標準入力を開く(-i)と端末デバイスを使う(-t)を同時に設定するオプションで、コンテナをインタラクティブに操作する場合に設定します。
- –name jm0 は、コンテナにコンテナ名 jm0 を付けます。
- -p 8888:8888 はホストとコンテナで通信するためのポートマッピングで、-p [ホストのポート番号]:[コンテナのポート番号]のように設定します。Jupyter Notebook で使用するポート番号を設定します。
- -u root は root ユーザとしてコンテナにログインします。
- -v /Users/xxxxx/jmodelica:/home/jmodelica/jmodelica は、ホストの作業ディレクトリ /Users/xxxxx/jmodelica をコンテナの /home/jmodelica/jmodelica にマウントします。
- ubuntu:18.04 は、コンテナの元となるベースイメージです。
以下のようなプロンプトが表示され、作成した Docker コンテナにインタラクティブにアクセスできる状態になります。aa8385bf0ef7 は新規生成されるコンテナIDです。
root@aa8385bf0ef7:/#
コンテナに必要な環境やツールをインストールする
コンテナで以下のようなコマンドを実行して、JModelica.org のビルドに必要な環境を整えます。
apt update apt upgrade apt -y install g++ subversion gfortran ipython cmake swig ant openjdk-8-jdk apt -y install python-dev python-numpy python-scipy python-matplotlib
インストール中に、Geographic area と Time Zone の入力を促されますが、それぞれ 6. Asia と 79. Tokyoを設定します。
Geographic area: 6 Time zone: 79
さらに以下をインストールします。
apt -y install cython python-lxml python-nose python-jpype zlib1g-dev libboost-dev apt -y install jcc vim wget unzip pkg-config libblas-dev liblapack-dev
ここでインストールしたものは、以下を除いて JModelica.org User Guide に記されています。
- vim: テキストエディタ
- wget: ダウンローダ
- unzip: zip の解凍ツール
- pkg-config, libblas-dev, liblapack-dev: これらをインストールすると、CasADi のビルド時の cmake コマンドによって PKGCONFIG, BLAS, LAPAK などが認識されます。
Jupyter Notebook をインストールする
まず pip コマンドをインストールし、pip を使って Jupyter をインストールします。
apt install python-pip pip install jupyter
設定ファイルを編集します。
mkdir ~/.jupyter vim ~/.jupyter/jupyter_notebook_config.py
設定ファイル jupyter_notebook_config.py の内容
c = get_config() c.NotebookApp.ip = '*' c.NotebookApp.open_browser = False c.NotebookApp.port = 8888 c.NotebookApp.token = 'jmodelica'
動作テストをします。
jupyter notebook --allow-root --port=8888 --ip=0.0.0.0 --no-browser
Mac のプラウザから http://localhost:8888 にアクセスします。Password or token: の欄に jmodelica と入力してログインします。
起動を確認したら、右上の方に表示される [Quit] をクリックして Jupyter を止めます。
これらの手順は、Docker上でubuntuをベースにPythonのjupyter環境を構築する方法 を参考にしました。
Ipopt をインストールする
Ipopt のソースコードを root のホームディレクトリにダウンロードして解凍します。
cd wget http://www.coin-or.org/download/source/Ipopt/Ipopt-3.12.13.tgz tar zxvf Ipopt-3.12.13.tgz
ThirdPartyソフトウェアのソースを入手します。
cd Ipopt-3.12.13/ThirdParty/ASL/ ./get.ASL cd ../Blas/ ./get.Blas cd ../Lapack ./get.Lapack cd ../Metis/ ./get.Metis cd ../Mumps/ ./get.Mumps cd ../..
試行錯誤の結果、インストール先を /usr/local に設定すると CasADi のビルド時の cmake によって IPOPT が認識されることがわかりました。
以下のように configure でインストール先を設定して Ipopt をビルドインストールします。
mkdir build cd build ../configure --prefix=/usr/local make make install
JModelica.org をインストールする
JModelica.org-2.14.zip を root のホームディレクトリにコピーして解凍します。
cd cp /home/jmodelica/jmodelica/JModelica.org-2.14.zip . unzip JModelica.org-2.14.zip
configure やシェルスクリプトのパーミッションとして実行権を付けます。
cd JModelica.org-2.14 chmod +x configure chmod +x *.sh
ソースコードの solver_opbect.output を solver_object.getOutput に置き換えます。
find ./ -type f -exec sed -i -e 's/solver_object.output/solver_object.getOutput/g' {} \;
この修正は、
- https://stackoverflow.com/questions/55230042/jmodelica-on-ubuntu-18-04
- https://gitlab.com/christiankral/install_jmodelica/-/blob/master/install_jmodelica.sh
を参考にしました。
以下の環境変数を設定して、使用する Java の環境を OpneJDK-8 にします。
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 export PATH=$JAVA_HOME/bin:$PATH
以下の手順で、インストール先を /usr/local/jmodelica にして、JModelica.org をビルドインストールします。
mkdir build cd build ../configure --prefix=/usr/local/jmodelica --with-ipopt=/usr/local make make install make casadi_interface
インストールした JModelica.org の動作テストを行う
以下のようにしてJupyter Notebook の起動スクリプトを作成します。
vim /usr/local/jmodelica/bin/jm_start.sh chmod a+x /usr/local/jmodelica/bin/jm_start.sh
/usr/local/jmodelica/bin/jm_start.sh の内容
#!/bin/sh export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH cd /home/jmodelica/jmodelica JMODELICA_HOME=/usr/local/jmodelica \ IPOPT_HOME=/usr/local \ SUNDIALS_HOME=${JMODELICA_HOME}/ThirdParty/Sundials \ PYTHONPATH=:${JMODELICA_HOME}/Python/::$PYTHONPATH \ LD_LIBRARY_PATH=:/usr/local/lib/:${JMODELICA_HOME}/ThirdParty/Sundials/lib:${JMODELICA_HOME}/ThirdParty/CasADi/lib:$LD_LIBRARY_PATH \ SEPARATE_PROCESS_JVM=${JAVA_HOME} \ MPLBACKEND=Agg \ jupyter notebook --allow-root --port=8888 --ip=0.0.0.0 --no-browser $@
このスクリプトを実行します。
/usr/local/jmodelica/bin/jm_start.sh
Mac のブラウザで http://localhost:8888 にアクセスします。ログイン画面が表示された場合は、Password or toke: の欄に jmodelica と入力します。右上の方に表示されるメニューで New > Python 2 を選択します。
JModelica.org User Guide に記載されているデモを実行します。表示されるセルに以下のように入力して Shift + Return を押します。
%matplotlib inline # Import and run the fmi_bouncing_ball example and plot results from pyfmi.examples import fmi_bouncing_ball fmi_bouncing_ball.run_demo()
同様に以下のような内容をセルに入力し、グラフが表示されることを確認します。
# Import and run the CSTR example using CasADi and plot results from pyjmi.examples import cstr_casadi cstr_casadi.run_demo()
# Import the RLC example from pyjmi.examples import RLC # Run the RLC example and plot results RLC.run_demo()
DyMat と Pandas をインストールする
[2020年3月6日追加]
DyMat は、JModelica, Dymola, OpenModelica の mat ファイル を読み込んだり、他のファイル形式にエクスポートすることができるライブラリです。Pandas はデータ解析を支援するライブラリです。便利なのでこれらをインストールします。
%%bash pip install DyMat pip install pandas
ブラウザで Home に移動し、Quit をクリックしてサーバーと停止します。
Docker コンテナから Dockerイメージを作成する
Mac上で Dock のターミナルアイコンを右クリック(トラックパッドの2本指クリック)して新規ウィンドウを開きます。以下のように、 docker ps コマンドで、Dockerコンテナ jm0 が実行中であることを確認します。
% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa8385bf0ef7 ubuntu:18.04 "/bin/bash" 10 hours ago Up 10 hours 0.0.0.0:8888->8888/tcp jm0
Dockerコンテナ jm0 を停止します。
% docker stop jm0 jm0 % docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aa8385bf0ef7 ubuntu:18.04 "/bin/bash" 16 hours ago Exited (0) 10 seconds ago jm0
DockerコンテナからDockerイメージを作成します。作成するコマンドは、
docker container commit コンテナ識別子 ユーザー名/イメージ名:タグ
です。ユーザー名 finback9、イメージ名 jmodelica、タグ jm0 としました。イメージが生成できると docker image ls コマンドで確認できます。このユーザー名は Docker Hub のログインIDです。
% docker container commit jm0 finback9/jmodelica:jm0 sha256:19511b3581a3e92fb4d6284ef6d8a1fdfa0f5d860e19f95d103c894eeea38d99 % docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE finback9/jmodelica jm0 19511b3581a3 5 minutes ago 2.67GB ubuntu 18.04 ccc6e87d482b 4 weeks ago 64.2MB
この他にも、 docker export コマンドでコンテナを tar ファイルに出力し、この tar ファイルから docker import コマンドでイメージを作成する方法もあります。
作成した Docker イメージから Docker コンテナを起動する
ターミナルから以下のコマンドを実行すると jm1 という名前のコンテナが起動します。コマンド内の/Users/xxxxx/jmodelica はホスト上の作業ディレクトリでコマンド実行前に存在する必要があります。コマンドの一番最後につけた /usr/local/jmodelica/bin/jm_start.sh でJupyter Notebook が起動します。
docker run -it --name jm1 -p 8888:8888 -u root -v /Users/xxxxx/jmodelica:/home/jmodelica/jmodelica finback9/jmodelica:jm0 /usr/local/jmodelica/bin/jm_start.sh
Mac のブラウザで hppt://localhost:8888 にアクセスして、Jupyter Notebook にログインして先程と同様に JModelica.org の動作テストを行います。
このようにして起動した場合、Jupyter Notebook の Quit をクリックするとコンテナが停止します。
% docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 507da0d613e9 finback9/jmodelica:jm0 "/usr/local/jmodelic…" 5 minutes ago Exited (0) 35 seconds ago jm1 aa8385bf0ef7 ubuntu:18.04 "/bin/bash" 18 hours ago Exited (0) 2 hours ago jm0
次のようにして再びコンテナを起動することができます。
% docker start jm1 jm1
.zshrc に次のような alias を追記しておくと、ターミナルで jmodelica_start と入力することによってコンテナを作成して起動させることができます。
alias jmodelica_start='docker run -it --name jm1 -p 8888:8888 -u root -v /Users/xxxxx/jmodelica:/home/jmodelica/jmodelica finback9/jmodelica:jm0 /usr/local/jmodelica/bin/jm_start.sh'
Docker イメージをファイルとして保存する
次のようなコマンドで作成した Dockerイメージをファイルに保存します。
docker image save -o ファイル名 リポジトリ:タグ
docker image save -o docker_jmodelica.tar finback9/jmodelica:jm0
ファイルからDockerイメージを復元するにはつぎのようなコマンドを実行します。
docker image load -i ファイル名
docker image load -i docker_jmodelica.tar
参考
- Docker上でubuntuをベースにPythonのjupyter環境を構築する方法
- python – JModelica on Ubuntu 18.04 – Stack overflow
- install_jmodelica.sh, Christian Kral
- JModelica User Guide – Ver.2.2
- JModelicaをUbuntuにインストールする – Qiita
- Google ColaboratoryでJModelica
プログラマのためのDocker教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化
以上。
“JModelica.org の Docker イメージ を作って Jupyter Notebook で利用する” に対して1件のコメントがあります。