Julia 言語でのシミュレーション補助フレームワーク DrWatson.jl の紹介
title: "article-DrWatson.jl"
Julia 言語でのシミュレーション補助フレームワーク DrWatson.jl の紹介
日本語の紹介記事が一つも見当たらなかったので、僕が書いてみます。 なるべく Julia を知らなくても Python あたりが分かれば大体便利さだけは伝わるように書きたいと思います。 分からないところ、分かりづらいところがあればぜひコメントお願いします!
TL;DR
はじめに
機械学習やコンピュータシミュレーションなどを趣味や研究で行っていると、 最初は新しいアイディアを学んだり、独自のアイディアを思いついて盛り上がりながら実装したり、楽しいと感じるかと思います。
しかしその作業が進んでいくと、別の問題が重くのしかかってきます。 それまでのコードやデータ、プロットの画像ファイルなどをどうやって管理するのか、という問題です。 個人でコンパクトに作業しているとしても、こんな問題って発生しませんか?
- あのうまく動いていたコードはどこにあるんだっけ? もう一度同じ計算をしたいんだけど、依存してる別のコードも書き換えちゃったぞ…
- プロジェクトの構造を整理して変更したら、パスが変わってもう動かない!
- この設定(パラメータの組)での、長時間かかったシミュレーションって、もうやったっけ? やったか分からないならまたやらなきゃいけない…
- 結果の CSV とかのデータファイルの名前ってどうすればいい?
- パラメータは (a=1.0, b=2.5) だから、プレースホルダーで “sim<sub>a</sub>=
b.csv” とする? パラメータ増えたらまたこういう文字列書かなきゃダメ?a<sub>b</sub>=
- パラメータは (a=1.0, b=2.5) だから、プレースホルダーで “sim<sub>a</sub>=
- 面倒なのでデータファイルの名前を使いまわしていたら、大事なデータファイルを上書きしてしまった!… しかも同じ結果を再現するコードが変更されてる… やり直し?
DrWatson.jl は、こういう問題を一挙に解決してくれるライブラリというかフレームワークです。 フレームワークと言うと大掛かりで覚えることが多く使い始めるのを躊躇うかもしれませんが、 実際には使いたい機能だけチェリーピックして使うことができます。
起こりがちな問題について詳しく
残しておくべきコードが見つからない
とりあえず正しいシミュレーションや計算ができた。 しかしもっと一般的ないろいろな種類の計算ができるようにプログラムを拡張したい。 git を使ってソースを管理しているので、一般性は低いけれども正しい結果を算出できるコードは git の repository のどこかの commit に残っている。 でもどこにあるのか見つけられない。
→じゃあ、gitの情報と計算結果のデータの情報を紐付けて、いつでもそのデータを生成したスクリプトを見つけられるようにできないかな?
プロジェクト構造を整理して変更したら、パスが変わったため、コードの読み込みができなくなった! 手動で全部修正するのは気が遠くなる…
この設定(パラメータの組)でのシミュレーションってもう計算したことがあったっけ?
計算完了した結果を集めた DataFrame は、もう一回作成しないといけないんだっけ? 自動でシミュレーション結果の集計してまとめて可視化などの処理できない?
いろんな設定でシミュレーションして結果を集めているんだけど、結果のcsvなり serialize したファイルの名前を一々決めるのは面倒…
人にコードを送っても、バグばっかりでうまく動かないって言われる… いちいち環境に合わせてどこをどう書き換えれば良いのかをドキュメントにするのは大変
人からコードをもらっても、沢山の修正が必要で、うまく動かない… 忙しいんだから、もらったら一発で動いて欲しい
*
DrWatson.jl のデフォルトの設定
まず git repository を Julia コードで作成します。
例えば ~/git に git repository を置いておくとします。 そうしたら、 ~/git/drwatson_initialize.jl というような Julia コードを置いておくと便利です。 中身は
using DrWatson
# prefer project names without spaces!
initialize_project("SimulationTest"; authors="your name")
のようにするとフォルダ <file:///Users/tatsujit/git/SimulationTest> が生成されます。 最初の文字列引数がプロジェクト名で、git repository の名前にもなります。 上の2行目のコメントにあるように、プロジェクト名にはスペースを入れないのが吉でしょう。 authors は自分の名前か github アカウント名でも入れておくと良いでしょう。
出来上がったフォルダの中身とそれぞれの役割を見てみます
tree .
すると、以下のようなディレクトリ構造になっていることが分かります。 実際にはサブフォルダを増やしたり減らしたり、色々カスタマイズできます。
.
├── _research # 研究の試行錯誤用のスクリプトやデータなど
├── data # データのフォルダ
│ ├── exp_pro # 実験データで前処理 (pro は processed の略) されたもの
│ ├── exp_raw # 生の(前処理前の)実験データ
│ └── sims # シミュレーションの計算結果
├── Manifest.toml # Julia プロジェクトの管理ファイル(完全な Julia 環境の再現性を確保)、「何のライブラリを使ったか」
├── notebooks # jupyter notebook などはここに入れると良い。チュートリアルを入れるのにも良い場所
├── papers # このプロジェクトの結果を用いた論文や、関連の深い論文など入れておくと良いだろう
├── plots # データをプロットした画像ファイル (.png, .pdf, .svg, .eps など) はここにまとめると便利
├── Project.toml # Julia プロジェクトの管理ファイル、「何のライブラリが必要か」
├── README.md # github のトップに出る README ファイル
├── scripts # シミュレーションやデータ処理のスクリプトなどをここに置く
│ └── intro.jl # スクリプトのテンプレにもなる。これを実行するとプロジェクト名とパスを表示してくれる
├── src # scripts 内のコードから共通で呼び出す関数や構造体などはここにまとめると良い
│ └── dummy_src_file.jl # docstring 付きのサンプル関数定義がある
└── test # テストはここに書いていく
└── runtests.jl # src は scripts のファイルのテストを書く。環境の確認やベンチマークもしておくとリモート実行に便利
12 directories, 6 files
それぞれの意味と機能
デフォルトでは以下が .gitignore に入っています。
# Folders to ignore - files may be too large, too many, etc. NOTE: EDIT IF NEEDED.
/data # 特に計算結果のデータは大きいので github などでの管理には向いていないと
/videos # 計算からアニメーションを作った際など、ファイルが大きくなりがち
/plots # 画像ファイルは大きいのでデフォルトでは gitignore
/notebooks # jupyter notebook も画像や計算結果など含んで大きくなりがちなので
/_research # ここでの試行錯誤は scripts にまとめてから git で管理するのがオススメされている
scripts/intro.jl の中身はテンプレとプロジェクト情報の表示
using DrWatson
@quickactivate "SimulationTest"
# Here you may include files from the source directory
include(srcdir("dummy_src_file.jl"))
println(
"""
Currently active project is: $(projectname())
Path of active project: $(projectdir())
Have fun with your new project!
You can help us improve DrWatson by opening
issues on GitHub, submitting feature requests,
or even opening your own Pull Requests!
"""
)
src/dummy_src_file.jl はサンプル関数の定義
Julia では docstring は関数定義の直前に(空行を入れずに)書きます。REPL で ?dummy_project_function のようにするとこの内容が markdown で見れます。
"""
dummy_project_function(x, y) → z
Dummy function for illustration purposes.
Performs operation:
```math
z = x + y
"""
function dummy_project_function(x, y)
return x + y
end
### `test/runtests.jl` にはテストの書き方の例がある
```julia
using DrWatson, Test
@quickactivate "SimulationTest"
# Here you include files using `srcdir`
# include(srcdir("file.jl"))
# Run test suite
println("Starting tests")
ti = time()
@testset "SimulationTest tests" begin
@test 1 == 1
end
ti = time() - ti
println("\nTest took total time of:")
println(round(ti/60, digits = 3), " minutes")
DrWatson.jl を使ったプロジェクトの例
TODO どんな例がいいかな
ややこしくないのが良いんだけど
どうせやるならやってみたいことが良いよな
フロー
まずデフォルトの まず git repository を Julia コードで作成します。 でプロジェクト生成
git に登録 (gh コマンドがあるなら以下の感じでもOK)
# 1. プロジェクトディレクトリに移動
cd SimulationTest
# 2. Git リポジトリを初期化
git init
git add .
git commit -m "Initial commit: DrWatson project setup"
# 3. GitHub にリモートリポジトリ作成 + push; private repo としている
gh repo create MyProject --private --source=. --remote=origin --push --description "Julia simulation project with DrWatson"
scripts に
はじめに-old
DrWatson.jl の使い方を覚えると「なにがうれしいか」
- コンピュータシミュレーションや実験解析などのコードの書き方を統一できる
個人的なモチベーション
大学院生の頃にコンピュータシミュレーション中心の研究を少しだけしていました。 自分の研究用のコードの管理というものが大変難しいというのは経験しており、 また乱数シードが失われて再現の難しい結果というのも結局あります。
また、研究者が世界観をコンピュータで走るようなモデルで表現するような研究というのは、 コンセプト的には大変面白いと感じたものの、結果がコードのバグによるものであったり、 単純に概念の定義が間違っていたり、 論文の記述が間違っていて結果を再現できなかったり(そして論文の著者本人すら 正しい記述やコードを再現できない)、 というものが多かったように思います。 もちろん私の知識不足でタイポを修正できなかった場合もありますが、他の優れた院生や 研究者も結果を再現できないというのが常態と化していました。
「自分はこの現象をこのように考える」「自分は世界をこのように見たい」といった タイプの研究は、ある意味でアート的な研究だと思います。 コードや結果や論文が研究者の世界観の表現としてあるわけです。 そういうものは面白いので、コンピュータシミュレーションが期待を集めていた1990年代 以降も、ずっと続けば良いと思う。
他方で、そういう研究が大事であるからこそ、「間違っていた」「再現できない」 「バグでした」では困る。結局主張やロジックが間違いだったからと却下される論文は出てくる と思いますが、それでも残る研究はある。
コンピュータシミュレーションと計算論的研究の関係
コンピュータシミュレーションというのは、人間や物質を対象とした実験と比べると、 気軽にできて、楽しいと感じます。 また、いわゆる計算論的 (computational) な研究というのは、ある現象のモデルを 作って、現象の理解を深めたり、現象の予測ができるようにしたり、またその現象が 起こるメカニズムの説明をより詳細にできることを目指します。
その際、新しいモデルを作ったり、既存のモデルを新しい現象に適用したりする際には、 そのモデル自体の性質を詳しく調べたり調べ直したりすることが大事です。
[具体例] 認知モデルか何か
正しく、再現可能でよく整理されたシミュレーション研究の難しさ
この記事の前提知識
Julia
DrWatson.jl は Julia のライブラリであり、 Julia でのシミュレーション研究の補助ライブラリ なので、 Julia の知識は必要です。日本語でコンパクトな Julia 言語解説書としては 1から始める Juliaプログラミング | 進藤 裕之, 佐藤 建太 |本 | 通販 | Amazon が あります(大体読みました)。
より包括的な解説書としては 実践Julia入門 | 後藤 俊介 |本 | 通販 | Amazon があります (半分ほど目を通しました)。 Juliaプログラミング大全 (KS情報科学専門書) | 佐藤 建太 |本 | 通販 | Amazon も良さそうですが、 未読です(いま注文しました)。
git
DrWatson.jl では、後述のように、シミュレーションの再現可能性の確保のために git や github の バージョン管理を使います。 git を用いるメリットとして、あるコミットのソースツリー状態で計算した結果、または類似の結果を 再計算したい場合に、そのコミットまで巻き戻すことで、かなり確実に再計算が保証されます。 これは、 DrWatson.tagsave() によって Git commit ID をデータに残しておくことで実現できます。
Discussion