はじめに
この記事は「ただただアウトプットを癖付けるための Advent Calendar 2024」に投稿した記事です。
最初の記事にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果がNeurIPSに採択されました。
研究をする上でWebアプリを触ることはほとんどありませんでした。
ただ、作ったものを人に使ってもらうという視点にたつと、Webアプリは非常に有用だと感じています。
上で開発したコードとの接続が良いWebアプリを作っておくことで、CUIに慣れていない人にも使ってもらいやすくなると思います。
そこで今回は、データを扱ったり、簡単なシミュレーションを走らせてその結果を可視化するためのWebアプリを作ってみました。
関連記事
前の記事「【生物物理屋による論文紹介】EVO - 分子からゲノムまで、マルチスケールで扱うLLM」
次の記事「生物物理屋がローカルLLMを導入して遊んでみた話」
Streamlitとは
Streamlitは、Pythonでデータを可視化するためのWebアプリを簡単に作成できるフレームワークです。
Jupyter Notebookのように、コードとその実行結果を同じファイルに書くことができます。
まずはチュートリアル (と思いましたが、まだやってません)
Streamlitの公式チュートリアルをやってみました。
各種リモートサーバーへの接続を除き、全部で6つあります。
Trigger a full-script rerun from inside a fragment
Streamlitの特徴的な仕様として、関数を断片に分けることができ、それを部分的に再実行することができます。
今回のWebアプリ
今回は、自分の研究で扱っている生物の群れ行動のシミュレーション結果を可視化するWebアプリを作成しました。
以下のような機能を実装しました。
- パラメータを指定して、群れ行動のシミュレーションを走らせる
- シミュレーション結果を可視化する
アプリはこちら。
また、このアプリはこちらのリポジトリからデプロイしています。
なお、これらの実装には、以下のページを参考にしました。
また、コーディングにおいて、ローカルLLM+Continue(VSCode)を多用しました。これについては2つ後の記事で詳しく書いています。
qwen2.5-coderを用いたところ、Viscekモデルのシミュレーションもstreamlitのコードも、大部分を書いてくれました。楽。
1. パラメータを指定して、群れ行動のシミュレーションを走らせる
今回のモデルは、群れ運動において基盤的であるVicsekモデルです。
Vicsekモデルは、個体が周囲の個体と平均的な方向を合わせることで群れを形成するモデルです。
個体数や、方向合わせに生じる誤差の大きさ、群れの密度などのパラメータを指定することで、群れの振る舞いを変化させることができます。
これらのパラメータを指定するスライダーをサイドパネルに実装しました。
また、シミュレーションを走らせるためのボタンも実装しました。
これは、if st.toggle('Run simulation'):
というコードで、ボタンを押すとif文の中のコードが実行されるようになります。
ハマったこととして、このボタンをst.button
で実装したところ、以下で述べるシミュレーション結果の可視化のボタンを押した際にシミュレーション結果がクリアされてしまうという問題がありました。
このため、シミュレーション用のボタンはst.toggle
で実装しました。
2. シミュレーション結果を可視化する
シミュレーション結果を可視化するために、各個体の位置と向きをプロットしました。
最初は、可視化される時刻を指定して、ボタンを押すことでその時刻のシミュレーション結果を表示するという実装をしました。
ハマったのは、ボタンを押すたびにシミュレーションが再度走り、結果が変わってしまうという点です。
この問題を解決するために、シミュレーション結果をキャッシュすることで解決しました。
シミュレーション結果をst.session_state
に保存し、それを表示することで、ボタンを押すたびにシミュレーションが再度走ることを防ぎました。
また、シミュレーションを走らせるトグルボタンをオフにすることで、キャッシュされたシミュレーション結果をクリアするようにしました。
さらに、実はシミュレーション結果を表示するのに、ボタンを実装しない方が都合がいいことに気づきました。
可視化される時刻を選ぶスライダーを変更すると、それに付随するコードは再度実行されるので、自動的に描画が更新されるからです。
このため、ボタンを押すことなく、スライダーを動かすだけでシミュレーション結果を見ることができるようになりました。
あと欲しいのは、シミュレーション結果を動画で保存したり再生したりする機能です。
これは、今後の課題として取り組んでいきたいと思います。