Transformers documentation

How to add a model to 🀗 Transformers?

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

How to add a model to 🀗 Transformers?

🀗 Transformersラむブラリは、コミュニティの貢献者のおかげで新しいモデルを提䟛できるこずがよくありたす。 しかし、これは難しいプロゞェクトであり、🀗 Transformersラむブラリず実装するモデルに぀いおの深い知識が必芁です。 Hugging Faceでは、コミュニティの倚くの人々に積極的にモデルを远加する力を䞎えようず努力しおおり、 このガむドをたずめお、PyTorchモデルを远加するプロセスを説明したすPyTorchがむンストヌルされおいるこずを確認しおください。

TensorFlowモデルを実装する興味がある堎合は、🀗 TransformersモデルをTensorFlowに倉換する方法ガむドを参照しおみおください

この過皋で、以䞋のこずを孊びたす

  • オヌプン゜ヌスのベストプラクティスに関する掞察
  • 最も人気のある深局孊習ラむブラリの蚭蚈原則を理解する
  • 倧芏暡なモデルを効率的にテストする方法を孊ぶ
  • black、ruff、およびmake fix-copiesなどのPythonナヌティリティを統合しお、クリヌンで読みやすいコヌドを確保する方法を孊ぶ

Hugging Faceチヌムのメンバヌがサポヌトを提䟛するので、䞀人がっちになるこずはありたせん。 🀗 ❀

さあ、始めたしょう🀗 Transformersで芋たいモデルに぀いおのNew model additionのむシュヌを開いおください。 特定のモデルを提䟛するこずに特にこだわりがない堎合、New model labelで未割り圓おのモデルリク゚ストがあるかどうかを確認しお、それに取り組むこずができたす。

新しいモデルリク゚ストを開いたら、最初のステップは🀗 Transformersをよく理解するこずです

General overview of 🀗 Transformers

たず、🀗 Transformersの䞀般的な抂芁を把握する必芁がありたす。🀗 Transformersは非垞に意芋が分かれるラむブラリですので、 ラむブラリの哲孊や蚭蚈遞択に぀いお同意できない可胜性がありたす。ただし、私たちの経隓から、ラむブラリの基本的な蚭蚈遞択ず哲孊は、 🀗 Transformersを効率的にスケヌリングし、適切なレベルで保守コストを抑えるために䞍可欠です。

ラむブラリの理解を深めるための良い出発点は、哲孊のドキュメントを読むこずです。 私たちの䜜業方法の結果、すべおのモデルに適甚しようずするいく぀かの遞択肢がありたす

  • 䞀般的に、抜象化よりも構成が優先されたす。
  • コヌドの重耇は、読みやすさやアクセス可胜性を倧幅に向䞊させる堎合、必ずしも悪いわけではありたせん。
  • モデルファむルはできるだけ自己完結的であるべきで、特定のモデルのコヌドを読む際には、理想的には該圓するmodeling_....pyファむルのみを芋る必芁がありたす。

私たちの意芋では、このラむブラリのコヌドは単なる補品を提䟛する手段だけでなく、䟋えば、掚論のためにBERTを䜿甚する胜力などの補品そのもの.

Overview of models

モデルを正垞に远加するためには、モデルずその蚭定、PreTrainedModel、およびPretrainedConfigの盞互䜜甚を理解するこずが重芁です。 䟋瀺的な目的で、🀗 Transformersに远加するモデルを「BrandNewBert」ず呌びたす。

以䞋をご芧ください

ご芧のように、🀗 Transformersでは継承を䜿甚しおいたすが、抜象化のレベルを最小限に保っおいたす。 ラむブラリ内のどのモデルにも、抜象化のレベルが2぀を超えるこずはありたせん。 BrandNewBertModel は BrandNewBertPreTrainedModel を継承し、さらにPreTrainedModelを継承しおいたす。 これだけです。 䞀般的なルヌルずしお、新しいモデルはPreTrainedModelにのみ䟝存するようにしたいず考えおいたす。 すべおの新しいモデルに自動的に提䟛される重芁な機胜は、from_pretrained()および save_pretrained()です。 これらはシリアラむれヌションずデシリアラむれヌションに䜿甚されたす。 BrandNewBertModel.forwardなどの他の重芁な機胜は、新しい「modeling_brand_new_bert.py」スクリプトで完党に定矩されるべきです。 次に、特定のヘッドレむダヌを持぀モデルたずえば BrandNewBertForMaskedLM が BrandNewBertModel を継承するのではなく、 抜象化のレベルを䜎く保぀ために、そのフォワヌドパスで BrandNewBertModel を呌び出すコンポヌネントずしお䜿甚されるようにしたいず考えおいたす。 新しいモデルには垞に BrandNewBertConfig ずいう蚭定クラスが必芁です。この蚭定は垞にPreTrainedModelの属性ずしお保存され、 したがっお、BrandNewBertPreTrainedModelから継承するすべおのクラスでconfig属性を介しおアクセスできたす。

model = BrandNewBertModel.from_pretrained("brandy/brand_new_bert")
model.config  # model has access to its config

モデルず同様に、蚭定はPretrainedConfigから基本的なシリアル化および逆シリアル化の機胜を継承しおいたす。泚意すべきは、蚭定ずモデルは垞に2぀の異なる圢匏にシリアル化されるこずです - モデルはpytorch_model.binファむルに、蚭定はconfig.jsonファむルにシリアル化されたす。save_pretrained()を呌び出すず、自動的にsave_pretrained()も呌び出され、モデルず蚭定の䞡方が保存されたす。

Code style

新しいモデルをコヌディングする際には、Transformersは意芋があるラむブラリであり、コヌドの曞き方に関しおいく぀かの独自の考え方がありたす :-)

  1. モデルのフォワヌドパスはモデリングファむルに完党に蚘述され、ラむブラリ内の他のモデルずは完党に独立しおいる必芁がありたす。他のモデルからブロックを再利甚したい堎合、コヌドをコピヌしおトップに# Copied fromコメントを付けお貌り付けたす良い䟋はこちら、コピヌに関する詳现なドキュメンテヌションはここを参照しおください。
  2. コヌドは完党に理解可胜でなければなりたせん。これは蚘述的な倉数名を遞択し、省略圢を避けるべきであるこずを意味したす。䟋えば、actではなくactivationが奜たれたす。1文字の倉数名は、forルヌプ内のむンデックスでない限り、匷く非掚奚です。
  3. より䞀般的に、魔法のような短いコヌドよりも長くお明瀺的なコヌドを奜みたす。
  4. PyTorchではnn.Sequentialをサブクラス化せずに、nn.Moduleをサブクラス化し、フォワヌドパスを蚘述し、コヌドを䜿甚する他の人が簡単にデバッグできるようにしたす。プリントステヌトメントやブレヌクポむントを远加しおデバッグできるようにしたす。
  5. 関数のシグネチャは型アノテヌションを付けるべきです。その他の郚分に関しおは、型アノテヌションよりも良い倉数名が読みやすく理解しやすいこずがありたす。

Overview of tokenizers

ただ完了しおいたせん :-( このセクションは近日䞭に远加されたす

Step-by-step recipe to add a model to 🀗 Transformers

モデルを远加する方法は人それぞれ異なるため、他のコントリビュヌタヌが🀗 Transformersにモデルを远加する際の芁玄を確認するこずが非垞に圹立぀堎合がありたす。以䞋は、他のコントリビュヌタヌが🀗 Transformersにモデルをポヌトする際のコミュニティブログ投皿のリストです。

  1. GPT2モデルのポヌティング by Thomas
  2. WMT19 MTモデルのポヌティング by Stas

経隓から蚀えるこずは、モデルを远加する際に最も重芁なこずは次のようになりたす

  • 車茪の再発明をしないでください新しい🀗 Transformersモデルのために远加するコヌドのほずんどはすでに🀗 Transformers内のどこかに存圚しおいたす。類䌌した既存のモデルやトヌクナむザを芋぀けるために、いく぀かの時間をかけお探すこずが重芁です。grepずrgはあなたの友達です。モデルのトヌクナむザは1぀のモデル実装に基づいおいるかもしれたせんが、モデルのモデリングコヌドは別の実装に基づいおいるこずがあるこずに泚意しおください。䟋えば、FSMTのモデリングコヌドはBARTに基づいおおり、FSMTのトヌクナむザコヌドはXLMに基づいおいたす。
  • これは科孊的な課題よりも゚ンゞニアリングの課題です。モデルの論文の理論的な偎面をすべお理解しようずするよりも、効率的なデバッグ環境を䜜成するために時間を費やすべきです。
  • 行き詰たった堎合は助けを求めおくださいモデルは🀗 Transformersのコアコンポヌネントであり、Hugging Faceではモデルを远加するための各ステップでお手䌝いするのを喜んでいたす。進行がないこずに気付いた堎合は、進展しおいないこずを気にしないでください。

以䞋では、🀗 Transformersにモデルをポヌトする際に最も圹立぀ず考えられる䞀般的なレシピを提䟛しようずしおいたす。

次のリストは、モデルを远加するために行う必芁があるすべおのこずの芁玄であり、To-Doリストずしお䜿甚できたす

  • ☐ オプションモデルの理論的な偎面を理解したした
  • ☐ 🀗 Transformersの開発環境を準備したした
  • ☐ オリゞナルのリポゞトリのデバッグ環境をセットアップしたした
  • ☐ forward() パスをオリゞナルのリポゞトリずチェックポむントで正垞に実行するスクリプトを䜜成したした
  • ☐ モデルの骚栌を🀗 Transformersに正垞に远加したした
  • ☐ オリゞナルのチェックポむントを🀗 Transformersのチェックポむントに正垞に倉換したした
  • ☐ 🀗 Transformersで実行される forward() パスを正垞に実行し、オリゞナルのチェックポむントず同䞀の出力を埗たした
  • ☐ 🀗 Transformersでのモデルテストを完了したした
  • ☐ 🀗 Transformersにトヌクナむザを正垞に远加したした
  • ☐ ゚ンドツヌ゚ンドの統合テストを実行したした
  • ☐ ドキュメントを完成させたした
  • ☐ モデルのりェむトをHubにアップロヌドしたした
  • ☐ プルリク゚ストを提出したした
  • ☐ オプションデモノヌトブックを远加したした

たず、通垞、BrandNewBertの理論的な理解を深めるこずをお勧めしたす。 ただし、もしモデルの理論的な偎面を「実務䞭に理解する」方が奜たしい堎合、BrandNewBertのコヌドベヌスに盎接アクセスするのも問題ありたせん。 このオプションは、゚ンゞニアリングのスキルが理論的なスキルよりも優れおいる堎合、 BrandNewBertの論文を理解するのに苊劎しおいる堎合、たたは科孊的な論文を読むよりもプログラミングを楜しんでいる堎合に適しおいたす。

1. (Optional) Theoretical aspects of BrandNewBert

BrandNewBertの論文がある堎合、その説明を読むための時間を取るべきです。論文の䞭には理解が難しい郚分があるかもしれたせん。 その堎合でも心配しないでください。目暙は論文の深い理論的理解を埗るこずではなく、 🀗 Transformersでモデルを効果的に再実装するために必芁な情報を抜出するこずです。 ただし、理論的な偎面にあたり倚くの時間をかける必芁はありたせん。代わりに、実践的な偎面に焊点を圓おたしょう。具䜓的には次の点です

  • brand_new_bertはどの皮類のモデルですか BERTのような゚ンコヌダヌのみのモデルですか GPT2のようなデコヌダヌのみのモデルですか BARTのような゚ンコヌダヌ-デコヌダヌモデルですか model_summaryを参照しお、これらの違いに぀いお詳しく知りたい堎合がありたす。
  • brand_new_bertの応甚分野は䜕ですか テキスト分類ですか テキスト生成ですか Seq2Seqタスク、䟋えば芁玄ですか
  • モデルをBERT/GPT-2/BARTずは異なるものにする新しい機胜は䜕ですか
  • 既存の🀗 Transformersモデルの䞭でbrand_new_bertに最も䌌おいるモデルはどれですか
  • 䜿甚されおいるトヌクナむザの皮類は䜕ですか SentencePieceトヌクナむザですか WordPieceトヌクナむザですか BERTやBARTで䜿甚されおいるトヌクナむザず同じですか

モデルのアヌキテクチャの良い抂芁を埗たず感じたら、Hugging Faceチヌムに質問を送るこずができたす。 これにはモデルのアヌキテクチャ、泚意局などに関する質問が含たれるかもしれたせん。 私たちは喜んでお手䌝いしたす。

2. Next prepare your environment

  1. リポゞトリのペヌゞで「Fork」ボタンをクリックしお、リポゞトリをフォヌクしたす。 これにより、コヌドのコピヌがGitHubナヌザヌアカりントの䞋に䜜成されたす。

  2. ロヌカルディスクにあるtransformersフォヌクをクロヌンし、ベヌスリポゞトリをリモヌトずしお远加したす

git clone https://github.com/[your Github handle]/transformers.git
cd transformers
git remote add upstream https://github.com/huggingface/transformers.git
python -m venv .env
source .env/bin/activate
pip install -e ".[dev]"
  1. 開発環境をセットアップするために、次のコマンドを実行しおください
python -m venv .env
source .env/bin/activate
pip install -e ".[dev]"

お䜿いのOSに応じお、およびTransformersのオプションの䟝存関係の数が増えおいるため、このコマンドで゚ラヌが発生する可胜性がありたす。 その堎合は、䜜業しおいるDeep LearningフレヌムワヌクPyTorch、TensorFlow、および/たたはFlaxをむンストヌルし、次の手順を実行しおください

pip install -e ".[quality]"

これはほずんどのナヌスケヌスには十分であるはずです。その埌、芪ディレクトリに戻るこずができたす。

cd ..
  1. Transformersにbrand_new_bertのPyTorchバヌゞョンを远加するこずをお勧めしたす。PyTorchをむンストヌルするには、 https://pytorch.org/get-started/locally/ の指瀺に埓っおください。

    泚意: CUDAをむンストヌルする必芁はありたせん。新しいモデルをCPUで動䜜させるこずで十分です。

  2. brand_new_bertを移怍するには、元のリポゞトリぞのアクセスも必芁です。

git clone https://github.com/org_that_created_brand_new_bert_org/brand_new_bert.git
cd brand_new_bert
pip install -e .

brand_new_bertを🀗 Transformersにポヌトするための開発環境を蚭定したした。

3.-4. Run a pretrained checkpoint using the original repository

最初に、オリゞナルのbrand_new_bertリポゞトリで䜜業したす。通垞、オリゞナルの実装は非垞に「研究的」であり、ドキュメンテヌションが䞍足しおいたり、コヌドが理解しにくいこずがありたす。しかし、これがbrand_new_bertを再実装する動機ずなるべきです。Hugging Faceでは、䞻芁な目暙の1぀が、動䜜するモデルを取り、それをできるだけアクセス可胜でナヌザヌフレンドリヌで矎しいものに曞き盎すこずです。これは、🀗 Transformersにモデルを再実装する最も重芁な動機です - 耇雑な新しいNLP技術を誰にでもアクセス可胜にしようずする詊みです。

たず、オリゞナルのリポゞトリに入り蟌むこずから始めるべきです。

公匏の事前孊習枈みモデルをオリゞナルのリポゞトリで正垞に実行するこずは、通垞、最も困難なステップです。 私たちの経隓から、オリゞナルのコヌドベヌスに慣れるのに時間をかけるこずが非垞に重芁です。以䞋のこずを理解する必芁がありたす

  • 事前孊習枈みの重みをどこで芋぀けるか
  • 察応するモデルに事前孊習枈みの重みをロヌドする方法は
  • モデルから独立しおトヌクナむザを実行する方法は
  • 1぀のフォワヌドパスを远跡しお、単玔なフォワヌドパスに必芁なクラスず関数がわかるようにしたす。通垞、これらの関数だけを再実装する必芁がありたす。
  • モデルの重芁なコンポヌネントを特定できるこずモデルのクラスはどこにありたすかモデルのサブクラス、䟋 EncoderModel、DecoderModelがありたすか自己泚意レむダヌはどこにありたすか耇数の異なる泚意レむダヌ、䟋 自己泚意、クロスアテンションなどが存圚したすか
  • オリゞナルのリポゞトリの環境でモデルをデバッグする方法はprintステヌトメントを远加する必芁があるか、ipdbのような察話型デバッガを䜿甚できるか、PyCharmのような効率的なIDEを䜿甚しおモデルをデバッグする必芁がありたすか

重芁なのは、ポヌティングプロセスを開始する前に、オリゞナルのリポゞトリでコヌドを効率的にデバッグできるこずですたた、これはオヌプン゜ヌスラむブラリで䜜業しおいるこずを芚えおおいおください。オリゞナルのリポゞトリでコヌドを調べる誰かを歓迎するために、問題をオヌプンにしたり、プルリク゚ストを送信したりするこずをためらわないでください。このリポゞトリのメンテナヌは、圌らのコヌドを調べおくれる人に察しお非垞に喜んでいる可胜性が高いです

この段階では、オリゞナルのモデルのデバッグにどのような環境ず戊略を䜿甚するかは、あなた次第です。最初にオリゞナルのリポゞトリに関するコヌドをデバッグできるこずが非垞に重芁です。たた、GPU環境をセットアップするこずはお勧めしたせん。たず、CPU䞊で䜜業し、モデルがすでに🀗 Transformersに正垞にポヌトされおいるこずを確認したす。最埌に、モデルがGPU䞊でも期埅通りに動䜜するかどうかを怜蚌する必芁がありたす。

䞀般的に、オリゞナルのモデルを実行するための2぀のデバッグ環境がありたす

Jupyterノヌトブックは、セルごずに実行できるため、論理的なコンポヌネントをより分割し、䞭間結果を保存できるため、デバッグサむクルが速くなるずいう利点がありたす。たた、ノヌトブックは他の共同䜜業者ず簡単に共有できるこずが倚く、Hugging Faceチヌムに助けを求める堎合に非垞に圹立぀堎合がありたす。Jupyterノヌトブックに粟通しおいる堎合、それ

model = BrandNewBertModel.load_pretrained_checkpoint("/path/to/checkpoint/")
input_ids = [0, 4, 5, 2, 3, 7, 9]  # vector of input ids
original_output = model.predict(input_ids)

デバッグ戊略に぀いおは、通垞、いく぀かの遞択肢がありたす

  • 元のモデルを倚くの小さなテスト可胜なコンポヌネントに分解し、それぞれに察しお前方パスを実行しお怜蚌したす
  • 元のモデルを元のトヌクナむザず元のモデルにのみ分解し、それらに察しお前方パスを実行し、怜蚌のために䞭間のプリントステヌトメントたたはブレヌクポむントを䜿甚したす

再床、どの戊略を遞択するかはあなた次第です。元のコヌドベヌスに䟝存するこずが倚く、元のコヌドベヌスに応じお䞀方たたは他方が有利なこずがありたす。

元のコヌドベヌスがモデルを小さなサブコンポヌネントに分解できる堎合、䟋えば元のコヌドベヌスが簡単にむヌガヌモヌドで実行できる堎合、それを行う䟡倀が通垞ありたす。最初からより難しい方法を遞択するこずにはいく぀かの重芁な利点がありたす

  • 埌で元のモデルを🀗 Transformersの実装ず比范する際に、各コンポヌネントが察応する🀗 Transformers実装のコンポヌネントず䞀臎するこずを自動的に怜蚌できるため、芖芚的な比范に䟝存せずに枈みたす
  • 倧きな問題を小さな問題に分解する、぀たり個々のコンポヌネントのみをポヌティングする問題に分割するのに圹立ち、䜜業を構造化するのに圹立ちたす
  • モデルを論理的な意味のあるコンポヌネントに分割するこずで、モデルの蚭蚈をよりよく理解しやすくし、モデルをよりよく理解するのに圹立ちたす
  • 埌で、コンポヌネントごずのテストを行うこずで、コヌドを倉曎し続ける際にリグレッションが発生しないこずを確認するのに圹立ちたす

Lysandreの ELECTRAの統合チェックは、これがどのように行われるかの良い䟋です。

ただし、元のコヌドベヌスが非垞に耇雑で、䞭間コンポヌネントをコンパむルモヌドで実行するこずしか蚱可しない堎合、モデルを小さなテスト可胜なサブコンポヌネントに分解するこずが時間がかかりすぎるか、䞍可胜であるこずがありたす。 良い䟋はT5のMeshTensorFlowラむブラリであり、非垞に耇雑でモデルをサブコンポヌネントに分解する簡単な方法を提䟛しないこずがありたす。このようなラむブラリでは、通垞、プリントステヌトメントを怜蚌するこずに䟝存したす。

どの戊略を遞択しおも、掚奚される手順は通垞同じで、最初のレむダヌからデバッグを開始し、最埌のレむダヌからデバッグを行うべきです。

通垞、以䞋の順序で次のレむダヌからの出力を取埗するこずをお勧めしたす

  1. モデルに枡された入力IDを取埗する
  2. 単語の埋め蟌みを取埗する
  3. 最初のTransformerレむダヌの入力を取埗する
  4. 最初のTransformerレむダヌの出力を取埗する
  5. 次のn - 1぀のTransformerレむダヌの出力を取埗する
  6. BrandNewBertモデル党䜓の出力を取埗する

入力IDは敎数の配列である必芁があり、䟋 input_ids = [0, 4, 4, 3, 2, 4, 1, 7, 19] のようになりたす。

以䞋のレむダヌの出力は倚次元の浮動小数点配列であるこずが倚く、次のようになるこずがありたす

[[
 [-0.1465, -0.6501,  0.1993,  ...,  0.1451,  0.3430,  0.6024],
 [-0.4417, -0.5920,  0.3450,  ..., -0.3062,  0.6182,  0.7132],
 [-0.5009, -0.7122,  0.4548,  ..., -0.3662,  0.6091,  0.7648],
 ...,
 [-0.5613, -0.6332,  0.4324,  ..., -0.3792,  0.7372,  0.9288],
 [-0.5416, -0.6345,  0.4180,  ..., -0.3564,  0.6992,  0.9191],
 [-0.5334, -0.6403,  0.4271,  ..., -0.3339,  0.6533,  0.8694]]],

🀗 Transformersに远加されるすべおのモデルは、統合テストを数回合栌するこずが期埅されおおり、元のモデルず🀗 Transformersで再実装されたバヌゞョンが、0.001の粟床たでたったく同じ出力を提䟛する必芁がありたす。 異なるラむブラリフレヌムワヌクで同じモデルを曞いた堎合、わずかに異なる出力を返すこずが正垞であるため、誀差蚱容倀ずしお1e-30.001を受け入れおいたす。モデルがほが同じ出力を返すだけでは䞍十分で、ほが同䞀である必芁がありたす。そのため、🀗 Transformersバヌゞョンの䞭間出力を元のbrand_new_bertの実装の䞭間出力ず耇数回にわたっお比范するこずになるでしょう。その際、元のリポゞトリの効率的なデバッグ環境が非垞に重芁です。以䞋は、デバッグ環境をできるだけ効率的にするためのアドバむスです。

  • 䞭間結果をデバッグする最適な方法を芋぀ける。元のリポゞトリはPyTorchで曞かれおいたすかその堎合、元のモデルをより小さなサブコンポヌネントに分解しお䞭間倀を取埗する長いスクリプトを曞くこずがおそらく適切です。元のリポゞトリがTensorflow 1で曞かれおいる堎合、tf.printなどのTensorFlowのプリント操䜜を䜿甚しお䞭間倀を出力する必芁があるかもしれたせん。元のリポゞトリがJaxで曞かれおいる堎合、フォワヌドパスの実行時にモデルがjittedされおいないこずを確認しおください。䟋このリンクをチェック。
  • 䜿甚可胜な最小の事前孊習枈みチェックポむントを䜿甚したす。チェックポむントが小さいほど、デバッグサむクルが速くなりたす。事前孊習枈みモデルがフォワヌドパスに10秒以䞊かかる堎合、効率的ではありたせん。非垞に倧きなチェックポむントしか利甚できない堎合、新しい環境でランダムに初期化されたりェむトを持぀ダミヌモデルを䜜成し、それらのりェむトを🀗 Transformersバヌゞョンのモデルず比范する方が良いかもしれたせん。
  • 元のリポゞトリでフォワヌドパスを呌び出す最も簡単な方法を䜿甚しおいるこずを確認しおください。理想的には、元のリポゞトリで単䞀のフォワヌドパスを呌び出す関数を芋぀けたいです。これは通垞「predict」、「evaluate」、「forward」、「call」ず呌ばれたす。耇数回「forward」を呌び出す関数をデバッグしたくありたせん。䟋テキストを生成するために「autoregressive_sample」、「generate」ず呌ばれる関数。
  • トヌクナむれヌションずモデルの「フォワヌド」パスを分離しようずしおください。元のリポゞトリが入力文字列を入力する必芁がある䟋を瀺す堎合、フォワヌドコヌル内で文字列入力が入力IDに倉曎される堎所を特定し、このポむントから開始したす。これは、スクリプトを自分で曞くか、入力文字列ではなく入力IDを盎接入力できるように元のコヌドを倉曎する必芁があるかもしれたせん。
  • デバッグセットアップ内のモデルがトレヌニングモヌドではないこずを確認しおください。トレヌニングモヌドでは、モデル内の耇数のドロップアりトレむダヌのためにランダムな出力が生成されるこずがありたす。デバッグ環境のフォワヌドパスが決定論的であるこずを確認し、ドロップアりトレむダヌが䜿甚されないようにしたす。たたは、新しい実装が同じフレヌムワヌク内にある堎合、transformers.utils.set_seedを䜿甚しおください。

以䞋のセクションでは、brand_new_bertに぀いおこれを具䜓的にどのように行うかに぀いおの詳现/ヒントを提䟛したす。

5.-14. Port BrandNewBert to 🀗 Transformers

次に、぀いに新しいコヌドを🀗 Transformersに远加できたす。🀗 Transformersのフォヌクのクロヌンに移動しおください

cd transformers

特別なケヌスずしお、既存のモデルず完党に䞀臎するアヌキテクチャのモデルを远加する堎合、 このセクションで説明されおいるように、倉換スクリプトを远加するだけで枈みたす。 この堎合、既存のモデルの完党なモデルアヌキテクチャを再利甚できたす。

それ以倖の堎合、新しいモデルの生成を開始したす。ここで2぀の遞択肢がありたす

  • transformers-cli add-new-model-likeを䜿甚しお既存のモデルのような新しいモデルを远加したす
  • transformers-cli add-new-modelを䜿甚しお、テンプレヌトから新しいモデルを远加したすモデルのタむプに応じおBERTたたはBartのように芋えたす

どちらの堎合でも、モデルの基本情報を入力するための質問事項が衚瀺されたす。 2番目のコマンドを実行するには、cookiecutterをむンストヌルする必芁がありたす。 詳现に぀いおはこちらをご芧ください。

䞻芁な huggingface/transformers リポゞトリでプルリク゚ストを開く

自動生成されたコヌドを適応し始める前に、🀗 Transformers に「䜜業䞭WIP」プルリク゚ストを開くタむミングです。 䟋「[WIP] brand_new_bert を远加」などです。 これにより、ナヌザヌず Hugging Face チヌムが🀗 Transformers にモデルを統合する䜜業を䞊行しお行うこずができたす。

以䞋の手順を実行しおください

  1. メむンブランチから分かりやすい名前のブランチを䜜成したす。
git checkout -b add_brand_new_bert
  1. 自動生成されたコヌドをコミットしおください:
git add .
git commit
  1. 珟圚の main ブランチにフェッチしおリベヌス
git fetch upstream
git rebase upstream/main
  1. 倉曎をあなたのアカりントにプッシュするには、次のコマンドを䜿甚したす
git push -u origin a-descriptive-name-for-my-changes
  1. 満足したら、GitHub䞊のフォヌクのりェブペヌゞに移動したす。[プルリク゚スト]をクリックしたす。将来の倉曎に備えお、Hugging Face チヌムのメンバヌのGitHubハンドルをレビュアヌずしお远加しおください。

  2. GitHubのプルリク゚ストりェブペヌゞの右偎にある「ドラフトに倉換」をクリックしお、PRをドラフトに倉曎したす。

以䞋では、進捗があった堎合は垞に䜜業をコミットし、プッシュしおプルリク゚ストに衚瀺されるようにしおください。さらに、定期的にメむンからの最新の倉曎を取り蟌むために、次のように行うこずを忘れないでください

git fetch upstream
git merge upstream/main

䞀般的に、モデルや実装に関する質問はPull Request (PR) で行い、PR内で議論し、解決したす。 これにより、Hugging Face チヌムは新しいコヌドをコミットする際や質問がある堎合に垞に通知を受けるこずができたす。 質問や問題が解決された際に、問題や質問が理解されやすいように、Hugging Face チヌムにコヌドを指摘するこずが非垞に圹立ちたす。

このためには、「Files changed」タブに移動しおすべおの倉曎を衚瀺し、質問したい行に移動しお「+」シンボルをクリックしおコメントを远加したす。 質問や問題が解決された堎合は、䜜成されたコメントの「Resolve」ボタンをクリックできたす。

同様に、Hugging Face チヌムはコヌドをレビュヌする際にコメントを開きたす。 PR䞊でのほずんどの質問はGitHub䞊で行うこずをお勧めしたす。 䞀般的な質問に関しおは、公にはあたり圹立たない質問に぀いおは、SlackやメヌルでHugging Face チヌムに連絡するこずもできたす。

5. 生成されたモデルコヌドを”brand_new_bert”に適応させる

最初に、モデル自䜓に焊点を圓お、トヌクナむザには気にしないでください。 関連するコヌドは、生成されたファむルsrc/transformers/models/brand_new_bert/modeling_brand_new_bert.pyおよびsrc/transformers/models/brand_new_bert/configuration_brand_new_bert.pyで芋぀かるはずです。

さお、぀いにコヌディングを始めるこずができたす :smile:。 src/transformers/models/brand_new_bert/modeling_brand_new_bert.pyにある生成されたコヌドは、゚ンコヌダヌのみのモデルであればBERTず同じアヌキテクチャを持っおいるか、゚ンコヌダヌ-デコヌダヌモデルであればBARTず同じアヌキテクチャを持っおいるはずです。 この段階では、モデルの理論的な偎面に぀いお孊んだこずを思い出すべきです。぀たり、「このモデルはBERTたたはBARTずどのように異なるのか」ずいうこずです。 これらの倉曎を実装したすが、これは通垞、セルフアテンションレむダヌ、正芏化レむダヌの順序などを倉曎するこずを意味したす。 再び、あなたのモデルがどのように実装されるべきかをより良く理解するために、Transformers内に既存のモデルの類䌌アヌキテクチャを芋るこずが圹立぀こずがありたす。

この時点では、コヌドが完党に正確たたはクリヌンである必芁はありたせん。 むしろ、たずは必芁なコヌドの最初のクリヌンでないコピヌペヌストバヌゞョンを src/transformers/models/brand_new_bert/modeling_brand_new_bert.pyに远加し、必芁なコヌドがすべお远加されおいるず感じるたで改善/修正を反埩的に行うこずがお勧めです。 私たちの経隓から、必芁なコヌドの最初のバヌゞョンを迅速に远加し、次のセクションで説明する倉換スクリプトを䜿甚しおコヌドを繰り返し改善/修正する方が効率的であるこずが倚いです。 この時点で動䜜する必芁があるのは、🀗 Transformersの”brand_new_bert”の実装をむンスタンス化できるこずだけです。぀たり、以䞋のコマンドが機胜する必芁がありたす

from transformers import BrandNewBertModel, BrandNewBertConfig

model = BrandNewBertModel(BrandNewBertConfig())

䞊蚘のコマンドは、BrandNewBertConfig() で定矩されたデフォルトパラメヌタに埓っおモデルを䜜成し、 すべおのコンポヌネントの init() メ゜ッドが正垞に動䜜するこずを確認したす。

すべおのランダムな初期化は、BrandnewBertPreTrainedModel クラスの _init_weights メ゜ッドで行う必芁がありたす。 このメ゜ッドは、蚭定倉数に䟝存するすべおのリヌフモゞュヌルを初期化する必芁がありたす。以䞋は、BERT の _init_weights メ゜ッドの䟋です

def _init_weights(self, module):
    """Initialize the weights"""
    if isinstance(module, nn.Linear):
        module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
        if module.bias is not None:
            module.bias.data.zero_()
    elif isinstance(module, nn.Embedding):
        module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
        if module.padding_idx is not None:
            module.weight.data[module.padding_idx].zero_()
    elif isinstance(module, nn.LayerNorm):
        module.bias.data.zero_()
        module.weight.data.fill_(1.0)

特定のモゞュヌルに特別な初期化が必芁な堎合、カスタムスキヌムをさらに持぀こずができたす。たずえば、 Wav2Vec2ForPreTrainingでは、最埌の2぀の線圢局には通垞のPyTorchのnn.Linearの初期化が必芁ですが、 他のすべおの局は䞊蚘のような初期化を䜿甚する必芁がありたす。これは以䞋のようにコヌディングされおいたす

def _init_weights(self, module):
    """Initialize the weights"""
    if isinstance(module, Wav2Vec2ForPreTraining):
        module.project_hid.reset_parameters()
        module.project_q.reset_parameters()
        module.project_hid._is_hf_initialized = True
        module.project_q._is_hf_initialized = True
    elif isinstance(module, nn.Linear):
        module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
        if module.bias is not None:
            module.bias.data.zero_()

_is_hf_initializedフラグは、サブモゞュヌルを䞀床だけ初期化するこずを確実にするために内郚で䜿甚されたす。 module.project_qずmodule.project_hidのためにそれをTrueに蚭定するこずで、 カスタム初期化が埌で䞊曞きされないようにし、_init_weights関数がそれらに適甚されないようにしたす。

6. 倉換スクリプトを曞く

次に、brand_new_bert の元のリポゞトリでデバッグに䜿甚したチェックポむントを、新しく䜜成した 🀗 Transformers 実装の brand_new_bert ず互換性のあるチェックポむントに倉換できる倉換スクリプトを曞く必芁がありたす。 倉換スクリプトをれロから曞くこずはお勧めされたせんが、代わりに 🀗 Transformers で既に存圚する類䌌のモデルを同じフレヌムワヌクで倉換したスクリプトを調べるこずが良いでしょう。 通垞、既存の倉換スクリプトをコピヌしお、自分のナヌスケヌスにわずかに適応させるこずで十分です。 Hugging Face チヌムに既存のモデルに類䌌した倉換スクリプトを教えおもらうこずも躊躇しないでください。

  • TensorFlowからPyTorchにモデルを移怍しおいる堎合、良い出発点はBERTの倉換スクリプトかもしれたせん here
  • PyTorchからPyTorchにモデルを移怍しおいる堎合、良い出発点はBARTの倉換スクリプトかもしれたせん here

以䞋では、PyTorchモデルが局の重みをどのように保存し、局の名前を定矩するかに぀いお簡単に説明したす。 PyTorchでは、局の名前は局に䞎えるクラス属性の名前によっお定矩されたす。 PyTorchで SimpleModel ずいうダミヌモデルを定矩したしょう

from torch import nn


class SimpleModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.dense = nn.Linear(10, 10)
        self.intermediate = nn.Linear(10, 10)
        self.layer_norm = nn.LayerNorm(10)

これで、このモデル定矩のむンスタンスを䜜成し、dense、intermediate、layer_normのすべおの重みをランダムな重みで埋めたモデルを䜜成できたす。モデルのアヌキテクチャを確認するために、モデルを印刷しおみたしょう。

model = SimpleModel()

print(model)

これは以䞋を出力したす

SimpleModel(
  (dense): Linear(in_features=10, out_features=10, bias=True)
  (intermediate): Linear(in_features=10, out_features=10, bias=True)
  (layer_norm): LayerNorm((10,), eps=1e-05, elementwise_affine=True)
)

局の名前はPyTorchのクラス属性の名前によっお定矩されおいたす。特定の局の重み倀を出力するこずができたす

print(model.dense.weight.data)

ランダムに初期化された重みを確認するために

tensor([[-0.0818,  0.2207, -0.0749, -0.0030,  0.0045, -0.1569, -0.1598,  0.0212,
         -0.2077,  0.2157],
        [ 0.1044,  0.0201,  0.0990,  0.2482,  0.3116,  0.2509,  0.2866, -0.2190,
          0.2166, -0.0212],
        [-0.2000,  0.1107, -0.1999, -0.3119,  0.1559,  0.0993,  0.1776, -0.1950,
         -0.1023, -0.0447],
        [-0.0888, -0.1092,  0.2281,  0.0336,  0.1817, -0.0115,  0.2096,  0.1415,
         -0.1876, -0.2467],
        [ 0.2208, -0.2352, -0.1426, -0.2636, -0.2889, -0.2061, -0.2849, -0.0465,
          0.2577,  0.0402],
        [ 0.1502,  0.2465,  0.2566,  0.0693,  0.2352, -0.0530,  0.1859, -0.0604,
          0.2132,  0.1680],
        [ 0.1733, -0.2407, -0.1721,  0.1484,  0.0358, -0.0633, -0.0721, -0.0090,
          0.2707, -0.2509],
        [-0.1173,  0.1561,  0.2945,  0.0595, -0.1996,  0.2988, -0.0802,  0.0407,
          0.1829, -0.1568],
        [-0.1164, -0.2228, -0.0403,  0.0428,  0.1339,  0.0047,  0.1967,  0.2923,
          0.0333, -0.0536],
        [-0.1492, -0.1616,  0.1057,  0.1950, -0.2807, -0.2710, -0.1586,  0.0739,
          0.2220,  0.2358]]).

スクリプト内の倉換スクリプトでは、ランダムに初期化された重みを、察応するチェックポむント内の正確な重みで埋める必芁がありたす。䟋えば、以䞋のように翻蚳したす

# retrieve matching layer weights, e.g. by
# recursive algorithm
layer_name = "dense"
pretrained_weight = array_of_dense_layer

model_pointer = getattr(model, "dense")

model_pointer.weight.data = torch.from_numpy(pretrained_weight)

PyTorchモデルの各ランダム初期化された重みず察応する事前孊習枈みチェックポむントの重みが 圢状ず名前の䞡方で正確に䞀臎するこずを確認する必芁がありたす。 これを行うために、圢状に察するassertステヌトメントを远加し、チェックポむントの重みの名前を出力するこずが 必芁䞍可欠です。䟋えば、次のようなステヌトメントを远加する必芁がありたす

assert (
    model_pointer.weight.shape == pretrained_weight.shape
), f"Pointer shape of random weight {model_pointer.shape} and array shape of checkpoint weight {pretrained_weight.shape} mismatched"

たた、䞡方の重みの名前を印刷しお、䞀臎しおいるこずを確認する必芁がありたす。䟋えば、次のようにしたす

logger.info(f"Initialize PyTorch weight {layer_name} from {pretrained_weight.name}")

もし圢状たたは名前のいずれかが䞀臎しない堎合、おそらく誀っお🀗 Transformersの実装に初期化されたレむダヌに間違ったチェックポむントの重みを割り圓おおしたった可胜性がありたす。

誀った圢状は、おそらくBrandNewBertConfig()での蚭定パラメヌタヌが、倉換したいチェックポむントで䜿甚されたものず正確に䞀臎しないためです。 ただし、PyTorchのレむダヌの実装によっおは、重みを事前に転眮する必芁がある堎合もありたす。

最埌に、すべおの必芁な重みが初期化されおいるこずを確認し、初期化に䜿甚されなかったすべおのチェックポむントの重みを衚瀺しお、モデルが正しく倉換されおいるこずを確認しおください。 倉換トラむアルが誀った圢状ステヌトメントたたは誀った名前割り圓おで倱敗するのは完党に正垞です。 これはおそらく、BrandNewBertConfig()で誀ったパラメヌタヌを䜿甚したか、🀗 Transformersの実装に誀ったアヌキテクチャがあるか、🀗 Transformersの実装の1぀のコンポヌネントのinit()関数にバグがあるか、チェックポむントの重みの1぀を転眮する必芁があるためです。

このステップは、以前のステップず繰り返すべきです。すべおのチェックポむントの重みが正しく🀗 Transformersモデルに読み蟌たれるたで繰り返すべきです。 🀗 Transformers実装に正しくチェックポむントを読み蟌んだ埌、遞択したフォルダヌにモデルを保存できたす /path/to/converted/checkpoint/folder。このフォルダにはpytorch_model.binファむルずconfig.jsonファむルの䞡方が含たれるはずです。

model.save_pretrained("/path/to/converted/checkpoint/folder")

7. 順䌝播forward passの実装

🀗 Transformers実装で事前孊習枈みの重みを正しく読み蟌んだ埌、順䌝播が正しく実装されおいるこずを確認する必芁がありたす。元のリポゞトリを理解するで、元のリポゞトリを䜿甚しおモデルの順䌝播を実行するスクリプトをすでに䜜成したした。今床は、元のリポゞトリの代わりに🀗 Transformers実装を䜿甚しお類䌌のスクリプトを䜜成する必芁がありたす。以䞋のようになりたす

model = BrandNewBertModel.from_pretrained("/path/to/converted/checkpoint/folder")
input_ids = [0, 4, 4, 3, 2, 4, 1, 7, 19]
output = model(input_ids).last_hidden_states

🀗 Transformersの実装ず元のモデルの実装が最初の実行で完党に同じ出力を提䟛しないか、 フォワヌドパスで゚ラヌが発生する可胜性が非垞に高いです。倱望しないでください - これは予想されおいるこずです たず、フォワヌドパスが゚ラヌをスロヌしないこずを確認する必芁がありたす。 間違った次元が䜿甚され、次元の䞍䞀臎゚ラヌや、誀ったデヌタ型オブゞェクトが䜿甚されるこずがよくありたす。 䟋えば、torch.longではなくtorch.float32が䜿甚されたす。特定の゚ラヌを解決できない堎合は、 Hugging Faceチヌムに助けを求めるこずを躊躇しないでください。

🀗 Transformers実装が正しく機胜するこずを確認する最終的な郚分は、出力が1e-3の粟床で同等であるこずを確認するこずです。 たず、出力の圢状が同䞀であるこず、぀たりスクリプトの🀗 Transformers実装ず元の実装の䞡方でoutputs.shapeが同じ倀を生成する必芁がありたす。 次に、出力倀が同䞀であるこずを確認する必芁がありたす。 これは新しいモデルを远加する際の最も難しい郚分の1぀です。 出力が同䞀でない理由の䞀般的な間違いは以䞋の通りです。

  • 䞀郚のレむダヌが远加されおいない、぀たり掻性化レむダヌが远加されおいないか、リザバル接続が忘れられおいる
  • 単語埋め蟌み行列が結ばれおいない
  • オリゞナルの実装がオフセットを䜿甚しおいるため、誀った䜍眮埋め蟌みが䜿甚されおいる
  • フォワヌドパス䞭にドロップアりトが適甚されおいたす。これを修正するには、model.trainingがFalseであるこずを確認し、フォワヌドパス䞭に誀っおドロップアりトレむダヌがアクティブ化されないようにしたす。 ぀たり PyTorchのfunctional dropoutにmodel.trainingを枡したす。

問題を修正する最良の方法は、通垞、元の実装ず🀗 Transformers実装のフォワヌドパスを䞊べお衚瀺し、違いがあるかどうかを確認するこずです。 理想的には、フォワヌドパスの䞡方の実装の䞭間出力をデバッグ/プリントアりトしお、🀗 Transformers実装が元の実装ず異なる出力を瀺すネットワヌク内の正確な䜍眮を芋぀けるこずができたす。 最初に、䞡方のスクリプトのハヌドコヌディングされたinput_idsが同䞀であるこずを確認したす。 次に、input_idsの最初の倉換通垞、単語埋め蟌みの出力が同䞀であるこずを確認したす。 その埌、ネットワヌクの最埌のレむダヌたで䜜業を進めたす。 いずれかの時点で、2぀の実装間で違いがあるこずに気付くはずで、それにより🀗 Transformers実装のバグの堎所が特定されたす。 経隓䞊、元の実装ず🀗 Transformers実装のフォワヌドパスの同じ䜍眮に倚くのプリントステヌトメントを远加し、 䞭間プレれンテヌションで同じ倀を瀺すプリントステヌトメントを段階的に削陀するのがシンプルか぀効果的な方法です。

䞡方の実装が同じ出力を生成するこずに自信を持っおいる堎合、torch.allclose(original_output, output, atol=1e-3)を䜿甚しお出力を確認するず、最も難しい郚分が完了したす おめでずうございたす - 完了する䜜業は簡単なものになるはずです 😊。

8. 必芁なすべおのモデルテストを远加

この時点で、新しいモデルが正垞に远加されたした。 ただし、モデルがただ必芁な蚭蚈に完党に準拠しおいない可胜性が非垞に高いです。 🀗 Transformersず完党に互換性があるこずを確認するために、すべおの䞀般的なテストがパスする必芁がありたす。 Cookiecutterはおそらくモデル甚のテストファむルを自動的に远加しおいるはずで、おそらく同じディレクトリにtests/models/brand_new_bert/test_modeling_brand_new_bert.pyずしお存圚したす。 このテストファむルを実行しお、すべおの䞀般的なテストがパスするこずを確認しおください

pytest tests/models/brand_new_bert/test_modeling_brand_new_bert.py

すべおの䞀般的なテストを修正したら、今床は実行したすべおの玠晎らしい䜜業が適切にテストされおいるこずを確認するこずが非垞に重芁です。これにより、

  • a) コミュニティはbrand_new_bertの特定のテストを芋るこずで、あなたの䜜業を簡単に理解できたす。
  • b) モデルぞの将来の倉曎がモデルの重芁な機胜を壊さないようにするこずができたす。

たず、統合テストを远加する必芁がありたす。これらの統合テストは、基本的にはデバッグスクリプトず同じこずを行いたす。これらのモデルテストのテンプレヌトはCookiecutterによっお既に远加されおおり、「BrandNewBertModelIntegrationTests」ず呌ばれおいたす。このテストを蚘入するだけです。これらのテストが合栌しおいるこずを確認するには、次のコマンドを実行したす。

RUN_SLOW=1 pytest -sv tests/models/brand_new_bert/test_modeling_brand_new_bert.py::BrandNewBertModelIntegrationTests

Windowsを䜿甚しおいる堎合、RUN_SLOW=1をSET RUN_SLOW=1に眮き換えおください。

次に、brand_new_bertに特有のすべおの特城は、別個のテスト内で远加されるべきです。 BrandNewBertModelTester/BrandNewBertModelTestの䞋に。この郚分はよく忘れられたすが、2぀の点で非垞に圹立ちたす

  • モデルの远加䞭に獲埗した知識をコミュニティに䌝え、brand_new_bertの特別な機胜がどのように動䜜するかを瀺すこずによっお、知識の共有を支揎したす。
  • 将来の貢献者は、これらの特別なテストを実行するこずでモデルぞの倉曎を迅速にテストできたす。

9. トヌクナむザの実装

次に、brand_new_bertのトヌクナむザを远加する必芁がありたす。通垞、トヌクナむザは🀗 Transformersの既存のトヌクナむザず同等か非垞に䌌おいたす。

トヌクナむザが正しく動䜜するこずを確認するためには、たず、元のリポゞトリ内で文字列を入力し、input_idsを返すスクリプトを䜜成するこずをお勧めしたす。 このスクリプトは、次のように芋えるかもしれたせん疑䌌コヌドで瀺したす

input_str = "This is a long example input string containing special characters .$?-, numbers 2872 234 12 and words."
model = BrandNewBertModel.load_pretrained_checkpoint("/path/to/checkpoint/")
input_ids = model.tokenize(input_str)

オリゞナルのリポゞトリを詳しく調査し、正しいトヌクナむザの関数を芋぀ける必芁があるかもしれたせん。 たたは、オリゞナルのリポゞトリのクロヌンを倉曎しお、input_idsだけを出力するようにする必芁があるかもしれたせん。 オリゞナルのリポゞトリを䜿甚した機胜的なトヌクナむれヌションスクリプトを䜜成した埌、 🀗 Transformers向けの類䌌したスクリプトを䜜成する必芁がありたす。 以䞋のように芋えるべきです

from transformers import BrandNewBertTokenizer

input_str = "This is a long example input string containing special characters .$?-, numbers 2872 234 12 and words."

tokenizer = BrandNewBertTokenizer.from_pretrained("/path/to/tokenizer/folder/")

input_ids = tokenizer(input_str).input_ids

input_idsが同じ倀を生成した堎合、最終ステップずしおトヌクナむザのテストファむルも远加するべきです。

brand_new_bertのモデルングテストファむルず同様に、brand_new_bertのトヌクナむズテストファむルには、いく぀かのハヌドコヌドされた統合テストが含たれるべきです。

10. ゚ンドツヌ゚ンド統合テストの実行

トヌクナむザを远加した埌、🀗 Transformers内のtests/models/brand_new_bert/test_modeling_brand_new_bert.pyに モデルずトヌクナむザの䞡方を䜿甚するいく぀かの゚ンドツヌ゚ンド統合テストも远加する必芁がありたす。 このようなテストは、🀗 Transformersの実装が期埅どおりに機胜するこずを瀺すべきです。 意味のあるテキスト察テキストのサンプルが含たれたす。有甚なテキスト察テキストのサンプルには、゜ヌスからタヌゲットぞの翻蚳ペア、蚘事から芁玄ぞのペア、質問から回答ぞのペアなどが含たれたす。 ポヌトされたチェックポむントがダりンストリヌムタスクでファむンチュヌニングされおいない堎合、モデルのテストに䟝存するだけで十分です。 モデルが完党に機胜しおいるこずを確認するために、すべおのテストをGPU䞊で実行するこずもお勧めしたす。 モデルの内郚テン゜ルに.to(self.device)ステヌトメントを远加するのを忘れる可胜性があるため、そのようなテストでぱラヌが衚瀺されるこずがありたす。 GPUにアクセスできない堎合、Hugging Faceチヌムが代わりにこれらのテストを実行できたす。

11. ドキュメントの远加

これで、brand_new_bertの必芁なすべおの機胜が远加されたした - ほが完了です残りの远加すべきこずは、良いドキュメントずドキュメントペヌゞです。 Cookiecutterがdocs/source/model_doc/brand_new_bert.mdずいうテンプレヌトファむルを远加しおいるはずで、これを蚘入する必芁がありたす。 モデルのナヌザヌは通垞、モデルを䜿甚する前にたずこのペヌゞを芋たす。したがっお、ドキュメンテヌションは理解しやすく簡朔である必芁がありたす。 モデルの䜿甚方法を瀺すためにいく぀かのTipsを远加するこずはコミュニティにずっお非垞に圹立ちたす。ドキュメンテヌションに関しおは、Hugging Faceチヌムに問い合わせるこずをためらわないでください。

次に、src/transformers/models/brand_new_bert/modeling_brand_new_bert.pyに远加されたドキュメンテヌション文字列が正しいこず、およびすべおの必芁な入力および出力を含んでいるこずを確認しおください。 ドキュメンテヌションの曞き方ずドキュメンテヌション文字列のフォヌマットに぀いお詳现なガむドがこちらにありたす。 ドキュメンテヌションは通垞、コミュニティずモデルの最初の接觊点であるため、コヌドず同じくらい泚意深く扱うべきであるこずを垞に念頭に眮いおください。

コヌドのリファクタリング

玠晎らしい、これでbrand_new_bertに必芁なすべおのコヌドが远加されたした。 この時点で、次のようなポテンシャルなコヌドスタむルの誀りを蚂正するために以䞋を実行する必芁がありたす

make style

あなたのコヌディングスタむルが品質チェックをパスするこずを確認しおください:

make quality

🀗 Transformersの非垞に厳栌なデザむンテストには、ただ合栌しおいない可胜性があるいく぀かの他のテストが存圚するかもしれたせん。 これは、ドキュメント文字列に情報が䞍足しおいるか、名前が間違っおいるこずが原因であるこずが倚いです。Hugging Faceチヌムは、ここで詰たっおいる堎合には必ず助けおくれるでしょう。

最埌に、コヌドが正しく機胜するこずを確認した埌、コヌドをリファクタリングするのは垞に良いアむデアです。 すべおのテストがパスした今、远加したコヌドを再床確認しおリファクタリングを行うのは良いタむミングです。

これでコヌディングの郚分は完了したした、おめでずうございたす 🎉 あなたは玠晎らしいです 😎

12. モデルをモデルハブにアップロヌド

最埌のパヌトでは、すべおのチェックポむントをモデルハブに倉換しおアップロヌドし、各アップロヌドしたモデルチェックポむントにモデルカヌドを远加する必芁がありたす。 モデルハブの機胜に぀いお詳しくは、Model sharing and uploading Pageを読んで理解できたす。 ここでは、brand_new_bertの著者組織の䞋にモデルをアップロヌドできるように必芁なアクセス暩を取埗するために、Hugging Faceチヌムず協力する必芁がありたす。 transformersのすべおのモデルに存圚するpush_to_hubメ゜ッドは、チェックポむントをハブにプッシュする迅速か぀効率的な方法です。 以䞋に、少しのコヌドスニペットを瀺したす

brand_new_bert.push_to_hub("brand_new_bert")
# Uncomment the following line to push to an organization.
# brand_new_bert.push_to_hub("<organization>/brand_new_bert")

各チェックポむントに適切なモデルカヌドを䜜成する䟡倀がありたす。モデルカヌドは、この特定のチェックポむントの特性をハむラむトするべきです。䟋えば、このチェックポむントはどのデヌタセットで事前孊習/ファむンチュヌニングされたか、どのような䞋流タスクでモデルを䜿甚すべきかを瀺すべきです。たた、モデルの正しい䜿甚方法に関するコヌドも含めるべきです。

13.オプションノヌトブックの远加

brand_new_bertを掚論たたは䞋流タスクのファむンチュヌニングにどのように詳现に䜿甚できるかを瀺すノヌトブックを远加するこずは非垞に圹立ちたす。これはあなたのPRをマヌゞするために必須ではありたせんが、コミュニティにずっお非垞に有甚です。

14. 完成したPRの提出

プログラミングが完了したら、最埌のステップに移動し、PRをメむンブランチにマヌゞしたしょう。通垞、Hugging Faceチヌムはこの時点で既にあなたをサポヌトしおいるはずですが、PRに良い説明を远加し、コヌドにコメントを远加しお、レビュアヌに特定の蚭蚈の遞択肢を指摘したい堎合はコメントを远加するこずも䟡倀がありたす。

Share your work!!

さあ、コミュニティからあなたの䜜業に察する評䟡を埗る時が来たしたモデルの远加を完了するこずは、TransformersおよびNLPコミュニティにずっお重芁な貢献です。あなたのコヌドずポヌトされた事前孊習枈みモデルは、䜕癟人、䜕千人ずいう開発者や研究者によっお確実に䜿甚されるでしょう。あなたの仕事に誇りを持ち、コミュニティずあなたの成果を共有したしょう。

あなたはコミュニティの誰でも簡単にアクセスできる別のモデルを䜜成したした 🀯

< > Update on GitHub