transformersにコントリビュートした話

Hugging Face
この記事は約6分で読めます。

最近、Hugging Face社が開発しているtransformersというライブラリのコントリビューターになることができました。自分にとっては、OSSにコントリビュートすること自体が初めての経験だったのですが、思っていたより簡単にできたため一連の流れを共有できればと思います。

なぜコントリビュートしようと思ったのか

  • kaggleのコンペなどで利用する機会が多く、頻繁にお世話になっているため、OSSコントリビュートという形で恩返ししたい
  • 内部のコードの理解を深めることで、今後より活用できるようになるのではないか

コントリビュートする方法

Hugging Face社が公式ガイドを出しているため、そちらを参考にしました。

How to contribute to transformers?
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

まずは、Issueを探す

初めてtransformersにコントリビュートする場合は、Good First Issue というタグが付けられたIssueに取り組むことが推奨されています。Good First Issue は、transformersのコードの詳細を知らなくても取り組める内容が多く、新規参画者向けの内容となっています。

こちらから一覧を確認できます:

Issues · huggingface/transformers
🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. - Issues · huggingface/transformers

今回、私が取り組んだ内容は、公式ドキュメントに掲載されているサンプルコードをdoctestが通る状態にするというものでした。公式ドキュメントに自分の書いたコードが掲載されるというのが、良いモチベーションになった気がします笑

このページにコントリビュートしました:

Reformer
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

Issueで参加表明を行う

詳しくは、Issueの詳細に掲載されている場合が多いですが、Issueのスレッドにどのような内容に取り組みたいかをコメントして、参加表明を行います。すると、Issueの管理者からコメントなりリアクションなりが貰えると思うので、そこから作業を開始することができます。

このタイミングで、スレッドで同じ内容に既に取り組んでいる人がいないか、Pull requestsに同じ内容と思われるものがないか確認すると良いでしょう。

作業開始

レポジトリをforkする

GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX.
🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. - GitHub - huggingface/transformers: 🤗 Transformers: State-of-the-art Machin...

右上の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に従いました。

transformers/docs at main · huggingface/transformers
🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. - transformers/docs at main · huggingface/transformers

変更点が影響を与えるファイルが分かっていれば、公式ガイドに従う形でいいと思います。

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以外のライブラリにも貢献していきたいと考えています。

最後まで、ご覧いただきありがとうございました。

コメント

タイトルとURLをコピーしました