🎊

OSSライブラリの個人開発を続けて2年になった

2021/03/12に公開

1. はじめに

Zennでもちょこちょこ記事を書いている強化学習用Experience Replayライブラリ cpprb の v10.0.0 をつい先日リリースしました。 (セマンティックバージョニングを採用しているので、9回も非互換の破壊的な変更をしてしまいました。)

git のログを見ると 2019年1月12日 に最初のコミット[1]をしており、開発・公開して2年ちょっと経ったのでそのまとめ記事を書こうと思います。

git log $(git rev-list --max-parents=0 HEAD)

2. どのくらい使われているのか

2.1 スター

対象が強化学習に取り組んでいる研究者や開発者であり、そもそもすごくニッチであるとはいえ、2021年3月時点で、GitLab.com でスター10、GitHub のミラーがスター22のマイナーライブラリです。

https://gitlab.com/ymd_h/cpprb
https://github.com/ymd-h/cpprb

2.2 ダウンロード数

PyPI に登録して配布しているので、この機に始めてダウンロード数を調べてみようと思い以下の PyPI公式のBigQueryデータを分析して表示してくれる PePy を覗いてみたら・・・

Downloads
Downloads

え? 307k もダウンロードされてるの??バージョン更新日に約700ダウンロード???
ほそぼそやっているつもりだったので少し驚きました。もしかしたらボットによるダウンロードもあるのかもしれませんが、それでも多くの人に使ってもらえているならありがたいことです。

2.3 フィードバック

GitLabのissueや最近始めた GitHub Discussionsに時々バグ報告があります。数えるほどですがいつも助けられています。

Issue は Slack に通知されるようにしています。フィードバックが来るのは偶になので Slack 連携は本当に助かります。Discussions は新しいかつβ なこともあって連携できない認識なのですが、できるようになりましたかね?

2.4 利用されているレポジトリ

GitHub で dependents を確認すると、18個のレポジトリが利用してくれているようです。

もっともスターが多いのは友人が開発している tf2rl でスター349個でした。
https://github.com/keiohta/tf2rl

そしてぱっと目を通してみると、機械学習の有名な学会 NeurIPS の2020年スポットライト発表に選ばれている論文の公式実装があり驚きました。

https://github.com/chenhongge/SA_DQN

3. どうして開発しているのか

上でも言及した友人に「Cython 興味ない? Pythonが遅くて困ってるから高速化しようと思ってるんだけど」と誘われて始めました。cpprbの開発自体はほぼ全て私が一人でやってますが、多いときには毎日のように slack でチャットして強化学習の話をしてきました。
完全に一人だとおそらく続かなかったと思うので、個人開発とはいえ仲間がいることがやっぱり重要だと感じています。

4. 利用している技術・サービス

4.1 言語関連

Cython を利用して Python (CPython) 用の拡張ライブラリを作成しています。

Cythonをビルド時に利用する際に、どのように setup.py を書けば二度手間を避けられるかということは苦労して調べてブログに書きました。

multiprocessing で大規模共有メモリを取り扱う方法について色々調べて以前記事を書きました。
https://zenn.dev/ymd_h/articles/4f965f3bfd510d

他にも、pipの新しいリゾルバの依存関係解決の問題を、スクラップで情報集めながら追っているのですが、久しぶりに見に行ってもまだ駄目なようです。。。
https://zenn.dev/ymd_h/scraps/744cba53c90fe5

4.2 レポジトリホスティング

GiLab.com をメインにして、GitHub にミラーを作っています。
始めたときには、まだ GitHub Actions がなく、GitLab CI が統合されている GitLab.com が魅力的でした。

Actionsは他人が書いたものを再利用できるのは素敵ですが、再利用・公開できるActionsを書こうと思うとJavaScriptが必要だったりと私には向いていませんでした。さっとコンテナ上で実行するコードを羅列するGitLab CIの方が分かりやすくて好きです。

一方、ActionsではWindowsやmacOSも無料で利用できるため、Windows/macOSのテストおよびWindowsでのwheelバイナリ作成・PyPI登録はActionsから行っています。(macOSは標準ビルドチェーンではビルドできないのでバイナリ配布していません。Linuxはmanylinuxのコンテナを利用してビルドしているので引き続きGitLab CIを利用しています。)

4.3 サイト・ドキュメント

Sphinx で docstringからAPI referenceを自動的に作成しています。その他の部分は Emacs Org-modeで書いた記事を ox-hugo でエクスポートして、Hugoで静的サイトに出力しています。
この一連の流れは全てGitLab CI上で自動化されていて、masterブランチの内容が GitLab Pages にデプロイされます。

複雑な流れになっていますが、READMEに書いている内容の一部をサイトのページにも流用したり、複数ページのサイトを1ファイルにまとめることで、markdownのヘッダー設定を何度も作らなくて良いなどといったメリットもあります。

Hugoに関しては、以前次のような記事を書きました。
https://zenn.dev/ymd_h/articles/6a8b173d55512c

GitHub Pagesと異なり、GitLab Pagesはプロジェクト毎にURLのパスが区切られているので、何も考えずに複数のサイトを立ち上げてもバッティングすることなくて便利です。

4.4 CI

一部既に話に出てきていますが、自動化大好きなので、多くのジョブをCI上で走らせています。
以下はGitLab CI上でのパイプラインのスクショです。他にもGitHub Actions上で、テストとCode QLによるCode Scanningが走っています。


https://qiita.com/ymd_h/items/63d9105cd0429317bd6f
https://zenn.dev/ymd_h/scraps/4ccb6bf3a640fa

  • テスト用の環境を毎回作成すると時間がかかるので、コンテナ化して登録しておき、定期的に更新ジョブを自動で走らせています。
  • 過去のIssueで検証したテストは全て回帰テストで走っているので、どんどん積み上がっています。

4.5 その他

直接 cpprb では利用していませんが、Google Colab上で使ってみるにあたって、OpenAI Gymの環境を可視化する方法は苦労したので調べてQiitaに記事を書くと共に別途パッケージとしてPyPIに公開しました。(この記事が今までQiitaに書いた記事の中で、1番Likeをもらってます。)

https://qiita.com/ymd_h/items/c393797deb72e1779269
https://pypi.org/project/gym-notebook-wrapper/

5. 宣伝(?)

多くの人に使ってもらえると嬉しいので、QiitaやZennにちょこちょこ記事を書いています。

https://zenn.dev/ymd_h/articles/03edcaa47a3b1c
https://qiita.com/ymd_h/items/505c607c40cf3e42d080

またOSSの宣伝には reddit が良い!って記事をどこかで読んだ気がしたので、ある程度使えるレベルになった時点でスレッドを立ててみたんですが、あんまり反応もなくどれほど効果があったかは不明です。

https://www.reddit.com/r/MachineLearning/comments/f8sdea/p_cpprb_replay_buffer_python_library_for/

Kaggleで公開した notebook にもしれっと使ってみました。
そんなにいいスコアではないですが、コンペ初期の早いタイミングで公開していたので、voteしてもらってnotebookの銅メダルになっています。
https://www.kaggle.com/ymdhryk/ape-x-dqn-safe-guard-length-risk-aware

TwitterなどのSNSはやっていないので、SNSで宣伝・告知ということはしていません。(将来的には必要かもしれませんが。)

6. 今後

次々でてくる新しいアルゴリズムの実装を補助できるような機能の追加をしていきたいです。
https://zenn.dev/ymd_h/articles/35d88f7d739651
https://zenn.dev/ymd_h/scraps/80e640694eea56

内部実装が汚くなってしまっており、せっかくOSSにしているのに自分以外にわかりづらくなってしまっているので、直したいです。(自戒)

Zennには記事以外に本も書けるので、細切れで出している情報を整理・構造化して、そのうち本を書きたいと思っています。

まとめ

ほそぼそと趣味のOSS個人開発を続けてきて、周辺技術も含めて色々と学び、少しずつアウトプットしてきました。

使ってもらったり、フィードバックをもらったりするのはとても嬉しいし、開発の中で様々な技術を学べるので、OSS個人開発おすすめです。

脚注
  1. https://stackoverflow.com/a/5189296 ↩︎

Discussion