最近、Hugging Face社が開発しているtransformersというライブラリのコントリビューターになることができました。自分にとっては、OSSにコントリビュートすること自体が初めての経験だったのですが、思っていたより簡単にできたため一連の流れを共有できればと思います。
なぜコントリビュートしようと思ったのか
- kaggleのコンペなどで利用する機会が多く、頻繁にお世話になっているため、OSSコントリビュートという形で恩返ししたい
- 内部のコードの理解を深めることで、今後より活用できるようになるのではないか
コントリビュートする方法
Hugging Face社が公式ガイドを出しているため、そちらを参考にしました。
まずは、Issueを探す
初めてtransformersにコントリビュートする場合は、Good First Issue
というタグが付けられたIssueに取り組むことが推奨されています。Good First Issue
は、transformersのコードの詳細を知らなくても取り組める内容が多く、新規参画者向けの内容となっています。
こちらから一覧を確認できます:
今回、私が取り組んだ内容は、公式ドキュメントに掲載されているサンプルコードをdoctestが通る状態にするというものでした。公式ドキュメントに自分の書いたコードが掲載されるというのが、良いモチベーションになった気がします笑
このページにコントリビュートしました:
Issueで参加表明を行う
詳しくは、Issueの詳細に掲載されている場合が多いですが、Issueのスレッドにどのような内容に取り組みたいかをコメントして、参加表明を行います。すると、Issueの管理者からコメントなりリアクションなりが貰えると思うので、そこから作業を開始することができます。
このタイミングで、スレッドで同じ内容に既に取り組んでいる人がいないか、Pull requestsに同じ内容と思われるものがないか確認すると良いでしょう。
作業開始
レポジトリをforkする
右上のForkというボタンを押して、自分のGitHubアカウント上にコピーを作成します。
コードを手元に持ってくる
# forkしたレポジトリをcloneする
# <your Github handle>は、hiromu166など自分のアカウント名に置き換えてください
git clone git@github.com:<your Github handle>/transformers.git
# cloneしたディレクトリに移動する
cd transformers
# fork元の本家のレポジトリをupstreamとして参照する
git remote add upstream https://github.com/huggingface/transformers.git
ブランチを切り、環境を整える
# 作業内容に応じたブランチ名でブランチを作成する
git checkout -b a-descriptive-name-for-my-changes
# 仮想環境を作成し、開発に必要なライブラリなどをダウンロードする
# 以下は、pyenv(3.8.6) + virtualenvを使う場合
pyenv virtualenv 3.8.6 transformers
pyenv shell transformers
pip install -e ".[dev]"
その他、作業内容に応じてdatasetsもダウンロードしてください。
実装を行い、fixup, testを通す
Issueを解決するための実装を行っていきます。分からない部分が出てきたら、IssueのスレッドやDiscordで気軽に質問することができます。(Discordの方が気楽に質問できる雰囲気なように感じました)他に似たような内容のPull requestがある場合は、そちらを参考にするのも良いでしょう。
実装が終わったら、コードスタイルの統一化などを行ったり、必要なtestが通るか確認します。
# コードスタイルの統一化などはこれだけでOK
make fixup
testは、Issueの内容によると思いますが、今回の取り組みはドキュメントに関するものだったので、こちらのURLに従いました。
変更点が影響を与えるファイルが分かっていれば、公式ガイドに従う形でいいと思います。
pytest tests/<TEST_TO_RUN>.py
変更内容をpushし、PRを作成する
変更内容をローカルで適宜コミットします。
# 変更したファイル(この場合は、modified_file.py)をadd
git add modified_file.py
# commit
# 変更内容がわかるようにコメントをつけましょう
git commit -m 'hoge'
# push
git push -u origin a-descriptive-name-for-my-changes
これで、本家のtransformersに変更内容がpushされたはずなので、PRを作成し、Issueの作成者をメンションし、レビューをお願いしましょう。
レビュアーからapproveが貰えるまで、修正を行い、上記の流れを繰り返します。
mergeに向けて
approveが得られれば、あとはmergeされるのを待つだけです。ただし、変更を行ったファイルが他のユーザーからも変更されていた場合はconflictが発生するため、解消する必要があります。transformersでは、rebaseを使って以下のように行うことが推奨されています。
# 本家の最新状態(mainブランチ)を持ってきて、rebase
git fetch upstream
git rebase upstream/main
# ここでconflictが発生した場合は、修正を行う
# 修正が完了したら、rebaseを再開
git rebase --continue
# 内容をforce push
git push -f origin a-descriptive-name-for-my-changes
あとは、PRが無事mergeされれば、コントリビュート完了です!お疲れ様でした。
おわりに
transformersは、新規参画者が貢献しやすいIssueがあったり、コントリビュートに関するドキュメントがあったりで、かなりOSS初心者にも取り組みやすいライブラリなのではないでしょうか。
今後は、Good Second Issue
(Good First Issueよりもやや難易度が高い)に取り組んだり、transformers以外のライブラリにも貢献していきたいと考えています。
最後まで、ご覧いただきありがとうございました。
コメント