見出し画像

ギリアのAI開発を支えるテンプレートリポジトリの機能とその中身


初めに

ギリアで機械学習エンジニアをしている野谷と申します。
ギリアでは、個人またはチームとして知見やTipsの整理・共有、新しいツールの開発・試験導入などの改善活動を行っています。その中で、AI開発に関連する活動として、テンプレートリポジトリ(公式の説明 *1)の開発・拡充を行っていました。開発が完了したため、ご紹介いたします。

きっかけ

ギリアでは、2021年にはPythonのコーディングガイドラインについて、PEP 8などの従うべき規約とそれに対するギリア独自の改訂、ベストプラクティスなどを社内wikiにまとめていました。
しかし、実際の案件への導入の有無や方法にばらつきがあり、pyproject.tomlなどの基本的な設定ファイルが存在しないものからGitHub Actionsにより自動テストが入っているものまでが混在している状態でした。こういった状態は、特に案件がサービスに向けて大規模化・長期化する時に技術的な負債や障壁となることがあり、望ましいものではありませんでした。
この問題の解決を目指し、標準化活動の大きなテーマとしてリポジトリ作成時に使うテンプレートリポジトリの開発・拡充に取り組むようになりました。

機能

ギリアでは、案件を基準としたマルチレポを採用しています。
一方で、コードスタイルや実験管理においては、案件の規模などをもとに特定の水準を要求しています。大きな案件ではより厳しく確実に、小さな案件ではより自由に素早く案件を遂行できるようにしています。
テンプレートリポジトリでは、この設定した水準を最小限のレベルで実施することを主眼としています。
テンプレートリポジトリの機能は、主にコーディングスタイルの統一と再現性の確保の2点を備えています。

コーディングスタイルの統一

以下のツールについて、社内標準の設定がなされた各種設定ファイルと導入方法、GitHub Actionsによる自動テストが入っています。

Linter, Formatter

ruff *2 + isort *3  + black *4 を推奨しています。以前はruffではなくflake8 *5 でしたが、パフォーマンスを理由にruffに変更しました。
折り返しを120行にしたり、競合する設定を変更したりなど、いくつか設定をカスタマイズしています。

Type Hinting

mypy *6 をデフォルトで使用しています。
Type HintingとCI/CDがあれば良く、pyright *7 やpytype *8 なども可能としています。特にpyrightについては一時注目しており、mypyと変えて使用するかの議論がありました。実際に、一部の部署ではpyrightを使用しています。

Test

pytest *9 をデフォルトで使用しています。また、pytest-covによりテストカバレッジも測定しています。
こちらも単体テストとCI/CDがあればよく、unittest *10 なども可能としています。なお、ギリアではpytestをよく使用しています。

Docstring

Docstringがきちんとついているかについて、pydocstyle *11 で自動で確認する機能をOptionalとして入れています。Styleはプロジェクト単位により自由ですが、Googleまたはnumpyのスタイルがほとんどです。

再現性の確保

再現性の確保のため、ほとんどのプロジェクトで必ず書くような汎用的な関数をいくつか設定しています。

シードの固定

シード値を固定します。Kaggleでも有名なseed_everythingが由来です。pytorch lightningで実装されていますが、deterministicの設定が無効になっていること、最適化や自然言語処理などpytorch lightningを使用しないプロジェクトも多いことから、独自の実装を作成しています。

実行環境の記録

pythonのライブラリの情報をlogに出力します。Dockerの機能で十分に代用可能ですが、dockerfileの管理だと実験中に実際の実行環境との差分ができてしまう可能性があること、docker imageの管理だと実行の度に環境を保存すると必要なディスクサイズが非常に大きくなってしまうことから、より軽量なものを最低限のものとして用意しています。

コードのバージョン保存

ギリアはコードをGitHubにて管理しています。このGitHub上でのバージョンをlogに出力します。デバッグ時以外で実験時にGitHub上で管理していない差分があった場合、エラーを出して実験を停止させます。

上記の汎用的な関数を揃えることで、あとはパラメータ管理を行えば、ほとんどのケースで再現性が確保できます。OSとcuda、Pythonのバージョンは意図せずに変えることが稀であること、ギリアの計算基盤では管理できることから、テンプレートリポジトリの管理対象とはしていません。

その他

パッケージ化機能

小粒ですが重要なものとして、パッケージ化の機能も入っています。具体的には、Pythonで書かれたプロジェクトのパッケージ化 *12 を行うための基本的なファイルが入っています。
ギリアの独自技術の作成やサービス化をする際に、AI機能をAPIとして容易に利用できるようにすることを見越して作成しました。この機能を用いることで、PythonであればNexusを通して開発済みのパッケージを容易に頒布・インストールできるようにしています。実際にギリアの社内画像ライブラリ(Zeus)はpipでインストールして使用することができます。

影響を受けたもの

お気づきの方もいると思いますが、cvpaperchallenge/Ascender *13 の影響を大きく受けています。ギリアでは、社内の計算基盤とAscenderの想定する環境に差異があったこと、再現性を確保したい要望があったことから、Ascenderとは別にテンプレートリポジトリを作成しました。
もしテンプレートリポジトリがなく、かつ使用してみたい場合には、Ascenderから始めるのが良いかと思います。

やっていないこと

いくつかの理由から、テンプレートリポジトリではやっていないこともあります。
ここで挙げたものはあえてリポジトリ化以前の状態に止め、社内のドキュメントに推奨される手引きやTipsをまとめています。また、プロジェクト開始後にどのように行われているか確認することで、品質を管理しています。

実験管理

ギリアでは最適化、強化学習、画像認識、自然言語処理、統計解析、時系列データ処理など様々なモーダル・タスクの技術全般を幅広く扱っています。そのため、案件によって使いたいライブラリが異なるケースが多く、導入は各案件ごとに判断し委ねています。
導入されているライブラリは、今のところ画像認識・自然言語処理ではtensorboard *14が多く、最適化・強化学習ではmlflow *15を使用することが多い印象です。ただし、同じ技術領域やプロジェクトでも導入したり廃止したりと、細かな実施内容や開発の段階の差異によって相性が異なるようです。

今後については、より広範な実験管理ツールとしてwandb *16 に注目しています。試用したところ非常に感触が良く、徐々に使用を増やしています。そのため、テンプレートリポジトリにwandbの導入支援機能を入れるか検討しています。

パラメータ管理

Hydra *17 などは入れない判断を下しました。理由は実験管理のものと同様です。今のところHydraが多い印象ですが、argparseで十分な案件も多いです。

データ管理

train/valid/testの分割やデータのバージョン管理などはモデルに関わるものであり、非常に大事な要素ですが、現状ではテンプレートリポジトリには入れない判断をしました。
理由としては、ギリアでは画像・自然言語・最適化などの案件によって様々な様式や方法でデータを扱っており、テンプレートリポジトリでは個々の状況に対応できないからです。
データの管理については、別途社内インフラとして開発すべく、別のチームが検討と試作を進めています。

最後に

テンプレートリポジトリの開発以前では、社内ドキュメントに推奨があったものの存在を知る人が少なく、プロジェクトによってコードや開発のスタイルにばらつきがある状態でした。現在はテンプレートリポジトリの開発と布教活動により、Pythonの開発における標準的な設定とそのテストが容易に導入できる状態になっています。
また、より優れたものを早く取り入れるために、ある程度の部分はテンプレートリポジトリ開発後も個人の裁量に委ねられています。例えば、Linter、Formatterのflake8からruffへの移行も、最初は個人で試されていたことでした。試した結果良さそうだということが判り、テンプレートリポジトリにも導入されました。

テンプレートリポジトリの導入の効果としてはLinter、Formatterは7割近くのプロジェクトで守られるようになりました。また、Type Hintingは導入前は1桁台と非常に使用率が低かったため実効性を懸念していましたが、導入後はLinter、Formatter同様に7割近い割合で使用されています。

テンプレートリポジトリの開発については、主要な機能が入ったため一区切りつきましたが、引き続き継続的な改善と布教、フィードバックの反映などによる使い勝手の向上を進めていきます。


引用:
*1: テンプレートリポジトリを作成する - GitHub Docs https://docs.github.com/ja/repositories/creating-and-managing-repositories/creating-a-template-repository
*2 *3 *4 *5 *6 *7 *8 *9 *11* 13 *14 *15 *17: GitHub https://github.com/
*10: unittest — Unit testing framework — Python 3.12.3 documentation https://docs.python.org/3/library/unittest.html
*12: Python のプロジェクトをパッケージングする - Python Packaging User Guide
https://packaging.python.org/ja/latest/tutorials/packaging-projects/
*16: Weights & Biases: The AI Developer Platform https://wandb.ai/site/                                   

この記事が気に入ったらサポートをしてみませんか?