ククログ

株式会社クリアコード > ククログ > Bio"Pack"athon 2022 #4 - Treefitのパッケージング

Bio"Pack"athon 2022 #4 - Treefitのパッケージング

Bio"Pack"athon 2022 #4で「Treefitのパッケージング」という話をした須藤です。Treefitとはなにかも簡単に説明しつつTreefitのパッケージングまわりのことを説明します。

関連リンク:

Treefit

Treefit早水先生らが開発した細胞分化の軌跡推定をするために使えるソフトウェアです。私もTreefitの開発に参加していてR版・Python版パッケージの開発を担当しました。実は、最初のバージョンは2-4年前に開発していて、リリースした頃に統計数理研究所のプロジェクト紹介1で記事にしてもらったりもしていたのですがこのブログでは紹介していませんでした。(書くのが面倒くさくて。。。)

細胞分化の軌跡推定についての詳細は前述のプロジェクト紹介ページや↓の同じイベントでの早水先生の動画をみてください。なんですが、ここでも簡単に紹介しておきます。

動物細胞の場合、幹細胞の分化の軌跡の全体像はツリー構造になるという仮説が古くからありますが、そのツリー構造の全体像にはまだ解明されていない部分が色々と残っています。そこで近年では、最新の実験計測技術が生み出す1細胞の遺伝子発現データという高精細なデータから細胞分化のツリーを再構築する研究に研究者たちの関心が集まっています。このデータ解析課題は「細胞分化の軌跡推定」と呼ばれるもので、これまでに多くの研究者たちが1細胞の遺伝子発現データからツリーを作る手法を提案してきました。しかし、既存手法は細胞分化の軌跡を表すツリーを推定することだけに焦点を合わせており、データから推定されたツリーがどれだけ信頼できるか(もとのデータ点の分布がどれほどツリーっぽいか)を客観的に判断するための方法はありませんでした。Treefitは、データとツリーのフィッティングの良し悪しを測ることで、データから推定されたツリーの信頼性を客観的に評価することを可能にする革新的なツールです。データとツリーの当てはまりの良さを測るという新しい着眼点で開発されたTreefitは既存の手法と競合するものではなく、むしろ推定結果の妥当性を事後評価する目的で様々なツリー推定アルゴリズムと組み合わせて使うことができます。

Treefitのパッケージング

そんなすごいTreefitですが、作っただけで終わりにするのではなく広く使ってもらってさらなる応用研究に活用してもらいたいです。そのためには、関連研究で使われているツールから簡単に使える環境を整備しなくてはいけません。ということで、関連研究をしている人たちによく使われていそうなRとPython用のパッケージを開発しました。

Bio"Pack"athonは「バイオのソフトウェアパッケージを作ることを推進するコミュニティ」ということだったので、Treefitのパッケージを作ったときに得られた知見のうち、パッケージを作るとき一般に有用そうな知見を紹介しました。大きく分けて次のことについて紹介しました。

  • ドキュメント関連
  • テスト関連
  • リリース関連

ドキュメント関連

広く使ってもらうにあたりドキュメントの整備は非常に重要です。適切なドキュメントがないとユーザー候補はそもそも自分が使うべきパッケージかどうかを判断できません。

よって、「ユーザー候補」が最初に読むべきドキュメントを準備します。「チュートリアル」や「Getting started」と呼ばれている内容のドキュメントになります。R版・Python版でそれぞれ次のようになっていて、文章による説明だけではなくサンプルコードとその実行結果および可視化結果をたくさん載せています。

サンプルコードとその実行結果および可視化結果があることにより直感的に理解しやすくなります。「ユーザー候補」はまだTreefitに対する知識が少ないのでこのようなアプローチの方が理解しやすくなります。

APIはできるだけ簡単に使えるように設計します。よくあるユースケースであればチュートリアルで使っているコードをベースにちょっとパラメーターをカスタマイズすれば使えるようなイメージです。通常のAPIだけでなく高レベルなAPIも用意してよくあるユースケースは高レベルなAPIでカバーするというような設計もアリです。

ただし、便利APIだけではカバーできないユースケースもあるのでそのあたりをサポートするかどうかの設計判断が必要です。初期のリリースでは小さめのAPIにしてユーザーからの要望に応じて徐々に提供するAPIを増やしていくのが現実的です。

そのようにパッケージを成長させていくためには、現時点でどのようなAPIが提供されていてなにができるのか(なにができないのか)をユーザが確認できる状態にしないといけません。そのためのドキュメントが「リファレンス」と呼ばれているものです。

リファレンスで最も重要なのは網羅性です。使えるAPIをすべて網羅していることが最低ラインです。以下はTreefitのリファレンスです。現時点のTreefitはまだAPIが少ないですが、すべて網羅しています。

各APIの説明にはできるだけサンプルコードとその実行結果をつけます。チュートリアルと同じように文章だけの説明よりサンプルコードとその実行結果があった方が理解しやすいからです。R版で使っているpkgdownではHTML生成時にサンプルコードを実行して可視化したものも埋め込めるので図も入っています。Python版で使っているSphinxでも頑張ればできそうな気がしますが、デフォルトではできないので図は入っていません。

テスト関連

Treefitは1回リリースして終わりのプロジェクトではありません。今もより洗練されたアルゴリズムを開発しています。継続的に開発するにあたり自動でテストを実行できる環境を整備しておくことは重要です。エンバグしたことに気づくこともできますし、RやPythonのバージョンアップで壊れていないか確認することにも使えます。

TreefitのリポジトリーはGitHubにあるのでGitHub Actionsを使ってコミットごとにテストを実行しています。テストは既存のテスティングフレームワークを使って書いています。Rではtestthat、Pythonではpytestを使っています。

RのパッケージはCRANに登録することになりますが、CRAN Repository Policyにある通り、CRANに登録するには少なくとも2つ以上のメジャーなRのプラットフォームで動かないといけません2。GitHub ActionsではUbuntu・macOS・Windowsでテストを実行でき、この条件を満たしているか動作確認しやすいです。

ただ、一通り動く状態にするまではそれなりに大変(特にドキュメント生成まわりが大変)なのでうまく動かせない人はR版TreefitのGitHub Actionsの設定を参考にしてください。

リリース関連

ユーザーに簡単に使ってもらうためにはパッケージをリリースしないといけません。

Pythonのパッケージはtwine uploadするだけなので簡単です。パッケージの公開にあたりレビューがないからです。

一方、Rのパッケージはレビューがあります。そのため、Pythonパッケージのリリースよりかなり難しいです。devtoolsなどRのパッケージリリースを支援する各種ツールがあるのでそれを使うことになります。また、前述のCRAN Repository Policyを確認することも忘れてはいけません。

ツールが揃っているのですが、ツールの使い方を忘れては使いこなせないのでR版のTreefitではツールを使う各種作業を定型化しています3

まとめ

Treefitのパッケージ関連の知見はおもしろかったですか?

このようにTreefitのパッケージを開発・メンテナンスしています。参考になる部分があればぜひマネをしてください。R版もPython版もフリーソフトウェアとして自由に再利用できます。

Treefit自体もおもしろいので興味がある人は前述の早水先生の動画やプロジェクト紹介記事もみてください。Treefitの研究・開発に興味がある人は早水先生に連絡してください!一緒に研究・開発しましょう!

クリアコードはフリーソフトウェアを開発することに特化したソフトウェア開発会社です。私が最初に早水先生からTreefitの開発の話を聞いたとき、一番おもしろいなーと思ったのは「生物の研究の世界ではオープンソースソフトウェアとして有用なソフトウェアを公開することが論文でもプラスになる」という話でした。そのときはMonocleを例として教えてもらいました。クリアコードはフリーソフトウェアを開発する会社なので、そういう研究の世界の人たちをフリーソフトウェアを開発することで支援できたらいいなぁと思ったのです。自分たちの研究に関するソフトウェアの開発も手伝って欲しいという方はお問い合わせフォームからご連絡ください。

問い合わせする前に勘違いしているとアレなので念のため説明しますが、フリーソフトウェアの開発は無償ではなく有償です。ここでいうフリーソフトウェアはGNUの言うフリーソフトウェアのことなので無償ということではなく自由ということです。Treefitも有償で開発しました。

  1. 早水先生は今は早稲田大学に所属していますが、当時は統計数理研究所に所属していたのです。

  2. "Packages will not normally be accepted that do not run on at least two of the major R platforms."

  3. RubyではなくRを使うべきだとは思うのですが、私がRubyに慣れているのでついついRubyを使ってしまうのです。。。