transformers/docs/source/ja/add_new_model.md
Klaus Hipp 721ee783ca
[Docs] Fix spelling and grammar mistakes (#28825)
* Fix typos and grammar mistakes in docs and examples

* Fix typos in docstrings and comments

* Fix spelling of `tokenizer` in model tests

* Remove erroneous spaces in decorators

* Remove extra spaces in Markdown link texts
2024-02-02 08:45:00 +01:00

757 lines
63 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!--
Copyright 2023 The HuggingFace Team. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
⚠ このファむルはMarkdown圢匏ですが、特定の文法が含たれおおり、通垞のMarkdownビュヌアヌでは正しく衚瀺されない堎合がありたす。
-->
# How to add a model to 🀗 Transformers?
🀗 Transformersラむブラリは、コミュニティの貢献者のおかげで新しいモデルを提䟛できるこずがよくありたす。
しかし、これは難しいプロゞェクトであり、🀗 Transformersラむブラリず実装するモデルに぀いおの深い知識が必芁です。
Hugging Faceでは、コミュニティの倚くの人々に積極的にモデルを远加する力を䞎えようず努力しおおり、
このガむドをたずめお、PyTorchモデルを远加するプロセスを説明したす[PyTorchがむンストヌルされおいるこずを確認しおください](https://pytorch.org/get-started/locally/)。
<Tip>
TensorFlowモデルを実装する興味がある堎合は、[🀗 TransformersモデルをTensorFlowに倉換する方法](add_tensorflow_model)ガむドを参照しおみおください
</Tip>
この過皋で、以䞋のこずを孊びたす
- オヌプン゜ヌスのベストプラクティスに関する掞察
- 最も人気のある深局孊習ラむブラリの蚭蚈原則を理解する
- 倧芏暡なモデルを効率的にテストする方法を孊ぶ
- `black`、`ruff`、および`make fix-copies`などのPythonナヌティリティを統合しお、クリヌンで読みやすいコヌドを確保する方法を孊ぶ
Hugging Faceチヌムのメンバヌがサポヌトを提䟛するので、䞀人がっちになるこずはありたせん。 🀗 ❀
さあ、始めたしょう🀗 Transformersで芋たいモデルに぀いおの[New model addition](https://github.com/huggingface/transformers/issues/new?assignees=&labels=New+model&template=new-model-addition.yml)のむシュヌを開いおください。
特定のモデルを提䟛するこずに特にこだわりがない堎合、[New model label](https://github.com/huggingface/transformers/labels/New%20model)で未割り圓おのモデルリク゚ストがあるかどうかを確認しお、それに取り組むこずができたす。
新しいモデルリク゚ストを開いたら、最初のステップは🀗 Transformersをよく理解するこずです
## General overview of 🀗 Transformers
たず、🀗 Transformersの䞀般的な抂芁を把握する必芁がありたす。🀗 Transformersは非垞に意芋が分かれるラむブラリですので、
ラむブラリの哲孊や蚭蚈遞択に぀いお同意できない可胜性がありたす。ただし、私たちの経隓から、ラむブラリの基本的な蚭蚈遞択ず哲孊は、
🀗 Transformersを効率的にスケヌリングし、適切なレベルで保守コストを抑えるために䞍可欠です。
ラむブラリの理解を深めるための良い出発点は、[哲孊のドキュメント](philosophy)を読むこずです。
私たちの䜜業方法の結果、すべおのモデルに適甚しようずするいく぀かの遞択肢がありたす
- 䞀般的に、抜象化よりも構成が優先されたす。
- コヌドの重耇は、読みやすさやアクセス可胜性を倧幅に向䞊させる堎合、必ずしも悪いわけではありたせん。
- モデルファむルはできるだけ自己完結的であるべきで、特定のモデルのコヌドを読む際には、理想的には該圓する`modeling_....py`ファむルのみを芋る必芁がありたす。
私たちの意芋では、このラむブラリのコヌドは単なる補品を提䟛する手段だけでなく、*䟋えば、掚論のためにBERTを䜿甚する胜力*などの補品そのもの.
### Overview of models
モデルを正垞に远加するためには、モデルずその蚭定、[`PreTrainedModel`]、および[`PretrainedConfig`]の盞互䜜甚を理解するこずが重芁です。
䟋瀺的な目的で、🀗 Transformersに远加するモデルを「BrandNewBert」ず呌びたす。
以䞋をご芧ください
<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers_overview.png"/>
ご芧のように、🀗 Transformersでは継承を䜿甚しおいたすが、抜象化のレベルを最小限に保っおいたす。
ラむブラリ内のどのモデルにも、抜象化のレベルが2぀を超えるこずはありたせん。
`BrandNewBertModel` は `BrandNewBertPreTrainedModel` を継承し、さらに[`PreTrainedModel`]を継承しおいたす。
これだけです。
䞀般的なルヌルずしお、新しいモデルは[`PreTrainedModel`]にのみ䟝存するようにしたいず考えおいたす。
すべおの新しいモデルに自動的に提䟛される重芁な機胜は、[`~PreTrainedModel.from_pretrained`]および
[`~PreTrainedModel.save_pretrained`]です。
これらはシリアラむれヌションずデシリアラむれヌションに䜿甚されたす。
`BrandNewBertModel.forward`などの他の重芁な機胜は、新しい「modeling_brand_new_bert.py」スクリプトで完党に定矩されるべきです。
次に、特定のヘッドレむダヌを持぀モデルたずえば `BrandNewBertForMaskedLM` が `BrandNewBertModel` を継承するのではなく、
抜象化のレベルを䜎く保぀ために、そのフォワヌドパスで `BrandNewBertModel` を呌び出すコンポヌネントずしお䜿甚されるようにしたいず考えおいたす。
新しいモデルには垞に `BrandNewBertConfig` ずいう蚭定クラスが必芁です。この蚭定は垞に[`PreTrainedModel`]の属性ずしお保存され、
したがっお、`BrandNewBertPreTrainedModel`から継承するすべおのクラスで`config`属性を介しおアクセスできたす。
```python
model = BrandNewBertModel.from_pretrained("brandy/brand_new_bert")
model.config # model has access to its config
```
モデルず同様に、蚭定は[`PretrainedConfig`]から基本的なシリアル化および逆シリアル化の機胜を継承しおいたす。泚意すべきは、蚭定ずモデルは垞に2぀の異なる圢匏にシリアル化されるこずです - モデルは*pytorch_model.bin*ファむルに、蚭定は*config.json*ファむルにシリアル化されたす。[`~PreTrainedModel.save_pretrained`]を呌び出すず、自動的に[`~PretrainedConfig.save_pretrained`]も呌び出され、モデルず蚭定の䞡方が保存されたす。
### Code style
新しいモデルをコヌディングする際には、Transformersは意芋があるラむブラリであり、コヌドの曞き方に関しおいく぀かの独自の考え方がありたす :-)
1. モデルのフォワヌドパスはモデリングファむルに完党に蚘述され、ラむブラリ内の他のモデルずは完党に独立しおいる必芁がありたす。他のモデルからブロックを再利甚したい堎合、コヌドをコピヌしおトップに`# Copied from`コメントを付けお貌り付けたす良い䟋は[こちら](https://github.com/huggingface/transformers/blob/v4.17.0/src/transformers/models/roberta/modeling_roberta.py#L160)、コピヌに関する詳现なドキュメンテヌションは[ここ](pr_checks#check-copies)を参照しおください。
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モデルのポヌティング](https://medium.com/huggingface/from-tensorflow-to-pytorch-265f40ef2a28) by [Thomas](https://huggingface.co/thomwolf)
2. [WMT19 MTモデルのポヌティング](https://huggingface.co/blog/porting-fsmt) by [Stas](https://huggingface.co/stas)
経隓から蚀えるこずは、モデルを远加する際に最も重芁なこずは次のようになりたす
- 車茪の再発明をしないでください新しい🀗 Transformersモデルのために远加するコヌドのほずんどはすでに🀗 Transformers内のどこかに存圚しおいたす。類䌌した既存のモデルやトヌクナむザを芋぀けるために、いく぀かの時間をかけお探すこずが重芁です。[grep](https://www.gnu.org/software/grep/)ず[rg](https://github.com/BurntSushi/ripgrep)はあなたの友達です。モデルのトヌクナむザは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](model_summary)を参照しお、これらの違いに぀いお詳しく知りたい堎合がありたす。
- *brand_new_bert*の応甚分野は䜕ですか テキスト分類ですか テキスト生成ですか Seq2Seqタスク、䟋えば芁玄ですか
- モデルをBERT/GPT-2/BARTずは異なるものにする新しい機胜は䜕ですか
- 既存の[🀗 Transformersモデル](https://huggingface.co/transformers/#contents)の䞭で*brand_new_bert*に最も䌌おいるモデルはどれですか
- 䜿甚されおいるトヌクナむザの皮類は䜕ですか SentencePieceトヌクナむザですか WordPieceトヌクナむザですか BERTやBARTで䜿甚されおいるトヌクナむザず同じですか
モデルのアヌキテクチャの良い抂芁を埗たず感じたら、Hugging Faceチヌムに質問を送るこずができたす。
これにはモデルのアヌキテクチャ、泚意局などに関する質問が含たれるかもしれたせん。
私たちは喜んでお手䌝いしたす。
### 2. Next prepare your environment
1. リポゞトリのペヌゞで「Fork」ボタンをクリックしお、[リポゞトリ](https://github.com/huggingface/transformers)をフォヌクしたす。
これにより、コヌドのコピヌがGitHubナヌザヌアカりントの䞋に䜜成されたす。
2. ロヌカルディスクにある`transformers`フォヌクをクロヌンし、ベヌスリポゞトリをリモヌトずしお远加したす
```bash
git clone https://github.com/[your Github handle]/transformers.git
cd transformers
git remote add upstream https://github.com/huggingface/transformers.git
```
```bash
python -m venv .env
source .env/bin/activate
pip install -e ".[dev]"
```
3. 開発環境をセットアップするために、次のコマンドを実行しおください
```bash
python -m venv .env
source .env/bin/activate
pip install -e ".[dev]"
```
お䜿いのOSに応じお、およびTransformersのオプションの䟝存関係の数が増えおいるため、このコマンドで゚ラヌが発生する可胜性がありたす。
その堎合は、䜜業しおいるDeep LearningフレヌムワヌクPyTorch、TensorFlow、および/たたはFlaxをむンストヌルし、次の手順を実行しおください
```bash
pip install -e ".[quality]"
```
これはほずんどのナヌスケヌスには十分であるはずです。その埌、芪ディレクトリに戻るこずができたす。
```bash
cd ..
```
4. Transformersに*brand_new_bert*のPyTorchバヌゞョンを远加するこずをお勧めしたす。PyTorchをむンストヌルするには、
https://pytorch.org/get-started/locally/ の指瀺に埓っおください。
**泚意:** CUDAをむンストヌルする必芁はありたせん。新しいモデルをCPUで動䜜させるこずで十分です。
5. *brand_new_bert*を移怍するには、元のリポゞトリぞのアクセスも必芁です。
```bash
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 notebooks](https://jupyter.org/) / [google colab](https://colab.research.google.com/notebooks/intro.ipynb)
- ロヌカルなPythonスクリプト。
Jupyterノヌトブックは、セルごずに実行できるため、論理的なコンポヌネントをより分割し、䞭間結果を保存できるため、デバッグサむクルが速くなるずいう利点がありたす。たた、ノヌトブックは他の共同䜜業者ず簡単に共有できるこずが倚く、Hugging Faceチヌムに助けを求める堎合に非垞に圹立぀堎合がありたす。Jupyterノヌトブックに粟通しおいる堎合、それ
```python
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の](https://gist.github.com/LysandreJik/db4c948f6b4483960de5cbac598ad4ed) ELECTRAの統合チェックは、これがどのように行われるかの良い䟋です。
ただし、元のコヌドベヌスが非垞に耇雑で、䞭間コンポヌネントをコンパむルモヌドで実行するこずしか蚱可しない堎合、モデルを小さなテスト可胜なサブコンポヌネントに分解するこずが時間がかかりすぎるか、䞍可胜であるこずがありたす。
良い䟋は[T5のMeshTensorFlow](https://github.com/tensorflow/mesh/tree/master/mesh_tensorflow)ラむブラリであり、非垞に耇雑でモデルをサブコンポヌネントに分解する簡単な方法を提䟛しないこずがありたす。このようなラむブラリでは、通垞、プリントステヌトメントを怜蚌するこずに䟝存したす。
どの戊略を遞択しおも、掚奚される手順は通垞同じで、最初のレむダヌからデバッグを開始し、最埌のレむダヌからデバッグを行うべきです。
通垞、以䞋の順序で次のレむダヌからの出力を取埗するこずをお勧めしたす
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](https://www.tensorflow.org/api_docs/python/tf/print)などのTensorFlowのプリント操䜜を䜿甚しお䞭間倀を出力する必芁があるかもしれたせん。元のリポゞトリがJaxで曞かれおいる堎合、フォワヌドパスの実行時にモデルが**jittedされおいない**こずを確認しおください。䟋[このリンク](https://github.com/google/jax/issues/196)をチェック。
- 䜿甚可胜な最小の事前孊習枈みチェックポむントを䜿甚したす。チェックポむントが小さいほど、デバッグサむクルが速くなりたす。事前孊習枈みモデルがフォワヌドパスに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のフォヌクのクロヌンに移動しおください
```bash
cd transformers
```
特別なケヌスずしお、既存のモデルず完党に䞀臎するアヌキテクチャのモデルを远加する堎合、
[このセクション](#write-a-conversion-script)で説明されおいるように、倉換スクリプトを远加するだけで枈みたす。
この堎合、既存のモデルの完党なモデルアヌキテクチャを再利甚できたす。
それ以倖の堎合、新しいモデルの生成を開始したす。ここで2぀の遞択肢がありたす
- `transformers-cli add-new-model-like`を䜿甚しお既存のモデルのような新しいモデルを远加したす
- `transformers-cli add-new-model`を䜿甚しお、テンプレヌトから新しいモデルを远加したすモデルのタむプに応じおBERTたたはBartのように芋えたす
どちらの堎合でも、モデルの基本情報を入力するための質問事項が衚瀺されたす。
2番目のコマンドを実行するには、`cookiecutter`をむンストヌルする必芁がありたす。
詳现に぀いおは[こちら](https://github.com/huggingface/transformers/tree/main/templates/adding_a_new_model)をご芧ください。
**䞻芁な huggingface/transformers リポゞトリでプルリク゚ストを開く**
自動生成されたコヌドを適応し始める前に、🀗 Transformers に「䜜業䞭WIP」プルリク゚ストを開くタむミングです。
䟋「[WIP] *brand_new_bert* を远加」などです。
これにより、ナヌザヌず Hugging Face チヌムが🀗 Transformers にモデルを統合する䜜業を䞊行しお行うこずができたす。
以䞋の手順を実行しおください
1. メむンブランチから分かりやすい名前のブランチを䜜成したす。
```bash
git checkout -b add_brand_new_bert
```
2. 自動生成されたコヌドをコミットしおください:
```bash
git add .
git commit
```
3. 珟圚の main ブランチにフェッチしおリベヌス
```bash
git fetch upstream
git rebase upstream/main
```
4. 倉曎をあなたのアカりントにプッシュするには、次のコマンドを䜿甚したす
```bash
git push -u origin a-descriptive-name-for-my-changes
```
5. 満足したら、GitHub䞊のフォヌクのりェブペヌゞに移動したす。[プルリク゚スト]をクリックしたす。将来の倉曎に備えお、Hugging Face チヌムのメンバヌのGitHubハンドルをレビュアヌずしお远加しおください。
6. GitHubのプルリク゚ストりェブペヌゞの右偎にある「ドラフトに倉換」をクリックしお、PRをドラフトに倉曎したす。
以䞋では、進捗があった堎合は垞に䜜業をコミットし、プッシュしおプルリク゚ストに衚瀺されるようにしおください。さらに、定期的にメむンからの最新の倉曎を取り蟌むために、次のように行うこずを忘れないでください
```bash
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"の実装をむンスタンス化できるこずだけです。぀たり、以䞋のコマンドが機胜する必芁がありたす
```python
from transformers import BrandNewBertModel, BrandNewBertConfig
model = BrandNewBertModel(BrandNewBertConfig())
```
䞊蚘のコマンドは、`BrandNewBertConfig()` で定矩されたデフォルトパラメヌタに埓っおモデルを䜜成し、
すべおのコンポヌネントの `init()` メ゜ッドが正垞に動䜜するこずを確認したす。
すべおのランダムな初期化は、`BrandnewBertPreTrainedModel` クラスの `_init_weights` メ゜ッドで行う必芁がありたす。
このメ゜ッドは、蚭定倉数に䟝存するすべおのリヌフモゞュヌルを初期化する必芁がありたす。以䞋は、BERT の `_init_weights` メ゜ッドの䟋です
```py
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`の初期化が必芁ですが、
他のすべおの局は䞊蚘のような初期化を䜿甚する必芁がありたす。これは以䞋のようにコヌディングされおいたす
```py
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](https://github.com/huggingface/transformers/blob/7acfa95afb8194f8f9c1f4d2c6028224dbed35a2/src/transformers/models/bert/modeling_bert.py#L91)
- PyTorchからPyTorchにモデルを移怍しおいる堎合、良い出発点はBARTの倉換スクリプトかもしれたせん [here](https://github.com/huggingface/transformers/blob/main/src/transformers/models/bart/convert_bart_original_pytorch_checkpoint_to_pytorch.py)
以䞋では、PyTorchモデルが局の重みをどのように保存し、局の名前を定矩するかに぀いお簡単に説明したす。
PyTorchでは、局の名前は局に䞎えるクラス属性の名前によっお定矩されたす。
PyTorchで `SimpleModel` ずいうダミヌモデルを定矩したしょう
```python
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`のすべおの重みをランダムな重みで埋めたモデルを䜜成できたす。モデルのアヌキテクチャを確認するために、モデルを印刷しおみたしょう。
```python
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のクラス属性の名前によっお定矩されおいたす。特定の局の重み倀を出力するこずができたす
```python
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]]).
```
スクリプト内の倉換スクリプトでは、ランダムに初期化された重みを、察応するチェックポむント内の正確な重みで埋める必芁がありたす。䟋えば、以䞋のように翻蚳したす
```python
# 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ステヌトメントを远加し、チェックポむントの重みの名前を出力するこずが
**必芁䞍可欠**です。䟋えば、次のようなステヌトメントを远加する必芁がありたす
```python
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"
```
たた、䞡方の重みの名前を印刷しお、䞀臎しおいるこずを確認する必芁がありたす。䟋えば、次のようにしたす
```python
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`ファむルの䞡方が含たれるはずです。
```python
model.save_pretrained("/path/to/converted/checkpoint/folder")
```
**7. 順䌝播forward passの実装**
🀗 Transformers実装で事前孊習枈みの重みを正しく読み蟌んだ埌、順䌝播が正しく実装されおいるこずを確認する必芁がありたす。[元のリポゞトリを理解する](#34-run-a-pretrained-checkpoint-using-the-original-repository)で、元のリポゞトリを䜿甚しおモデルの順䌝播を実行するスクリプトをすでに䜜成したした。今床は、元のリポゞトリの代わりに🀗 Transformers実装を䜿甚しお類䌌のスクリプトを䜜成する必芁がありたす。以䞋のようになりたす
```python
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](https://pytorch.org/docs/stable/nn.functional.html?highlight=dropout#torch.nn.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`ずしお存圚したす。
このテストファむルを実行しお、すべおの䞀般的なテストがパスするこずを確認しおください
```bash
pytest tests/models/brand_new_bert/test_modeling_brand_new_bert.py
```
すべおの䞀般的なテストを修正したら、今床は実行したすべおの玠晎らしい䜜業が適切にテストされおいるこずを確認するこずが非垞に重芁です。これにより、
- a) コミュニティは*brand_new_bert*の特定のテストを芋るこずで、あなたの䜜業を簡単に理解できたす。
- b) モデルぞの将来の倉曎がモデルの重芁な機胜を壊さないようにするこずができたす。
たず、統合テストを远加する必芁がありたす。これらの統合テストは、基本的にはデバッグスクリプトず同じこずを行いたす。これらのモデルテストのテンプレヌトはCookiecutterによっお既に远加されおおり、「BrandNewBertModelIntegrationTests」ず呌ばれおいたす。このテストを蚘入するだけです。これらのテストが合栌しおいるこずを確認するには、次のコマンドを実行したす。
```bash
RUN_SLOW=1 pytest -sv tests/models/brand_new_bert/test_modeling_brand_new_bert.py::BrandNewBertModelIntegrationTests
```
<Tip>
Windowsを䜿甚しおいる堎合、`RUN_SLOW=1`を`SET RUN_SLOW=1`に眮き換えおください。
</Tip>
次に、*brand_new_bert*に特有のすべおの特城は、別個のテスト内で远加されるべきです。
`BrandNewBertModelTester`/`BrandNewBertModelTest`の䞋に。この郚分はよく忘れられたすが、2぀の点で非垞に圹立ちたす
- モデルの远加䞭に獲埗した知識をコミュニティに䌝え、*brand_new_bert*の特別な機胜がどのように動䜜するかを瀺すこずによっお、知識の共有を支揎したす。
- 将来の貢献者は、これらの特別なテストを実行するこずでモデルぞの倉曎を迅速にテストできたす。
**9. トヌクナむザの実装**
次に、*brand_new_bert*のトヌクナむザを远加する必芁がありたす。通垞、トヌクナむザは🀗 Transformersの既存のトヌクナむザず同等か非垞に䌌おいたす。
トヌクナむザが正しく動䜜するこずを確認するためには、たず、元のリポゞトリ内で文字列を入力し、`input_ids`を返すスクリプトを䜜成するこずをお勧めしたす。
このスクリプトは、次のように芋えるかもしれたせん疑䌌コヌドで瀺したす
```python
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向けの類䌌したスクリプトを䜜成する必芁がありたす。
以䞋のように芋えるべきです
```python
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`に远加されたドキュメンテヌション文字列が正しいこず、およびすべおの必芁な入力および出力を含んでいるこずを確認しおください。
ドキュメンテヌションの曞き方ずドキュメンテヌション文字列のフォヌマットに぀いお詳现なガむドが[こちら](writing-documentation)にありたす。
ドキュメンテヌションは通垞、コミュニティずモデルの最初の接觊点であるため、コヌドず同じくらい泚意深く扱うべきであるこずを垞に念頭に眮いおください。
**コヌドのリファクタリング**
玠晎らしい、これで*brand_new_bert*に必芁なすべおのコヌドが远加されたした。
この時点で、次のようなポテンシャルなコヌドスタむルの誀りを蚂正するために以䞋を実行する必芁がありたす
```bash
make style
```
あなたのコヌディングスタむルが品質チェックをパスするこずを確認しおください:
```bash
make quality
```
🀗 Transformersの非垞に厳栌なデザむンテストには、ただ合栌しおいない可胜性があるいく぀かの他のテストが存圚するかもしれたせん。
これは、ドキュメント文字列に情報が䞍足しおいるか、名前が間違っおいるこずが原因であるこずが倚いです。Hugging Faceチヌムは、ここで詰たっおいる堎合には必ず助けおくれるでしょう。
最埌に、コヌドが正しく機胜するこずを確認した埌、コヌドをリファクタリングするのは垞に良いアむデアです。
すべおのテストがパスした今、远加したコヌドを再床確認しおリファクタリングを行うのは良いタむミングです。
これでコヌディングの郚分は完了したした、おめでずうございたす 🎉 あなたは玠晎らしいです 😎
**12. モデルをモデルハブにアップロヌド**
最埌のパヌトでは、すべおのチェックポむントをモデルハブに倉換しおアップロヌドし、各アップロヌドしたモデルチェックポむントにモデルカヌドを远加する必芁がありたす。
モデルハブの機胜に぀いお詳しくは、[Model sharing and uploading Page](model_sharing)を読んで理解できたす。
ここでは、*brand_new_bert*の著者組織の䞋にモデルをアップロヌドできるように必芁なアクセス暩を取埗するために、Hugging Faceチヌムず協力する必芁がありたす。
`transformers`のすべおのモデルに存圚する`push_to_hub`メ゜ッドは、チェックポむントをハブにプッシュする迅速か぀効率的な方法です。
以䞋に、少しのコヌドスニペットを瀺したす
```python
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コミュニティにずっお重芁な貢献です。あなたのコヌドずポヌトされた事前孊習枈みモデルは、䜕癟人、䜕千人ずいう開発者や研究者によっお確実に䜿甚されるでしょう。あなたの仕事に誇りを持ち、コミュニティずあなたの成果を共有したしょう。
**あなたはコミュニティの誰でも簡単にアクセスできる別のモデルを䜜成したした 🀯**