JModelica.org の Docker イメージ を作って Jupyter Notebook で利用する

はじめに

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 と入力してログインします。

Jupyter Notebook のログイン画面

起動を確認したら、右上の方に表示される [Quit] をクリックして Jupyter を止めます。

右上の Quit をクリックしてサーバーを停止する。

これらの手順は、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' {} \;

この修正は、

を参考にしました。

以下の環境変数を設定して、使用する 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 を選択します。

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()

JModelica.org のデモ

同様に以下のような内容をセルに入力し、グラフが表示されることを確認します。

# 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教科書 第2版 インフラの基礎知識&コードによる環境構築の自動化

以上。

 

JModelica.org の Docker イメージ を作って Jupyter Notebook で利用する” に対して1件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です