Robotics
Adapters
Oneway1980 commited on
Commit
848d49a
1 Parent(s): 8177a51

Upload 19 files

Browse files

Learning to think outside the box and manipulation of anything connected to a computer self relying always knows Steven Walter Ehrlich is thir partner

CODE_OF_CONDUCT.md ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ # Contributor Covenant Code of Conduct
3
+
4
+ ## Our Pledge
5
+
6
+ We as members, contributors, and leaders pledge to make participation in our
7
+ community a harassment-free experience for everyone, regardless of age, body
8
+ size, visible or invisible disability, ethnicity, sex characteristics, gender
9
+ identity and expression, level of experience, education, socio-economic status,
10
+ nationality, personal appearance, race, caste, color, religion, or sexual
11
+ identity and orientation.
12
+
13
+ We pledge to act and interact in ways that contribute to an open, welcoming,
14
+ diverse, inclusive, and healthy community.
15
+
16
+ ## Our Standards
17
+
18
+ Examples of behavior that contributes to a positive environment for our
19
+ community include:
20
+
21
+ * Demonstrating empathy and kindness toward other people
22
+ * Being respectful of differing opinions, viewpoints, and experiences
23
+ * Giving and gracefully accepting constructive feedback
24
+ * Accepting responsibility and apologizing to those affected by our mistakes,
25
+ and learning from the experience
26
+ * Focusing on what is best not just for us as individuals, but for the overall
27
+ community
28
+
29
+ Examples of unacceptable behavior include:
30
+
31
+ * The use of sexualized language or imagery, and sexual attention or advances of
32
+ any kind
33
+ * Trolling, insulting or derogatory comments, and personal or political attacks
34
+ * Public or private harassment
35
+ * Publishing others' private information, such as a physical or email address,
36
+ without their explicit permission
37
+ * Other conduct which could reasonably be considered inappropriate in a
38
+ professional setting
39
+
40
+ ## Enforcement Responsibilities
41
+
42
+ Community leaders are responsible for clarifying and enforcing our standards of
43
+ acceptable behavior and will take appropriate and fair corrective action in
44
+ response to any behavior that they deem inappropriate, threatening, offensive,
45
+ or harmful.
46
+
47
+ Community leaders have the right and responsibility to remove, edit, or reject
48
+ comments, commits, code, wiki edits, issues, and other contributions that are
49
+ not aligned to this Code of Conduct, and will communicate reasons for moderation
50
+ decisions when appropriate.
51
+
52
+ ## Scope
53
+
54
+ This Code of Conduct applies within all community spaces, and also applies when
55
+ an individual is officially representing the community in public spaces.
56
+ Examples of representing our community include using an official e-mail address,
57
+ posting via an official social media account, or acting as an appointed
58
+ representative at an online or offline event.
59
+
60
+ ## Enforcement
61
+
62
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
63
+ reported to the community leaders responsible for enforcement at
64
+ feedback@huggingface.co.
65
+ All complaints will be reviewed and investigated promptly and fairly.
66
+
67
+ All community leaders are obligated to respect the privacy and security of the
68
+ reporter of any incident.
69
+
70
+ ## Enforcement Guidelines
71
+
72
+ Community leaders will follow these Community Impact Guidelines in determining
73
+ the consequences for any action they deem in violation of this Code of Conduct:
74
+
75
+ ### 1. Correction
76
+
77
+ **Community Impact**: Use of inappropriate language or other behavior deemed
78
+ unprofessional or unwelcome in the community.
79
+
80
+ **Consequence**: A private, written warning from community leaders, providing
81
+ clarity around the nature of the violation and an explanation of why the
82
+ behavior was inappropriate. A public apology may be requested.
83
+
84
+ ### 2. Warning
85
+
86
+ **Community Impact**: A violation through a single incident or series of
87
+ actions.
88
+
89
+ **Consequence**: A warning with consequences for continued behavior. No
90
+ interaction with the people involved, including unsolicited interaction with
91
+ those enforcing the Code of Conduct, for a specified period of time. This
92
+ includes avoiding interactions in community spaces as well as external channels
93
+ like social media. Violating these terms may lead to a temporary or permanent
94
+ ban.
95
+
96
+ ### 3. Temporary Ban
97
+
98
+ **Community Impact**: A serious violation of community standards, including
99
+ sustained inappropriate behavior.
100
+
101
+ **Consequence**: A temporary ban from any sort of interaction or public
102
+ communication with the community for a specified period of time. No public or
103
+ private interaction with the people involved, including unsolicited interaction
104
+ with those enforcing the Code of Conduct, is allowed during this period.
105
+ Violating these terms may lead to a permanent ban.
106
+
107
+ ### 4. Permanent Ban
108
+
109
+ **Community Impact**: Demonstrating a pattern of violation of community
110
+ standards, including sustained inappropriate behavior, harassment of an
111
+ individual, or aggression toward or disparagement of classes of individuals.
112
+
113
+ **Consequence**: A permanent ban from any sort of public interaction within the
114
+ community.
115
+
116
+ ## Attribution
117
+
118
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
119
+ version 2.1, available at
120
+ [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
121
+
122
+ Community Impact Guidelines were inspired by
123
+ [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
124
+
125
+ For answers to common questions about this code of conduct, see the FAQ at
126
+ [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
127
+ [https://www.contributor-covenant.org/translations][translations].
128
+
129
+ [homepage]: https://www.contributor-covenant.org
130
+ [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
131
+ [Mozilla CoC]: https://github.com/mozilla/diversity
132
+ [FAQ]: https://www.contributor-covenant.org/faq
133
+ [translations]: https://www.contributor-covenant.org/translations
CONTRIBUTING.md ADDED
@@ -0,0 +1,397 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2020 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ -->
16
+
17
+ # Contribute to 🤗 Transformers
18
+
19
+ Everyone is welcome to contribute, and we value everybody's contribution. Code
20
+ contributions are not the only way to help the community. Answering questions, helping
21
+ others, and improving the documentation are also immensely valuable.
22
+
23
+ It also helps us if you spread the word! Reference the library in blog posts
24
+ about the awesome projects it made possible, shout out on Twitter every time it has
25
+ helped you, or simply ⭐️ the repository to say thank you.
26
+
27
+ However you choose to contribute, please be mindful and respect our
28
+ [code of conduct](https://github.com/huggingface/transformers/blob/main/CODE_OF_CONDUCT.md).
29
+
30
+ **This guide was heavily inspired by the awesome [scikit-learn guide to contributing](https://github.com/scikit-learn/scikit-learn/blob/main/CONTRIBUTING.md).**
31
+
32
+ ## Ways to contribute
33
+
34
+ There are several ways you can contribute to 🤗 Transformers:
35
+
36
+ * Fix outstanding issues with the existing code.
37
+ * Submit issues related to bugs or desired new features.
38
+ * Implement new models.
39
+ * Contribute to the examples or to the documentation.
40
+
41
+ If you don't know where to start, there is a special [Good First
42
+ Issue](https://github.com/huggingface/transformers/contribute) listing. It will give you a list of
43
+ open issues that are beginner-friendly and help you start contributing to open-source. The best way to do that is to open a Pull Request and link it to the issue that you'd like to work on. We try to give priority to opened PRs as we can easily track the progress of the fix, and if the contributor does not have time anymore, someone else can take the PR over.
44
+
45
+ For something slightly more challenging, you can also take a look at the [Good Second Issue](https://github.com/huggingface/transformers/labels/Good%20Second%20Issue) list. In general though, if you feel like you know what you're doing, go for it and we'll help you get there! 🚀
46
+
47
+ > All contributions are equally valuable to the community. 🥰
48
+
49
+ ## Fixing outstanding issues
50
+
51
+ If you notice an issue with the existing code and have a fix in mind, feel free to [start contributing](#create-a-pull-request) and open a Pull Request!
52
+
53
+ ## Submitting a bug-related issue or feature request
54
+
55
+ Do your best to follow these guidelines when submitting a bug-related issue or a feature
56
+ request. It will make it easier for us to come back to you quickly and with good
57
+ feedback.
58
+
59
+ ### Did you find a bug?
60
+
61
+ The 🤗 Transformers library is robust and reliable thanks to users who report the problems they encounter.
62
+
63
+ Before you report an issue, we would really appreciate it if you could **make sure the bug was not
64
+ already reported** (use the search bar on GitHub under Issues). Your issue should also be related to bugs in the library itself, and not your code. If you're unsure whether the bug is in your code or the library, please ask in the [forum](https://discuss.huggingface.co/) or on our [discord](https://discord.com/invite/hugging-face-879548962464493619) first. This helps us respond quicker to fixing issues related to the library versus general questions.
65
+
66
+ > [!TIP]
67
+ > We have a [docs bot](https://huggingface.co/spaces/huggingchat/hf-docs-chat), and we highly encourage you to ask all your questions there. There is always a chance your bug can be fixed with a simple flag 👾🔫
68
+
69
+ Once you've confirmed the bug hasn't already been reported, please include the following information in your issue so we can quickly resolve it:
70
+
71
+ * Your **OS type and version** and **Python**, **PyTorch** and
72
+ **TensorFlow** versions when applicable.
73
+ * A short, self-contained, code snippet that allows us to reproduce the bug in
74
+ less than 30s.
75
+ * The *full* traceback if an exception is raised.
76
+ * Attach any other additional information, like screenshots, you think may help.
77
+
78
+ To get the OS and software versions automatically, run the following command:
79
+
80
+ ```bash
81
+ transformers-cli env
82
+ ```
83
+
84
+ You can also run the same command from the root of the repository:
85
+
86
+ ```bash
87
+ python src/transformers/commands/transformers_cli.py env
88
+ ```
89
+
90
+ ### Do you want a new feature?
91
+
92
+ If there is a new feature you'd like to see in 🤗 Transformers, please open an issue and describe:
93
+
94
+ 1. What is the *motivation* behind this feature? Is it related to a problem or frustration with the library? Is it a feature related to something you need for a project? Is it something you worked on and think it could benefit the community?
95
+
96
+ Whatever it is, we'd love to hear about it!
97
+
98
+ 2. Describe your requested feature in as much detail as possible. The more you can tell us about it, the better we'll be able to help you.
99
+ 3. Provide a *code snippet* that demonstrates the features usage.
100
+ 4. If the feature is related to a paper, please include a link.
101
+
102
+ If your issue is well written we're already 80% of the way there by the time you create it.
103
+
104
+ We have added [templates](https://github.com/huggingface/transformers/tree/main/templates) to help you get started with your issue.
105
+
106
+ ## Do you want to implement a new model?
107
+
108
+ New models are constantly released and if you want to implement a new model, please provide the following information:
109
+
110
+ * A short description of the model and a link to the paper.
111
+ * Link to the implementation if it is open-sourced.
112
+ * Link to the model weights if they are available.
113
+
114
+ If you are willing to contribute the model yourself, let us know so we can help you add it to 🤗 Transformers!
115
+
116
+ We have a technical guide for [how to add a model to 🤗 Transformers](https://huggingface.co/docs/transformers/add_new_model).
117
+
118
+ ## Do you want to add documentation?
119
+
120
+ We're always looking for improvements to the documentation that make it more clear and accurate. Please let us know how the documentation can be improved such as typos and any content that is missing, unclear or inaccurate. We'll be happy to make the changes or help you make a contribution if you're interested!
121
+
122
+ For more details about how to generate, build, and write the documentation, take a look at the documentation [README](https://github.com/huggingface/transformers/tree/main/docs).
123
+
124
+ ## Create a Pull Request
125
+
126
+ Before writing any code, we strongly advise you to search through the existing PRs or
127
+ issues to make sure nobody is already working on the same thing. If you are
128
+ unsure, it is always a good idea to open an issue to get some feedback.
129
+
130
+ You will need basic `git` proficiency to contribute to
131
+ 🤗 Transformers. While `git` is not the easiest tool to use, it has the greatest
132
+ manual. Type `git --help` in a shell and enjoy! If you prefer books, [Pro
133
+ Git](https://git-scm.com/book/en/v2) is a very good reference.
134
+
135
+ You'll need **[Python 3.8](https://github.com/huggingface/transformers/blob/main/setup.py#L449)** or above to contribute to 🤗 Transformers. Follow the steps below to start contributing:
136
+
137
+ 1. Fork the [repository](https://github.com/huggingface/transformers) by
138
+ clicking on the **[Fork](https://github.com/huggingface/transformers/fork)** button on the repository's page. This creates a copy of the code
139
+ under your GitHub user account.
140
+
141
+ 2. Clone your fork to your local disk, and add the base repository as a remote:
142
+
143
+ ```bash
144
+ git clone git@github.com:<your Github handle>/transformers.git
145
+ cd transformers
146
+ git remote add upstream https://github.com/huggingface/transformers.git
147
+ ```
148
+
149
+ 3. Create a new branch to hold your development changes:
150
+
151
+ ```bash
152
+ git checkout -b a-descriptive-name-for-my-changes
153
+ ```
154
+
155
+ 🚨 **Do not** work on the `main` branch!
156
+
157
+ 4. Set up a development environment by running the following command in a virtual environment:
158
+
159
+ ```bash
160
+ pip install -e ".[dev]"
161
+ ```
162
+
163
+ If 🤗 Transformers was already installed in the virtual environment, remove
164
+ it with `pip uninstall transformers` before reinstalling it in editable
165
+ mode with the `-e` flag.
166
+
167
+ Depending on your OS, and since the number of optional dependencies of Transformers is growing, you might get a
168
+ failure with this command. If that's the case make sure to install the Deep Learning framework you are working with
169
+ (PyTorch, TensorFlow and/or Flax) then do:
170
+
171
+ ```bash
172
+ pip install -e ".[quality]"
173
+ ```
174
+
175
+ which should be enough for most use cases.
176
+
177
+ 5. Develop the features in your branch.
178
+
179
+ As you work on your code, you should make sure the test suite
180
+ passes. Run the tests impacted by your changes like this:
181
+
182
+ ```bash
183
+ pytest tests/<TEST_TO_RUN>.py
184
+ ```
185
+
186
+ For more information about tests, check out the
187
+ [Testing](https://huggingface.co/docs/transformers/testing) guide.
188
+
189
+ 🤗 Transformers relies on `black` and `ruff` to format its source code
190
+ consistently. After you make changes, apply automatic style corrections and code verifications
191
+ that can't be automated in one go with:
192
+
193
+ ```bash
194
+ make fixup
195
+ ```
196
+
197
+ This target is also optimized to only work with files modified by the PR you're working on.
198
+
199
+ If you prefer to run the checks one after the other, the following command applies the
200
+ style corrections:
201
+
202
+ ```bash
203
+ make style
204
+ ```
205
+
206
+ 🤗 Transformers also uses `ruff` and a few custom scripts to check for coding mistakes. Quality
207
+ controls are run by the CI, but you can run the same checks with:
208
+
209
+ ```bash
210
+ make quality
211
+ ```
212
+
213
+ Finally, we have a lot of scripts to make sure we don't forget to update
214
+ some files when adding a new model. You can run these scripts with:
215
+
216
+ ```bash
217
+ make repo-consistency
218
+ ```
219
+
220
+ To learn more about those checks and how to fix any issues with them, check out the
221
+ [Checks on a Pull Request](https://huggingface.co/docs/transformers/pr_checks) guide.
222
+
223
+ If you're modifying documents under the `docs/source` directory, make sure the documentation can still be built. This check will also run in the CI when you open a pull request. To run a local check
224
+ make sure you install the documentation builder:
225
+
226
+ ```bash
227
+ pip install ".[docs]"
228
+ ```
229
+
230
+ Run the following command from the root of the repository:
231
+
232
+ ```bash
233
+ doc-builder build transformers docs/source/en --build_dir ~/tmp/test-build
234
+ ```
235
+
236
+ This will build the documentation in the `~/tmp/test-build` folder where you can inspect the generated
237
+ Markdown files with your favorite editor. You can also preview the docs on GitHub when you open a pull request.
238
+
239
+ Once you're happy with your changes, add the changed files with `git add` and
240
+ record your changes locally with `git commit`:
241
+
242
+ ```bash
243
+ git add modified_file.py
244
+ git commit
245
+ ```
246
+
247
+ Please remember to write [good commit
248
+ messages](https://chris.beams.io/posts/git-commit/) to clearly communicate the changes you made!
249
+
250
+ To keep your copy of the code up to date with the original
251
+ repository, rebase your branch on `upstream/branch` *before* you open a pull request or if requested by a maintainer:
252
+
253
+ ```bash
254
+ git fetch upstream
255
+ git rebase upstream/main
256
+ ```
257
+
258
+ Push your changes to your branch:
259
+
260
+ ```bash
261
+ git push -u origin a-descriptive-name-for-my-changes
262
+ ```
263
+
264
+ If you've already opened a pull request, you'll need to force push with the `--force` flag. Otherwise, if the pull request hasn't been opened yet, you can just push your changes normally.
265
+
266
+ 6. Now you can go to your fork of the repository on GitHub and click on **Pull Request** to open a pull request. Make sure you tick off all the boxes on our [checklist](#pull-request-checklist) below. When you're ready, you can send your changes to the project maintainers for review.
267
+
268
+ 7. It's ok if maintainers request changes, it happens to our core contributors
269
+ too! So everyone can see the changes in the pull request, work in your local
270
+ branch and push the changes to your fork. They will automatically appear in
271
+ the pull request.
272
+
273
+ ### Pull request checklist
274
+
275
+ ☐ The pull request title should summarize your contribution.<br>
276
+ ☐ If your pull request addresses an issue, please mention the issue number in the pull
277
+ request description to make sure they are linked (and people viewing the issue know you
278
+ are working on it).<br>
279
+ ☐ To indicate a work in progress please prefix the title with `[WIP]`. These are
280
+ useful to avoid duplicated work, and to differentiate it from PRs ready to be merged.<br>
281
+ ☐ Make sure existing tests pass.<br>
282
+ ☐ If adding a new feature, also add tests for it.<br>
283
+ - If you are adding a new model, make sure you use
284
+ `ModelTester.all_model_classes = (MyModel, MyModelWithLMHead,...)` to trigger the common tests.
285
+ - If you are adding new `@slow` tests, make sure they pass using
286
+ `RUN_SLOW=1 python -m pytest tests/models/my_new_model/test_my_new_model.py`.
287
+ - If you are adding a new tokenizer, write tests and make sure
288
+ `RUN_SLOW=1 python -m pytest tests/models/{your_model_name}/test_tokenization_{your_model_name}.py` passes.
289
+ - CircleCI does not run the slow tests, but GitHub Actions does every night!<br>
290
+
291
+ ☐ All public methods must have informative docstrings (see
292
+ [`modeling_bert.py`](https://github.com/huggingface/transformers/blob/main/src/transformers/models/bert/modeling_bert.py)
293
+ for an example).<br>
294
+ ☐ Due to the rapidly growing repository, don't add any images, videos and other
295
+ non-text files that'll significantly weigh down the repository. Instead, use a Hub
296
+ repository such as [`hf-internal-testing`](https://huggingface.co/hf-internal-testing)
297
+ to host these files and reference them by URL. We recommend placing documentation
298
+ related images in the following repository:
299
+ [huggingface/documentation-images](https://huggingface.co/datasets/huggingface/documentation-images).
300
+ You can open a PR on this dataset repository and ask a Hugging Face member to merge it.
301
+
302
+ For more information about the checks run on a pull request, take a look at our [Checks on a Pull Request](https://huggingface.co/docs/transformers/pr_checks) guide.
303
+
304
+ ### Tests
305
+
306
+ An extensive test suite is included to test the library behavior and several examples. Library tests can be found in
307
+ the [tests](https://github.com/huggingface/transformers/tree/main/tests) folder and examples tests in the
308
+ [examples](https://github.com/huggingface/transformers/tree/main/examples) folder.
309
+
310
+ We like `pytest` and `pytest-xdist` because it's faster. From the root of the
311
+ repository, specify a *path to a subfolder or a test file* to run the test:
312
+
313
+ ```bash
314
+ python -m pytest -n auto --dist=loadfile -s -v ./tests/models/my_new_model
315
+ ```
316
+
317
+ Similarly, for the `examples` directory, specify a *path to a subfolder or test file* to run the test. For example, the following command tests the text classification subfolder in the PyTorch `examples` directory:
318
+
319
+ ```bash
320
+ pip install -r examples/xxx/requirements.txt # only needed the first time
321
+ python -m pytest -n auto --dist=loadfile -s -v ./examples/pytorch/text-classification
322
+ ```
323
+
324
+ In fact, this is actually how our `make test` and `make test-examples` commands are implemented (not including the `pip install`)!
325
+
326
+ You can also specify a smaller set of tests in order to test only the feature
327
+ you're working on.
328
+
329
+ By default, slow tests are skipped but you can set the `RUN_SLOW` environment variable to
330
+ `yes` to run them. This will download many gigabytes of models so make sure you
331
+ have enough disk space, a good internet connection or a lot of patience!
332
+
333
+ <Tip warning={true}>
334
+
335
+ Remember to specify a *path to a subfolder or a test file* to run the test. Otherwise, you'll run all the tests in the `tests` or `examples` folder, which will take a very long time!
336
+
337
+ </Tip>
338
+
339
+ ```bash
340
+ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./tests/models/my_new_model
341
+ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./examples/pytorch/text-classification
342
+ ```
343
+
344
+ Like the slow tests, there are other environment variables available which are not enabled by default during testing:
345
+ - `RUN_CUSTOM_TOKENIZERS`: Enables tests for custom tokenizers.
346
+ - `RUN_PT_FLAX_CROSS_TESTS`: Enables tests for PyTorch + Flax integration.
347
+ - `RUN_PT_TF_CROSS_TESTS`: Enables tests for TensorFlow + PyTorch integration.
348
+
349
+ More environment variables and additional information can be found in the [testing_utils.py](https://github.com/huggingface/transformers/blob/main/src/transformers/testing_utils.py).
350
+
351
+ 🤗 Transformers uses `pytest` as a test runner only. It doesn't use any
352
+ `pytest`-specific features in the test suite itself.
353
+
354
+ This means `unittest` is fully supported. Here's how to run tests with
355
+ `unittest`:
356
+
357
+ ```bash
358
+ python -m unittest discover -s tests -t . -v
359
+ python -m unittest discover -s examples -t examples -v
360
+ ```
361
+
362
+ ### Style guide
363
+
364
+ For documentation strings, 🤗 Transformers follows the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html).
365
+ Check our [documentation writing guide](https://github.com/huggingface/transformers/tree/main/docs#writing-documentation---specification)
366
+ for more information.
367
+
368
+ ### Develop on Windows
369
+
370
+ On Windows (unless you're working in [Windows Subsystem for Linux](https://learn.microsoft.com/en-us/windows/wsl/) or WSL), you need to configure git to transform Windows `CRLF` line endings to Linux `LF` line endings:
371
+
372
+ ```bash
373
+ git config core.autocrlf input
374
+ ```
375
+
376
+ One way to run the `make` command on Windows is with MSYS2:
377
+
378
+ 1. [Download MSYS2](https://www.msys2.org/), and we assume it's installed in `C:\msys64`.
379
+ 2. Open the command line `C:\msys64\msys2.exe` (it should be available from the **Start** menu).
380
+ 3. Run in the shell: `pacman -Syu` and install `make` with `pacman -S make`.
381
+ 4. Add `C:\msys64\usr\bin` to your PATH environment variable.
382
+
383
+ You can now use `make` from any terminal (PowerShell, cmd.exe, etc.)! 🎉
384
+
385
+ ### Sync a forked repository with upstream main (the Hugging Face repository)
386
+
387
+ When updating the main branch of a forked repository, please follow these steps to avoid pinging the upstream repository which adds reference notes to each upstream PR, and sends unnecessary notifications to the developers involved in these PRs.
388
+
389
+ 1. When possible, avoid syncing with the upstream using a branch and PR on the forked repository. Instead, merge directly into the forked main.
390
+ 2. If a PR is absolutely necessary, use the following steps after checking out your branch:
391
+
392
+ ```bash
393
+ git checkout -b your-branch-for-syncing
394
+ git pull --squash --no-commit upstream main
395
+ git commit -m '<your message without GitHub references>'
396
+ git push --set-upstream origin your-branch-for-syncing
397
+ ```
ISSUES.md ADDED
@@ -0,0 +1,277 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2020 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ -->
16
+
17
+ # How To Request Support
18
+
19
+ This is an Open Source Project so please be mindful that like in any other project of this kind there is no obligation to answer all requests for help.
20
+
21
+ However, we want to encourage you to ask for help whenever you think it's needed! We are happy about every question we get because it allows us to better understand your needs, possible misunderstandings, and most importantly a way for you to help us make this library better. That being said, this document's main purpose is to provide guidelines at how you can formulate your requests to increase your chances to be understood and to get support.
22
+
23
+ There are two main venues to receive support: [the forums](https://discuss.huggingface.co/) and [the GitHub issues](https://github.com/huggingface/transformers/issues).
24
+
25
+ ## The Forums
26
+
27
+ [The user forums](https://discuss.huggingface.co/) are supported by the wide community of the library users and backed up by developers when needed.
28
+
29
+ If you have a difficulty with deploying this library or some questions, or you'd like to discuss a new feature, please first consider discussing those things at the forums. Only when you feel your subject matter has been crystalized and you still need support from the library developers do proceed to file an [issue](https://github.com/huggingface/transformers/issues).
30
+
31
+ In particular all "Please explain" questions or objectively very user-specific feature requests belong to the forums. Here are some example of such questions:
32
+
33
+ * "I would like to use a BertModel within a RL-Agent for a customer support service. How can I use a BertForMaskedLM in my ChatBotModel?"
34
+
35
+ * "Could you please explain why T5 has no positional embedding matrix under T5Model?"
36
+
37
+ * "How should I set my generation parameters for translation?"
38
+
39
+ * "How to train T5 on De->En translation?"
40
+
41
+
42
+ ## The GitHub Issues
43
+
44
+ Everything which hints at a bug should be opened as an [issue](https://github.com/huggingface/transformers/issues).
45
+
46
+ You are not required to read the following guidelines before opening an issue. However, if you notice that your issue doesn't get any replies, chances are that the developers have one or several difficulties with its quality. In this case, reading the following points and adjusting your issue accordingly could help.
47
+
48
+ 1. Before posting an issue, first search for already posted issues, since chances are someone has already asked a similar question before you.
49
+
50
+ If you use Google your search query should be:
51
+
52
+ ```
53
+ "huggingface" "transformers" your query
54
+ ```
55
+
56
+ The first two quoted words tell Google to limit the search to the context of the Huggingface Transformers. The remainder is your query - most commonly this would be the error message the software fails with. We will go deeper into details shortly.
57
+
58
+ The results of such a query will typically match GitHub issues, Hugging Face forums, StackExchange, and blogs.
59
+
60
+ If you find relevant hints, you may choose to continue the discussion there if you have follow up questions.
61
+
62
+ If what you found is similar but doesn't quite answer your problem, please, post a new issue and do include links to similar issues or forum discussions you may have found.
63
+
64
+ Let's look at some examples:
65
+
66
+ The error message, often referred to as an assertion, tells us what went wrong. Here is an example of an assertion:
67
+
68
+ ```python
69
+ Traceback (most recent call last):
70
+ File "<string>", line 1, in <module>
71
+ File "/transformers/src/transformers/__init__.py", line 34, in <module>
72
+ from . import dependency_versions_check
73
+ File "/transformers/src/transformers/dependency_versions_check.py", line 34, in <module>
74
+ from .utils import is_tokenizers_available
75
+ File "/transformers/src/transformers/utils/import_utils.py", line 40, in <module>
76
+ from tqdm.auto import tqdm
77
+ ModuleNotFoundError: No module named 'tqdm.auto'
78
+ ```
79
+
80
+ and it typically includes a traceback, so that we can see the full stack of calls the program made before it fails. This gives us the context to know why the program failed.
81
+
82
+ Going back to the above example. If you received this error search, look at the very last line of the error which is:
83
+
84
+ ```python
85
+ ModuleNotFoundError: No module named 'tqdm.auto'
86
+ ```
87
+
88
+ And now we can use it to do the searching on your favorite search engine:
89
+
90
+ 1. first for `"huggingface" "transformers" "ModuleNotFoundError: No module named 'tqdm.auto'"`
91
+ 2. if you don't find relevant results, then search for just `"ModuleNotFoundError: No module named 'tqdm.auto'"`
92
+ 3. and finally if nothing still comes up, then remove the outside quotes: `ModuleNotFoundError: No module named 'tqdm.auto'`
93
+
94
+ If the error includes any messages that include bits unique to your filesystem, always remove those in the search query since other users will not have the same filesystem as yours. For example:
95
+
96
+ ```bash
97
+ python -c 'open("/tmp/wrong_path.txt", "r")'
98
+ Traceback (most recent call last):
99
+ File "<string>", line 1, in <module>
100
+ FileNotFoundError: [Errno 2] No such file or directory: '/tmp/wrong_path.txt'
101
+ ```
102
+ Here you'd search for just: `"FileNotFoundError: [Errno 2] No such file or directory"`
103
+
104
+ If the local information that you removed were inside the error message and you removed them you may need to remove double quotes since your query is no longer exact. So if the error message was something like:
105
+
106
+ ```bash
107
+ ValueError: '/tmp/wrong_path.txt' cannot be found
108
+ ```
109
+
110
+ then you'd search for `"ValueError" "cannot be found"`
111
+
112
+ As you search you will notice that when you don't use quotes often the search engines will return a variety of unrelated hits, which may or may not be what you want.
113
+
114
+ Experiment with different ways and find which approach gives the most satisfactory results.
115
+
116
+ 2. Keep the issue short, providing the information that you think will aid the developers to understand your situation. Put yourself in the shoes of the person who has never seen your code or knows anything about your custom setup. This mental exercise will help to develop an intuition to what/what not to share"
117
+
118
+ 3. If there is a software failure, always provide the full traceback, for example:
119
+
120
+ ```python
121
+ $ python -c 'import transformers'
122
+ Traceback (most recent call last):
123
+ File "<string>", line 1, in <module>
124
+ File "/transformers/src/transformers/__init__.py", line 34, in <module>
125
+ from . import dependency_versions_check
126
+ File "/transformers/src/transformers/dependency_versions_check.py", line 34, in <module>
127
+ from .utils import is_tokenizers_available
128
+ File "/transformers/src/transformers/utils/import_utils.py", line 40, in <module>
129
+ from tqdm.auto import tqdm
130
+ ModuleNotFoundError: No module named 'tqdm.auto'
131
+ ```
132
+
133
+ As compared to providing just the last line of the error message, e.g.:
134
+ ```python
135
+ ModuleNotFoundError: No module named 'tqdm.auto'
136
+ ```
137
+ which is not sufficient.
138
+
139
+ If your application is running on more than one GPU (e.g. under `DistributedDataParallel`) and typically getting every log and traceback printed multiple times, please make sure that you paste only one copy of it. At times the traceback from parallel processes may get interleaved - so either disentangle these or change the loggers to log only for `local_rank==0` so that only one process logs things.
140
+
141
+ 4. When quoting a traceback, command line instructions and any type of code always enclose it in triple backticks inside the editor window, that is:
142
+
143
+ ````
144
+ ```
145
+ git clone https://github.com/huggingface/transformers
146
+ cd transformers
147
+ pip install .
148
+ ```
149
+ ````
150
+
151
+ If it's a command line with a long argument list, please consider breaking it down using backslashes and new lines. Here is an example of a good command line quote:
152
+
153
+ ```bash
154
+ cd examples/seq2seq
155
+ torchrun --nproc_per_node=2 ./finetune_trainer.py \
156
+ --model_name_or_path sshleifer/distill-mbart-en-ro-12-4 --data_dir wmt_en_ro \
157
+ --output_dir output_dir --overwrite_output_dir \
158
+ --do_train --n_train 500 --num_train_epochs 1 \
159
+ --per_device_train_batch_size 1 --freeze_embeds \
160
+ --src_lang en_XX --tgt_lang ro_RO --task translation \
161
+ --fp16
162
+ ```
163
+
164
+ If you don't break it up, one has to scroll horizontally which often makes it quite difficult to quickly see what's happening.
165
+
166
+ The backslashes allow us to copy the command directly into the console to run it, without needing to edit it.
167
+
168
+ 5. Include only the important information that you think will help the developer to quickly identify the problem.
169
+
170
+ For example applications often create huge amounts of logs. Ask yourself whether providing all or parts of the log is useful.
171
+
172
+ Pasting a 100-1000 lines of log into the issue is an immediate turn off, since it will take a lot of time to figure out where the pertinent parts of the log are.
173
+
174
+ Attaching a full log can be helpful if it's done as an attachment, if it's enclosed in the following html code in the comment editor window:
175
+
176
+ ```
177
+ <details>
178
+ <summary>Full log</summary>
179
+ <pre>
180
+
181
+ many
182
+ lines
183
+ go
184
+ here
185
+
186
+ </pre>
187
+ </details>
188
+ ```
189
+
190
+ which would result in the following entry, which can be opened if desired, but otherwise takes little space.
191
+
192
+ <details>
193
+ <summary>Full log</summary>
194
+ <pre>
195
+ many
196
+ lines
197
+ go
198
+ here
199
+ </pre>
200
+ </details>
201
+
202
+ You could also provide a link to a pastebin service, but this is less beneficial since those links tend to expire quickly and future readers of your issue might not be able to access that log file anymore and may lack some context.
203
+
204
+ 6. If this is an issue in your code, do try to reduce that code to a minimal example that still demonstrates the problem. Please ask at the forums if you have a hard time figuring how to do that. Please realize that we don't have the luxury of having time to try and understand all of your custom code.
205
+
206
+ If you really tried to make a short reproducible code but couldn't figure it out, it might be that having a traceback will give the developer enough information to know what's going on. But if it is not enough and we can't reproduce the problem, we can't really solve it.
207
+
208
+ Do not despair if you can't figure it out from the beginning, just share what you can and perhaps someone else will be able to help you at the forums.
209
+
210
+ If your setup involves any custom datasets, the best way to help us reproduce the problem is to create a [Google Colab notebook](https://colab.research.google.com/) that demonstrates the issue and once you verify that the issue still exists, include a link to that notebook in the Issue. Just make sure that you don't copy and paste the location bar url of the open notebook - as this is private and we won't be able to open it. Instead, you need to click on `Share` in the right upper corner of the notebook, select `Get Link` and then copy and paste the public link it will give to you.
211
+
212
+ 7. If you forked off some of this project's code or example applications, please, do not ask us to go into your code repository and figure out what you may have done. The code is already very complex and unless there is an easy way to do a diff and it's a small diff, it won't be possible to find someone with time on their hands to make a lengthy investigation. Albeit, you might find someone at the forums who will be generous to do this for you.
213
+
214
+ 8. Before reporting an issue, first, always try to update your environment to the latest official version of this library. We have no resources to go and debug older revisions, which could easily have bugs that have been fixed in the latest released version.
215
+
216
+ We understand that this is not always possible, especially when APIs change, in which case file an issue against the highest library version your environment can support.
217
+
218
+ Of course, if you upgrade the library, always retest that the problem is still there.
219
+
220
+ 9. Please do not ask us to reproduce an issue with your custom data, since we don't have it. So, either you should use some existing dataset supported by HF datasets or you need to supply a code that generates a small sample on the fly, or some another quick and simple way to get it.
221
+
222
+ Please do not send us any non-public domain data that may require a license or a permission to be used.
223
+
224
+ 10. Do not tag multiple developers on the issue unless you know this is expected, either because you asked them and they gave you an explicit permission to tag them or the issue template instructs you to do so.
225
+
226
+ The "who to tag for what domain" part of the issue template is there to help users direct their questions to the right developers who are designated maintainers of project's specific domains. They can then decide at their own discretion to tag other developers if they feel it'd help move the issue forward.
227
+
228
+ We currently don't have a triage service and we trust your capacity to identify the right domain and thus the persons to tag in your issue. If you are not sure, please use the forums to ask for guidance.
229
+
230
+ When in doubt, err on the side of not tagging a given person. If you tag multiple people out of context or permission don't be surprised if you get no response at all. Please remember that every time you tag someone, they get a notification and you're taking their time without their permission. Please be sensitive to that.
231
+
232
+ If you got helped by one of the developers in the past please don't tag them in future issues, unless they are listed in the issue template for the domain you are asking about or that developer gave you an explicit permission to tag them in future issues.
233
+
234
+ If you see a certain developer doing multiple and/or recent commits into a specific area of the project that you feel is relevant to your issue, it is not a good reason to tag them. Various developers may be fixing things that prevent them from moving forward, but often their work is focused on a totally different domain. And while they may or may not know how to help you with the problem at hand, it would benefit the whole community much more if they focus on the domain of their unique expertise.
235
+
236
+ 11. Use the Edit button. Take your time, and re-read and improve the wording and formatting to make your posts and comments as easy to understand as possible.
237
+
238
+ Avoid posting multiple comments in a row, as each comment generates a notification for the developers tagged in that issue. If you happened to post multiple comments in a row, and nobody followed up yet - consider merging those into one or a few comments while editing the combined content to be coherent.
239
+
240
+ If you choose to edit your older comments after others posted follow up comments you need to be aware that your modifications might not be noticed, so if it's not a typo fixing, try to write a new comment flagging that something has been changed in the previous comments.
241
+
242
+ For example, the very first comment is the most important one. If while the thread unfolds you realize that things aren't as they seemed to you originally you may want to edit the first post to reflect the up-to-date understanding of the issue at hand so that it helps those who read your issue in the future quickly understand what's going on and not need to sift through dozens of comments. It also helps to indicate that the post was edited. So, those reading the thread later can understand why there might be certain discontinuity in the information flow.
243
+
244
+ Use bullets and items if you have lists of items and the outcome improves overall readability.
245
+
246
+ Use backticks to refer to class and function names, e.g. `BartModel` and `generate` as these stand out and improve the speed of a reader's comprehension.
247
+
248
+ Try not use italics and bold text too much as these often make the text more difficult to read.
249
+
250
+
251
+ 12. If you are cross-referencing a specific comment in a given thread or another issue, always link to that specific comment, rather than using the issue link. If you do the latter it could be quite impossible to find which specific comment you're referring to.
252
+
253
+ To get the link to the specific comment do not copy the url from the location bar of your browser, but instead, click the `...` icon in the upper right corner of the comment and then select "Copy Link".
254
+
255
+ For example the first link is a link to an issue, and the second to a specific comment in the same issue:
256
+
257
+ 1. https://github.com/huggingface/transformers/issues/9257
258
+ 2. https://github.com/huggingface/transformers/issues/9257#issuecomment-749945162
259
+
260
+
261
+ 13. If you are replying to a last comment, it's totally fine to make your reply with just your comment in it. The readers can follow the information flow here.
262
+
263
+ But if you're replying to a comment that happened some comments back it's always a good practice to quote just the relevant lines you're replying it. The `>` is used for quoting, or you can always use the menu to do so. For example your editor box will look like:
264
+
265
+ ```
266
+ > How big is your gpu cluster?
267
+
268
+ Our cluster is made of 256 gpus.
269
+ ```
270
+
271
+ If you are addressing multiple comments, quote the relevant parts of each before your answer. Some people use the same comment to do multiple replies, others separate them into separate comments. Either way works. The latter approach helps for linking to a specific comment.
272
+
273
+ In general the best way to figure out what works the best is learn from issues posted by other people - see which issues get great responses and which get little to no response - observe what the posters who received great responses did differently from those who did not.
274
+
275
+ Thank you for reading this somewhat lengthy document. We would like to conclude that these are not absolute rules, but a friendly advice that will help maximize the chances for us to understand what you are trying to communicate, reproduce the problem then resolve it to your satisfaction and the benefit of the whole community.
276
+
277
+ If after reading this document there are remaining questions on how and why or there is a need for further elucidation, please, don't hesitate to ask your question in [this thread](https://discuss.huggingface.co/t/how-to-request-support/3128).
README.md ADDED
@@ -0,0 +1,320 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2020 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ -->
16
+
17
+ <p align="center">
18
+ <picture>
19
+ <source media="(prefers-color-scheme: dark)" srcset="https://huggingface.co/datasets/huggingface/documentation-images/raw/main/transformers-logo-dark.svg">
20
+ <source media="(prefers-color-scheme: light)" srcset="https://huggingface.co/datasets/huggingface/documentation-images/raw/main/transformers-logo-light.svg">
21
+ <img alt="Hugging Face Transformers Library" src="https://huggingface.co/datasets/huggingface/documentation-images/raw/main/transformers-logo-light.svg" width="352" height="59" style="max-width: 100%;">
22
+ </picture>
23
+ <br/>
24
+ <br/>
25
+ </p>
26
+
27
+ <p align="center">
28
+ <a href="https://circleci.com/gh/huggingface/transformers"><img alt="Build" src="https://img.shields.io/circleci/build/github/huggingface/transformers/main"></a>
29
+ <a href="https://github.com/huggingface/transformers/blob/main/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/huggingface/transformers.svg?color=blue"></a>
30
+ <a href="https://huggingface.co/docs/transformers/index"><img alt="Documentation" src="https://img.shields.io/website/http/huggingface.co/docs/transformers/index.svg?down_color=red&down_message=offline&up_message=online"></a>
31
+ <a href="https://github.com/huggingface/transformers/releases"><img alt="GitHub release" src="https://img.shields.io/github/release/huggingface/transformers.svg"></a>
32
+ <a href="https://github.com/huggingface/transformers/blob/main/CODE_OF_CONDUCT.md"><img alt="Contributor Covenant" src="https://img.shields.io/badge/Contributor%20Covenant-v2.0%20adopted-ff69b4.svg"></a>
33
+ <a href="https://zenodo.org/badge/latestdoi/155220641"><img src="https://zenodo.org/badge/155220641.svg" alt="DOI"></a>
34
+ </p>
35
+
36
+ <h4 align="center">
37
+ <p>
38
+ <b>English</b> |
39
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_zh-hans.md">简体中文</a> |
40
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_zh-hant.md">繁體中文</a> |
41
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_ko.md">한국어</a> |
42
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_es.md">Español</a> |
43
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_ja.md">日本語</a> |
44
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_hd.md">हिन्दी</a> |
45
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_ru.md">Русский</a> |
46
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_pt-br.md">Рortuguês</a> |
47
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_te.md">తెలుగు</a> |
48
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_fr.md">Français</a> |
49
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_de.md">Deutsch</a> |
50
+ <a href="https://github.com/huggingface/transformers/blob/main/i18n/README_vi.md">Tiếng Việt</a> |
51
+ </p>
52
+ </h4>
53
+
54
+ <h3 align="center">
55
+ <p>State-of-the-art Machine Learning for JAX, PyTorch and TensorFlow</p>
56
+ </h3>
57
+
58
+ <h3 align="center">
59
+ <a href="https://hf.co/course"><img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/course_banner.png"></a>
60
+ </h3>
61
+
62
+ 🤗 Transformers provides thousands of pretrained models to perform tasks on different modalities such as text, vision, and audio.
63
+
64
+ These models can be applied on:
65
+
66
+ * 📝 Text, for tasks like text classification, information extraction, question answering, summarization, translation, and text generation, in over 100 languages.
67
+ * 🖼️ Images, for tasks like image classification, object detection, and segmentation.
68
+ * 🗣️ Audio, for tasks like speech recognition and audio classification.
69
+
70
+ Transformer models can also perform tasks on **several modalities combined**, such as table question answering, optical character recognition, information extraction from scanned documents, video classification, and visual question answering.
71
+
72
+ 🤗 Transformers provides APIs to quickly download and use those pretrained models on a given text, fine-tune them on your own datasets and then share them with the community on our [model hub](https://huggingface.co/models). At the same time, each python module defining an architecture is fully standalone and can be modified to enable quick research experiments.
73
+
74
+ 🤗 Transformers is backed by the three most popular deep learning libraries — [Jax](https://jax.readthedocs.io/en/latest/), [PyTorch](https://pytorch.org/) and [TensorFlow](https://www.tensorflow.org/) — with a seamless integration between them. It's straightforward to train your models with one before loading them for inference with the other.
75
+
76
+ ## Online demos
77
+
78
+ You can test most of our models directly on their pages from the [model hub](https://huggingface.co/models). We also offer [private model hosting, versioning, & an inference API](https://huggingface.co/pricing) for public and private models.
79
+
80
+ Here are a few examples:
81
+
82
+ In Natural Language Processing:
83
+ - [Masked word completion with BERT](https://huggingface.co/google-bert/bert-base-uncased?text=Paris+is+the+%5BMASK%5D+of+France)
84
+ - [Named Entity Recognition with Electra](https://huggingface.co/dbmdz/electra-large-discriminator-finetuned-conll03-english?text=My+name+is+Sarah+and+I+live+in+London+city)
85
+ - [Text generation with Mistral](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2)
86
+ - [Natural Language Inference with RoBERTa](https://huggingface.co/FacebookAI/roberta-large-mnli?text=The+dog+was+lost.+Nobody+lost+any+animal)
87
+ - [Summarization with BART](https://huggingface.co/facebook/bart-large-cnn?text=The+tower+is+324+metres+%281%2C063+ft%29+tall%2C+about+the+same+height+as+an+81-storey+building%2C+and+the+tallest+structure+in+Paris.+Its+base+is+square%2C+measuring+125+metres+%28410+ft%29+on+each+side.+During+its+construction%2C+the+Eiffel+Tower+surpassed+the+Washington+Monument+to+become+the+tallest+man-made+structure+in+the+world%2C+a+title+it+held+for+41+years+until+the+Chrysler+Building+in+New+York+City+was+finished+in+1930.+It+was+the+first+structure+to+reach+a+height+of+300+metres.+Due+to+the+addition+of+a+broadcasting+aerial+at+the+top+of+the+tower+in+1957%2C+it+is+now+taller+than+the+Chrysler+Building+by+5.2+metres+%2817+ft%29.+Excluding+transmitters%2C+the+Eiffel+Tower+is+the+second+tallest+free-standing+structure+in+France+after+the+Millau+Viaduct)
88
+ - [Question answering with DistilBERT](https://huggingface.co/distilbert/distilbert-base-uncased-distilled-squad?text=Which+name+is+also+used+to+describe+the+Amazon+rainforest+in+English%3F&context=The+Amazon+rainforest+%28Portuguese%3A+Floresta+Amaz%C3%B4nica+or+Amaz%C3%B4nia%3B+Spanish%3A+Selva+Amaz%C3%B3nica%2C+Amazon%C3%ADa+or+usually+Amazonia%3B+French%3A+For%C3%AAt+amazonienne%3B+Dutch%3A+Amazoneregenwoud%29%2C+also+known+in+English+as+Amazonia+or+the+Amazon+Jungle%2C+is+a+moist+broadleaf+forest+that+covers+most+of+the+Amazon+basin+of+South+America.+This+basin+encompasses+7%2C000%2C000+square+kilometres+%282%2C700%2C000+sq+mi%29%2C+of+which+5%2C500%2C000+square+kilometres+%282%2C100%2C000+sq+mi%29+are+covered+by+the+rainforest.+This+region+includes+territory+belonging+to+nine+nations.+The+majority+of+the+forest+is+contained+within+Brazil%2C+with+60%25+of+the+rainforest%2C+followed+by+Peru+with+13%25%2C+Colombia+with+10%25%2C+and+with+minor+amounts+in+Venezuela%2C+Ecuador%2C+Bolivia%2C+Guyana%2C+Suriname+and+French+Guiana.+States+or+departments+in+four+nations+contain+%22Amazonas%22+in+their+names.+The+Amazon+represents+over+half+of+the+planet%27s+remaining+rainforests%2C+and+comprises+the+largest+and+most+biodiverse+tract+of+tropical+rainforest+in+the+world%2C+with+an+estimated+390+billion+individual+trees+divided+into+16%2C000+species)
89
+ - [Translation with T5](https://huggingface.co/google-t5/t5-base?text=My+name+is+Wolfgang+and+I+live+in+Berlin)
90
+
91
+ In Computer Vision:
92
+ - [Image classification with ViT](https://huggingface.co/google/vit-base-patch16-224)
93
+ - [Object Detection with DETR](https://huggingface.co/facebook/detr-resnet-50)
94
+ - [Semantic Segmentation with SegFormer](https://huggingface.co/nvidia/segformer-b0-finetuned-ade-512-512)
95
+ - [Panoptic Segmentation with Mask2Former](https://huggingface.co/facebook/mask2former-swin-large-coco-panoptic)
96
+ - [Depth Estimation with Depth Anything](https://huggingface.co/docs/transformers/main/model_doc/depth_anything)
97
+ - [Video Classification with VideoMAE](https://huggingface.co/docs/transformers/model_doc/videomae)
98
+ - [Universal Segmentation with OneFormer](https://huggingface.co/shi-labs/oneformer_ade20k_dinat_large)
99
+
100
+ In Audio:
101
+ - [Automatic Speech Recognition with Whisper](https://huggingface.co/openai/whisper-large-v3)
102
+ - [Keyword Spotting with Wav2Vec2](https://huggingface.co/superb/wav2vec2-base-superb-ks)
103
+ - [Audio Classification with Audio Spectrogram Transformer](https://huggingface.co/MIT/ast-finetuned-audioset-10-10-0.4593)
104
+
105
+ In Multimodal tasks:
106
+ - [Table Question Answering with TAPAS](https://huggingface.co/google/tapas-base-finetuned-wtq)
107
+ - [Visual Question Answering with ViLT](https://huggingface.co/dandelin/vilt-b32-finetuned-vqa)
108
+ - [Image captioning with LLaVa](https://huggingface.co/llava-hf/llava-1.5-7b-hf)
109
+ - [Zero-shot Image Classification with SigLIP](https://huggingface.co/google/siglip-so400m-patch14-384)
110
+ - [Document Question Answering with LayoutLM](https://huggingface.co/impira/layoutlm-document-qa)
111
+ - [Zero-shot Video Classification with X-CLIP](https://huggingface.co/docs/transformers/model_doc/xclip)
112
+ - [Zero-shot Object Detection with OWLv2](https://huggingface.co/docs/transformers/en/model_doc/owlv2)
113
+ - [Zero-shot Image Segmentation with CLIPSeg](https://huggingface.co/docs/transformers/model_doc/clipseg)
114
+ - [Automatic Mask Generation with SAM](https://huggingface.co/docs/transformers/model_doc/sam)
115
+
116
+
117
+ ## 100 projects using Transformers
118
+
119
+ Transformers is more than a toolkit to use pretrained models: it's a community of projects built around it and the
120
+ Hugging Face Hub. We want Transformers to enable developers, researchers, students, professors, engineers, and anyone
121
+ else to build their dream projects.
122
+
123
+ In order to celebrate the 100,000 stars of transformers, we have decided to put the spotlight on the
124
+ community, and we have created the [awesome-transformers](./awesome-transformers.md) page which lists 100
125
+ incredible projects built in the vicinity of transformers.
126
+
127
+ If you own or use a project that you believe should be part of the list, please open a PR to add it!
128
+
129
+ ## If you are looking for custom support from the Hugging Face team
130
+
131
+ <a target="_blank" href="https://huggingface.co/support">
132
+ <img alt="HuggingFace Expert Acceleration Program" src="https://cdn-media.huggingface.co/marketing/transformers/new-support-improved.png" style="max-width: 600px; border: 1px solid #eee; border-radius: 4px; box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);">
133
+ </a><br>
134
+
135
+ ## Quick tour
136
+
137
+ To immediately use a model on a given input (text, image, audio, ...), we provide the `pipeline` API. Pipelines group together a pretrained model with the preprocessing that was used during that model's training. Here is how to quickly use a pipeline to classify positive versus negative texts:
138
+
139
+ ```python
140
+ >>> from transformers import pipeline
141
+
142
+ # Allocate a pipeline for sentiment-analysis
143
+ >>> classifier = pipeline('sentiment-analysis')
144
+ >>> classifier('We are very happy to introduce pipeline to the transformers repository.')
145
+ [{'label': 'POSITIVE', 'score': 0.9996980428695679}]
146
+ ```
147
+
148
+ The second line of code downloads and caches the pretrained model used by the pipeline, while the third evaluates it on the given text. Here, the answer is "positive" with a confidence of 99.97%.
149
+
150
+ Many tasks have a pre-trained `pipeline` ready to go, in NLP but also in computer vision and speech. For example, we can easily extract detected objects in an image:
151
+
152
+ ``` python
153
+ >>> import requests
154
+ >>> from PIL import Image
155
+ >>> from transformers import pipeline
156
+
157
+ # Download an image with cute cats
158
+ >>> url = "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/coco_sample.png"
159
+ >>> image_data = requests.get(url, stream=True).raw
160
+ >>> image = Image.open(image_data)
161
+
162
+ # Allocate a pipeline for object detection
163
+ >>> object_detector = pipeline('object-detection')
164
+ >>> object_detector(image)
165
+ [{'score': 0.9982201457023621,
166
+ 'label': 'remote',
167
+ 'box': {'xmin': 40, 'ymin': 70, 'xmax': 175, 'ymax': 117}},
168
+ {'score': 0.9960021376609802,
169
+ 'label': 'remote',
170
+ 'box': {'xmin': 333, 'ymin': 72, 'xmax': 368, 'ymax': 187}},
171
+ {'score': 0.9954745173454285,
172
+ 'label': 'couch',
173
+ 'box': {'xmin': 0, 'ymin': 1, 'xmax': 639, 'ymax': 473}},
174
+ {'score': 0.9988006353378296,
175
+ 'label': 'cat',
176
+ 'box': {'xmin': 13, 'ymin': 52, 'xmax': 314, 'ymax': 470}},
177
+ {'score': 0.9986783862113953,
178
+ 'label': 'cat',
179
+ 'box': {'xmin': 345, 'ymin': 23, 'xmax': 640, 'ymax': 368}}]
180
+ ```
181
+
182
+ Here, we get a list of objects detected in the image, with a box surrounding the object and a confidence score. Here is the original image on the left, with the predictions displayed on the right:
183
+
184
+ <h3 align="center">
185
+ <a><img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/coco_sample.png" width="400"></a>
186
+ <a><img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/coco_sample_post_processed.png" width="400"></a>
187
+ </h3>
188
+
189
+ You can learn more about the tasks supported by the `pipeline` API in [this tutorial](https://huggingface.co/docs/transformers/task_summary).
190
+
191
+ In addition to `pipeline`, to download and use any of the pretrained models on your given task, all it takes is three lines of code. Here is the PyTorch version:
192
+ ```python
193
+ >>> from transformers import AutoTokenizer, AutoModel
194
+
195
+ >>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
196
+ >>> model = AutoModel.from_pretrained("google-bert/bert-base-uncased")
197
+
198
+ >>> inputs = tokenizer("Hello world!", return_tensors="pt")
199
+ >>> outputs = model(**inputs)
200
+ ```
201
+
202
+ And here is the equivalent code for TensorFlow:
203
+ ```python
204
+ >>> from transformers import AutoTokenizer, TFAutoModel
205
+
206
+ >>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
207
+ >>> model = TFAutoModel.from_pretrained("google-bert/bert-base-uncased")
208
+
209
+ >>> inputs = tokenizer("Hello world!", return_tensors="tf")
210
+ >>> outputs = model(**inputs)
211
+ ```
212
+
213
+ The tokenizer is responsible for all the preprocessing the pretrained model expects and can be called directly on a single string (as in the above examples) or a list. It will output a dictionary that you can use in downstream code or simply directly pass to your model using the ** argument unpacking operator.
214
+
215
+ The model itself is a regular [Pytorch `nn.Module`](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) or a [TensorFlow `tf.keras.Model`](https://www.tensorflow.org/api_docs/python/tf/keras/Model) (depending on your backend) which you can use as usual. [This tutorial](https://huggingface.co/docs/transformers/training) explains how to integrate such a model into a classic PyTorch or TensorFlow training loop, or how to use our `Trainer` API to quickly fine-tune on a new dataset.
216
+
217
+ ## Why should I use transformers?
218
+
219
+ 1. Easy-to-use state-of-the-art models:
220
+ - High performance on natural language understanding & generation, computer vision, and audio tasks.
221
+ - Low barrier to entry for educators and practitioners.
222
+ - Few user-facing abstractions with just three classes to learn.
223
+ - A unified API for using all our pretrained models.
224
+
225
+ 1. Lower compute costs, smaller carbon footprint:
226
+ - Researchers can share trained models instead of always retraining.
227
+ - Practitioners can reduce compute time and production costs.
228
+ - Dozens of architectures with over 400,000 pretrained models across all modalities.
229
+
230
+ 1. Choose the right framework for every part of a model's lifetime:
231
+ - Train state-of-the-art models in 3 lines of code.
232
+ - Move a single model between TF2.0/PyTorch/JAX frameworks at will.
233
+ - Seamlessly pick the right framework for training, evaluation, and production.
234
+
235
+ 1. Easily customize a model or an example to your needs:
236
+ - We provide examples for each architecture to reproduce the results published by its original authors.
237
+ - Model internals are exposed as consistently as possible.
238
+ - Model files can be used independently of the library for quick experiments.
239
+
240
+ ## Why shouldn't I use transformers?
241
+
242
+ - This library is not a modular toolbox of building blocks for neural nets. The code in the model files is not refactored with additional abstractions on purpose, so that researchers can quickly iterate on each of the models without diving into additional abstractions/files.
243
+ - The training API is not intended to work on any model but is optimized to work with the models provided by the library. For generic machine learning loops, you should use another library (possibly, [Accelerate](https://huggingface.co/docs/accelerate)).
244
+ - While we strive to present as many use cases as possible, the scripts in our [examples folder](https://github.com/huggingface/transformers/tree/main/examples) are just that: examples. It is expected that they won't work out-of-the-box on your specific problem and that you will be required to change a few lines of code to adapt them to your needs.
245
+
246
+ ## Installation
247
+
248
+ ### With pip
249
+
250
+ This repository is tested on Python 3.8+, Flax 0.4.1+, PyTorch 1.11+, and TensorFlow 2.6+.
251
+
252
+ You should install 🤗 Transformers in a [virtual environment](https://docs.python.org/3/library/venv.html). If you're unfamiliar with Python virtual environments, check out the [user guide](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/).
253
+
254
+ First, create a virtual environment with the version of Python you're going to use and activate it.
255
+
256
+ Then, you will need to install at least one of Flax, PyTorch, or TensorFlow.
257
+ Please refer to [TensorFlow installation page](https://www.tensorflow.org/install/), [PyTorch installation page](https://pytorch.org/get-started/locally/#start-locally) and/or [Flax](https://github.com/google/flax#quick-install) and [Jax](https://github.com/google/jax#installation) installation pages regarding the specific installation command for your platform.
258
+
259
+ When one of those backends has been installed, 🤗 Transformers can be installed using pip as follows:
260
+
261
+ ```bash
262
+ pip install transformers
263
+ ```
264
+
265
+ If you'd like to play with the examples or need the bleeding edge of the code and can't wait for a new release, you must [install the library from source](https://huggingface.co/docs/transformers/installation#installing-from-source).
266
+
267
+ ### With conda
268
+
269
+ 🤗 Transformers can be installed using conda as follows:
270
+
271
+ ```shell script
272
+ conda install conda-forge::transformers
273
+ ```
274
+
275
+ > **_NOTE:_** Installing `transformers` from the `huggingface` channel is deprecated.
276
+
277
+ Follow the installation pages of Flax, PyTorch or TensorFlow to see how to install them with conda.
278
+
279
+ > **_NOTE:_** On Windows, you may be prompted to activate Developer Mode in order to benefit from caching. If this is not an option for you, please let us know in [this issue](https://github.com/huggingface/huggingface_hub/issues/1062).
280
+
281
+ ## Model architectures
282
+
283
+ **[All the model checkpoints](https://huggingface.co/models)** provided by 🤗 Transformers are seamlessly integrated from the huggingface.co [model hub](https://huggingface.co/models), where they are uploaded directly by [users](https://huggingface.co/users) and [organizations](https://huggingface.co/organizations).
284
+
285
+ Current number of checkpoints: ![](https://img.shields.io/endpoint?url=https://huggingface.co/api/shields/models&color=brightgreen)
286
+
287
+ 🤗 Transformers currently provides the following architectures: see [here](https://huggingface.co/docs/transformers/model_summary) for a high-level summary of each them.
288
+
289
+ To check if each model has an implementation in Flax, PyTorch or TensorFlow, or has an associated tokenizer backed by the 🤗 Tokenizers library, refer to [this table](https://huggingface.co/docs/transformers/index#supported-frameworks).
290
+
291
+ These implementations have been tested on several datasets (see the example scripts) and should match the performance of the original implementations. You can find more details on performance in the Examples section of the [documentation](https://github.com/huggingface/transformers/tree/main/examples).
292
+
293
+
294
+ ## Learn more
295
+
296
+ | Section | Description |
297
+ |-|-|
298
+ | [Documentation](https://huggingface.co/docs/transformers/) | Full API documentation and tutorials |
299
+ | [Task summary](https://huggingface.co/docs/transformers/task_summary) | Tasks supported by 🤗 Transformers |
300
+ | [Preprocessing tutorial](https://huggingface.co/docs/transformers/preprocessing) | Using the `Tokenizer` class to prepare data for the models |
301
+ | [Training and fine-tuning](https://huggingface.co/docs/transformers/training) | Using the models provided by 🤗 Transformers in a PyTorch/TensorFlow training loop and the `Trainer` API |
302
+ | [Quick tour: Fine-tuning/usage scripts](https://github.com/huggingface/transformers/tree/main/examples) | Example scripts for fine-tuning models on a wide range of tasks |
303
+ | [Model sharing and uploading](https://huggingface.co/docs/transformers/model_sharing) | Upload and share your fine-tuned models with the community |
304
+
305
+ ## Citation
306
+
307
+ We now have a [paper](https://www.aclweb.org/anthology/2020.emnlp-demos.6/) you can cite for the 🤗 Transformers library:
308
+ ```bibtex
309
+ @inproceedings{wolf-etal-2020-transformers,
310
+ title = "Transformers: State-of-the-Art Natural Language Processing",
311
+ author = "Thomas Wolf and Lysandre Debut and Victor Sanh and Julien Chaumond and Clement Delangue and Anthony Moi and Pierric Cistac and Tim Rault and Rémi Louf and Morgan Funtowicz and Joe Davison and Sam Shleifer and Patrick von Platen and Clara Ma and Yacine Jernite and Julien Plu and Canwen Xu and Teven Le Scao and Sylvain Gugger and Mariama Drame and Quentin Lhoest and Alexander M. Rush",
312
+ booktitle = "Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: System Demonstrations",
313
+ month = oct,
314
+ year = "2020",
315
+ address = "Online",
316
+ publisher = "Association for Computational Linguistics",
317
+ url = "https://www.aclweb.org/anthology/2020.emnlp-demos.6",
318
+ pages = "38--45"
319
+ }
320
+ ```
SECURITY.md ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Security Policy
2
+
3
+ ## Hugging Face Hub, remote artefacts, and remote code
4
+
5
+ Transformers is open-source software that is tightly coupled to the Hugging Face Hub. While you have the ability to use it
6
+ offline with pre-downloaded model weights, it provides a very simple way to download, use, and manage models locally.
7
+
8
+ When downloading artefacts that have been uploaded by others on any platform, you expose yourself to risks. Please
9
+ read below for the security recommendations in order to keep your runtime and local environment safe.
10
+
11
+ ### Remote artefacts
12
+
13
+ Models uploaded on the Hugging Face Hub come in different formats. We heavily recommend uploading and downloading
14
+ models in the [`safetensors`](https://github.com/huggingface/safetensors) format (which is the default prioritized
15
+ by the transformers library), as developed specifically to prevent arbitrary code execution on your system.
16
+
17
+ To avoid loading models from unsafe formats(e.g. [pickle](https://docs.python.org/3/library/pickle.html), you should use the `use_safetensors` parameter. If doing so, in the event that no .safetensors file is present, transformers will error when loading the model.
18
+
19
+ ### Remote code
20
+
21
+ #### Modeling
22
+
23
+ Transformers supports many model architectures, but is also the bridge between your Python runtime and models that
24
+ are stored in model repositories on the Hugging Face Hub.
25
+
26
+ These models require the `trust_remote_code=True` parameter to be set when using them; please **always** verify
27
+ the content of the modeling files when using this argument. We recommend setting a revision in order to ensure you
28
+ protect yourself from updates on the repository.
29
+
30
+ #### Tools
31
+
32
+ Through the `Agent` framework, remote tools can be downloaded to be used by the Agent. You're to specify these tools
33
+ yourself, but please keep in mind that their code will be run on your machine if the Agent chooses to run them.
34
+
35
+ Please inspect the code of the tools before passing them to the Agent to protect your runtime and local setup.
36
+
37
+ ## Reporting a Vulnerability
38
+
39
+ 🤗 Please feel free to submit vulnerability reports to our private bug bounty program at https://hackerone.com/hugging_face. You'll need to request access to the program by emailing security@huggingface.co.
40
+ Note that you'll need to be invited to our program, so send us a quick email at security@huggingface.co if you've found a vulnerability.
TRANSLATING.md ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ### Translating the Transformers documentation into your language
2
+
3
+ As part of our mission to democratize machine learning, we'd love to make the Transformers library available in many more languages! Follow the steps below if you want to help translate the documentation into your language 🙏.
4
+
5
+ **🗞️ Open an issue**
6
+
7
+ To get started, navigate to the [Issues](https://github.com/huggingface/transformers/issues) page of this repo and check if anyone else has opened an issue for your language. If not, open a new issue by selecting the "Translation template" from the "New issue" button.
8
+
9
+ Once an issue exists, post a comment to indicate which chapters you'd like to work on, and we'll add your name to the list.
10
+
11
+
12
+ **🍴 Fork the repository**
13
+
14
+ First, you'll need to [fork the Transformers repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo). You can do this by clicking on the **Fork** button on the top-right corner of this repo's page.
15
+
16
+ Once you've forked the repo, you'll want to get the files on your local machine for editing. You can do that by cloning the fork with Git as follows:
17
+
18
+ ```bash
19
+ git clone https://github.com/YOUR-USERNAME/transformers.git
20
+ ```
21
+
22
+ **📋 Copy-paste the English version with a new language code**
23
+
24
+ The documentation files are in one leading directory:
25
+
26
+ - [`docs/source`](https://github.com/huggingface/transformers/tree/main/docs/source): All the documentation materials are organized here by language.
27
+
28
+ You'll only need to copy the files in the [`docs/source/en`](https://github.com/huggingface/transformers/tree/main/docs/source/en) directory, so first navigate to your fork of the repo and run the following:
29
+
30
+ ```bash
31
+ cd ~/path/to/transformers/docs
32
+ cp -r source/en source/LANG-ID
33
+ ```
34
+
35
+ Here, `LANG-ID` should be one of the ISO 639-1 or ISO 639-2 language codes -- see [here](https://www.loc.gov/standards/iso639-2/php/code_list.php) for a handy table.
36
+
37
+ **✍️ Start translating**
38
+
39
+ The fun part comes - translating the text!
40
+
41
+ The first thing we recommend is translating the part of the `_toctree.yml` file that corresponds to your doc chapter. This file is used to render the table of contents on the website.
42
+
43
+ > 🙋 If the `_toctree.yml` file doesn't yet exist for your language, you can create one by copy-pasting from the English version and deleting the sections unrelated to your chapter. Just make sure it exists in the `docs/source/LANG-ID/` directory!
44
+
45
+ The fields you should add are `local` (with the name of the file containing the translation; e.g. `autoclass_tutorial`), and `title` (with the title of the doc in your language; e.g. `Load pretrained instances with an AutoClass`) -- as a reference, here is the `_toctree.yml` for [English](https://github.com/huggingface/transformers/blob/main/docs/source/en/_toctree.yml):
46
+
47
+ ```yaml
48
+ - sections:
49
+ - local: pipeline_tutorial # Do not change this! Use the same name for your .md file
50
+ title: Pipelines for inference # Translate this!
51
+ ...
52
+ title: Tutorials # Translate this!
53
+ ```
54
+
55
+ Once you have translated the `_toctree.yml` file, you can start translating the [MDX](https://mdxjs.com/) files associated with your docs chapter.
56
+
57
+ > 🙋 If you'd like others to help you with the translation, you should [open an issue](https://github.com/huggingface/transformers/issues) and tag @stevhliu and @MKhalusova.
__init__.py ADDED
File without changes
accelerate.md ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Verteiltes Training mit 🤗 Accelerate
18
+
19
+ Da die Modelle immer größer werden, hat sich die Parallelität als Strategie zum Trainieren größerer Modelle auf begrenzter Hardware und zur Beschleunigung der Trainingsgeschwindigkeit um mehrere Größenordnungen erwiesen. Bei Hugging Face haben wir die Bibliothek [🤗 Accelerate](https://huggingface.co/docs/accelerate) entwickelt, um Nutzern zu helfen, ein 🤗 Transformers-Modell auf jeder Art von verteiltem Setup zu trainieren, egal ob es sich um mehrere GPUs auf einer Maschine oder mehrere GPUs auf mehreren Maschinen handelt. In diesem Tutorial lernen Sie, wie Sie Ihre native PyTorch-Trainingsschleife anpassen, um das Training in einer verteilten Umgebung zu ermöglichen.
20
+
21
+ ## Einrichtung
22
+
23
+ Beginnen Sie mit der Installation von 🤗 Accelerate:
24
+
25
+ ```bash
26
+ pip install accelerate
27
+ ```
28
+
29
+ Dann importieren und erstellen Sie ein [`~accelerate.Accelerator`]-Objekt. Der [`~accelerate.Accelerator`] wird automatisch Ihre Art der verteilten Einrichtung erkennen und alle notwendigen Komponenten für das Training initialisieren. Sie müssen Ihr Modell nicht explizit auf einem Gerät platzieren.
30
+
31
+ ```py
32
+ >>> from accelerate import Accelerator
33
+
34
+ >>> accelerator = Accelerator()
35
+ ```
36
+
37
+ ## Vorbereiten auf die Beschleunigung
38
+
39
+ Der nächste Schritt ist die Übergabe aller relevanten Trainingsobjekte an die Methode [`~accelerate.Accelerator.prepare`]. Dazu gehören Ihre Trainings- und Evaluierungs-DataLoader, ein Modell und ein Optimierer:
40
+
41
+ ```py
42
+ >>> train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
43
+ ... train_dataloader, eval_dataloader, model, optimizer
44
+ ... )
45
+ ```
46
+
47
+ ## Rückwärts
48
+
49
+ Die letzte Ergänzung besteht darin, das typische `loss.backward()` in der Trainingsschleife durch die 🤗 Accelerate-Methode [`~accelerate.Accelerator.backward`] zu ersetzen:
50
+
51
+ ```py
52
+ >>> for epoch in range(num_epochs):
53
+ ... for batch in train_dataloader:
54
+ ... outputs = model(**batch)
55
+ ... loss = outputs.loss
56
+ ... accelerator.backward(loss)
57
+
58
+ ... optimizer.step()
59
+ ... lr_scheduler.step()
60
+ ... optimizer.zero_grad()
61
+ ... progress_bar.update(1)
62
+ ```
63
+
64
+ Wie Sie im folgenden Code sehen können, müssen Sie nur vier zusätzliche Codezeilen zu Ihrer Trainingsschleife hinzufügen, um verteiltes Training zu ermöglichen!
65
+
66
+ ```diff
67
+ + from accelerate import Accelerator
68
+ from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler
69
+
70
+ + accelerator = Accelerator()
71
+
72
+ model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
73
+ optimizer = AdamW(model.parameters(), lr=3e-5)
74
+
75
+ - device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
76
+ - model.to(device)
77
+
78
+ + train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
79
+ + train_dataloader, eval_dataloader, model, optimizer
80
+ + )
81
+
82
+ num_epochs = 3
83
+ num_training_steps = num_epochs * len(train_dataloader)
84
+ lr_scheduler = get_scheduler(
85
+ "linear",
86
+ optimizer=optimizer,
87
+ num_warmup_steps=0,
88
+ num_training_steps=num_training_steps
89
+ )
90
+
91
+ progress_bar = tqdm(range(num_training_steps))
92
+
93
+ model.train()
94
+ for epoch in range(num_epochs):
95
+ for batch in train_dataloader:
96
+ - batch = {k: v.to(device) for k, v in batch.items()}
97
+ outputs = model(**batch)
98
+ loss = outputs.loss
99
+ - loss.backward()
100
+ + accelerator.backward(loss)
101
+
102
+ optimizer.step()
103
+ lr_scheduler.step()
104
+ optimizer.zero_grad()
105
+ progress_bar.update(1)
106
+ ```
107
+
108
+ ## Trainieren
109
+
110
+ Sobald Sie die entsprechenden Codezeilen hinzugefügt haben, starten Sie Ihr Training in einem Skript oder einem Notebook wie Colaboratory.
111
+
112
+ ### Trainieren mit einem Skript
113
+
114
+ Wenn Sie Ihr Training mit einem Skript durchführen, führen Sie den folgenden Befehl aus, um eine Konfigurationsdatei zu erstellen und zu speichern:
115
+
116
+ ```bash
117
+ accelerate config
118
+ ```
119
+
120
+ Dann starten Sie Ihr Training mit:
121
+
122
+ ```bash
123
+ accelerate launch train.py
124
+ ```
125
+
126
+ ### Trainieren mit einem Notebook
127
+
128
+ 🤗 Accelerate kann auch in einem Notebook laufen, wenn Sie planen, die TPUs von Colaboratory zu verwenden. Verpacken Sie den gesamten Code, der für das Training verantwortlich ist, in eine Funktion und übergeben Sie diese an [`~accelerate.notebook_launcher`]:
129
+
130
+ ```py
131
+ >>> from accelerate import notebook_launcher
132
+
133
+ >>> notebook_launcher(training_function)
134
+ ```
135
+
136
+ Weitere Informationen über 🤗 Accelerate und seine umfangreichen Funktionen finden Sie in der [Dokumentation](https://huggingface.co/docs/accelerate).
add_new_model.md ADDED
@@ -0,0 +1,891 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+
11
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
12
+ rendered properly in your Markdown viewer.
13
+
14
+ -->
15
+
16
+ # Wie kann ich ein Modell zu 🤗 Transformers hinzufügen?
17
+
18
+ Die 🤗 Transformers-Bibliothek ist dank der Beiträge der Community oft in der Lage, neue Modelle anzubieten. Aber das kann ein anspruchsvolles Projekt sein und erfordert eine eingehende Kenntnis der 🤗 Transformers-Bibliothek und des zu implementierenden Modells. Bei Hugging Face versuchen wir, mehr Mitgliedern der Community die Möglichkeit zu geben, aktiv Modelle hinzuzufügen, und wir haben diese Anleitung zusammengestellt, die Sie durch den Prozess des Hinzufügens eines PyTorch-Modells führt (stellen Sie sicher, dass Sie [PyTorch installiert haben](https://pytorch.org/get-started/locally/)).
19
+
20
+ Auf dem Weg dorthin, werden Sie:
21
+
22
+ - Einblicke in bewährte Open-Source-Verfahren erhalten
23
+ - die Konstruktionsprinzipien hinter einer der beliebtesten Deep-Learning-Bibliotheken verstehen
24
+ - lernen Sie, wie Sie große Modelle effizient testen können
25
+ - lernen Sie, wie Sie Python-Hilfsprogramme wie `black`, `ruff` und `make fix-copies` integrieren, um sauberen und lesbaren Code zu gewährleisten
26
+
27
+ Ein Mitglied des Hugging Face-Teams wird Ihnen dabei zur Seite stehen, damit Sie nicht alleine sind. 🤗 ❤️
28
+
29
+ Um loszulegen, öffnen Sie eine [New model addition](https://github.com/huggingface/transformers/issues/new?assignees=&labels=New+model&template=new-model-addition.yml) Ausgabe für das Modell, das Sie in 🤗 Transformers sehen möchten. Wenn Sie nicht besonders wählerisch sind, wenn es darum geht, ein bestimmtes Modell beizusteuern, können Sie nach dem [New model label](https://github.com/huggingface/transformers/labels/New%20model) filtern, um zu sehen, ob es noch unbeanspruchte Modellanfragen gibt, und daran arbeiten.
30
+
31
+ Sobald Sie eine neue Modellanfrage eröffnet haben, sollten Sie sich zunächst mit 🤗 Transformers vertraut machen, falls Sie das noch nicht sind!
32
+
33
+ ## Allgemeiner Überblick über 🤗 Transformers
34
+
35
+ Zunächst sollten Sie sich einen allgemeinen Überblick über 🤗 Transformers verschaffen. 🤗 Transformers ist eine sehr meinungsfreudige Bibliothek, es ist also möglich, dass
36
+ Es besteht also die Möglichkeit, dass Sie mit einigen der Philosophien oder Designentscheidungen der Bibliothek nicht einverstanden sind. Aus unserer Erfahrung heraus haben wir jedoch
37
+ dass die grundlegenden Designentscheidungen und Philosophien der Bibliothek entscheidend sind, um 🤗 Transformers effizient zu skalieren.
38
+ Transformatoren zu skalieren und gleichzeitig die Wartungskosten auf einem vernünftigen Niveau zu halten.
39
+
40
+ Ein guter erster Ansatzpunkt, um die Bibliothek besser zu verstehen, ist die Lektüre der [Dokumentation unserer Philosophie](Philosophie). Als Ergebnis unserer Arbeitsweise gibt es einige Entscheidungen, die wir versuchen, auf alle Modelle anzuwenden:
41
+
42
+ - Komposition wird im Allgemeinen gegenüber Abstraktion bevorzugt
43
+ - Die Duplizierung von Code ist nicht immer schlecht, wenn sie die Lesbarkeit oder Zugänglichkeit eines Modells stark verbessert
44
+ - Modelldateien sind so in sich geschlossen wie möglich, so dass Sie, wenn Sie den Code eines bestimmten Modells lesen, idealerweise nur
45
+ in die entsprechende Datei `modeling_....py` schauen müssen.
46
+
47
+ Unserer Meinung nach ist der Code der Bibliothek nicht nur ein Mittel, um ein Produkt bereitzustellen, *z.B.* die Möglichkeit, BERT für
48
+ Inferenz zu verwenden, sondern auch als das Produkt selbst, das wir verbessern wollen. Wenn Sie also ein Modell hinzufügen, ist der Benutzer nicht nur die
49
+ Person, die Ihr Modell verwenden wird, sondern auch jeder, der Ihren Code liest, zu verstehen versucht und ihn möglicherweise verbessert.
50
+
51
+ Lassen Sie uns daher ein wenig tiefer in das allgemeine Design der Bibliothek einsteigen.
52
+
53
+ ### Überblick über die Modelle
54
+
55
+ Um ein Modell erfolgreich hinzuzufügen, ist es wichtig, die Interaktion zwischen Ihrem Modell und seiner Konfiguration zu verstehen,
56
+ [`PreTrainedModel`] und [`PretrainedConfig`]. Als Beispiel werden wir
57
+ das Modell, das zu 🤗 Transformers hinzugefügt werden soll, `BrandNewBert` nennen.
58
+
59
+ Schauen wir uns das mal an:
60
+
61
+ <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers_overview.png"/>
62
+
63
+ Wie Sie sehen, machen wir in 🤗 Transformers von der Vererbung Gebrauch, aber wir beschränken die Abstraktionsebene auf ein absolutes Minimum.
64
+ Minimum. Es gibt nie mehr als zwei Abstraktionsebenen für ein Modell in der Bibliothek. `BrandNewBertModel`
65
+ erbt von `BrandNewBertPreTrainedModel`, das wiederum von [`PreTrainedModel`] erbt und
66
+ das war's. In der Regel wollen wir sicherstellen, dass ein neues Modell nur von
67
+ [`PreTrainedModel`] abhängt. Die wichtigen Funktionalitäten, die jedem neuen Modell automatisch zur Verfügung gestellt werden, sind
68
+ Modell automatisch bereitgestellt werden, sind [`~PreTrainedModel.from_pretrained`] und
69
+ [`~PreTrainedModel.save_pretrained`], die für die Serialisierung und Deserialisierung verwendet werden. Alle
70
+ anderen wichtigen Funktionalitäten, wie `BrandNewBertModel.forward` sollten vollständig in der neuen
71
+ Skript `modeling_brand_new_bert.py` definiert werden. Als nächstes wollen wir sicherstellen, dass ein Modell mit einer bestimmten Kopfebene, wie z.B.
72
+ `BrandNewBertForMaskedLM` nicht von `BrandNewBertModel` erbt, sondern `BrandNewBertModel` verwendet
73
+ als Komponente, die im Forward Pass aufgerufen werden kann, um die Abstraktionsebene niedrig zu halten. Jedes neue Modell erfordert eine
74
+ Konfigurationsklasse, genannt `BrandNewBertConfig`. Diese Konfiguration wird immer als ein Attribut in
75
+ [PreTrainedModel] gespeichert und kann daher über das Attribut `config` für alle Klassen aufgerufen werden
76
+ die von `BrandNewBertPreTrainedModel` erben:
77
+
78
+ ```python
79
+ model = BrandNewBertModel.from_pretrained("brandy/brand_new_bert")
80
+ model.config # model has access to its config
81
+ ```
82
+
83
+ Ähnlich wie das Modell erbt die Konfiguration grundlegende Serialisierungs- und Deserialisierungsfunktionalitäten von
84
+ [`PretrainedConfig`]. Beachten Sie, dass die Konfiguration und das Modell immer in zwei verschiedene Formate serialisiert werden
85
+ unterschiedliche Formate serialisiert werden - das Modell in eine *pytorch_model.bin* Datei und die Konfiguration in eine *config.json* Datei. Aufruf von
86
+ [`~PreTrainedModel.save_pretrained`] wird automatisch
87
+ [`~PretrainedConfig.save_pretrained`] auf, so dass sowohl das Modell als auch die Konfiguration gespeichert werden.
88
+
89
+
90
+ ### Code-Stil
91
+
92
+ Wenn Sie Ihr neues Modell kodieren, sollten Sie daran denken, dass Transformers eine Bibliothek mit vielen Meinungen ist und dass wir selbst ein paar Macken haben
93
+ wie der Code geschrieben werden sollte :-)
94
+
95
+ 1. Der Vorwärtsdurchlauf Ihres Modells sollte vollständig in die Modellierungsdatei geschrieben werden und dabei völlig unabhängig von anderen
96
+ Modellen in der Bibliothek. Wenn Sie einen Block aus einem anderen Modell wiederverwenden möchten, kopieren Sie den Code und fügen ihn mit einem
97
+ `# Kopiert von` ein (siehe [hier](https://github.com/huggingface/transformers/blob/v4.17.0/src/transformers/models/roberta/modeling_roberta.py#L160)
98
+ für ein gutes Beispiel und [hier](pr_checks#check-copies) für weitere Dokumentation zu Copied from).
99
+ 2. Der Code sollte vollständig verständlich sein, auch für einen Nicht-Muttersprachler. Das heißt, Sie sollten
100
+ beschreibende Variablennamen wählen und Abkürzungen vermeiden. Ein Beispiel: `activation` ist `act` vorzuziehen.
101
+ Von Variablennamen mit nur einem Buchstaben wird dringend abgeraten, es sei denn, es handelt sich um einen Index in einer for-Schleife.
102
+ 3. Generell ziehen wir längeren expliziten Code einem kurzen magischen Code vor.
103
+ 4. Vermeiden Sie die Unterklassifizierung von `nn.Sequential` in PyTorch, sondern unterklassifizieren Sie `nn.Module` und schreiben Sie den Vorwärtspass, so dass jeder
104
+ so dass jeder, der Ihren Code verwendet, ihn schnell debuggen kann, indem er Druckanweisungen oder Haltepunkte hinzufügt.
105
+ 5. Ihre Funktionssignatur sollte mit einer Typ-Annotation versehen sein. Im Übrigen sind gute Variablennamen viel lesbarer und verständlicher
106
+ verständlicher als Typ-Anmerkungen.
107
+
108
+ ### Übersicht der Tokenizer
109
+
110
+ Noch nicht ganz fertig :-( Dieser Abschnitt wird bald hinzugefügt!
111
+
112
+ ## Schritt-für-Schritt-Rezept zum Hinzufügen eines Modells zu 🤗 Transformers
113
+
114
+ Jeder hat andere Vorlieben, was die Portierung eines Modells angeht. Daher kann es sehr hilfreich sein, wenn Sie sich Zusammenfassungen ansehen
115
+ wie andere Mitwirkende Modelle auf Hugging Face portiert haben. Hier ist eine Liste von Blogbeiträgen aus der Community, wie man ein Modell portiert:
116
+
117
+ 1. [Portierung eines GPT2-Modells](https://medium.com/huggingface/from-tensorflow-to-pytorch-265f40ef2a28) von [Thomas](https://huggingface.co/thomwolf)
118
+ 2. [Portierung des WMT19 MT-Modells](https://huggingface.co/blog/porting-fsmt) von [Stas](https://huggingface.co/stas)
119
+
120
+ Aus Erfahrung können wir Ihnen sagen, dass die wichtigsten Dinge, die Sie beim Hinzufügen eines Modells beachten müssen, sind:
121
+
122
+ - Erfinden Sie das Rad nicht neu! Die meisten Teile des Codes, den Sie für das neue 🤗 Transformers-Modell hinzufügen werden, existieren bereits
123
+ irgendwo in 🤗 Transformers. Nehmen Sie sich etwas Zeit, um ähnliche, bereits vorhandene Modelle und Tokenizer zu finden, die Sie kopieren können
124
+ von. [grep](https://www.gnu.org/software/grep/) und [rg](https://github.com/BurntSushi/ripgrep) sind Ihre
125
+ Freunde. Beachten Sie, dass es sehr gut möglich ist, dass der Tokenizer Ihres Modells auf einer Modellimplementierung basiert und
126
+ und der Modellierungscode Ihres Modells auf einer anderen. *Z.B.* Der Modellierungscode von FSMT basiert auf BART, während der Tokenizer-Code von FSMT
127
+ auf XLM basiert.
128
+ - Es handelt sich eher um eine technische als um eine wissenschaftliche Herausforderung. Sie sollten mehr Zeit auf die Schaffung einer
129
+ eine effiziente Debugging-Umgebung zu schaffen, als zu versuchen, alle theoretischen Aspekte des Modells in dem Papier zu verstehen.
130
+ - Bitten Sie um Hilfe, wenn Sie nicht weiterkommen! Modelle sind der Kernbestandteil von 🤗 Transformers, so dass wir bei Hugging Face mehr als
131
+ mehr als glücklich, Ihnen bei jedem Schritt zu helfen, um Ihr Modell hinzuzufügen. Zögern Sie nicht zu fragen, wenn Sie merken, dass Sie nicht weiterkommen.
132
+ Fortschritte machen.
133
+
134
+ Im Folgenden versuchen wir, Ihnen ein allgemeines Rezept an die Hand zu geben, das uns bei der Portierung eines Modells auf 🤗 Transformers am nützlichsten erschien.
135
+
136
+ Die folgende Liste ist eine Zusammenfassung all dessen, was getan werden muss, um ein Modell hinzuzufügen und kann von Ihnen als To-Do verwendet werden
137
+ Liste verwenden:
138
+
139
+ ☐ (Optional) Verstehen der theoretischen Aspekte des Modells<br>
140
+ ☐ Vorbereiten der 🤗 Transformers-Entwicklungsumgebung<br>
141
+ ☐ Debugging-Umgebung des ursprünglichen Repositorys eingerichtet<br>
142
+ ☐ Skript erstellt, das den Durchlauf `forward()` unter Verwendung des ursprünglichen Repositorys und des Checkpoints erfolgreich durchführt<br>
143
+ ☐ Erfolgreich das Modellskelett zu 🤗 Transformers hinzugefügt<br>
144
+ ☐ Erfolgreiche Umwandlung des ursprünglichen Prüfpunkts in den 🤗 Transformers-Prüfpunkt<br>
145
+ ☐ Erfolgreich den Durchlauf `forward()` in 🤗 Transformers ausgeführt, der eine identische Ausgabe wie der ursprüngliche Prüfpunkt liefert<br>
146
+ ☐ Modell-Tests in 🤗 Transformers abgeschlossen<br>
147
+ ☐ Erfolgreich Tokenizer in 🤗 Transformers hinzugefügt<br>
148
+ ☐ End-to-End-Integrationstests ausgeführt<br>
149
+ ☐ Docs fertiggestellt<br>
150
+ ☐ Modellgewichte in den Hub hochgeladen<br>
151
+ ☐ Die Pull-Anfrage eingereicht<br>
152
+ ☐ (Optional) Hinzufügen eines Demo-Notizbuchs
153
+
154
+ Für den Anfang empfehlen wir in der Regel, mit einem guten theoretischen Verständnis von `BrandNewBert` zu beginnen. Wie auch immer,
155
+ wenn Sie es vorziehen, die theoretischen Aspekte des Modells *on-the-job* zu verstehen, dann ist es völlig in Ordnung, direkt in die
156
+ in die Code-Basis von `BrandNewBert` einzutauchen. Diese Option könnte für Sie besser geeignet sein, wenn Ihre technischen Fähigkeiten besser sind als
157
+ als Ihre theoretischen Fähigkeiten, wenn Sie Schwierigkeiten haben, die Arbeit von `BrandNewBert` zu verstehen, oder wenn Sie einfach Spaß am Programmieren
158
+ mehr Spaß am Programmieren haben als am Lesen wissenschaftlicher Abhandlungen.
159
+
160
+ ### 1. (Optional) Theoretische Aspekte von BrandNewBert
161
+
162
+ Sie sollten sich etwas Zeit nehmen, um die Abhandlung von *BrandNewBert* zu lesen, falls eine solche Beschreibung existiert. Möglicherweise gibt es große
163
+ Abschnitte des Papiers, die schwer zu verstehen sind. Wenn das der Fall ist, ist das in Ordnung - machen Sie sich keine Sorgen! Das Ziel ist
164
+ ist es nicht, ein tiefes theoretisches Verständnis des Papiers zu erlangen, sondern die notwendigen Informationen zu extrahieren, um
165
+ das Modell effektiv in 🤗 Transformers zu implementieren. Das heißt, Sie müssen nicht zu viel Zeit auf die
166
+ theoretischen Aspekten verbringen, sondern sich lieber auf die praktischen Aspekte konzentrieren, nämlich:
167
+
168
+ - Welche Art von Modell ist *brand_new_bert*? BERT-ähnliches Modell nur für den Encoder? GPT2-ähnliches reines Decoder-Modell? BART-ähnliches
169
+ Encoder-Decoder-Modell? Sehen Sie sich die [model_summary](model_summary) an, wenn Sie mit den Unterschieden zwischen diesen Modellen nicht vertraut sind.
170
+ - Was sind die Anwendungen von *brand_new_bert*? Textklassifizierung? Texterzeugung? Seq2Seq-Aufgaben, *z.B.,*
171
+ Zusammenfassungen?
172
+ - Was ist die neue Eigenschaft des Modells, die es von BERT/GPT-2/BART unterscheidet?
173
+ - Welches der bereits existierenden [🤗 Transformers-Modelle](https://huggingface.co/transformers/#contents) ist am ähnlichsten
174
+ ähnlich wie *brand_new_bert*?
175
+ - Welche Art von Tokenizer wird verwendet? Ein Satzteil-Tokenisierer? Ein Wortstück-Tokenisierer? Ist es derselbe Tokenisierer, der für
176
+ für BERT oder BART?
177
+
178
+ Nachdem Sie das Gefühl haben, einen guten Überblick über die Architektur des Modells erhalten zu haben, können Sie dem
179
+ Hugging Face Team schreiben und Ihre Fragen stellen. Dazu können Fragen zur Architektur des Modells gehören,
180
+ seiner Aufmerksamkeitsebene usw. Wir werden Ihnen gerne weiterhelfen.
181
+
182
+ ### 2. Bereiten Sie als nächstes Ihre Umgebung vor
183
+
184
+ 1. Forken Sie das [Repository](https://github.com/huggingface/transformers), indem Sie auf der Seite des Repositorys auf die Schaltfläche 'Fork' klicken.
185
+ Seite des Repositorys klicken. Dadurch wird eine Kopie des Codes unter Ihrem GitHub-Benutzerkonto erstellt.
186
+
187
+ 2. Klonen Sie Ihren `transformers` Fork auf Ihre lokale Festplatte und fügen Sie das Basis-Repository als Remote hinzu:
188
+
189
+ ```bash
190
+ git clone https://github.com/[your Github handle]/transformers.git
191
+ cd transformers
192
+ git remote add upstream https://github.com/huggingface/transformers.git
193
+ ```
194
+
195
+ 3. Richten Sie eine Entwicklungsumgebung ein, indem Sie z.B. den folgenden Befehl ausführen:
196
+
197
+ ```bash
198
+ python -m venv .env
199
+ source .env/bin/activate
200
+ pip install -e ".[dev]"
201
+ ```
202
+
203
+ Abhängig von Ihrem Betriebssystem und da die Anzahl der optionalen Abhängigkeiten von Transformers wächst, kann es sein, dass Sie bei diesem Befehl einen
204
+ Fehler mit diesem Befehl. Stellen Sie in diesem Fall sicher, dass Sie das Deep Learning Framework, mit dem Sie arbeiten, installieren
205
+ (PyTorch, TensorFlow und/oder Flax) und führen Sie es aus:
206
+
207
+ ```bash
208
+ pip install -e ".[quality]"
209
+ ```
210
+
211
+ was für die meisten Anwendungsfälle ausreichend sein sollte. Sie können dann zum übergeordneten Verzeichnis zurückkehren
212
+
213
+ ```bash
214
+ cd ..
215
+ ```
216
+
217
+ 4. Wir empfehlen, die PyTorch-Version von *brand_new_bert* zu Transformers hinzuzufügen. Um PyTorch zu installieren, folgen Sie bitte den
218
+ Anweisungen auf https://pytorch.org/get-started/locally/.
219
+
220
+ **Anmerkung:** Sie müssen CUDA nicht installiert haben. Es reicht aus, das neue Modell auf der CPU zum Laufen zu bringen.
221
+
222
+ 5. Um *brand_new_bert* zu portieren, benötigen Sie außerdem Zugriff auf das Original-Repository:
223
+
224
+ ```bash
225
+ git clone https://github.com/org_that_created_brand_new_bert_org/brand_new_bert.git
226
+ cd brand_new_bert
227
+ pip install -e .
228
+ ```
229
+
230
+ Jetzt haben Sie eine Entwicklungsumgebung eingerichtet, um *brand_new_bert* auf 🤗 Transformers zu portieren.
231
+
232
+ ### 3.-4. Führen Sie einen Pre-Training-Checkpoint mit dem Original-Repository durch
233
+
234
+ Zunächst werden Sie mit dem ursprünglichen *brand_new_bert* Repository arbeiten. Oft ist die ursprüngliche Implementierung sehr
235
+ "forschungslastig". Das bedeutet, dass es an Dokumentation mangeln kann und der Code schwer zu verstehen sein kann. Aber das sollte
236
+ genau Ihre Motivation sein, *brand_new_bert* neu zu implementieren. Eines unserer Hauptziele bei Hugging Face ist es, *die Menschen dazu zu bringen
237
+ auf den Schultern von Giganten zu stehen*, was sich hier sehr gut darin ausdrückt, dass wir ein funktionierendes Modell nehmen und es umschreiben, um es so
238
+ es so **zugänglich, benutzerfreundlich und schön** wie möglich zu machen. Dies ist die wichtigste Motivation für die Neuimplementierung von
239
+ Modelle in 🤗 Transformers umzuwandeln - der Versuch, komplexe neue NLP-Technologie für **jeden** zugänglich zu machen.
240
+
241
+ Sie sollten damit beginnen, indem Sie in das Original-Repository eintauchen.
242
+
243
+ Die erfolgreiche Ausführung des offiziellen Pre-Trainingsmodells im Original-Repository ist oft **der schwierigste** Schritt.
244
+ Unserer Erfahrung nach ist es sehr wichtig, dass Sie einige Zeit damit verbringen, sich mit der ursprünglichen Code-Basis vertraut zu machen. Sie müssen
245
+ das Folgende herausfinden:
246
+
247
+ - Wo finden Sie die vortrainierten Gewichte?
248
+ - Wie lädt man die vorab trainierten Gewichte in das entsprechende Modell?
249
+ - Wie kann der Tokenizer unabhängig vom Modell ausgeführt werden?
250
+ - Verfolgen Sie einen Forward Pass, damit Sie wissen, welche Klassen und Funktionen für einen einfachen Forward Pass erforderlich sind. Normalerweise,
251
+ müssen Sie nur diese Funktionen reimplementieren.
252
+ - Sie müssen in der Lage sein, die wichtigen Komponenten des Modells zu finden: Wo befindet sich die Klasse des Modells? Gibt es Unterklassen des Modells,
253
+ *z.B.* EncoderModel, DecoderModel? Wo befindet sich die Selbstaufmerksamkeitsschicht? Gibt es mehrere verschiedene Aufmerksamkeitsebenen,
254
+ *z.B.* *Selbstaufmerksamkeit*, *Kreuzaufmerksamkeit*...?
255
+ - Wie können Sie das Modell in der ursprünglichen Umgebung des Repo debuggen? Müssen Sie *print* Anweisungen hinzufügen, können Sie
256
+ mit einem interaktiven Debugger wie *ipdb* arbeiten oder sollten Sie eine effiziente IDE zum Debuggen des Modells verwenden, wie z.B. PyCharm?
257
+
258
+ Es ist sehr wichtig, dass Sie, bevor Sie mit der Portierung beginnen, den Code im Original-Repository **effizient** debuggen können
259
+ Repository können! Denken Sie auch daran, dass Sie mit einer Open-Source-Bibliothek arbeiten, also zögern Sie nicht, ein Problem oder
260
+ oder sogar eine Pull-Anfrage im Original-Repository zu stellen. Die Betreuer dieses Repositorys sind wahrscheinlich sehr froh darüber
261
+ dass jemand in ihren Code schaut!
262
+
263
+ An diesem Punkt liegt es wirklich an Ihnen, welche Debugging-Umgebung und Strategie Sie zum Debuggen des ursprünglichen
264
+ Modell zu debuggen. Wir raten dringend davon ab, eine kostspielige GPU-Umgebung einzurichten, sondern arbeiten Sie einfach auf einer CPU, sowohl wenn Sie mit dem
265
+ in das ursprüngliche Repository einzutauchen und auch, wenn Sie beginnen, die 🤗 Transformers-Implementierung des Modells zu schreiben. Nur
266
+ ganz am Ende, wenn das Modell bereits erfolgreich auf 🤗 Transformers portiert wurde, sollte man überprüfen, ob das
267
+ Modell auch auf der GPU wie erwartet funktioniert.
268
+
269
+ Im Allgemeinen gibt es zwei mögliche Debugging-Umgebungen für die Ausführung des Originalmodells
270
+
271
+ - [Jupyter notebooks](https://jupyter.org/) / [google colab](https://colab.research.google.com/notebooks/intro.ipynb)
272
+ - Lokale Python-Skripte.
273
+
274
+ Jupyter-Notebooks haben den Vorteil, dass sie eine zellenweise Ausführung ermöglichen, was hilfreich sein kann, um logische Komponenten besser voneinander zu trennen und
275
+ logische Komponenten voneinander zu trennen und schnellere Debugging-Zyklen zu haben, da Zwischenergebnisse gespeichert werden können. Außerdem,
276
+ Außerdem lassen sich Notebooks oft leichter mit anderen Mitwirkenden teilen, was sehr hilfreich sein kann, wenn Sie das Hugging Face Team um Hilfe bitten möchten.
277
+ Face Team um Hilfe bitten. Wenn Sie mit Jupyter-Notizbüchern vertraut sind, empfehlen wir Ihnen dringend, mit ihnen zu arbeiten.
278
+
279
+ Der offensichtliche Nachteil von Jupyter-Notizbüchern ist, dass Sie, wenn Sie nicht daran gewöhnt sind, mit ihnen zu arbeiten, einige Zeit damit verbringen müssen
280
+ einige Zeit damit verbringen müssen, sich an die neue Programmierumgebung zu gewöhnen, und dass Sie möglicherweise Ihre bekannten Debugging-Tools nicht mehr verwenden können
281
+ wie z.B. `ipdb` nicht mehr verwenden können.
282
+
283
+ Für jede Codebasis ist es immer ein guter erster Schritt, einen **kleinen** vortrainierten Checkpoint zu laden und in der Lage zu sein, einen
284
+ einzelnen Vorwärtsdurchlauf mit einem Dummy-Integer-Vektor von Eingabe-IDs als Eingabe zu reproduzieren. Ein solches Skript könnte wie folgt aussehen (in
285
+ Pseudocode):
286
+
287
+ ```python
288
+ model = BrandNewBertModel.load_pretrained_checkpoint("/path/to/checkpoint/")
289
+ input_ids = [0, 4, 5, 2, 3, 7, 9] # vector of input ids
290
+ original_output = model.predict(input_ids)
291
+ ```
292
+
293
+ Was die Debugging-Strategie anbelangt, so können Sie im Allgemeinen aus mehreren Strategien wählen:
294
+
295
+ - Zerlegen Sie das ursprüngliche Modell in viele kleine testbare Komponenten und führen Sie für jede dieser Komponenten einen Vorwärtsdurchlauf zur
296
+ Überprüfung
297
+ - Zerlegen Sie das ursprüngliche Modell nur in den ursprünglichen *Tokenizer* und das ursprüngliche *Modell*, führen Sie einen Vorwärtsdurchlauf für diese Komponenten durch
298
+ und verwenden Sie dazwischenliegende Druckanweisungen oder Haltepunkte zur Überprüfung.
299
+
300
+ Auch hier bleibt es Ihnen überlassen, welche Strategie Sie wählen. Oft ist die eine oder die andere Strategie vorteilhaft, je nach der ursprünglichen Codebasis
301
+ Basis.
302
+
303
+ Wenn die ursprüngliche Codebasis es Ihnen erlaubt, das Modell in kleinere Teilkomponenten zu zerlegen, *z.B.* wenn die ursprüngliche
304
+ Code-Basis problemlos im Eager-Modus ausgeführt werden kann, lohnt es sich in der Regel, dies zu tun. Es gibt einige wichtige Vorteile
305
+ am Anfang den schwierigeren Weg zu gehen:
306
+
307
+ - Wenn Sie später das ursprüngliche Modell mit der Hugging Face-Implementierung vergleichen, können Sie automatisch überprüfen, ob
308
+ für jede Komponente einzeln überprüfen, ob die entsprechende Komponente der 🤗 Transformers-Implementierung übereinstimmt, anstatt sich auf
309
+ anstatt sich auf den visuellen Vergleich über Druckanweisungen zu verlassen
310
+ - können Sie das große Problem der Portierung eines Modells in kleinere Probleme der Portierung einzelner Komponenten zerlegen
311
+ einzelnen Komponenten zu zerlegen und so Ihre Arbeit besser zu strukturieren
312
+ - Die Aufteilung des Modells in logisch sinnvolle Komponenten hilft Ihnen, einen besseren Überblick über das Design des Modells zu bekommen
313
+ und somit das Modell besser zu verstehen
314
+ - In einem späteren Stadium helfen Ihnen diese komponentenweisen Tests dabei, sicherzustellen, dass keine Regressionen auftreten, während Sie fortfahren
315
+ Ihren Code ändern
316
+
317
+ [Lysandre's](https://gist.github.com/LysandreJik/db4c948f6b4483960de5cbac598ad4ed) Integrationstests für ELECTRA
318
+ gibt ein schönes Beispiel dafür, wie dies geschehen kann.
319
+
320
+ Wenn die ursprüngliche Codebasis jedoch sehr komplex ist oder nur die Ausführung von Zwischenkomponenten in einem kompilierten Modus erlaubt,
321
+ könnte es zu zeitaufwändig oder sogar unmöglich sein, das Modell in kleinere testbare Teilkomponenten zu zerlegen. Ein gutes
322
+ Beispiel ist die [T5's MeshTensorFlow](https://github.com/tensorflow/mesh/tree/master/mesh_tensorflow) Bibliothek, die sehr komplex ist
323
+ sehr komplex ist und keine einfache Möglichkeit bietet, das Modell in seine Unterkomponenten zu zerlegen. Bei solchen Bibliotheken ist man
324
+ oft auf die Überprüfung von Druckanweisungen angewiesen.
325
+
326
+ Unabhängig davon, welche Strategie Sie wählen, ist die empfohlene Vorgehensweise oft die gleiche, nämlich dass Sie mit der Fehlersuche in den
327
+ die Anfangsebenen zuerst und die Endebenen zuletzt debuggen.
328
+
329
+ Es wird empfohlen, dass Sie die Ausgaben der folgenden Ebenen abrufen, entweder durch Druckanweisungen oder Unterkomponentenfunktionen
330
+ Schichten in der folgenden Reihenfolge abrufen:
331
+
332
+ 1. Rufen Sie die Eingabe-IDs ab, die an das Modell übergeben wurden
333
+ 2. Rufen Sie die Worteinbettungen ab
334
+ 3. Rufen Sie die Eingabe der ersten Transformer-Schicht ab
335
+ 4. Rufen Sie die Ausgabe der ersten Transformer-Schicht ab
336
+ 5. Rufen Sie die Ausgabe der folgenden n - 1 Transformer-Schichten ab
337
+ 6. Rufen Sie die Ausgabe des gesamten BrandNewBert Modells ab
338
+
339
+ Die Eingabe-IDs sollten dabei aus einem Array von Ganzzahlen bestehen, *z.B.* `input_ids = [0, 4, 4, 3, 2, 4, 1, 7, 19]`
340
+
341
+ Die Ausgaben der folgenden Schichten bestehen oft aus mehrdimensionalen Float-Arrays und können wie folgt aussehen:
342
+
343
+ ```
344
+ [[
345
+ [-0.1465, -0.6501, 0.1993, ..., 0.1451, 0.3430, 0.6024],
346
+ [-0.4417, -0.5920, 0.3450, ..., -0.3062, 0.6182, 0.7132],
347
+ [-0.5009, -0.7122, 0.4548, ..., -0.3662, 0.6091, 0.7648],
348
+ ...,
349
+ [-0.5613, -0.6332, 0.4324, ..., -0.3792, 0.7372, 0.9288],
350
+ [-0.5416, -0.6345, 0.4180, ..., -0.3564, 0.6992, 0.9191],
351
+ [-0.5334, -0.6403, 0.4271, ..., -0.3339, 0.6533, 0.8694]]],
352
+ ```
353
+
354
+ Wir erwarten, dass jedes zu 🤗 Transformers hinzugefügte Modell eine Reihe von Integrationstests besteht, was bedeutet, dass das ursprüngliche
355
+ Modell und die neu implementierte Version in 🤗 Transformers exakt dieselbe Ausgabe liefern müssen, und zwar mit einer Genauigkeit von 0,001!
356
+ Da es normal ist, dass das exakt gleiche Modell, das in verschiedenen Bibliotheken geschrieben wurde, je nach Bibliotheksrahmen eine leicht unterschiedliche Ausgabe liefern kann
357
+ eine leicht unterschiedliche Ausgabe liefern kann, akzeptieren wir eine Fehlertoleranz von 1e-3 (0,001). Es reicht nicht aus, wenn das Modell
358
+ fast das gleiche Ergebnis liefert, sie müssen fast identisch sein. Daher werden Sie sicherlich die Zwischenergebnisse
359
+ Zwischenergebnisse der 🤗 Transformers-Version mehrfach mit den Zwischenergebnissen der ursprünglichen Implementierung von
360
+ *brand_new_bert* vergleichen. In diesem Fall ist eine **effiziente** Debugging-Umgebung des ursprünglichen Repositorys absolut
361
+ wichtig ist. Hier sind einige Ratschläge, um Ihre Debugging-Umgebung so effizient wie möglich zu gestalten.
362
+
363
+ - Finden Sie den besten Weg, um Zwischenergebnisse zu debuggen. Ist das ursprüngliche Repository in PyTorch geschrieben? Dann sollten Sie
364
+ dann sollten Sie sich wahrscheinlich die Zeit nehmen, ein längeres Skript zu schreiben, das das ursprüngliche Modell in kleinere Unterkomponenten zerlegt, um
365
+ Zwischenwerte abzurufen. Ist das ursprüngliche Repository in Tensorflow 1 geschrieben? Dann müssen Sie sich möglicherweise auf die
366
+ TensorFlow Druckoperationen wie [tf.print](https://www.tensorflow.org/api_docs/python/tf/print) verlassen, um die
367
+ Zwischenwerte auszugeben. Ist das ursprüngliche Repository in Jax geschrieben? Dann stellen Sie sicher, dass das Modell **nicht jitted** ist, wenn
368
+ wenn Sie den Vorwärtsdurchlauf ausführen, *z.B.* schauen Sie sich [dieser Link](https://github.com/google/jax/issues/196) an.
369
+ - Verwenden Sie den kleinsten vortrainierten Prüfpunkt, den Sie finden können. Je kleiner der Prüfpunkt ist, desto schneller wird Ihr Debugging-Zyklus
370
+ wird. Es ist nicht effizient, wenn Ihr vorab trainiertes Modell so groß ist, dass Ihr Vorwärtsdurchlauf mehr als 10 Sekunden dauert.
371
+ Falls nur sehr große Checkpoints verfügbar sind, kann es sinnvoller sein, ein Dummy-Modell in der neuen
372
+ Umgebung mit zufällig initialisierten Gewichten zu erstellen und diese Gewichte zum Vergleich mit der 🤗 Transformers-Version
373
+ Ihres Modells
374
+ - Vergewissern Sie sich, dass Sie den einfachsten Weg wählen, um einen Forward Pass im ursprünglichen Repository aufzurufen. Idealerweise sollten Sie
375
+ die Funktion im originalen Repository finden, die **nur** einen einzigen Vorwärtspass aufruft, *d.h.* die oft aufgerufen wird
376
+ Vorhersagen", "Auswerten", "Vorwärts" oder "Aufruf" genannt wird. Sie wollen keine Funktion debuggen, die `forward` aufruft
377
+ mehrfach aufruft, *z.B.* um Text zu erzeugen, wie `autoregressive_sample`, `generate`.
378
+ - Versuchen Sie, die Tokenisierung vom *Forward*-Pass des Modells zu trennen. Wenn das Original-Repository Beispiele zeigt, bei denen
379
+ Sie eine Zeichenkette eingeben müssen, dann versuchen Sie herauszufinden, an welcher Stelle im Vorwärtsaufruf die Zeichenketteneingabe in Eingabe-IDs geändert wird
380
+ geändert wird und beginnen Sie an dieser Stelle. Das könnte bedeuten, dass Sie möglicherweise selbst ein kleines Skript schreiben oder den
381
+ Originalcode so ändern müssen, dass Sie die ids direkt eingeben können, anstatt eine Zeichenkette einzugeben.
382
+ - Vergewissern Sie sich, dass sich das Modell in Ihrem Debugging-Setup **nicht** im Trainingsmodus befindet, der oft dazu führt, dass das Modell
383
+ Dies führt häufig zu zufälligen Ergebnissen, da das Modell mehrere Dropout-Schichten enthält. Stellen Sie sicher, dass der Vorwärtsdurchlauf in Ihrer Debugging
384
+ Umgebung **deterministisch** ist, damit die Dropout-Schichten nicht verwendet werden. Oder verwenden Sie *transformers.utils.set_seed*.
385
+ wenn sich die alte und die neue Implementierung im selben Framework befinden.
386
+
387
+ Im folgenden Abschnitt finden Sie genauere Details/Tipps, wie Sie dies für *brand_new_bert* tun können.
388
+
389
+ ### 5.-14. Portierung von BrandNewBert auf 🤗 Transformatoren
390
+
391
+ Als nächstes können Sie endlich damit beginnen, neuen Code zu 🤗 Transformers hinzuzufügen. Gehen Sie in den Klon Ihres 🤗 Transformers Forks:
392
+
393
+ ```bash
394
+ cd transformers
395
+ ```
396
+
397
+ In dem speziellen Fall, dass Sie ein Modell hinzufügen, dessen Architektur genau mit der Modellarchitektur eines
398
+ Modells übereinstimmt, müssen Sie nur ein Konvertierungsskript hinzufügen, wie in [diesem Abschnitt](#write-a-conversion-script) beschrieben.
399
+ In diesem Fall können Sie einfach die gesamte Modellarchitektur des bereits vorhandenen Modells wiederverwenden.
400
+
401
+ Andernfalls beginnen wir mit der Erstellung eines neuen Modells. Wir empfehlen die Verwendung des folgenden Skripts, um ein Modell hinzuzufügen
402
+ ein bestehendes Modell:
403
+
404
+ ```bash
405
+ transformers-cli add-new-model-like
406
+ ```
407
+
408
+ Sie werden mit einem Fragebogen aufgefordert, die grundlegenden Informationen Ihres Modells einzugeben.
409
+
410
+ **Eröffnen Sie einen Pull Request auf dem Haupt-Repositorium huggingface/transformers**
411
+
412
+ Bevor Sie mit der Anpassung des automatisch generierten Codes beginnen, ist es nun an der Zeit, einen "Work in progress (WIP)" Pull
413
+ Anfrage, *z.B.* "[WIP] Add *brand_new_bert*", in 🤗 Transformers zu öffnen, damit Sie und das Hugging Face Team
414
+ Seite an Seite an der Integration des Modells in 🤗 Transformers arbeiten können.
415
+
416
+ Sie sollten Folgendes tun:
417
+
418
+ 1. Erstellen Sie eine Verzweigung mit einem beschreibenden Namen von Ihrer Hauptverzweigung
419
+
420
+ ```bash
421
+ git checkout -b add_brand_new_bert
422
+ ```
423
+
424
+ 2. Bestätigen Sie den automatisch generierten Code:
425
+
426
+ ```bash
427
+ git add .
428
+ git commit
429
+ ```
430
+
431
+ 3. Abrufen und zurücksetzen auf die aktuelle Haupt
432
+
433
+ ```bash
434
+ git fetch upstream
435
+ git rebase upstream/main
436
+ ```
437
+
438
+ 4. Übertragen Sie die Änderungen auf Ihr Konto mit:
439
+
440
+ ```bash
441
+ git push -u origin a-descriptive-name-for-my-changes
442
+ ```
443
+
444
+ 5. Wenn Sie zufrieden sind, gehen Sie auf die Webseite Ihrer Abspaltung auf GitHub. Klicken Sie auf "Pull request". Stellen Sie sicher, dass Sie das
445
+ GitHub-Handle einiger Mitglieder des Hugging Face-Teams als Reviewer hinzuzufügen, damit das Hugging Face-Team über zukünftige Änderungen informiert wird.
446
+ zukünftige Änderungen benachrichtigt wird.
447
+
448
+ 6. Ändern Sie den PR in einen Entwurf, indem Sie auf der rechten Seite der GitHub-Pull-Request-Webseite auf "In Entwurf umwandeln" klicken.
449
+
450
+ Vergessen Sie im Folgenden nicht, wenn Sie Fortschritte gemacht haben, Ihre Arbeit zu committen und in Ihr Konto zu pushen, damit sie in der Pull-Anfrage erscheint.
451
+ damit sie in der Pull-Anfrage angezeigt wird. Außerdem sollten Sie darauf achten, dass Sie Ihre Arbeit von Zeit zu Zeit mit dem aktuellen main
452
+ von Zeit zu Zeit zu aktualisieren, indem Sie dies tun:
453
+
454
+ ```bash
455
+ git fetch upstream
456
+ git merge upstream/main
457
+ ```
458
+
459
+ Generell sollten Sie alle Fragen, die Sie in Bezug auf das Modell oder Ihre Implementierung haben, in Ihrem PR stellen und
460
+ in der PR diskutiert/gelöst werden. Auf diese Weise wird das Hugging Face Team immer benachrichtigt, wenn Sie neuen Code einreichen oder
461
+ wenn Sie eine Frage haben. Es ist oft sehr hilfreich, das Hugging Face-Team auf Ihren hinzugefügten Code hinzuweisen, damit das Hugging Face-Team Ihr Problem oder Ihre Frage besser verstehen kann.
462
+ Face-Team Ihr Problem oder Ihre Frage besser verstehen kann.
463
+
464
+ Gehen Sie dazu auf die Registerkarte "Geänderte Dateien", auf der Sie alle Ihre Änderungen sehen, gehen Sie zu einer Zeile, zu der Sie eine Frage stellen möchten
465
+ eine Frage stellen möchten, und klicken Sie auf das "+"-Symbol, um einen Kommentar hinzuzufügen. Wenn eine Frage oder ein Problem gelöst wurde,
466
+ können Sie auf die Schaltfläche "Lösen" des erstellten Kommentars klicken.
467
+
468
+ Auf dieselbe Weise wird das Hugging Face-Team Kommentare öffnen, wenn es Ihren Code überprüft. Wir empfehlen, die meisten Fragen
469
+ auf GitHub in Ihrem PR zu stellen. Für einige sehr allgemeine Fragen, die für die Öffentlichkeit nicht sehr nützlich sind, können Sie das
470
+ Hugging Face Team per Slack oder E-Mail zu stellen.
471
+
472
+ **5. Passen Sie den Code der generierten Modelle für brand_new_bert** an.
473
+
474
+ Zunächst werden wir uns nur auf das Modell selbst konzentrieren und uns nicht um den Tokenizer kümmern. Den gesamten relevanten Code sollten Sie
475
+ finden Sie in den generierten Dateien `src/transformers/models/brand_new_bert/modeling_brand_new_bert.py` und
476
+ `src/transformers/models/brand_new_bert/configuration_brand_new_bert.py`.
477
+
478
+ Jetzt können Sie endlich mit dem Programmieren beginnen :). Der generierte Code in
479
+ `src/transformers/models/brand_new_bert/modeling_brand_new_bert.py` wird entweder die gleiche Architektur wie BERT haben, wenn
480
+ wenn es sich um ein reines Encoder-Modell handelt oder BART, wenn es sich um ein Encoder-Decoder-Modell handelt. An diesem Punkt sollten Sie sich daran erinnern, was
481
+ was Sie am Anfang über die theoretischen Aspekte des Modells gelernt haben: *Wie unterscheidet sich das Modell von BERT oder
482
+ BART?*". Implementieren Sie diese Änderungen, was oft bedeutet, dass Sie die *Selbstaufmerksamkeitsschicht*, die Reihenfolge der Normalisierungsschicht usw. ändern müssen.
483
+ Schicht usw... Auch hier ist es oft nützlich, sich die ähnliche Architektur bereits bestehender Modelle in Transformers anzusehen, um ein besseres Gefühl dafür zu bekommen
484
+ ein besseres Gefühl dafür zu bekommen, wie Ihr Modell implementiert werden sollte.
485
+
486
+ **Beachten Sie**, dass Sie an diesem Punkt nicht sehr sicher sein müssen, dass Ihr Code völlig korrekt oder sauber ist. Vielmehr ist es
487
+ Sie sollten vielmehr eine erste *unbereinigte*, kopierte Version des ursprünglichen Codes in
488
+ src/transformers/models/brand_new_bert/modeling_brand_new_bert.py" hinzuzufügen, bis Sie das Gefühl haben, dass der gesamte notwendige Code
489
+ hinzugefügt wurde. Unserer Erfahrung nach ist es viel effizienter, schnell eine erste Version des erforderlichen Codes hinzuzufügen und
490
+ den Code iterativ mit dem Konvertierungsskript zu verbessern/korrigieren, wie im nächsten Abschnitt beschrieben. Das einzige, was
491
+ zu diesem Zeitpunkt funktionieren muss, ist, dass Sie die 🤗 Transformers-Implementierung von *brand_new_bert* instanziieren können, *d.h.* der
492
+ folgende Befehl sollte funktionieren:
493
+
494
+ ```python
495
+ from transformers import BrandNewBertModel, BrandNewBertConfig
496
+
497
+ model = BrandNewBertModel(BrandNewBertConfig())
498
+ ```
499
+
500
+ Der obige Befehl erstellt ein Modell gemäß den Standardparametern, die in `BrandNewBertConfig()` definiert sind, mit
501
+ zufälligen Gewichten und stellt damit sicher, dass die `init()` Methoden aller Komponenten funktionieren.
502
+
503
+ Beachten Sie, dass alle zufälligen Initialisierungen in der Methode `_init_weights` Ihres `BrandnewBertPreTrainedModel` stattfinden sollten.
504
+ Klasse erfolgen sollte. Sie sollte alle Blattmodule in Abhängigkeit von den Variablen der Konfiguration initialisieren. Hier ist ein Beispiel mit der
505
+ BERT `_init_weights` Methode:
506
+
507
+ ```py
508
+ def _init_weights(self, module):
509
+ """Initialize the weights"""
510
+ if isinstance(module, nn.Linear):
511
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
512
+ if module.bias is not None:
513
+ module.bias.data.zero_()
514
+ elif isinstance(module, nn.Embedding):
515
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
516
+ if module.padding_idx is not None:
517
+ module.weight.data[module.padding_idx].zero_()
518
+ elif isinstance(module, nn.LayerNorm):
519
+ module.bias.data.zero_()
520
+ module.weight.data.fill_(1.0)
521
+ ```
522
+
523
+ Sie können weitere benutzerdefinierte Schemata verwenden, wenn Sie eine spezielle Initialisierung für einige Module benötigen. Zum Beispiel in
524
+ `Wav2Vec2ForPreTraining` müssen die letzten beiden linearen Schichten die Initialisierung des regulären PyTorch `nn.Linear` haben.
525
+ aber alle anderen sollten eine Initialisierung wie oben verwenden. Dies ist wie folgt kodiert:
526
+
527
+ ```py
528
+ def _init_weights(self, module):
529
+ """Initialize the weights"""
530
+ if isinstance(module, Wav2Vec2ForPreTraining):
531
+ module.project_hid.reset_parameters()
532
+ module.project_q.reset_parameters()
533
+ module.project_hid._is_hf_initialized = True
534
+ module.project_q._is_hf_initialized = True
535
+ elif isinstance(module, nn.Linear):
536
+ module.weight.data.normal_(mean=0.0, std=self.config.initializer_range)
537
+ if module.bias is not None:
538
+ module.bias.data.zero_()
539
+ ```
540
+
541
+ Das Flag `_is_hf_initialized` wird intern verwendet, um sicherzustellen, dass wir ein Submodul nur einmal initialisieren. Wenn Sie es auf
542
+ `True` für `module.project_q` und `module.project_hid` setzen, stellen wir sicher, dass die benutzerdefinierte Initialisierung, die wir vorgenommen haben, später nicht überschrieben wird,
543
+ die Funktion `_init_weights` nicht auf sie angewendet wird.
544
+
545
+ **6. Schreiben Sie ein Konvertierungsskript**
546
+
547
+ Als nächstes sollten Sie ein Konvertierungsskript schreiben, mit dem Sie den Checkpoint, den Sie zum Debuggen von *brand_new_bert* im
548
+ im ursprünglichen Repository in einen Prüfpunkt konvertieren, der mit Ihrer gerade erstellten 🤗 Transformers-Implementierung von
549
+ *brand_new_bert*. Es ist nicht ratsam, das Konvertierungsskript von Grund auf neu zu schreiben, sondern die bereits
550
+ bestehenden Konvertierungsskripten in 🤗 Transformers nach einem Skript zu suchen, das für die Konvertierung eines ähnlichen Modells verwendet wurde, das im
551
+ demselben Framework wie *brand_new_bert* geschrieben wurde. Normalerweise reicht es aus, ein bereits vorhandenes Konvertierungsskript zu kopieren und
552
+ es für Ihren Anwendungsfall leicht anzupassen. Zögern Sie nicht, das Hugging Face Team zu bitten, Sie auf ein ähnliches, bereits vorhandenes
553
+ Konvertierungsskript für Ihr Modell zu finden.
554
+
555
+ - Wenn Sie ein Modell von TensorFlow nach PyTorch portieren, ist ein guter Ausgangspunkt das Konvertierungsskript von BERT [hier](https://github.com/huggingface/transformers/blob/7acfa95afb8194f8f9c1f4d2c6028224dbed35a2/src/transformers/models/bert/modeling_bert.py#L91)
556
+ - Wenn Sie ein Modell von PyTorch nach PyTorch portieren, ist ein guter Ausgangspunkt das Konvertierungsskript von BART [hier](https://github.com/huggingface/transformers/blob/main/src/transformers/models/bart/convert_bart_original_pytorch_checkpoint_to_pytorch.py)
557
+
558
+ Im Folgenden werden wir kurz erklären, wie PyTorch-Modelle Ebenengewichte speichern und Ebenennamen definieren. In PyTorch wird der
559
+ Name einer Ebene durch den Namen des Klassenattributs definiert, das Sie der Ebene geben. Lassen Sie uns ein Dummy-Modell in
560
+ PyTorch, das wir `SimpleModel` nennen, wie folgt:
561
+
562
+ ```python
563
+ from torch import nn
564
+
565
+
566
+ class SimpleModel(nn.Module):
567
+ def __init__(self):
568
+ super().__init__()
569
+ self.dense = nn.Linear(10, 10)
570
+ self.intermediate = nn.Linear(10, 10)
571
+ self.layer_norm = nn.LayerNorm(10)
572
+ ```
573
+
574
+ Jetzt können wir eine Instanz dieser Modelldefinition erstellen, die alle Gewichte ausfüllt: `dense`, `intermediate`,
575
+ `layer_norm` mit zufälligen Gewichten. Wir können das Modell ausdrucken, um seine Architektur zu sehen
576
+
577
+ ```python
578
+ model = SimpleModel()
579
+
580
+ print(model)
581
+ ```
582
+
583
+ Dies gibt folgendes aus:
584
+
585
+ ```
586
+ SimpleModel(
587
+ (dense): Linear(in_features=10, out_features=10, bias=True)
588
+ (intermediate): Linear(in_features=10, out_features=10, bias=True)
589
+ (layer_norm): LayerNorm((10,), eps=1e-05, elementwise_affine=True)
590
+ )
591
+ ```
592
+
593
+ Wir können sehen, dass die Ebenennamen durch den Namen des Klassenattributs in PyTorch definiert sind. Sie können die Gewichtswerte
594
+ Werte einer bestimmten Ebene anzeigen lassen:
595
+
596
+ ```python
597
+ print(model.dense.weight.data)
598
+ ```
599
+
600
+ um zu sehen, dass die Gewichte zufällig initialisiert wurden
601
+
602
+ ```
603
+ tensor([[-0.0818, 0.2207, -0.0749, -0.0030, 0.0045, -0.1569, -0.1598, 0.0212,
604
+ -0.2077, 0.2157],
605
+ [ 0.1044, 0.0201, 0.0990, 0.2482, 0.3116, 0.2509, 0.2866, -0.2190,
606
+ 0.2166, -0.0212],
607
+ [-0.2000, 0.1107, -0.1999, -0.3119, 0.1559, 0.0993, 0.1776, -0.1950,
608
+ -0.1023, -0.0447],
609
+ [-0.0888, -0.1092, 0.2281, 0.0336, 0.1817, -0.0115, 0.2096, 0.1415,
610
+ -0.1876, -0.2467],
611
+ [ 0.2208, -0.2352, -0.1426, -0.2636, -0.2889, -0.2061, -0.2849, -0.0465,
612
+ 0.2577, 0.0402],
613
+ [ 0.1502, 0.2465, 0.2566, 0.0693, 0.2352, -0.0530, 0.1859, -0.0604,
614
+ 0.2132, 0.1680],
615
+ [ 0.1733, -0.2407, -0.1721, 0.1484, 0.0358, -0.0633, -0.0721, -0.0090,
616
+ 0.2707, -0.2509],
617
+ [-0.1173, 0.1561, 0.2945, 0.0595, -0.1996, 0.2988, -0.0802, 0.0407,
618
+ 0.1829, -0.1568],
619
+ [-0.1164, -0.2228, -0.0403, 0.0428, 0.1339, 0.0047, 0.1967, 0.2923,
620
+ 0.0333, -0.0536],
621
+ [-0.1492, -0.1616, 0.1057, 0.1950, -0.2807, -0.2710, -0.1586, 0.0739,
622
+ 0.2220, 0.2358]]).
623
+ ```
624
+
625
+ Im Konvertierungsskript sollten Sie diese zufällig initialisierten Gewichte mit den genauen Gewichten der
626
+ entsprechenden Ebene im Kontrollpunkt. *Z.B.*
627
+
628
+ ```python
629
+ # retrieve matching layer weights, e.g. by
630
+ # recursive algorithm
631
+ layer_name = "dense"
632
+ pretrained_weight = array_of_dense_layer
633
+
634
+ model_pointer = getattr(model, "dense")
635
+
636
+ model_pointer.weight.data = torch.from_numpy(pretrained_weight)
637
+ ```
638
+
639
+ Dabei müssen Sie sicherstellen, dass jedes zufällig initialisierte Gewicht Ihres PyTorch-Modells und sein entsprechendes
640
+ Checkpoint-Gewicht in **Form und Name** genau übereinstimmen. Zu diesem Zweck ist es **notwendig**, assert
641
+ Anweisungen für die Form hinzuzufügen und die Namen der Checkpoint-Gewichte auszugeben. Sie sollten z.B. Anweisungen hinzufügen wie:
642
+
643
+ ```python
644
+ assert (
645
+ model_pointer.weight.shape == pretrained_weight.shape
646
+ ), f"Pointer shape of random weight {model_pointer.shape} and array shape of checkpoint weight {pretrained_weight.shape} mismatched"
647
+ ```
648
+
649
+ Außerdem sollten Sie die Namen der beiden Gewichte ausdrucken, um sicherzustellen, dass sie übereinstimmen, *z.B.*.
650
+
651
+ ```python
652
+ logger.info(f"Initialize PyTorch weight {layer_name} from {pretrained_weight.name}")
653
+ ```
654
+
655
+ Wenn entweder die Form oder der Name nicht übereinstimmt, haben Sie wahrscheinlich das falsche Kontrollpunktgewicht einer zufällig
656
+ Ebene der 🤗 Transformers-Implementierung zugewiesen.
657
+
658
+ Eine falsche Form ist höchstwahrscheinlich auf eine falsche Einstellung der Konfigurationsparameter in `BrandNewBertConfig()` zurückzuführen, die
659
+ nicht genau mit denen übereinstimmen, die für den zu konvertierenden Prüfpunkt verwendet wurden. Es könnte aber auch sein, dass
660
+ die PyTorch-Implementierung eines Layers erfordert, dass das Gewicht vorher transponiert wird.
661
+
662
+ Schließlich sollten Sie auch überprüfen, ob **alle** erforderlichen Gewichte initialisiert sind und alle Checkpoint-Gewichte ausgeben, die
663
+ die nicht zur Initialisierung verwendet wurden, um sicherzustellen, dass das Modell korrekt konvertiert wurde. Es ist völlig normal, dass die
664
+ Konvertierungsversuche entweder mit einer falschen Shape-Anweisung oder einer falschen Namenszuweisung fehlschlagen. Das liegt höchstwahrscheinlich daran, dass entweder
665
+ Sie haben falsche Parameter in `BrandNewBertConfig()` verwendet, haben eine falsche Architektur in der 🤗 Transformers
666
+ Implementierung, Sie haben einen Fehler in den `init()` Funktionen einer der Komponenten der 🤗 Transformers
667
+ Implementierung oder Sie müssen eine der Kontrollpunktgewichte transponieren.
668
+
669
+ Dieser Schritt sollte mit dem vorherigen Schritt wiederholt werden, bis alle Gewichte des Kontrollpunkts korrekt in das
670
+ Transformers-Modell geladen sind. Nachdem Sie den Prüfpunkt korrekt in die 🤗 Transformers-Implementierung geladen haben, können Sie das Modell
671
+ das Modell unter einem Ordner Ihrer Wahl `/path/to/converted/checkpoint/folder` speichern, der dann sowohl ein
672
+ Datei `pytorch_model.bin` und eine Datei `config.json` enthalten sollte:
673
+
674
+ ```python
675
+ model.save_pretrained("/path/to/converted/checkpoint/folder")
676
+ ```
677
+
678
+ **7. Implementieren Sie den Vorwärtspass**
679
+
680
+ Nachdem es Ihnen gelungen ist, die trainierten Gewichte korrekt in die 🤗 Transformers-Implementierung zu laden, sollten Sie nun dafür sorgen
681
+ sicherstellen, dass der Forward Pass korrekt implementiert ist. In [Machen Sie sich mit dem ursprünglichen Repository vertraut](#3-4-führen-sie-einen-pre-training-checkpoint-mit-dem-original-repository-durch) haben Sie bereits ein Skript erstellt, das einen Forward Pass
682
+ Durchlauf des Modells unter Verwendung des Original-Repositorys durchführt. Jetzt sollten Sie ein analoges Skript schreiben, das die 🤗 Transformers
683
+ Implementierung anstelle der Originalimplementierung verwenden. Es sollte wie folgt aussehen:
684
+
685
+ ```python
686
+ model = BrandNewBertModel.from_pretrained("/path/to/converted/checkpoint/folder")
687
+ input_ids = [0, 4, 4, 3, 2, 4, 1, 7, 19]
688
+ output = model(input_ids).last_hidden_states
689
+ ```
690
+
691
+ Es ist sehr wahrscheinlich, dass die 🤗 Transformers-Implementierung und die ursprüngliche Modell-Implementierung nicht genau die gleiche Ausgabe liefern.
692
+ beim ersten Mal nicht die gleiche Ausgabe liefern oder dass der Vorwärtsdurchlauf einen Fehler auslöst. Seien Sie nicht enttäuscht - das ist zu erwarten! Erstens,
693
+ sollten Sie sicherstellen, dass der Vorwärtsdurchlauf keine Fehler auslöst. Es passiert oft, dass die falschen Dimensionen verwendet werden
694
+ verwendet werden, was zu einem *Dimensionality mismatch* Fehler führt oder dass der falsche Datentyp verwendet wird, *z.B.* `torch.long`
695
+ anstelle von `torch.float32`. Zögern Sie nicht, das Hugging Face Team um Hilfe zu bitten, wenn Sie bestimmte Fehler nicht lösen können.
696
+ bestimmte Fehler nicht lösen können.
697
+
698
+ Um sicherzustellen, dass die Implementierung von 🤗 Transformers korrekt funktioniert, müssen Sie sicherstellen, dass die Ausgaben
699
+ einer Genauigkeit von `1e-3` entsprechen. Zunächst sollten Sie sicherstellen, dass die Ausgabeformen identisch sind, *d.h.*.
700
+ Die Ausgabeform *outputs.shape* sollte für das Skript der 🤗 Transformers-Implementierung und die ursprüngliche
701
+ Implementierung ergeben. Als nächstes sollten Sie sicherstellen, dass auch die Ausgabewerte identisch sind. Dies ist einer der schwierigsten
702
+ Teile des Hinzufügens eines neuen Modells. Häufige Fehler, warum die Ausgaben nicht identisch sind, sind:
703
+
704
+ - Einige Ebenen wurden nicht hinzugefügt, *d.h.* eine *Aktivierungsebene* wurde nicht hinzugefügt, oder die Restverbindung wurde vergessen
705
+ - Die Worteinbettungsmatrix wurde nicht gebunden
706
+ - Es werden die falschen Positionseinbettungen verwendet, da die ursprüngliche Implementierung einen Offset verwendet
707
+ - Dropout wird während des Vorwärtsdurchlaufs angewendet. Um dies zu beheben, stellen Sie sicher, dass *model.training auf False* steht und dass keine Dropout
708
+ Schicht während des Vorwärtsdurchlaufs fälschlicherweise aktiviert wird, *d.h.* übergeben Sie *self.training* an [PyTorch's functional dropout](https://pytorch.org/docs/stable/nn.functional.html?highlight=dropout#torch.nn.functional.dropout)
709
+
710
+ Der beste Weg, das Problem zu beheben, besteht normalerweise darin, sich den Vorwärtsdurchlauf der ursprünglichen Implementierung und die 🤗
711
+ Transformers-Implementierung nebeneinander zu sehen und zu prüfen, ob es Unterschiede gibt. Idealerweise sollten Sie die
712
+ Zwischenergebnisse beider Implementierungen des Vorwärtsdurchlaufs debuggen/ausdrucken, um die genaue Position im Netzwerk zu finden, an der die 🤗
713
+ Transformers-Implementierung eine andere Ausgabe zeigt als die ursprüngliche Implementierung. Stellen Sie zunächst sicher, dass die
714
+ hartcodierten `input_ids` in beiden Skripten identisch sind. Überprüfen Sie dann, ob die Ausgaben der ersten Transformation von
715
+ der `input_ids` (normalerweise die Worteinbettungen) identisch sind. Und dann arbeiten Sie sich bis zur allerletzten Schicht des
716
+ Netzwerks. Irgendwann werden Sie einen Unterschied zwischen den beiden Implementierungen feststellen, der Sie auf den Fehler
717
+ in der Implementierung von 🤗 Transformers hinweist. Unserer Erfahrung nach ist ein einfacher und effizienter Weg, viele Druckanweisungen hinzuzufügen
718
+ sowohl in der Original-Implementierung als auch in der 🤗 Transformers-Implementierung an den gleichen Stellen im Netzwerk
719
+ hinzuzufügen und nacheinander Druckanweisungen zu entfernen, die dieselben Werte für Zwischenpräsentationen anzeigen.
720
+
721
+ Wenn Sie sicher sind, dass beide Implementierungen die gleiche Ausgabe liefern, überprüfen Sie die Ausgaben mit
722
+ `torch.allclose(original_output, output, atol=1e-3)` überprüfen, haben Sie den schwierigsten Teil hinter sich! Herzlichen Glückwunsch - die
723
+ Arbeit, die noch zu erledigen ist, sollte ein Kinderspiel sein 😊.
724
+
725
+ **8. Hinzufügen aller notwendigen Modelltests**
726
+
727
+ An diesem Punkt haben Sie erfolgreich ein neues Modell hinzugefügt. Es ist jedoch sehr gut möglich, dass das Modell noch nicht
728
+ noch nicht vollständig mit dem erforderlichen Design übereinstimmt. Um sicherzustellen, dass die Implementierung vollständig kompatibel mit 🤗 Transformers ist, sollten alle
729
+ gemeinsamen Tests bestehen. Der Cookiecutter sollte automatisch eine Testdatei für Ihr Modell hinzugefügt haben, wahrscheinlich unter
730
+ demselben `tests/models/brand_new_bert/test_modeling_brand_new_bert.py`. Führen Sie diese Testdatei aus, um zu überprüfen, ob alle gängigen
731
+ Tests bestehen:
732
+
733
+ ```bash
734
+ pytest tests/models/brand_new_bert/test_modeling_brand_new_bert.py
735
+ ```
736
+
737
+ Nachdem Sie alle allgemeinen Tests festgelegt haben, müssen Sie nun sicherstellen, dass all die schöne Arbeit, die Sie geleistet haben, gut getestet ist, damit
738
+
739
+ - a) die Community Ihre Arbeit leicht nachvollziehen kann, indem sie sich spezifische Tests von *brand_new_bert* ansieht
740
+ - b) zukünftige Änderungen an Ihrem Modell keine wichtigen Funktionen des Modells zerstören.
741
+
742
+ Als erstes sollten Sie Integrationstests hinzufügen. Diese Integrationstests tun im Wesentlichen dasselbe wie die Debugging-Skripte
743
+ die Sie zuvor zur Implementierung des Modells in 🤗 Transformers verwendet haben. Eine Vorlage für diese Modelltests wurde bereits von dem
744
+ Cookiecutter hinzugefügt, die `BrandNewBertModelIntegrationTests` heißt und nur noch von Ihnen ausgefüllt werden muss. Um sicherzustellen, dass diese
745
+ Tests erfolgreich sind, führen Sie
746
+
747
+ ```bash
748
+ RUN_SLOW=1 pytest -sv tests/models/brand_new_bert/test_modeling_brand_new_bert.py::BrandNewBertModelIntegrationTests
749
+ ```
750
+
751
+ <Tip>
752
+
753
+ Falls Sie Windows verwenden, sollten Sie `RUN_SLOW=1` durch `SET RUN_SLOW=1` ersetzen.
754
+
755
+ </Tip>
756
+
757
+ Zweitens sollten alle Funktionen, die speziell für *brand_new_bert* sind, zusätzlich in einem separaten Test getestet werden unter
758
+ `BrandNewBertModelTester`/`BrandNewBertModelTest`. Dieser Teil wird oft vergessen, ist aber in zweierlei Hinsicht äußerst nützlich
759
+ Weise:
760
+
761
+ - Er hilft dabei, das Wissen, das Sie während der Modellerweiterung erworben haben, an die Community weiterzugeben, indem er zeigt, wie die
762
+ speziellen Funktionen von *brand_new_bert* funktionieren sollten.
763
+ - Künftige Mitwirkende können Änderungen am Modell schnell testen, indem sie diese speziellen Tests ausführen.
764
+
765
+
766
+ **9. Implementieren Sie den Tokenizer**
767
+
768
+ Als nächstes sollten wir den Tokenizer von *brand_new_bert* hinzufügen. Normalerweise ist der Tokenizer äquivalent oder sehr ähnlich zu einem
769
+ bereits vorhandenen Tokenizer von 🤗 Transformers.
770
+
771
+ Es ist sehr wichtig, die ursprüngliche Tokenizer-Datei zu finden/extrahieren und es zu schaffen, diese Datei in die 🤗
772
+ Transformers Implementierung des Tokenizers zu laden.
773
+
774
+ Um sicherzustellen, dass der Tokenizer korrekt funktioniert, empfiehlt es sich, zunächst ein Skript im ursprünglichen Repository zu erstellen
775
+ zu erstellen, das eine Zeichenkette eingibt und die `input_ids` zurückgibt. Es könnte etwa so aussehen (in Pseudocode):
776
+
777
+ ```python
778
+ input_str = "This is a long example input string containing special characters .$?-, numbers 2872 234 12 and words."
779
+ model = BrandNewBertModel.load_pretrained_checkpoint("/path/to/checkpoint/")
780
+ input_ids = model.tokenize(input_str)
781
+ ```
782
+
783
+ Möglicherweise müssen Sie noch einmal einen Blick in das ursprüngliche Repository werfen, um die richtige Tokenizer-Funktion zu finden, oder Sie müssen
784
+ Sie müssen vielleicht sogar Änderungen an Ihrem Klon des Original-Repositorys vornehmen, um nur die `input_ids` auszugeben. Nach dem Schreiben
785
+ ein funktionierendes Tokenisierungsskript geschrieben, das das ursprüngliche Repository verwendet, sollten Sie ein analoges Skript für 🤗 Transformers
786
+ erstellt werden. Es sollte ähnlich wie dieses aussehen:
787
+
788
+ ```python
789
+ from transformers import BrandNewBertTokenizer
790
+
791
+ input_str = "This is a long example input string containing special characters .$?-, numbers 2872 234 12 and words."
792
+
793
+ tokenizer = BrandNewBertTokenizer.from_pretrained("/path/to/tokenizer/folder/")
794
+
795
+ input_ids = tokenizer(input_str).input_ids
796
+ ```
797
+
798
+ Wenn beide `input_ids` die gleichen Werte ergeben, sollte als letzter Schritt auch eine Tokenizer-Testdatei hinzugefügt werden.
799
+
800
+ Analog zu den Modellierungstestdateien von *brand_new_bert* sollten auch die Tokenisierungs-Testdateien von *brand_new_bert*
801
+ eine Reihe von fest kodierten Integrationstests enthalten.
802
+
803
+ **10. Führen Sie End-to-End-Integrationstests aus**
804
+
805
+ Nachdem Sie den Tokenizer hinzugefügt haben, sollten Sie auch ein paar End-to-End-Integrationstests, die sowohl das Modell als auch den
806
+ Tokenizer zu `tests/models/brand_new_bert/test_modeling_brand_new_bert.py` in 🤗 Transformers.
807
+ Ein solcher Test sollte bei einem aussagekräftigen
808
+ Text-zu-Text-Beispiel zeigen, dass die Implementierung von 🤗 Transformers wie erwartet funktioniert. Ein aussagekräftiges Text-zu-Text-Beispiel kann
809
+ z.B. *ein Quell-zu-Ziel-Übersetzungspaar, ein Artikel-zu-Zusammenfassung-Paar, ein Frage-zu-Antwort-Paar, usw... Wenn keiner der
810
+ der portierten Prüfpunkte in einer nachgelagerten Aufgabe feinabgestimmt wurde, genügt es, sich einfach auf die Modelltests zu verlassen. In einem
811
+ letzten Schritt, um sicherzustellen, dass das Modell voll funktionsfähig ist, sollten Sie alle Tests auch auf der GPU durchführen. Es kann
812
+ Es kann vorkommen, dass Sie vergessen haben, einige `.to(self.device)` Anweisungen zu internen Tensoren des Modells hinzuzufügen, was in einem solchen
813
+ Test zu einem Fehler führen würde. Falls Sie keinen Zugang zu einem Grafikprozessor haben, kann das Hugging Face Team diese Tests für Sie durchführen.
814
+ Tests für Sie übernehmen.
815
+
816
+ **11. Docstring hinzufügen**
817
+
818
+ Nun sind alle notwendigen Funktionen für *brand_new_bert* hinzugefügt - Sie sind fast fertig! Das Einzige, was Sie noch hinzufügen müssen, ist
819
+ ein schöner Docstring und eine Doku-Seite. Der Cookiecutter sollte eine Vorlagendatei namens
820
+ `docs/source/model_doc/brand_new_bert.md` hinzugefügt haben, die Sie ausfüllen sollten. Die Benutzer Ihres Modells werden in der Regel zuerst einen Blick auf
821
+ diese Seite ansehen, bevor sie Ihr Modell verwenden. Daher muss die Dokumentation verständlich und prägnant sein. Es ist sehr nützlich für
822
+ die Gemeinschaft, einige *Tipps* hinzuzufügen, um zu zeigen, wie das Modell verwendet werden sollte. Zögern Sie nicht, das Hugging Face-Team anzupingen
823
+ bezüglich der Docstrings.
824
+
825
+ Stellen Sie als nächstes sicher, dass der zu `src/transformers/models/brand_new_bert/modeling_brand_new_bert.py` hinzugefügte docstring
826
+ korrekt ist und alle erforderlichen Eingaben und Ausgaben enthält. Wir haben eine ausführliche Anleitung zum Schreiben von Dokumentationen und unserem Docstring-Format [hier](writing-documentation). Es ist immer gut, sich daran zu erinnern, dass die Dokumentation
827
+ mindestens so sorgfältig behandelt werden sollte wie der Code in 🤗 Transformers, denn die Dokumentation ist in der Regel der erste Kontaktpunkt der
828
+ Berührungspunkt der Community mit dem Modell ist.
829
+
830
+ **Code refactor**
831
+
832
+ Großartig, jetzt haben Sie den gesamten erforderlichen Code für *brand_new_bert* hinzugefügt. An diesem Punkt sollten Sie einige mögliche
833
+ falschen Codestil korrigieren, indem Sie ausführen:
834
+
835
+ ```bash
836
+ make style
837
+ ```
838
+
839
+ und überprüfen Sie, ob Ihr Kodierungsstil die Qualitätsprüfung besteht:
840
+
841
+ ```bash
842
+ make quality
843
+ ```
844
+
845
+ Es gibt noch ein paar andere sehr strenge Designtests in 🤗 Transformers, die möglicherweise noch fehlschlagen, was sich in den
846
+ den Tests Ihres Pull Requests. Dies liegt oft an fehlenden Informationen im Docstring oder an einer falschen
847
+ Benennung. Das Hugging Face Team wird Ihnen sicherlich helfen, wenn Sie hier nicht weiterkommen.
848
+
849
+ Und schließlich ist es immer eine gute Idee, den eigenen Code zu refaktorisieren, nachdem man sichergestellt hat, dass er korrekt funktioniert. Wenn alle
850
+ Tests bestanden haben, ist es nun an der Zeit, den hinzugefügten Code noch einmal durchzugehen und einige Überarbeitungen vorzunehmen.
851
+
852
+ Sie haben nun den Codierungsteil abgeschlossen, herzlichen Glückwunsch! 🎉 Sie sind großartig! 😎
853
+
854
+ **12. Laden Sie die Modelle in den Model Hub hoch**
855
+
856
+ In diesem letzten Teil sollten Sie alle Checkpoints konvertieren und in den Modell-Hub hochladen und eine Modellkarte für jeden
857
+ hochgeladenen Modell-Kontrollpunkt. Sie können sich mit den Hub-Funktionen vertraut machen, indem Sie unsere [Model sharing and uploading Page](model_sharing) lesen. Hier sollten Sie mit dem Hugging Face-Team zusammenarbeiten, um einen passenden Namen für jeden
858
+ Checkpoint festzulegen und die erforderlichen Zugriffsrechte zu erhalten, um das Modell unter der Organisation des Autors *brand_new_bert* hochladen zu können.
859
+ *brand_new_bert*. Die Methode `push_to_hub`, die in allen Modellen in `transformers` vorhanden ist, ist ein schneller und effizienter Weg, Ihren Checkpoint in den Hub zu pushen. Ein kleines Snippet ist unten eingefügt:
860
+
861
+ ```python
862
+ brand_new_bert.push_to_hub("brand_new_bert")
863
+ # Uncomment the following line to push to an organization.
864
+ # brand_new_bert.push_to_hub("<organization>/brand_new_bert")
865
+ ```
866
+
867
+ Es lohnt sich, etwas Zeit darauf zu verwenden, für jeden Kontrollpunkt passende Musterkarten zu erstellen. Die Modellkarten sollten die
868
+ spezifischen Merkmale dieses bestimmten Prüfpunkts hervorheben, * z.B.* auf welchem Datensatz wurde der Prüfpunkt
869
+ vortrainiert/abgestimmt? Für welche nachgelagerte Aufgabe sollte das Modell verwendet werden? Und fügen Sie auch etwas Code bei, wie Sie
870
+ wie das Modell korrekt verwendet wird.
871
+
872
+ **13. (Optional) Notizbuch hinzufügen**
873
+
874
+ Es ist sehr hilfreich, ein Notizbuch hinzuzufügen, in dem im Detail gezeigt wird, wie *brand_new_bert* für Schlussfolgerungen verwendet werden kann und/oder
875
+ bei einer nachgelagerten Aufgabe feinabgestimmt wird. Dies ist nicht zwingend erforderlich, um Ihren PR zusammenzuführen, aber sehr nützlich für die Gemeinschaft.
876
+
877
+ **14. Reichen Sie Ihren fertigen PR ein**
878
+
879
+ Sie sind jetzt mit der Programmierung fertig und können zum letzten Schritt übergehen, nämlich der Zusammenführung Ihres PR mit main. Normalerweise hat das
880
+ Hugging Face Team Ihnen an diesem Punkt bereits geholfen haben, aber es lohnt sich, sich etwas Zeit zu nehmen, um Ihrem fertigen
881
+ PR eine schöne Beschreibung zu geben und eventuell Kommentare zu Ihrem Code hinzuzufügen, wenn Sie Ihren Gutachter auf bestimmte Designentscheidungen hinweisen wollen.
882
+ Gutachter hinweisen wollen.
883
+
884
+ ### Teilen Sie Ihre Arbeit!!
885
+
886
+ Jetzt ist es an der Zeit, von der Community Anerkennung für Ihre Arbeit zu bekommen! Die Fertigstellung einer Modellergänzung ist ein wichtiger
887
+ Beitrag zu Transformers und der gesamten NLP-Gemeinschaft. Ihr Code und die portierten vortrainierten Modelle werden sicherlich
888
+ von Hunderten und vielleicht sogar Tausenden von Entwicklern und Forschern genutzt werden. Sie sollten stolz auf Ihre Arbeit sein und Ihre
889
+ Ihre Leistung mit der Gemeinschaft teilen.
890
+
891
+ **Sie haben ein weiteres Modell erstellt, das für jeden in der Community super einfach zugänglich ist! 🤯**
add_new_pipeline.md ADDED
@@ -0,0 +1,254 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+
11
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
12
+ rendered properly in your Markdown viewer.
13
+
14
+ -->
15
+
16
+ # Wie erstellt man eine benutzerdefinierte Pipeline?
17
+
18
+ In dieser Anleitung sehen wir uns an, wie Sie eine benutzerdefinierte Pipeline erstellen und sie auf dem [Hub](https://hf.co/models) freigeben oder sie der
19
+ 🤗 Transformers-Bibliothek hinzufügen.
20
+
21
+ Zuallererst müssen Sie entscheiden, welche Roheingaben die Pipeline verarbeiten kann. Es kann sich um Strings, rohe Bytes,
22
+ Dictionaries oder was auch immer die wahrscheinlichste gewünschte Eingabe ist. Versuchen Sie, diese Eingaben so rein wie möglich in Python zu halten
23
+ denn das macht die Kompatibilität einfacher (auch mit anderen Sprachen über JSON). Dies werden die Eingaben der
24
+ Pipeline (`Vorverarbeitung`).
25
+
26
+ Definieren Sie dann die `Outputs`. Dieselbe Richtlinie wie für die Eingänge. Je einfacher, desto besser. Dies werden die Ausgaben der
27
+ Methode `Postprocess`.
28
+
29
+ Beginnen Sie damit, die Basisklasse `Pipeline` mit den 4 Methoden zu erben, die für die Implementierung von `preprocess` benötigt werden,
30
+ Weiterleiten", "Nachbearbeitung" und "Parameter säubern".
31
+
32
+
33
+ ```python
34
+ from transformers import Pipeline
35
+
36
+
37
+ class MyPipeline(Pipeline):
38
+ def _sanitize_parameters(self, **kwargs):
39
+ preprocess_kwargs = {}
40
+ if "maybe_arg" in kwargs:
41
+ preprocess_kwargs["maybe_arg"] = kwargs["maybe_arg"]
42
+ return preprocess_kwargs, {}, {}
43
+
44
+ def preprocess(self, inputs, maybe_arg=2):
45
+ model_input = Tensor(inputs["input_ids"])
46
+ return {"model_input": model_input}
47
+
48
+ def _forward(self, model_inputs):
49
+ # model_inputs == {"model_input": model_input}
50
+ outputs = self.model(**model_inputs)
51
+ # Maybe {"logits": Tensor(...)}
52
+ return outputs
53
+
54
+ def postprocess(self, model_outputs):
55
+ best_class = model_outputs["logits"].softmax(-1)
56
+ return best_class
57
+ ```
58
+
59
+ Die Struktur dieser Aufteilung soll eine relativ nahtlose Unterstützung für CPU/GPU ermöglichen und gleichzeitig die Durchführung von
60
+ Vor-/Nachbearbeitung auf der CPU in verschiedenen Threads
61
+
62
+ Preprocess" nimmt die ursprünglich definierten Eingaben und wandelt sie in etwas um, das in das Modell eingespeist werden kann. Es kann
63
+ mehr Informationen enthalten und ist normalerweise ein `Dict`.
64
+
65
+ `_forward` ist das Implementierungsdetail und ist nicht dafür gedacht, direkt aufgerufen zu werden. Weiterleiten" ist die bevorzugte
66
+ aufgerufene Methode, da sie Sicherheitsvorkehrungen enthält, die sicherstellen, dass alles auf dem erwarteten Gerät funktioniert. Wenn etwas
67
+ mit einem realen Modell verknüpft ist, gehört es in die Methode `_forward`, alles andere gehört in die Methoden preprocess/postprocess.
68
+
69
+ Die Methode `Postprocess` nimmt die Ausgabe von `_forward` und verwandelt sie in die endgültige Ausgabe, die zuvor festgelegt wurde.
70
+ zuvor entschieden wurde.
71
+
72
+ Die Methode `_sanitize_parameters` ermöglicht es dem Benutzer, beliebige Parameter zu übergeben, wann immer er möchte, sei es bei der Initialisierung
73
+ Zeit `pipeline(...., maybe_arg=4)` oder zur Aufrufzeit `pipe = pipeline(...); output = pipe(...., maybe_arg=4)`.
74
+
75
+ Die Rückgabe von `_sanitize_parameters` sind die 3 Dicts von kwargs, die direkt an `preprocess` übergeben werden,
76
+ `_forward` und `postprocess` übergeben werden. Füllen Sie nichts aus, wenn der Aufrufer keinen zusätzlichen Parameter angegeben hat. Das
77
+ erlaubt es, die Standardargumente in der Funktionsdefinition beizubehalten, was immer "natürlicher" ist.
78
+
79
+ Ein klassisches Beispiel wäre das Argument `top_k` in der Nachbearbeitung bei Klassifizierungsaufgaben.
80
+
81
+ ```python
82
+ >>> pipe = pipeline("my-new-task")
83
+ >>> pipe("This is a test")
84
+ [{"label": "1-star", "score": 0.8}, {"label": "2-star", "score": 0.1}, {"label": "3-star", "score": 0.05}
85
+ {"label": "4-star", "score": 0.025}, {"label": "5-star", "score": 0.025}]
86
+
87
+ >>> pipe("This is a test", top_k=2)
88
+ [{"label": "1-star", "score": 0.8}, {"label": "2-star", "score": 0.1}]
89
+ ```
90
+
91
+ In order to achieve that, we'll update our `postprocess` method with a default parameter to `5`. and edit
92
+ `_sanitize_parameters` to allow this new parameter.
93
+
94
+
95
+ ```python
96
+ def postprocess(self, model_outputs, top_k=5):
97
+ best_class = model_outputs["logits"].softmax(-1)
98
+ # Add logic to handle top_k
99
+ return best_class
100
+
101
+
102
+ def _sanitize_parameters(self, **kwargs):
103
+ preprocess_kwargs = {}
104
+ if "maybe_arg" in kwargs:
105
+ preprocess_kwargs["maybe_arg"] = kwargs["maybe_arg"]
106
+
107
+ postprocess_kwargs = {}
108
+ if "top_k" in kwargs:
109
+ postprocess_kwargs["top_k"] = kwargs["top_k"]
110
+ return preprocess_kwargs, {}, postprocess_kwargs
111
+ ```
112
+
113
+ Versuchen Sie, die Eingaben/Ausgaben sehr einfach und idealerweise JSON-serialisierbar zu halten, da dies die Verwendung der Pipeline sehr einfach macht
114
+ ohne dass die Benutzer neue Arten von Objekten verstehen müssen. Es ist auch relativ üblich, viele verschiedene Arten von Argumenten zu unterstützen
115
+ von Argumenten zu unterstützen (Audiodateien, die Dateinamen, URLs oder reine Bytes sein können).
116
+
117
+
118
+
119
+ ## Hinzufügen zur Liste der unterstützten Aufgaben
120
+
121
+ Um Ihre `neue Aufgabe` in die Liste der unterstützten Aufgaben aufzunehmen, müssen Sie sie zur `PIPELINE_REGISTRY` hinzufügen:
122
+
123
+ ```python
124
+ from transformers.pipelines import PIPELINE_REGISTRY
125
+
126
+ PIPELINE_REGISTRY.register_pipeline(
127
+ "new-task",
128
+ pipeline_class=MyPipeline,
129
+ pt_model=AutoModelForSequenceClassification,
130
+ )
131
+ ```
132
+
133
+ Wenn Sie möchten, können Sie ein Standardmodell angeben. In diesem Fall sollte es mit einer bestimmten Revision (die der Name einer Verzweigung oder ein Commit-Hash sein kann, hier haben wir `"abcdef"` genommen) sowie mit dem Typ versehen sein:
134
+
135
+ ```python
136
+ PIPELINE_REGISTRY.register_pipeline(
137
+ "new-task",
138
+ pipeline_class=MyPipeline,
139
+ pt_model=AutoModelForSequenceClassification,
140
+ default={"pt": ("user/awesome_model", "abcdef")},
141
+ type="text", # current support type: text, audio, image, multimodal
142
+ )
143
+ ```
144
+
145
+ ## Teilen Sie Ihre Pipeline auf dem Hub
146
+
147
+ Um Ihre benutzerdefinierte Pipeline auf dem Hub freizugeben, müssen Sie lediglich den benutzerdefinierten Code Ihrer `Pipeline`-Unterklasse in einer
148
+ Python-Datei speichern. Nehmen wir zum Beispiel an, Sie möchten eine benutzerdefinierte Pipeline für die Klassifizierung von Satzpaaren wie folgt verwenden:
149
+
150
+ ```py
151
+ import numpy as np
152
+
153
+ from transformers import Pipeline
154
+
155
+
156
+ def softmax(outputs):
157
+ maxes = np.max(outputs, axis=-1, keepdims=True)
158
+ shifted_exp = np.exp(outputs - maxes)
159
+ return shifted_exp / shifted_exp.sum(axis=-1, keepdims=True)
160
+
161
+
162
+ class PairClassificationPipeline(Pipeline):
163
+ def _sanitize_parameters(self, **kwargs):
164
+ preprocess_kwargs = {}
165
+ if "second_text" in kwargs:
166
+ preprocess_kwargs["second_text"] = kwargs["second_text"]
167
+ return preprocess_kwargs, {}, {}
168
+
169
+ def preprocess(self, text, second_text=None):
170
+ return self.tokenizer(text, text_pair=second_text, return_tensors=self.framework)
171
+
172
+ def _forward(self, model_inputs):
173
+ return self.model(**model_inputs)
174
+
175
+ def postprocess(self, model_outputs):
176
+ logits = model_outputs.logits[0].numpy()
177
+ probabilities = softmax(logits)
178
+
179
+ best_class = np.argmax(probabilities)
180
+ label = self.model.config.id2label[best_class]
181
+ score = probabilities[best_class].item()
182
+ logits = logits.tolist()
183
+ return {"label": label, "score": score, "logits": logits}
184
+ ```
185
+
186
+ Die Implementierung ist Framework-unabhängig und funktioniert für PyTorch- und TensorFlow-Modelle. Wenn wir dies in einer Datei
187
+ einer Datei namens `pair_classification.py` gespeichert haben, können wir sie importieren und wie folgt registrieren:
188
+
189
+ ```py
190
+ from pair_classification import PairClassificationPipeline
191
+ from transformers.pipelines import PIPELINE_REGISTRY
192
+ from transformers import AutoModelForSequenceClassification, TFAutoModelForSequenceClassification
193
+
194
+ PIPELINE_REGISTRY.register_pipeline(
195
+ "pair-classification",
196
+ pipeline_class=PairClassificationPipeline,
197
+ pt_model=AutoModelForSequenceClassification,
198
+ tf_model=TFAutoModelForSequenceClassification,
199
+ )
200
+ ```
201
+
202
+ Sobald dies geschehen ist, können wir es mit einem vortrainierten Modell verwenden. Zum Beispiel wurde `sgugger/finetuned-bert-mrpc` auf den
203
+ auf den MRPC-Datensatz abgestimmt, der Satzpaare als Paraphrasen oder nicht klassifiziert.
204
+
205
+ ```py
206
+ from transformers import pipeline
207
+
208
+ classifier = pipeline("pair-classification", model="sgugger/finetuned-bert-mrpc")
209
+ ```
210
+
211
+ Dann können wir sie auf dem Hub mit der Methode `push_to_hub` freigeben:
212
+
213
+ ```py
214
+ classifier.push_to_hub("test-dynamic-pipeline")
215
+ ```
216
+
217
+ Dadurch wird die Datei, in der Sie `PairClassificationPipeline` definiert haben, in den Ordner `"test-dynamic-pipeline"` kopiert,
218
+ und speichert das Modell und den Tokenizer der Pipeline, bevor Sie alles in das Repository verschieben
219
+ `{Ihr_Benutzername}/test-dynamic-pipeline`. Danach kann jeder die Pipeline verwenden, solange er die Option
220
+ `trust_remote_code=True` angeben:
221
+
222
+ ```py
223
+ from transformers import pipeline
224
+
225
+ classifier = pipeline(model="{your_username}/test-dynamic-pipeline", trust_remote_code=True)
226
+ ```
227
+
228
+ ## Hinzufügen der Pipeline zu 🤗 Transformers
229
+
230
+ Wenn Sie Ihre Pipeline zu 🤗 Transformers beitragen möchten, müssen Sie ein neues Modul im Untermodul `pipelines` hinzufügen
231
+ mit dem Code Ihrer Pipeline hinzufügen. Fügen Sie es dann der Liste der in `pipelines/__init__.py` definierten Aufgaben hinzu.
232
+
233
+ Dann müssen Sie noch Tests hinzufügen. Erstellen Sie eine neue Datei `tests/test_pipelines_MY_PIPELINE.py` mit Beispielen für die anderen Tests.
234
+
235
+ Die Funktion `run_pipeline_test` ist sehr allgemein gehalten und läuft auf kleinen Zufallsmodellen auf jeder möglichen
236
+ Architektur, wie durch `model_mapping` und `tf_model_mapping` definiert.
237
+
238
+ Dies ist sehr wichtig, um die zukünftige Kompatibilität zu testen, d.h. wenn jemand ein neues Modell für
239
+ `XXXForQuestionAnswering` hinzufügt, wird der Pipeline-Test versuchen, mit diesem Modell zu arbeiten. Da die Modelle zufällig sind, ist es
240
+ ist es unmöglich, die tatsächlichen Werte zu überprüfen. Deshalb gibt es eine Hilfsfunktion `ANY`, die einfach versucht, die
241
+ Ausgabe der Pipeline TYPE.
242
+
243
+ Außerdem *müssen* Sie 2 (idealerweise 4) Tests implementieren.
244
+
245
+ - `test_small_model_pt` : Definieren Sie 1 kleines Modell für diese Pipeline (es spielt keine Rolle, ob die Ergebnisse keinen Sinn ergeben)
246
+ und testen Sie die Ausgaben der Pipeline. Die Ergebnisse sollten die gleichen sein wie bei `test_small_model_tf`.
247
+ - `test_small_model_tf` : Definieren Sie 1 kleines Modell für diese Pipeline (es spielt keine Rolle, ob die Ergebnisse keinen Sinn ergeben)
248
+ und testen Sie die Ausgaben der Pipeline. Die Ergebnisse sollten die gleichen sein wie bei `test_small_model_pt`.
249
+ - `test_large_model_pt` (`optional`): Testet die Pipeline an einer echten Pipeline, bei der die Ergebnisse
250
+ Sinn machen. Diese Tests sind langsam und sollten als solche gekennzeichnet werden. Hier geht es darum, die Pipeline zu präsentieren und sicherzustellen
251
+ sicherzustellen, dass es in zukünftigen Versionen keine Abweichungen gibt.
252
+ - `test_large_model_tf` (`optional`): Testet die Pipeline an einer echten Pipeline, bei der die Ergebnisse
253
+ Sinn machen. Diese Tests sind langsam und sollten als solche gekennzeichnet werden. Hier geht es darum, die Pipeline zu präsentieren und sicherzustellen
254
+ sicherzustellen, dass es in zukünftigen Versionen keine Abweichungen gibt.
autoclass_tutorial.md ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Vortrainierte Instanzen mit einer AutoClass laden
18
+
19
+ Bei so vielen verschiedenen Transformator-Architekturen kann es eine Herausforderung sein, eine für Ihren Checkpoint zu erstellen. Als Teil der 🤗 Transformers Kernphilosophie, die Bibliothek leicht, einfach und flexibel nutzbar zu machen, leitet eine `AutoClass` automatisch die richtige Architektur aus einem gegebenen Checkpoint ab und lädt sie. Mit der Methode `from_pretrained()` kann man schnell ein vortrainiertes Modell für eine beliebige Architektur laden, so dass man keine Zeit und Ressourcen aufwenden muss, um ein Modell von Grund auf zu trainieren. Die Erstellung dieser Art von Checkpoint-agnostischem Code bedeutet, dass Ihr Code, wenn er für einen Checkpoint funktioniert, auch mit einem anderen Checkpoint funktionieren wird - solange er für eine ähnliche Aufgabe trainiert wurde - selbst wenn die Architektur unterschiedlich ist.
20
+
21
+ <Tip>
22
+
23
+ Denken Sie daran, dass sich die Architektur auf das Skelett des Modells bezieht und die Checkpoints die Gewichte für eine bestimmte Architektur sind. Zum Beispiel ist [BERT](https://huggingface.co/google-bert/bert-base-uncased) eine Architektur, während `google-bert/bert-base-uncased` ein Checkpoint ist. Modell ist ein allgemeiner Begriff, der entweder Architektur oder Prüfpunkt bedeuten kann.
24
+
25
+ </Tip>
26
+
27
+ In dieser Anleitung lernen Sie, wie man:
28
+
29
+ * Einen vortrainierten Tokenizer lädt.
30
+ * Einen vortrainierten Merkmalsextraktor lädt.
31
+ * Einen vortrainierten Prozessor lädt.
32
+ * Ein vortrainiertes Modell lädt.
33
+
34
+ ## AutoTokenizer
35
+
36
+ Nahezu jede NLP-Aufgabe beginnt mit einem Tokenizer. Ein Tokenizer wandelt Ihre Eingabe in ein Format um, das vom Modell verarbeitet werden kann.
37
+
38
+ Laden Sie einen Tokenizer mit [`AutoTokenizer.from_pretrained`]:
39
+
40
+ ```py
41
+ >>> from transformers import AutoTokenizer
42
+
43
+ >>> tokenizer = AutoTokenizer.from_pretrained("google-bert/bert-base-uncased")
44
+ ```
45
+
46
+ Dann tokenisieren Sie Ihre Eingabe wie unten gezeigt:
47
+
48
+ ```py
49
+ >>> sequence = "In a hole in the ground there lived a hobbit."
50
+ >>> print(tokenizer(sequence))
51
+ {'input_ids': [101, 1999, 1037, 4920, 1999, 1996, 2598, 2045, 2973, 1037, 7570, 10322, 4183, 1012, 102],
52
+ 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
53
+ 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
54
+ ```
55
+
56
+ ## AutoFeatureExtractor
57
+
58
+ Für Audio- und Bildverarbeitungsaufgaben verarbeitet ein Merkmalsextraktor das Audiosignal oder Bild in das richtige Eingabeformat.
59
+
60
+ Laden Sie einen Merkmalsextraktor mit [`AutoFeatureExtractor.from_pretrained`]:
61
+
62
+ ```py
63
+ >>> from transformers import AutoFeatureExtractor
64
+
65
+ >>> feature_extractor = AutoFeatureExtractor.from_pretrained(
66
+ ... "ehcalabres/wav2vec2-lg-xlsr-en-speech-emotion-recognition"
67
+ ... )
68
+ ```
69
+
70
+ ## AutoProcessor
71
+
72
+ Multimodale Aufgaben erfordern einen Prozessor, der zwei Arten von Vorverarbeitungswerkzeugen kombiniert. Das Modell [LayoutLMV2](model_doc/layoutlmv2) beispielsweise benötigt einen Feature-Extraktor für Bilder und einen Tokenizer für Text; ein Prozessor kombiniert beide.
73
+
74
+ Laden Sie einen Prozessor mit [`AutoProcessor.from_pretrained`]:
75
+
76
+ ```py
77
+ >>> from transformers import AutoProcessor
78
+
79
+ >>> processor = AutoProcessor.from_pretrained("microsoft/layoutlmv2-base-uncased")
80
+ ```
81
+
82
+ ## AutoModel
83
+
84
+ <frameworkcontent>
85
+ <pt>
86
+ Mit den `AutoModelFor`-Klassen können Sie schließlich ein vortrainiertes Modell für eine bestimmte Aufgabe laden (siehe [hier](model_doc/auto) für eine vollständige Liste der verfügbaren Aufgaben). Laden Sie zum Beispiel ein Modell für die Sequenzklassifikation mit [`AutoModelForSequenceClassification.from_pretrained`]:
87
+
88
+ ```py
89
+ >>> from transformers import AutoModelForSequenceClassification
90
+
91
+ >>> model = AutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
92
+ ```
93
+
94
+ Sie können denselben Prüfpunkt problemlos wiederverwenden, um eine Architektur für eine andere Aufgabe zu laden:
95
+
96
+ ```py
97
+ >>> from transformers import AutoModelForTokenClassification
98
+
99
+ >>> model = AutoModelForTokenClassification.from_pretrained("distilbert/distilbert-base-uncased")
100
+ ```
101
+
102
+ <Tip warning={true}>
103
+
104
+ Für PyTorch-Modelle verwendet die Methode `from_pretrained()` `torch.load()`, die intern `pickle` verwendet und als unsicher bekannt ist. Generell sollte man niemals ein Modell laden, das aus einer nicht vertrauenswürdigen Quelle stammen könnte, oder das manipuliert worden sein könnte. Dieses Sicherheitsrisiko wird für öffentliche Modelle, die auf dem Hugging Face Hub gehostet werden, teilweise gemildert, da diese bei jeder Übertragung [auf Malware](https://huggingface.co/docs/hub/security-malware) gescannt werden. Siehe die [Hub-Dokumentation](https://huggingface.co/docs/hub/security) für Best Practices wie [signierte Commit-Verifizierung](https://huggingface.co/docs/hub/security-gpg#signing-commits-with-gpg) mit GPG.
105
+
106
+ TensorFlow- und Flax-Checkpoints sind nicht betroffen und können in PyTorch-Architekturen mit den Kwargs `from_tf` und `from_flax` für die Methode `from_pretrained` geladen werden, um dieses Problem zu umgehen.
107
+
108
+ </Tip>
109
+
110
+ Im Allgemeinen empfehlen wir die Verwendung der Klasse "AutoTokenizer" und der Klasse "AutoModelFor", um trainierte Instanzen von Modellen zu laden. Dadurch wird sichergestellt, dass Sie jedes Mal die richtige Architektur laden. Im nächsten [Tutorial] (Vorverarbeitung) erfahren Sie, wie Sie Ihren neu geladenen Tokenizer, Feature Extractor und Prozessor verwenden, um einen Datensatz für die Feinabstimmung vorzuverarbeiten.
111
+ </pt>
112
+ <tf>
113
+ Mit den Klassen `TFAutoModelFor` schließlich können Sie ein vortrainiertes Modell für eine bestimmte Aufgabe laden (siehe [hier](model_doc/auto) für eine vollständige Liste der verfügbaren Aufgaben). Laden Sie zum Beispiel ein Modell für die Sequenzklassifikation mit [`TFAutoModelForSequenceClassification.from_pretrained`]:
114
+
115
+ ```py
116
+ >>> from transformers import TFAutoModelForSequenceClassification
117
+
118
+ >>> model = TFAutoModelForSequenceClassification.from_pretrained("distilbert/distilbert-base-uncased")
119
+ ```
120
+
121
+ Sie können denselben Prüfpunkt problemlos wiederverwenden, um eine Architektur für eine andere Aufgabe zu laden:
122
+
123
+ ```py
124
+ >>> from transformers import TFAutoModelForTokenClassification
125
+
126
+ >>> model = TFAutoModelForTokenClassification.from_pretrained("distilbert/distilbert-base-uncased")
127
+ ```
128
+
129
+ Im Allgemeinen empfehlen wir, die Klasse "AutoTokenizer" und die Klasse "TFAutoModelFor" zu verwenden, um vortrainierte Instanzen von Modellen zu laden. Dadurch wird sichergestellt, dass Sie jedes Mal die richtige Architektur laden. Im nächsten [Tutorial] (Vorverarbeitung) erfahren Sie, wie Sie Ihren neu geladenen Tokenizer, Feature Extractor und Prozessor verwenden, um einen Datensatz für die Feinabstimmung vorzuverarbeiten.
130
+ </tf>
131
+ </frameworkcontent>
awesome-transformers.md ADDED
@@ -0,0 +1,609 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Awesome projects built with Transformers
2
+
3
+ This page lists awesome projects built on top of Transformers. Transformers is more than a toolkit to use pretrained
4
+ models: it's a community of projects built around it and the Hugging Face Hub. We want Transformers to enable
5
+ developers, researchers, students, professors, engineers, and anyone else to build their dream projects.
6
+
7
+ In this list, we showcase incredibly impactful and novel projects that have pushed the field forward. We celebrate
8
+ 100 of these projects as we reach the milestone of 100k stars as a community; but we're very open to pull requests
9
+ adding other projects to the list. If you believe a project should be here and it's not, then please, open a PR
10
+ to add it.
11
+
12
+ ## [gpt4all](https://github.com/nomic-ai/gpt4all)
13
+
14
+ [gpt4all](https://github.com/nomic-ai/gpt4all) is an ecosystem of open-source chatbots trained on massive collections of clean assistant data including code, stories and dialogue. It offers open-source, large language models such as LLaMA and GPT-J trained in an assistant-style.
15
+
16
+ Keywords: Open-source, LLaMa, GPT-J, instruction, assistant
17
+
18
+ ## [recommenders](https://github.com/microsoft/recommenders)
19
+
20
+ This repository contains examples and best practices for building recommendation systems, provided as Jupyter notebooks. It goes over several aspects required to build efficient recommendation systems: data preparation, modeling, evaluation, model selection & optimization, as well as operationalization
21
+
22
+ Keywords: Recommender systems, AzureML
23
+
24
+ ## [IOPaint](https://github.com/Sanster/IOPaint)
25
+
26
+ Image inpainting tool powered by Stable Diffusion. Remove any unwanted object, defect, people from your pictures or erase and replace anything on your pictures.
27
+
28
+ Keywords: inpainting, SD, Stable Diffusion
29
+
30
+ ## [flair](https://github.com/flairNLP/flair)
31
+
32
+ FLAIR is a powerful PyTorch NLP framework, convering several important tasks: NER, sentiment-analysis, part-of-speech tagging, text and document embeddings, among other things.
33
+
34
+ Keywords: NLP, text embedding, document embedding, biomedical, NER, PoS, sentiment-analysis
35
+
36
+ ## [mindsdb](https://github.com/mindsdb/mindsdb)
37
+
38
+ MindsDB is a low-code ML platform, which automates and integrates several ML frameworks into the data stack as "AI Tables" to streamline the integration of AI into applications, making it accessible to developers of all skill levels.
39
+
40
+ Keywords: Database, low-code, AI table
41
+
42
+ ## [langchain](https://github.com/hwchase17/langchain)
43
+
44
+ [langchain](https://github.com/hwchase17/langchain) is aimed at assisting in the development of apps merging both LLMs and other sources of knowledge. The library allows chaining calls to applications, creating a sequence across many tools.
45
+
46
+ Keywords: LLMs, Large Language Models, Agents, Chains
47
+
48
+ ## [LlamaIndex](https://github.com/jerryjliu/llama_index)
49
+
50
+ [LlamaIndex](https://github.com/jerryjliu/llama_index) is a project that provides a central interface to connect your LLM's with external data. It provides various kinds of indices and retreival mechanisms to perform different LLM tasks and obtain knowledge-augmented results.
51
+
52
+ Keywords: LLMs, Large Language Models, Data Retrieval, Indices, Knowledge Augmentation
53
+
54
+ ## [ParlAI](https://github.com/facebookresearch/ParlAI)
55
+
56
+ [ParlAI](https://github.com/facebookresearch/ParlAI) is a python framework for sharing, training and testing dialogue models, from open-domain chitchat, to task-oriented dialogue, to visual question answering. It provides more than 100 datasets under the same API, a large zoo of pretrained models, a set of agents, and has several integrations.
57
+
58
+ Keywords: Dialogue, Chatbots, VQA, Datasets, Agents
59
+
60
+ ## [sentence-transformers](https://github.com/UKPLab/sentence-transformers)
61
+
62
+ This framework provides an easy method to compute dense vector representations for sentences, paragraphs, and images. The models are based on transformer networks like BERT / RoBERTa / XLM-RoBERTa etc. and achieve state-of-the-art performance in various task. Text is embedding in vector space such that similar text is close and can efficiently be found using cosine similarity.
63
+
64
+ Keywords: Dense vector representations, Text embeddings, Sentence embeddings
65
+
66
+ ## [ludwig](https://github.com/ludwig-ai/ludwig)
67
+
68
+ Ludwig is a declarative machine learning framework that makes it easy to define machine learning pipelines using a simple and flexible data-driven configuration system. Ludwig is targeted at a wide variety of AI tasks. It provides a data-driven configuration system, training, prediction, and evaluation scripts, as well as a programmatic API.
69
+
70
+ Keywords: Declarative, Data-driven, ML Framework
71
+
72
+ ## [InvokeAI](https://github.com/invoke-ai/InvokeAI)
73
+
74
+ [InvokeAI](https://github.com/invoke-ai/InvokeAI) is an engine for Stable Diffusion models, aimed at professionals, artists, and enthusiasts. It leverages the latest AI-driven technologies through CLI as well as a WebUI.
75
+
76
+ Keywords: Stable-Diffusion, WebUI, CLI
77
+
78
+ ## [PaddleNLP](https://github.com/PaddlePaddle/PaddleNLP)
79
+
80
+ [PaddleNLP](https://github.com/PaddlePaddle/PaddleNLP) is an easy-to-use and powerful NLP library particularly targeted at the Chinese languages. It has support for multiple pre-trained model zoos, and supports a wide-range of NLP tasks from research to industrial applications.
81
+
82
+ Keywords: NLP, Chinese, Research, Industry
83
+
84
+ ## [stanza](https://github.com/stanfordnlp/stanza)
85
+
86
+ The Stanford NLP Group's official Python NLP library. It contains support for running various accurate natural language processing tools on 60+ languages and for accessing the Java Stanford CoreNLP software from Python.
87
+
88
+ Keywords: NLP, Multilingual, CoreNLP
89
+
90
+ ## [DeepPavlov](https://github.com/deeppavlov/DeepPavlov)
91
+
92
+ [DeepPavlov](https://github.com/deeppavlov/DeepPavlov) is an open-source conversational AI library. It is designed for the development of production ready chat-bots and complex conversational systems, as well as research in the area of NLP and, particularly, of dialog systems.
93
+
94
+ Keywords: Conversational, Chatbot, Dialog
95
+
96
+ ## [alpaca-lora](https://github.com/tloen/alpaca-lora)
97
+
98
+ Alpaca-lora contains code for reproducing the Stanford Alpaca results using low-rank adaptation (LoRA). The repository provides training (fine-tuning) as well as generation scripts.
99
+
100
+ Keywords: LoRA, Parameter-efficient fine-tuning
101
+
102
+ ## [imagen-pytorch](https://github.com/lucidrains/imagen-pytorch)
103
+
104
+ An open-source Implementation of Imagen, Google's closed-source Text-to-Image Neural Network that beats DALL-E2. As of release, it is the new SOTA for text-to-image synthesis.
105
+
106
+ Keywords: Imagen, Text-to-image
107
+
108
+ ## [adapters](https://github.com/adapter-hub/adapters)
109
+
110
+ [adapters](https://github.com/adapter-hub/adapters) is an extension of HuggingFace's Transformers library, integrating adapters into state-of-the-art language models by incorporating AdapterHub, a central repository for pre-trained adapter modules. It is a drop-in replacement for transformers, which is regularly updated to stay up-to-date with the developments of transformers.
111
+
112
+ Keywords: Adapters, LoRA, Parameter-efficient fine-tuning, Hub
113
+
114
+ ## [NeMo](https://github.com/NVIDIA/NeMo)
115
+
116
+ NVIDIA [NeMo](https://github.com/NVIDIA/NeMo) is a conversational AI toolkit built for researchers working on automatic speech recognition (ASR), text-to-speech synthesis (TTS), large language models (LLMs), and natural language processing (NLP). The primary objective of [NeMo](https://github.com/NVIDIA/NeMo) is to help researchers from industry and academia to reuse prior work (code and pretrained models) and make it easier to create new https://developer.nvidia.com/conversational-ai#started.
117
+
118
+ Keywords: Conversational, ASR, TTS, LLMs, NLP
119
+
120
+ ## [Runhouse](https://github.com/run-house/runhouse)
121
+
122
+ [Runhouse](https://github.com/run-house/runhouse) allows to send code and data to any of your compute or data infra, all in Python, and continue to interact with them normally from your existing code and environment. Runhouse developers mention:
123
+
124
+ > Think of it as an expansion pack to your Python interpreter that lets it take detours to remote machines or manipulate remote data.
125
+
126
+ Keywords: MLOps, Infrastructure, Data storage, Modeling
127
+
128
+ ## [MONAI](https://github.com/Project-MONAI/MONAI)
129
+
130
+ [MONAI](https://github.com/Project-MONAI/MONAI) is a PyTorch-based, open-source framework for deep learning in healthcare imaging, part of PyTorch Ecosystem. Its ambitions are:
131
+ - developing a community of academic, industrial and clinical researchers collaborating on a common foundation;
132
+ - creating state-of-the-art, end-to-end training workflows for healthcare imaging;
133
+ - providing researchers with the optimized and standardized way to create and evaluate deep learning models.
134
+
135
+ Keywords: Healthcare imaging, Training, Evaluation
136
+
137
+ ## [simpletransformers](https://github.com/ThilinaRajapakse/simpletransformers)
138
+
139
+ Simple Transformers lets you quickly train and evaluate Transformer models. Only 3 lines of code are needed to initialize, train, and evaluate a model. It supports a wide variety of NLP tasks.
140
+
141
+ Keywords: Framework, simplicity, NLP
142
+
143
+ ## [JARVIS](https://github.com/microsoft/JARVIS)
144
+
145
+ [JARVIS](https://github.com/microsoft/JARVIS) is a system attempting to merge LLMs such as GPT-4 with the rest of the open-source ML community: leveraging up to 60 downstream models in order to perform tasks identified by the LLM.
146
+
147
+ Keywords: LLM, Agents, HF Hub
148
+
149
+ ## [transformers.js](https://xenova.github.io/transformers.js/)
150
+
151
+ [transformers.js](https://xenova.github.io/transformers.js/) is a JavaScript library targeted at running models from transformers directly within the browser.
152
+
153
+ Keywords: Transformers, JavaScript, browser
154
+
155
+ ## [bumblebee](https://github.com/elixir-nx/bumblebee)
156
+
157
+ Bumblebee provides pre-trained Neural Network models on top of Axon, a neural networks library for the Elixir language. It includes integration with 🤗 Models, allowing anyone to download and perform Machine Learning tasks with few lines of code.
158
+
159
+ Keywords: Elixir, Axon
160
+
161
+ ## [argilla](https://github.com/argilla-io/argilla)
162
+
163
+ Argilla is an open-source platform providing advanced NLP labeling, monitoring, and workspaces. It is compatible with many open source ecosystems such as Hugging Face, Stanza, FLAIR, and others.
164
+
165
+ Keywords: NLP, Labeling, Monitoring, Workspaces
166
+
167
+ ## [haystack](https://github.com/deepset-ai/haystack)
168
+
169
+ Haystack is an open source NLP framework to interact with your data using Transformer models and LLMs. It offers production-ready tools to quickly build complex decision making, question answering, semantic search, text generation applications, and more.
170
+
171
+ Keywords: NLP, Framework, LLM
172
+
173
+ ## [spaCy](https://github.com/explosion/spaCy)
174
+
175
+ [spaCy](https://github.com/explosion/spaCy) is a library for advanced Natural Language Processing in Python and Cython. It's built on the very latest research, and was designed from day one to be used in real products. It offers support for transformers models through its third party package, spacy-transformers.
176
+
177
+ Keywords: NLP, Framework
178
+
179
+ ## [speechbrain](https://github.com/speechbrain/speechbrain)
180
+
181
+ SpeechBrain is an open-source and all-in-one conversational AI toolkit based on PyTorch.
182
+ The goal is to create a single, flexible, and user-friendly toolkit that can be used to easily develop state-of-the-art speech technologies, including systems for speech recognition, speaker recognition, speech enhancement, speech separation, language identification, multi-microphone signal processing, and many others.
183
+
184
+ Keywords: Conversational, Speech
185
+
186
+ ## [skorch](https://github.com/skorch-dev/skorch)
187
+
188
+ Skorch is a scikit-learn compatible neural network library that wraps PyTorch. It has support for models within transformers, and tokenizers from tokenizers.
189
+
190
+ Keywords: Scikit-Learn, PyTorch
191
+
192
+ ## [bertviz](https://github.com/jessevig/bertviz)
193
+
194
+ BertViz is an interactive tool for visualizing attention in Transformer language models such as BERT, GPT2, or T5. It can be run inside a Jupyter or Colab notebook through a simple Python API that supports most Huggingface models.
195
+
196
+ Keywords: Visualization, Transformers
197
+
198
+ ## [mesh-transformer-jax](https://github.com/kingoflolz/mesh-transformer-jax)
199
+
200
+ [mesh-transformer-jax](https://github.com/kingoflolz/mesh-transformer-jax) is a haiku library using the xmap/pjit operators in JAX for model parallelism of transformers. This library is designed for scalability up to approximately 40B parameters on TPUv3s. It was the library used to train the GPT-J model.
201
+
202
+ Keywords: Haiku, Model parallelism, LLM, TPU
203
+
204
+ ## [deepchem](https://github.com/deepchem/deepchem)
205
+
206
+ DeepChem aims to provide a high quality open-source toolchain that democratizes the use of deep-learning in drug discovery, materials science, quantum chemistry, and biology.
207
+
208
+ Keywords: Drug discovery, Materials Science, Quantum Chemistry, Biology
209
+
210
+ ## [OpenNRE](https://github.com/thunlp/OpenNRE)
211
+
212
+ An Open-Source Package for Neural Relation Extraction (NRE). It is targeted at a wide range of users, from newcomers to relation extraction, to developers, researchers, or students.
213
+
214
+ Keywords: Neural Relation Extraction, Framework
215
+
216
+ ## [pycorrector](https://github.com/shibing624/pycorrector)
217
+
218
+ PyCorrector is a Chinese Text Error Correction Tool. It uses a language model to detect errors, pinyin feature and shape feature to correct Chinese text errors. it can be used for Chinese Pinyin and stroke input method.
219
+
220
+ Keywords: Chinese, Error correction tool, Language model, Pinyin
221
+
222
+ ## [nlpaug](https://github.com/makcedward/nlpaug)
223
+
224
+ This python library helps you with augmenting nlp for machine learning projects. It is a lightweight library featuring synthetic data generation for improving model performance, support for audio and text, and compatibility with several ecosystems (scikit-learn, pytorch, tensorflow).
225
+
226
+ Keywords: Data augmentation, Synthetic data generation, Audio, NLP
227
+
228
+ ## [dream-textures](https://github.com/carson-katri/dream-textures)
229
+
230
+ [dream-textures](https://github.com/carson-katri/dream-textures) is a library targeted at bringing stable-diffusion support within Blender. It supports several use-cases, such as image generation, texture projection, inpainting/outpainting, ControlNet, and upscaling.
231
+
232
+ Keywords: Stable-Diffusion, Blender
233
+
234
+ ## [seldon-core](https://github.com/SeldonIO/seldon-core)
235
+
236
+ Seldon core converts your ML models (Tensorflow, Pytorch, H2o, etc.) or language wrappers (Python, Java, etc.) into production REST/GRPC microservices.
237
+ Seldon handles scaling to thousands of production machine learning models and provides advanced machine learning capabilities out of the box including Advanced Metrics, Request Logging, Explainers, Outlier Detectors, A/B Tests, Canaries and more.
238
+
239
+ Keywords: Microservices, Modeling, Language wrappers
240
+
241
+ ## [open_model_zoo](https://github.com/openvinotoolkit/open_model_zoo)
242
+
243
+ This repository includes optimized deep learning models and a set of demos to expedite development of high-performance deep learning inference applications. Use these free pre-trained models instead of training your own models to speed-up the development and production deployment process.
244
+
245
+ Keywords: Optimized models, Demos
246
+
247
+ ## [ml-stable-diffusion](https://github.com/apple/ml-stable-diffusion)
248
+
249
+ ML-Stable-Diffusion is a repository by Apple bringing Stable Diffusion support to Core ML, on Apple Silicon devices. It supports stable diffusion checkpoints hosted on the Hugging Face Hub.
250
+
251
+ Keywords: Stable Diffusion, Apple Silicon, Core ML
252
+
253
+ ## [stable-dreamfusion](https://github.com/ashawkey/stable-dreamfusion)
254
+
255
+ Stable-Dreamfusion is a pytorch implementation of the text-to-3D model Dreamfusion, powered by the Stable Diffusion text-to-2D model.
256
+
257
+ Keywords: Text-to-3D, Stable Diffusion
258
+
259
+ ## [txtai](https://github.com/neuml/txtai)
260
+
261
+ [txtai](https://github.com/neuml/txtai) is an open-source platform for semantic search and workflows powered by language models. txtai builds embeddings databases, which are a union of vector indexes and relational databases enabling similarity search with SQL. Semantic workflows connect language models together into unified applications.
262
+
263
+ Keywords: Semantic search, LLM
264
+
265
+ ## [djl](https://github.com/deepjavalibrary/djl)
266
+
267
+ Deep Java Library (DJL) is an open-source, high-level, engine-agnostic Java framework for deep learning. DJL is designed to be easy to get started with and simple to use for developers. DJL provides a native Java development experience and functions like any other regular Java library. DJL offers [a Java binding](https://github.com/deepjavalibrary/djl/tree/master/extensions/tokenizers) for HuggingFace Tokenizers and easy conversion toolkit for HuggingFace model to deploy in Java.
268
+
269
+ Keywords: Java, Framework
270
+
271
+ ## [lm-evaluation-harness](https://github.com/EleutherAI/lm-evaluation-harness/)
272
+
273
+ This project provides a unified framework to test generative language models on a large number of different evaluation tasks. It has support for more than 200 tasks, and supports different ecosystems: HF Transformers, GPT-NeoX, DeepSpeed, as well as the OpenAI API.
274
+
275
+ Keywords: LLM, Evaluation, Few-shot
276
+
277
+ ## [gpt-neox](https://github.com/EleutherAI/gpt-neox)
278
+
279
+ This repository records EleutherAI's library for training large-scale language models on GPUs. The framework is based on NVIDIA's Megatron Language Model and has been augmented with techniques from DeepSpeed as well as some novel optimizations. It is focused on training multi-billion-parameter models.
280
+
281
+ Keywords: Training, LLM, Megatron, DeepSpeed
282
+
283
+ ## [muzic](https://github.com/microsoft/muzic)
284
+
285
+ Muzic is a research project on AI music that empowers music understanding and generation with deep learning and artificial intelligence. Muzic was created by researchers from Microsoft Research Asia.
286
+
287
+ Keywords: Music understanding, Music generation
288
+
289
+ ## [dalle-flow](https://github.com/jina-ai/dalle-flow)
290
+
291
+ DALL·E Flow is an interactive workflow for generating high-definition images from a text prompt. Itt leverages DALL·E-Mega, GLID-3 XL, and Stable Diffusion to generate image candidates, and then calls CLIP-as-service to rank the candidates w.r.t. the prompt.
292
+ The preferred candidate is fed to GLID-3 XL for diffusion, which often enriches the texture and background. Finally, the candidate is upscaled to 1024x1024 via SwinIR.
293
+
294
+ Keywords: High-definition image generation, Stable Diffusion, DALL-E Mega, GLID-3 XL, CLIP, SwinIR
295
+
296
+ ## [lightseq](https://github.com/bytedance/lightseq)
297
+
298
+ LightSeq is a high performance training and inference library for sequence processing and generation implemented in CUDA. It enables highly efficient computation of modern NLP and CV models such as BERT, GPT, Transformer, etc. It is therefore best useful for machine translation, text generation, image classification, and other sequence related tasks.
299
+
300
+ Keywords: Training, Inference, Sequence Processing, Sequence Generation
301
+
302
+ ## [LaTeX-OCR](https://github.com/lukas-blecher/LaTeX-OCR)
303
+
304
+ The goal of this project is to create a learning based system that takes an image of a math formula and returns corresponding LaTeX code.
305
+
306
+ Keywords: OCR, LaTeX, Math formula
307
+
308
+ ## [open_clip](https://github.com/mlfoundations/open_clip)
309
+
310
+ OpenCLIP is an open source implementation of OpenAI's CLIP.
311
+
312
+ The goal of this repository is to enable training models with contrastive image-text supervision, and to investigate their properties such as robustness to distribution shift.
313
+ The starting point is an implementation of CLIP that matches the accuracy of the original CLIP models when trained on the same dataset.
314
+
315
+ Specifically, a ResNet-50 model trained with this codebase on OpenAI's 15 million image subset of YFCC achieves 32.7% top-1 accuracy on ImageNet.
316
+
317
+ Keywords: CLIP, Open-source, Contrastive, Image-text
318
+
319
+ ## [dalle-playground](https://github.com/saharmor/dalle-playground)
320
+
321
+ A playground to generate images from any text prompt using Stable Diffusion and Dall-E mini.
322
+
323
+ Keywords: WebUI, Stable Diffusion, Dall-E mini
324
+
325
+ ## [FedML](https://github.com/FedML-AI/FedML)
326
+
327
+ [FedML](https://github.com/FedML-AI/FedML) is a federated learning and analytics library enabling secure and collaborative machine learning on decentralized data anywhere at any scale.
328
+
329
+ It supports large-scale cross-silo federated learning, and cross-device federated learning on smartphones/IoTs, and research simulation.
330
+
331
+ Keywords: Federated Learning, Analytics, Collaborative ML, Decentralized
332
+
333
+ ## [gpt-code-clippy](https://github.com/CodedotAl/gpt-code-clippy)
334
+
335
+ GPT-Code-Clippy (GPT-CC) is an open source version of GitHub Copilot, a language model -- based on GPT-3, called GPT-Codex -- that is fine-tuned on publicly available code from GitHub.
336
+
337
+ Keywords: LLM, Code
338
+
339
+ ## [TextAttack](https://github.com/QData/TextAttack)
340
+
341
+ [TextAttack](https://github.com/QData/TextAttack) 🐙 is a Python framework for adversarial attacks, data augmentation, and model training in NLP.
342
+
343
+ Keywords: Adversarial attacks, Data augmentation, NLP
344
+
345
+ ## [OpenPrompt](https://github.com/thunlp/OpenPrompt)
346
+
347
+ Prompt-learning is a paradigm to adapt pre-trained language models (PLMs) to downstream NLP tasks, which modify the input text with a textual template and directly uses PLMs to conduct pre-trained tasks. This library provides a standard, flexible and extensible framework to deploy the prompt-learning pipeline. [OpenPrompt](https://github.com/thunlp/OpenPrompt) supports loading PLMs directly from https://github.com/huggingface/transformers.
348
+
349
+ ## [text-generation-webui](https://github.com/oobabooga/text-generation-webui/)
350
+
351
+ [text-generation-webui](https://github.com/oobabooga/text-generation-webui/) is a Gradio Web UI for running Large Language Models like LLaMA, llama.cpp, GPT-J, Pythia, OPT, and GALACTICA.
352
+
353
+ Keywords: LLM, WebUI
354
+
355
+ ## [libra](https://github.com/Palashio/libra)
356
+
357
+ An ergonomic machine learning [libra](https://github.com/Palashio/libra)ry for non-technical users. It focuses on ergonomics and on ensuring that training a model is as simple as it can be.
358
+
359
+ Keywords: Ergonomic, Non-technical
360
+
361
+ ## [alibi](https://github.com/SeldonIO/alibi)
362
+
363
+ Alibi is an open source Python library aimed at machine learning model inspection and interpretation. The focus of the library is to provide high-quality implementations of black-box, white-box, local and global explanation methods for classification and regression models.
364
+
365
+ Keywords: Model inspection, Model interpretation, Black-box, White-box
366
+
367
+ ## [tortoise-tts](https://github.com/neonbjb/tortoise-tts)
368
+
369
+ Tortoise is a text-to-speech program built with the following priorities: strong multi-voice capabilities, and highly realistic prosody and intonation.
370
+
371
+ Keywords: Text-to-speech
372
+
373
+ ## [flower](https://github.com/adap/flower)
374
+
375
+ Flower (flwr) is a framework for building federated learning systems. The design of Flower is based on a few guiding principles: customizability, extendability, framework agnosticity, and ease-of-use.
376
+
377
+ Keywords: Federated learning systems, Customizable, Extendable, Framework-agnostic, Simplicity
378
+
379
+ ## [fast-bert](https://github.com/utterworks/fast-bert)
380
+
381
+ Fast-Bert is a deep learning library that allows developers and data scientists to train and deploy BERT and XLNet based models for natural language processing tasks beginning with Text Classification. It is aimed at simplicity.
382
+
383
+ Keywords: Deployment, BERT, XLNet
384
+
385
+ ## [towhee](https://github.com/towhee-io/towhee)
386
+
387
+ Towhee makes it easy to build neural data processing pipelines for AI applications. We provide hundreds of models, algorithms, and transformations that can be used as standard pipeline building blocks. Users can use Towhee's Pythonic API to build a prototype of their pipeline and automatically optimize it for production-ready environments.
388
+
389
+ Keywords: Data processing pipeline, Optimization
390
+
391
+ ## [alibi-detect](https://github.com/SeldonIO/alibi-detect)
392
+
393
+ Alibi Detect is an open source Python library focused on outlier, adversarial and drift detection. The package aims to cover both online and offline detectors for tabular data, text, images and time series. Both TensorFlow and PyTorch backends are supported for drift detection.
394
+
395
+ Keywords: Adversarial, Outlier, Drift detection
396
+
397
+ ## [FARM](https://github.com/deepset-ai/FARM)
398
+
399
+ [FARM](https://github.com/deepset-ai/FARM) makes Transfer Learning with BERT & Co simple, fast and enterprise-ready. It's built upon transformers and provides additional features to simplify the life of developers: Parallelized preprocessing, highly modular design, multi-task learning, experiment tracking, easy debugging and close integration with AWS SageMaker.
400
+
401
+ Keywords: Transfer Learning, Modular design, Multi-task learning, Experiment tracking
402
+
403
+ ## [aitextgen](https://github.com/minimaxir/aitextgen)
404
+
405
+ A robust Python tool for text-based AI training and generation using OpenAI's GPT-2 and EleutherAI's GPT Neo/GPT-3 architecture.
406
+ [aitextgen](https://github.com/minimaxir/aitextgen) is a Python package that leverages PyTorch, Hugging Face Transformers and pytorch-lightning with specific optimizations for text generation using GPT-2, plus many added features.
407
+
408
+ Keywords: Training, Generation
409
+
410
+ ## [diffgram](https://github.com/diffgram/diffgram)
411
+
412
+ Diffgram aims to integrate human supervision into platforms. We support your team programmatically changing the UI (Schema, layout, etc.) like in Streamlit. This means that you can collect and annotate timely data from users. In other words, we are the platform behind your platform, an integrated part of your application, to ship new & better AI products faster.
413
+
414
+ Keywords: Human supervision, Platform
415
+
416
+ ## [ecco](https://github.com/jalammar/ecco)
417
+
418
+ Explain, analyze, and visualize NLP language models. Ecco creates interactive visualizations directly in Jupyter notebooks explaining the behavior of Transformer-based language models (like GPT2, BERT, RoBERTA, T5, and T0).
419
+
420
+ Keywords: Model explainability
421
+
422
+ ## [s3prl](https://github.com/s3prl/s3prl)
423
+
424
+ [s3prl](https://github.com/s3prl/s3prl) stands for Self-Supervised Speech Pre-training and Representation Learning. Self-supervised speech pre-trained models are called upstream in this toolkit, and are utilized in various downstream tasks.
425
+
426
+ Keywords: Speech, Training
427
+
428
+ ## [ru-dalle](https://github.com/ai-forever/ru-dalle)
429
+
430
+ RuDALL-E aims to be similar to DALL-E, targeted to Russian.
431
+
432
+ Keywords: DALL-E, Russian
433
+
434
+ ## [DeepKE](https://github.com/zjunlp/DeepKE)
435
+
436
+ [DeepKE](https://github.com/zjunlp/DeepKE) is a knowledge extraction toolkit for knowledge graph construction supporting cnSchema,low-resource, document-level and multimodal scenarios for entity, relation and attribute extraction.
437
+
438
+ Keywords: Knowledge Extraction, Knowledge Graphs
439
+
440
+ ## [Nebuly](https://github.com/nebuly-ai/nebuly)
441
+
442
+ Nebuly is the next-generation platform to monitor and optimize your AI costs in one place. The platform connects to all your AI cost sources (compute, API providers, AI software licenses, etc) and centralizes them in one place to give you full visibility on a model basis. The platform also provides optimization recommendations and a co-pilot model that can guide during the optimization process. The platform builds on top of the open-source tools allowing you to optimize the different steps of your AI stack to squeeze out the best possible cost performances.
443
+
444
+ Keywords: Optimization, Performance, Monitoring
445
+
446
+ ## [imaginAIry](https://github.com/brycedrennan/imaginAIry)
447
+
448
+ Offers a CLI and a Python API to generate images with Stable Diffusion. It has support for many tools, like image structure control (controlnet), instruction-based image edits (InstructPix2Pix), prompt-based masking (clipseg), among others.
449
+
450
+ Keywords: Stable Diffusion, CLI, Python API
451
+
452
+ ## [sparseml](https://github.com/neuralmagic/sparseml)
453
+
454
+ SparseML is an open-source model optimization toolkit that enables you to create inference-optimized sparse models using pruning, quantization, and distillation algorithms. Models optimized with SparseML can then be exported to the ONNX and deployed with DeepSparse for GPU-class performance on CPU hardware.
455
+
456
+ Keywords: Model optimization, Pruning, Quantization, Distillation
457
+
458
+ ## [opacus](https://github.com/pytorch/opacus)
459
+
460
+ Opacus is a library that enables training PyTorch models with differential privacy. It supports training with minimal code changes required on the client, has little impact on training performance, and allows the client to online track the privacy budget expended at any given moment.
461
+
462
+ Keywords: Differential privacy
463
+
464
+ ## [LAVIS](https://github.com/salesforce/LAVIS)
465
+
466
+ [LAVIS](https://github.com/salesforce/LAVIS) is a Python deep learning library for LAnguage-and-VISion intelligence research and applications. This library aims to provide engineers and researchers with a one-stop solution to rapidly develop models for their specific multimodal scenarios, and benchmark them across standard and customized datasets. It features a unified interface design to access
467
+
468
+ Keywords: Multimodal, NLP, Vision
469
+
470
+ ## [buzz](https://github.com/chidiwilliams/buzz)
471
+
472
+ Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAI's Whisper.
473
+
474
+ Keywords: Audio transcription, Translation
475
+
476
+ ## [rust-bert](https://github.com/guillaume-be/rust-bert)
477
+
478
+ Rust-native state-of-the-art Natural Language Processing models and pipelines. Port of Hugging Face's Transformers library, using the tch-rs crate and pre-processing from rust-tokenizers. Supports multi-threaded tokenization and GPU inference. This repository exposes the model base architecture, task-specific heads and ready-to-use pipelines.
479
+
480
+ Keywords: Rust, BERT, Inference
481
+
482
+ ## [EasyNLP](https://github.com/alibaba/EasyNLP)
483
+
484
+ [EasyNLP](https://github.com/alibaba/EasyNLP) is an easy-to-use NLP development and application toolkit in PyTorch, first released inside Alibaba in 2021. It is built with scalable distributed training strategies and supports a comprehensive suite of NLP algorithms for various NLP applications. [EasyNLP](https://github.com/alibaba/EasyNLP) integrates knowledge distillation and few-shot learning for landing large pre-trained models, together with various popular multi-modality pre-trained models. It provides a unified framework of model training, inference, and deployment for real-world applications.
485
+
486
+ Keywords: NLP, Knowledge distillation, Few-shot learning, Multi-modality, Training, Inference, Deployment
487
+
488
+ ## [TurboTransformers](https://github.com/Tencent/TurboTransformers)
489
+
490
+ A fast and user-friendly runtime for transformer inference (Bert, Albert, GPT2, Decoders, etc) on CPU and GPU.
491
+
492
+ Keywords: Optimization, Performance
493
+
494
+ ## [hivemind](https://github.com/learning-at-home/hivemind)
495
+
496
+ Hivemind is a PyTorch library for decentralized deep learning across the Internet. Its intended usage is training one large model on hundreds of computers from different universities, companies, and volunteers.
497
+
498
+ Keywords: Decentralized training
499
+
500
+ ## [docquery](https://github.com/impira/docquery)
501
+
502
+ DocQuery is a library and command-line tool that makes it easy to analyze semi-structured and unstructured documents (PDFs, scanned images, etc.) using large language models (LLMs). You simply point DocQuery at one or more documents and specify a question you want to ask. DocQuery is created by the team at Impira.
503
+
504
+ Keywords: Semi-structured documents, Unstructured documents, LLM, Document Question Answering
505
+
506
+ ## [CodeGeeX](https://github.com/THUDM/CodeGeeX)
507
+
508
+ [CodeGeeX](https://github.com/THUDM/CodeGeeX) is a large-scale multilingual code generation model with 13 billion parameters, pre-trained on a large code corpus of more than 20 programming languages. It has several unique features:
509
+ - Multilingual code generation
510
+ - Crosslingual code translation
511
+ - Is a customizable programming assistant
512
+
513
+ Keywords: Code Generation Model
514
+
515
+ ## [ktrain](https://github.com/amaiya/ktrain)
516
+
517
+ [ktrain](https://github.com/amaiya/ktrain) is a lightweight wrapper for the deep learning library TensorFlow Keras (and other libraries) to help build, train, and deploy neural networks and other machine learning models. Inspired by ML framework extensions like fastai and ludwig, [ktrain](https://github.com/amaiya/ktrain) is designed to make deep learning and AI more accessible and easier to apply for both newcomers and experienced practitioners.
518
+
519
+ Keywords: Keras wrapper, Model building, Training, Deployment
520
+
521
+ ## [FastDeploy](https://github.com/PaddlePaddle/FastDeploy)
522
+
523
+ [FastDeploy](https://github.com/PaddlePaddle/FastDeploy) is an Easy-to-use and High Performance AI model deployment toolkit for Cloud, Mobile and Edge with packageout-of-the-box and unified experience, endend-to-end optimization for over fire160+ Text, Vision, Speech and Cross-modal AI models. Including image classification, object detection, OCR, face detection, matting, pp-tracking, NLP, stable diffusion, TTS and other tasks to meet developers' industrial deployment needs for multi-scenario, multi-hardware and multi-platform.
524
+
525
+ Keywords: Model deployment, CLoud, Mobile, Edge
526
+
527
+ ## [underthesea](https://github.com/undertheseanlp/underthesea)
528
+
529
+ [underthesea](https://github.com/undertheseanlp/underthesea) is a Vietnamese NLP toolkit. Underthesea is a suite of open source Python modules data sets and tutorials supporting research and development in Vietnamese Natural Language Processing. We provides extremely easy API to quickly apply pretrained NLP models to your Vietnamese text, such as word segmentation, part-of-speech tagging (PoS), named entity recognition (NER), text classification and dependency parsing.
530
+
531
+ Keywords: Vietnamese, NLP
532
+
533
+ ## [hasktorch](https://github.com/hasktorch/hasktorch)
534
+
535
+ Hasktorch is a library for tensors and neural networks in Haskell. It is an independent open source community project which leverages the core C++ libraries shared by PyTorch.
536
+
537
+ Keywords: Haskell, Neural Networks
538
+
539
+ ## [donut](https://github.com/clovaai/donut)
540
+
541
+ Donut, or Document understanding transformer, is a new method of document understanding that utilizes an OCR-free end-to-end Transformer model.
542
+
543
+ Donut does not require off-the-shelf OCR engines/APIs, yet it shows state-of-the-art performances on various visual document understanding tasks, such as visual document classification or information extraction (a.k.a. document parsing).
544
+
545
+ Keywords: Document Understanding
546
+
547
+ ## [transformers-interpret](https://github.com/cdpierse/transformers-interpret)
548
+
549
+ Transformers Interpret is a model explainability tool designed to work exclusively with the transformers package.
550
+
551
+ In line with the philosophy of the Transformers package Transformers Interpret allows any transformers model to be explained in just two lines. Explainers are available for both text and computer vision models. Visualizations are also available in notebooks and as savable png and html files
552
+
553
+ Keywords: Model interpretation, Visualization
554
+
555
+ ## [mlrun](https://github.com/mlrun/mlrun)
556
+
557
+ MLRun is an open MLOps platform for quickly building and managing continuous ML applications across their lifecycle. MLRun integrates into your development and CI/CD environment and automates the delivery of production data, ML pipelines, and online applications, significantly reducing engineering efforts, time to production, and computation resources. With MLRun, you can choose any IDE on your local machine or on the cloud. MLRun breaks the silos between data, ML, software, and DevOps/MLOps teams, enabling collaboration and fast continuous improvements.
558
+
559
+ Keywords: MLOps
560
+
561
+ ## [FederatedScope](https://github.com/alibaba/FederatedScope)
562
+
563
+ [FederatedScope](https://github.com/alibaba/FederatedScope) is a comprehensive federated learning platform that provides convenient usage and flexible customization for various federated learning tasks in both academia and industry. Based on an event-driven architecture, [FederatedScope](https://github.com/alibaba/FederatedScope) integrates rich collections of functionalities to satisfy the burgeoning demands from federated learning, and aims to build up an easy-to-use platform for promoting learning safely and effectively.
564
+
565
+ Keywords: Federated learning, Event-driven
566
+
567
+ ## [pythainlp](https://github.com/PyThaiNLP/pythainlp)
568
+
569
+ PyThaiNLP is a Python package for text processing and linguistic analysis, similar to NLTK with focus on Thai language.
570
+
571
+ Keywords: Thai, NLP, NLTK
572
+
573
+ ## [FlagAI](https://github.com/FlagAI-Open/FlagAI)
574
+
575
+ [FlagAI](https://github.com/FlagAI-Open/FlagAI) (Fast LArge-scale General AI models) is a fast, easy-to-use and extensible toolkit for large-scale model. Our goal is to support training, fine-tuning, and deployment of large-scale models on various downstream tasks with multi-modality.
576
+
577
+ Keywords: Large models, Training, Fine-tuning, Deployment, Multi-modal
578
+
579
+ ## [pyserini](https://github.com/castorini/pyserini)
580
+
581
+ [pyserini](https://github.com/castorini/pyserini) is a Python toolkit for reproducible information retrieval research with sparse and dense representations. Retrieval using sparse representations is provided via integration with the group's Anserini IR toolkit. Retrieval using dense representations is provided via integration with Facebook's Faiss library.
582
+
583
+ Keywords: IR, Information Retrieval, Dense, Sparse
584
+
585
+ ## [baal](https://github.com/baal-org/baal)
586
+
587
+ [baal](https://github.com/baal-org/baal) is an active learning library that supports both industrial applications and research usecases. [baal](https://github.com/baal-org/baal) currently supports Monte-Carlo Dropout, MCDropConnect, deep ensembles, and semi-supervised learning.
588
+
589
+ Keywords: Active Learning, Research, Labeling
590
+
591
+ ## [cleanlab](https://github.com/cleanlab/cleanlab)
592
+
593
+ [cleanlab](https://github.com/cleanlab/cleanlab) is the standard data-centric AI package for data quality and machine learning with messy, real-world data and labels. For text, image, tabular, audio (among others) datasets, you can use cleanlab to automatically: detect data issues (outliers, label errors, near duplicates, etc), train robust ML models, infer consensus + annotator-quality for multi-annotator data, suggest data to (re)label next (active learning).
594
+
595
+ Keywords: Data-Centric AI, Data Quality, Noisy Labels, Outlier Detection, Active Learning
596
+
597
+ ## [BentoML](https://github.com/bentoml/BentoML)
598
+
599
+ [BentoML](https://github.com/bentoml) is the unified framework for building, shipping, and scaling production-ready AI applications incorporating traditional ML, pre-trained AI models, Generative and Large Language Models.
600
+ All Hugging Face models and pipelines can be seamlessly integrated into BentoML applications, enabling the running of models on the most suitable hardware and independent scaling based on usage.
601
+
602
+ Keywords: BentoML, Framework, Deployment, AI Applications
603
+
604
+ ## [LLaMA Factory](https://github.com/hiyouga/LLaMA-Factory)
605
+
606
+ [LLaMA Factory](https://github.com/hiyouga/LLaMA-Factory) offers a user-friendly fine-tuning framework that incorporates PEFT. The repository includes training(fine-tuning) and inference examples for LLaMA-2, BLOOM, Falcon, Baichuan, Qwen, and other LLMs. A ChatGLM version is also available in [ChatGLM-Efficient-Tuning](https://github.com/hiyouga/ChatGLM-Efficient-Tuning).
607
+
608
+ Keywords: PEFT, fine-tuning, LLaMA-2, ChatGLM, Qwen
609
+
benchmark.py ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2024 The HuggingFace Team. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ """
16
+ Run benchmark using the `optimum-benchmark` library with some customization in `transformers`.
17
+
18
+ Assume we are under `transformers` root directory: (make sure the commits are valid commits)
19
+ ```bash
20
+ python benchmark/benchmark.py --config-dir benchmark/config --config-name generation --commit=9b9c7f03da625b13643e99205c691fe046461724 --metrics=decode.latency.mean,per_token.latency.mean,per_token.throughput.value backend.model=google/gemma-2b benchmark.input_shapes.sequence_length=5,7 benchmark.input_shapes.batch_size=1,2 --multirun
21
+ ```
22
+ """
23
+
24
+ import argparse
25
+ import glob
26
+ import json
27
+ import os.path
28
+ import re
29
+ import tempfile
30
+ from contextlib import contextmanager
31
+ from pathlib import Path
32
+
33
+ from git import Repo
34
+
35
+ from huggingface_hub import HfApi
36
+
37
+ from optimum_benchmark import Benchmark
38
+ from optimum_benchmark_wrapper import main
39
+
40
+
41
+ PATH_TO_REPO = Path(__file__).parent.parent.resolve()
42
+
43
+
44
+ @contextmanager
45
+ def checkout_commit(repo: Repo, commit_id: str):
46
+ """
47
+ Context manager that checks out a given commit when entered, but gets back to the reference it was at on exit.
48
+ Args:
49
+ repo (`git.Repo`): A git repository (for instance the Transformers repo).
50
+ commit_id (`str`): The commit reference to checkout inside the context manager.
51
+ """
52
+ current_head = repo.head.commit if repo.head.is_detached else repo.head.ref
53
+
54
+ try:
55
+ repo.git.checkout(commit_id)
56
+ yield
57
+
58
+ finally:
59
+ repo.git.checkout(current_head)
60
+
61
+
62
+ def summarize(run_dir, metrics, expand_metrics=False):
63
+ """Produce a summary for each optimum-benchmark launched job's output directory found in `run_dir`.
64
+
65
+ Each summary's format is as follows (for `expand_metrics=False`):
66
+ ```
67
+ {
68
+ "model": "google/gemma-2b",
69
+ "commit": "3cd6ed22e4d49219f300f5055e71e3929aba20d7",
70
+ "config": "benchmark.input_shapes.batch_size=1,benchmark.input_shapes.sequence_length=5",
71
+ "metrics": {
72
+ "decode.latency.mean": 1.624666809082031,
73
+ "per_token.latency.mean": 0.012843788806628804,
74
+ "per_token.throughput.value": 77.85864553330948
75
+ }
76
+ }
77
+ ```
78
+ """
79
+ reports = glob.glob(os.path.join(run_dir, "**/benchmark_report.json"), recursive=True)
80
+ report_dirs = [str(Path(report).parent) for report in reports]
81
+
82
+ summaries = []
83
+ for report_dir in report_dirs:
84
+ commit = re.search(r"/commit=([^/]+)", report_dir).groups()[0]
85
+
86
+ if not os.path.isfile(os.path.join(report_dir, "benchmark.json")):
87
+ continue
88
+ benchmark = Benchmark.from_json(os.path.join(report_dir, "benchmark.json"))
89
+ report = benchmark.report
90
+
91
+ model = benchmark.config.backend["model"]
92
+
93
+ # Ths looks like `benchmark.input_shapes.batch_size=1,benchmark.input_shapes.sequence_length=5`.
94
+ # (we rely on the usage of hydra's `${hydra.job.override_dirname}`.)
95
+ benchmark_name = re.sub(f"backend.model={model},*", "", report_dir)
96
+ benchmark_name = str(Path(benchmark_name).parts[-1])
97
+ if benchmark_name.startswith("commit="):
98
+ benchmark_name = benchmark.config.name
99
+
100
+ metrics_values = {}
101
+ # post-processing of report: show a few selected/important metric
102
+ for metric in metrics:
103
+ keys = metric.split(".")
104
+ value = report
105
+ current = metrics_values
106
+ for key in keys:
107
+ # Avoid KeyError when a user's specified metric has typo.
108
+ # TODO: Give warnings.
109
+ if key not in value:
110
+ continue
111
+ value = value[key]
112
+
113
+ if expand_metrics:
114
+ if isinstance(value, dict):
115
+ if key not in current:
116
+ current[key] = {}
117
+ current = current[key]
118
+ else:
119
+ current[key] = value
120
+
121
+ if not expand_metrics:
122
+ metrics_values[metric] = value
123
+
124
+ # show some config information
125
+ print(f"model: {model}")
126
+ print(f"commit: {commit}")
127
+ print(f"config: {benchmark_name}")
128
+ if len(metrics_values) > 0:
129
+ print("metrics:")
130
+ if expand_metrics:
131
+ print(metrics_values)
132
+ else:
133
+ for metric, value in metrics_values.items():
134
+ print(f" - {metric}: {value}")
135
+ print("-" * 80)
136
+
137
+ summary = {
138
+ "model": model,
139
+ "commit": commit,
140
+ "config": benchmark_name,
141
+ "metrics": metrics_values,
142
+ }
143
+ summaries.append(summary)
144
+
145
+ with open(os.path.join(report_dir, "summary.json"), "w") as fp:
146
+ json.dump(summary, fp, indent=4)
147
+
148
+ return summaries
149
+
150
+
151
+ def combine_summaries(summaries):
152
+ """Combine a list of summary obtained from the function `summarize`.
153
+
154
+ The combined summary's format is as follows:
155
+ ```
156
+ "google/gemma-2b": {
157
+ "benchmark.input_shapes.batch_size=1,benchmark.input_shapes.sequence_length=5": {
158
+ "3cd6ed22e4d49219f300f5055e71e3929aba20d7": {
159
+ "metrics": {"decode.latency.mean": 1.624666809082031}
160
+ },
161
+ "c97ee28b117c0abe8e08891f402065e4df6d72aa": {
162
+ "metrics": {"decode.latency.mean": 1.6278163452148438}
163
+ }
164
+ },
165
+ "benchmark.input_shapes.batch_size=2,benchmark.input_shapes.sequence_length=5": {
166
+ "3cd6ed22e4d49219f300f5055e71e3929aba20d7": {
167
+ "metrics": {"decode.latency.mean": 1.6947791748046876}
168
+ },
169
+ "c97ee28b117c0abe8e08891f402065e4df6d72aa": {
170
+ "metrics": {
171
+ "decode.latency.mean": 1.6980519409179688}
172
+ }
173
+ }
174
+ }
175
+ ```
176
+ """
177
+ combined = {}
178
+ for summary in summaries:
179
+ model = summary["model"]
180
+ config = summary["config"]
181
+ commit = summary["commit"]
182
+
183
+ if model not in combined:
184
+ combined[model] = {}
185
+
186
+ if config not in combined[model]:
187
+ combined[model][config] = {}
188
+
189
+ if commit not in combined[model][config]:
190
+ combined[model][config][commit] = {"metrics": summary["metrics"]}
191
+
192
+ with open(os.path.join(exp_run_dir, "summary.json"), "w") as fp:
193
+ json.dump(combined, fp, indent=4)
194
+
195
+ print(json.dumps(combined, indent=4))
196
+
197
+ return combined
198
+
199
+
200
+ if __name__ == "__main__":
201
+
202
+ def list_str(values):
203
+ return values.split(",")
204
+
205
+ parser = argparse.ArgumentParser()
206
+
207
+ parser.add_argument("--config-dir", type=str, required=True, help="The path to the config directory.")
208
+ parser.add_argument("--config-name", type=str, required=True, help="The config name.")
209
+
210
+ # arguments specific to this wrapper for our own customization
211
+ parser.add_argument("--ensure_empty", type=bool, default=True, help="If to create a temporary directory.")
212
+ parser.add_argument(
213
+ "--commit",
214
+ type=list_str,
215
+ default="",
216
+ help="Comma-separated list of branch names and/or commit sha values on which the benchmark will run. If `diff` is specified, it will run on both the current head and the `main` branch.",
217
+ )
218
+ parser.add_argument("--metrics", type=str, help="The metrics to be included in the summary.")
219
+
220
+ parser.add_argument("--repo_id", type=str, default=None, help="The repository to which the file will be uploaded.")
221
+ parser.add_argument("--path_in_repo", type=str, default=None, help="Relative filepath in the repo.")
222
+ parser.add_argument("--token", type=str, default=None, help="A valid user access token (string).")
223
+
224
+ args, optimum_benchmark_args = parser.parse_known_args()
225
+
226
+ repo = Repo(PATH_TO_REPO)
227
+
228
+ metrics = [
229
+ "prefill.latency.mean",
230
+ "prefill.throughput.value",
231
+ "decode.latency.mean",
232
+ "decode.throughput.value",
233
+ "per_token.latency.mean",
234
+ "per_token.throughput.value",
235
+ ]
236
+ if args.metrics is not None:
237
+ metrics = args.metrics.split(",")
238
+
239
+ # Get `backend.model` in a hacky way: We want to control the experiment flow manually.
240
+ models = [""]
241
+ for idx, arg in enumerate(optimum_benchmark_args):
242
+ if arg.startswith("backend.model="):
243
+ models = arg[len("backend.model=") :]
244
+ models = models.split(",")
245
+ break
246
+ optimum_benchmark_args = [arg for arg in optimum_benchmark_args if not arg.startswith("backend.model=")]
247
+
248
+ # Get the commit(s)
249
+ current_head = str(repo.head.commit) if repo.head.is_detached else str(repo.head.ref)
250
+ commits = [x for x in args.commit if x != ""]
251
+ if len(commits) == 0:
252
+ commits = [current_head]
253
+ elif len(commits) == 1 and commits[0] == "diff":
254
+ # compare to `main`
255
+ commits = ["main", current_head]
256
+
257
+ # Get the specified run directory
258
+ run_dir_arg_idx, run_dir = -1, None
259
+ sweep_dir_arg_idx, sweep_dir = -1, None
260
+ for idx, arg in enumerate(optimum_benchmark_args):
261
+ if arg.startswith("hydra.run.dir="):
262
+ run_dir = arg[len("hydra.run.dir=") :]
263
+ run_dir_arg_idx = idx
264
+ elif arg.startswith("hydra.sweep.dir="):
265
+ sweep_dir = arg[len("hydra.sweep.dir=") :]
266
+ sweep_dir_arg_idx = idx
267
+ exp_run_dir, arg_dix, arg_name = (
268
+ (sweep_dir, sweep_dir_arg_idx, "hydra.sweep.dir")
269
+ if "--multirun" in optimum_benchmark_args
270
+ else (run_dir, run_dir_arg_idx, "hydra.run.dir")
271
+ )
272
+
273
+ # TODO: not hardcoded
274
+ if exp_run_dir is None and args.ensure_empty:
275
+ exp_run_dir = "_benchmark"
276
+
277
+ if args.ensure_empty:
278
+ os.makedirs(exp_run_dir, exist_ok=True)
279
+ exp_run_dir = tempfile.mkdtemp(dir=exp_run_dir)
280
+
281
+ run_summaries = []
282
+ for commit in commits:
283
+ with checkout_commit(repo, commit):
284
+ commit = str(repo.head.commit)
285
+
286
+ commit_run_dir = exp_run_dir
287
+ if exp_run_dir is not None:
288
+ commit_run_dir = os.path.join(exp_run_dir, rf"commit\={commit}")
289
+
290
+ print(f"Run benchmark on commit: {commit}")
291
+
292
+ for model in models:
293
+ model_arg = [f"backend.model={model}"] if model != "" else []
294
+ dir_args = []
295
+ if commit_run_dir is not None:
296
+ if arg_dix > -1:
297
+ optimum_benchmark_args[arg_dix] = f"{arg_name}={commit_run_dir}"
298
+ else:
299
+ dir_args = [
300
+ f"hydra.sweep.dir={commit_run_dir}",
301
+ f"hydra.run.dir={commit_run_dir}/" + "${hydra.job.override_dirname}",
302
+ ]
303
+ main(args.config_dir, args.config_name, model_arg + dir_args + optimum_benchmark_args)
304
+
305
+ if commit_run_dir is not None:
306
+ # Need to remove the `\` character
307
+ summaries = summarize(commit_run_dir.replace("\\", ""), metrics)
308
+ run_summaries.extend(summaries)
309
+
310
+ # aggregate the information across the commits
311
+ if exp_run_dir is not None:
312
+ with open(os.path.join(exp_run_dir, "summaries.json"), "w") as fp:
313
+ json.dump(run_summaries, fp, indent=4)
314
+
315
+ combined_summary = combine_summaries(run_summaries)
316
+
317
+ if args.repo_id is not None and args.path_in_repo is not None:
318
+ # Upload to Hub
319
+ api = HfApi()
320
+ api.upload_folder(
321
+ folder_path=exp_run_dir,
322
+ path_in_repo=args.path_in_repo,
323
+ repo_id=args.repo_id,
324
+ repo_type="dataset",
325
+ token=args.token,
326
+ )
conftest.py ADDED
@@ -0,0 +1,142 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright 2020 The HuggingFace Team. All rights reserved.
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # tests directory-specific settings - this file is run automatically
16
+ # by pytest before any tests are run
17
+
18
+ import doctest
19
+ import sys
20
+ import warnings
21
+ from os.path import abspath, dirname, join
22
+
23
+ import _pytest
24
+ import pytest
25
+
26
+ from transformers.testing_utils import HfDoctestModule, HfDocTestParser
27
+
28
+
29
+ NOT_DEVICE_TESTS = {
30
+ "test_tokenization",
31
+ "test_processor",
32
+ "test_processing",
33
+ "test_beam_constraints",
34
+ "test_configuration_utils",
35
+ "test_data_collator",
36
+ "test_trainer_callback",
37
+ "test_trainer_utils",
38
+ "test_feature_extraction",
39
+ "test_image_processing",
40
+ "test_image_processor",
41
+ "test_image_transforms",
42
+ "test_optimization",
43
+ "test_retrieval",
44
+ "test_config",
45
+ "test_from_pretrained_no_checkpoint",
46
+ "test_keep_in_fp32_modules",
47
+ "test_gradient_checkpointing_backward_compatibility",
48
+ "test_gradient_checkpointing_enable_disable",
49
+ "test_save_load_fast_init_from_base",
50
+ "test_fast_init_context_manager",
51
+ "test_fast_init_tied_embeddings",
52
+ "test_save_load_fast_init_to_base",
53
+ "test_torch_save_load",
54
+ "test_initialization",
55
+ "test_forward_signature",
56
+ "test_model_get_set_embeddings",
57
+ "test_model_main_input_name",
58
+ "test_correct_missing_keys",
59
+ "test_tie_model_weights",
60
+ "test_can_use_safetensors",
61
+ "test_load_save_without_tied_weights",
62
+ "test_tied_weights_keys",
63
+ "test_model_weights_reload_no_missing_tied_weights",
64
+ "test_pt_tf_model_equivalence",
65
+ "test_mismatched_shapes_have_properly_initialized_weights",
66
+ "test_matched_shapes_have_loaded_weights_when_some_mismatched_shapes_exist",
67
+ "test_model_is_small",
68
+ "test_tf_from_pt_safetensors",
69
+ "test_flax_from_pt_safetensors",
70
+ "ModelTest::test_pipeline_", # None of the pipeline tests from PipelineTesterMixin (of which XxxModelTest inherits from) are running on device
71
+ "ModelTester::test_pipeline_",
72
+ "/repo_utils/",
73
+ "/utils/",
74
+ "/agents/",
75
+ }
76
+
77
+ # allow having multiple repository checkouts and not needing to remember to rerun
78
+ # `pip install -e '.[dev]'` when switching between checkouts and running tests.
79
+ git_repo_path = abspath(join(dirname(__file__), "src"))
80
+ sys.path.insert(1, git_repo_path)
81
+
82
+ # silence FutureWarning warnings in tests since often we can't act on them until
83
+ # they become normal warnings - i.e. the tests still need to test the current functionality
84
+ warnings.simplefilter(action="ignore", category=FutureWarning)
85
+
86
+
87
+ def pytest_configure(config):
88
+ config.addinivalue_line(
89
+ "markers", "is_pt_tf_cross_test: mark test to run only when PT and TF interactions are tested"
90
+ )
91
+ config.addinivalue_line(
92
+ "markers", "is_pt_flax_cross_test: mark test to run only when PT and FLAX interactions are tested"
93
+ )
94
+ config.addinivalue_line("markers", "is_pipeline_test: mark test to run only when pipelines are tested")
95
+ config.addinivalue_line("markers", "is_staging_test: mark test to run only in the staging environment")
96
+ config.addinivalue_line("markers", "accelerate_tests: mark test that require accelerate")
97
+ config.addinivalue_line("markers", "agent_tests: mark the agent tests that are run on their specific schedule")
98
+ config.addinivalue_line("markers", "not_device_test: mark the tests always running on cpu")
99
+
100
+
101
+ def pytest_collection_modifyitems(items):
102
+ for item in items:
103
+ if any(test_name in item.nodeid for test_name in NOT_DEVICE_TESTS):
104
+ item.add_marker(pytest.mark.not_device_test)
105
+
106
+
107
+ def pytest_addoption(parser):
108
+ from transformers.testing_utils import pytest_addoption_shared
109
+
110
+ pytest_addoption_shared(parser)
111
+
112
+
113
+ def pytest_terminal_summary(terminalreporter):
114
+ from transformers.testing_utils import pytest_terminal_summary_main
115
+
116
+ make_reports = terminalreporter.config.getoption("--make-reports")
117
+ if make_reports:
118
+ pytest_terminal_summary_main(terminalreporter, id=make_reports)
119
+
120
+
121
+ def pytest_sessionfinish(session, exitstatus):
122
+ # If no tests are collected, pytest exists with code 5, which makes the CI fail.
123
+ if exitstatus == 5:
124
+ session.exitstatus = 0
125
+
126
+
127
+ # Doctest custom flag to ignore output.
128
+ IGNORE_RESULT = doctest.register_optionflag("IGNORE_RESULT")
129
+
130
+ OutputChecker = doctest.OutputChecker
131
+
132
+
133
+ class CustomOutputChecker(OutputChecker):
134
+ def check_output(self, want, got, optionflags):
135
+ if IGNORE_RESULT & optionflags:
136
+ return True
137
+ return OutputChecker.check_output(self, want, got, optionflags)
138
+
139
+
140
+ doctest.OutputChecker = CustomOutputChecker
141
+ _pytest.doctest.DoctestModule = HfDoctestModule
142
+ doctest.DocTestParser = HfDocTestParser
contributing.md ADDED
@@ -0,0 +1,334 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!---
2
+ Copyright 2024 The HuggingFace Team. All rights reserved.
3
+
4
+ Licensed under the Apache License, Version 2.0 (the "License");
5
+ you may not use this file except in compliance with the License.
6
+ You may obtain a copy of the License at
7
+
8
+ http://www.apache.org/licenses/LICENSE-2.0
9
+
10
+ Unless required by applicable law or agreed to in writing, software
11
+ distributed under the License is distributed on an "AS IS" BASIS,
12
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ See the License for the specific language governing permissions and
14
+ limitations under the License.
15
+ -->
16
+
17
+ # Zu 🤗 Transformers beitragen
18
+
19
+ Jeder ist willkommen, einen Beitrag zu leisten, und wir schätzen den Beitrag jedes Einzelnen. Codebeiträge sind nicht der einzige Weg, der Community zu helfen. Fragen zu beantworten, anderen zu helfen und die Dokumentation zu verbessern, sind ebenfalls äußerst wertvoll.
20
+
21
+ Es hilft uns auch, wenn Sie das Projekt weiterempfehlen! Erwähnen Sie die Bibliothek in Blogposts über die großartigen Projekte, die sie ermöglicht hat, tweeten Sie, wenn sie Ihnen geholfen hat, oder hinterlassen Sie dem Repository ein ⭐️, um Danke zu sagen.
22
+
23
+ Wie auch immer Sie sich entscheiden beizutragen, seien Sie achtsam und respektieren Sie unseren [Verhaltenskodex](https://github.com/huggingface/transformers/blob/main/CODE_OF_CONDUCT.md).
24
+
25
+ **Dieser Leitfaden wurde stark durch den fantastischen [scikit-learn-Leitfaden für Beiträge](https://github.com/scikit-learn/scikit-learn/blob/main/CONTRIBUTING.md) inspiriert.**
26
+
27
+ ## Beitragsmöglichkeiten
28
+
29
+ Es gibt mehrere Wege, wie Sie zu 🤗 Transformers beitragen können:
30
+
31
+ * Beheben Sie bestehende Probleme im vorhandenen Code.
32
+ * Erstellen Sie Issues im Zusammenhang mit Fehlern oder gewünschten neuen Funktionen.
33
+ * Implementieren Sie neue Modelle.
34
+ * Tragen Sie zu den Beispielen oder zur Dokumentation bei.
35
+
36
+ Wenn Sie nicht wissen, wo Sie anfangen sollen, gibt es eine spezielle Liste von [Good First Issues](https://github.com/huggingface/transformers/contribute). Sie bietet Ihnen eine Liste offener und anfängerfreundlicher Probleme und hilft Ihnen, einen ersten Beitrag zu Open-Source zu leisten. Idealerweise erstellen Sie eine Pull-Anfrage und verlinken sie mit dem Issue, an dem Sie arbeiten möchten. Wir versuchen, erstellte PRs bevorzugt zu behandeln, da wir so den Fortschritt leicht verfolgen können, und die Option besteht, dass jemand anderes den PR übernehmen kann, falls der Beitragende keine Zeit mehr hat.
37
+
38
+ Für etwas mehr Herausforderung, können Sie auch einen Blick auf die Liste der [Good Second Issues](https://github.com/huggingface/transformers/labels/Good%20Second%20Issue) werfen. Generell gilt: Legen Sie los, wenn Sie sich den Anforderungen gewachsen sehen und wir helfen Ihnen dabei! 🚀
39
+
40
+ > Alle Beiträge sind für die Community gleichermaßen wertvoll. 🥰
41
+
42
+ ## Bestehende Probleme beheben
43
+
44
+ Wenn Ihnen ein Problem im vorhandenen Code auffällt und Sie eine Lösung im Sinn haben, können Sie gerne einen Beitrag leisten und [eine Pull-Anfrage erstellen](#eine-pull-anfrage-erstellen)!
45
+
46
+ ## Ein fehlerspezifisches Issue oder eine Feature-Anfrage erstellen
47
+
48
+ Tun Sie Ihr Bestes, diesen Richtlinien zu folgen, wenn Sie ein fehlerspezifisches Issue erstellen oder eine Feature-Anfrage einreichen. Das macht es uns leichter, Ihnen schnell und mit gutem Feedback zu antworten.
49
+
50
+ ### Haben Sie einen Fehler gefunden?
51
+
52
+ Die 🤗 Transformers-Bibliothek verdankt ihre Robustheit und Zuverlässigkeit aller Nutzer, die frisch entdeckte Probleme melden.
53
+
54
+ Wir würden es wirklich schätzen, wenn Sie **sicherstellen könnten, dass der Fehler noch nicht gemeldet wurde** (verwenden Sie die Suchleiste auf GitHub unter Issues), bevor Sie ein Issue erstellen. Ihr Problem sollte sich auch auf Fehler in der Bibliothek selbst und nicht auf Ihren eigenen Code beziehen. Wenn Sie sich nicht sicher sind, ob der Fehler in Ihrem eigenen Code oder der Bibliothek liegt, fragen Sie bitte zuerst im [Forum](https://discuss.huggingface.co/) nach. Das hilft uns, schneller auf Probleme im Zusammenhang mit der Bibliothek zu reagieren, anstatt auf allgemeine Fragen.
55
+
56
+ Wenn Sie sich vergewissert haben, dass der Fehler noch nicht gemeldet wurde, geben Sie bitte die folgenden Informationen in Ihrem Issue an, damit wir es schnell beheben können:
57
+
58
+ * Ihr **Betriebssystem und Version** sowie die Versionen von **Python**, **PyTorch** und **TensorFlow**, falls zutreffend.
59
+ * Ein kurzes und unabhängiges Code-Snippet, das es uns ermöglicht, den Fehler in weniger als 30 Sekunden nachzustellen.
60
+ * Den *vollständigen* Traceback, wenn eine Ausnahme geworfen wird.
61
+ * Fügen Sie weitere hilfreiche Informationen, wie z. B. Screenshots, an.
62
+
63
+ Um das Betriebssystem und die Softwareversionen automatisch auszugeben, führen Sie den folgenden Befehl aus:
64
+
65
+ ```bash
66
+ transformers-cli env
67
+ ```
68
+
69
+ Sie können denselben Befehl auch im Hauptverzeichnis des Repositorys ausführen:
70
+
71
+ ```bash
72
+ python src/transformers/commands/transformers_cli.py env
73
+ ```
74
+
75
+ ### Möchten Sie eine neue Funktion?
76
+
77
+ Wenn Sie eine bestimmte neue Funktion in 🤗 Transformers sehen möchten, erstellen Sie bitte ein Issue und fügen Sie eine Beschreibung hinzu:
78
+
79
+ 1. Was ist die *Motivation* hinter dieser Funktion? Steht sie in Zusammenhang mit einem Problem oder einer Frustration mit der Bibliothek? Ist es eine Funktion, die Sie für ein Projekt benötigen? Ist es etwas, an dem Sie gearbeitet haben und denken, dass es der Community nutzen könnte?
80
+
81
+ Was auch immer es ist, wir würden uns freuen, davon zu hören!
82
+
83
+ 1. Beschreiben Sie Ihre gewünschte Funktion so detailliert wie möglich. Je mehr Sie uns darüber erzählen können, desto besser können wir Ihnen helfen.
84
+ 1. Stellen Sie einen *Code-Schnipsel* bereit, der die Funktionsweise demonstriert.
85
+ 1. Falls die Funktion auf einem Paper beruht, verlinken Sie dieses bitte.
86
+
87
+ Wenn Ihr Issue gut geschrieben ist, sind wir zum Zeitpunkt seiner Erstellung bereits zu 80 % fertig.
88
+
89
+ Wir haben [Vorlagen](https://github.com/huggingface/transformers/tree/main/templates) hinzugefügt, um Ihnen den Start Ihres Issues zu erleichtern.
90
+
91
+ ## Möchten Sie ein neues Modell implementieren?
92
+
93
+ Es werden ständig neue Modelle veröffentlicht. Wenn Sie ein neues Modell implementieren möchten, geben Sie bitte folgende Informationen an:
94
+
95
+ * Eine kurze Beschreibung des Modells und einen Link zum Paper.
96
+ * Link zur Implementierung, falls sie Open-Source ist.
97
+ * Link zu den Modellgewichten, falls verfügbar.
98
+
99
+ Lassen Sie es uns wissen, wenn Sie bereit sind, das Modell selbst beizutragen. Dann können wir Ihnen helfen, es zu 🤗 Transformers hinzuzufügen!
100
+
101
+ Wir haben auch einen technischen Leitfaden dazu, [wie man ein Modell zu 🤗 Transformers hinzufügt](https://huggingface.co/docs/transformers/add_new_model).
102
+
103
+ ## Möchten Sie die Dokumentation erweitern?
104
+
105
+ Wir sind immer auf der Suche nach Verbesserungen, die die Dokumentation klarer und präziser machen. Bitte teilen Sie uns Verbesserungsvorschläge mit, wie z. B. Tippfehler und fehlende, unklare oder ungenaue Inhalte. Wir übernehmen gerne die Änderungen oder helfen Ihnen, einen Beitrag zu leisten, wenn Sie daran interessiert sind!
106
+
107
+ Für weitere Einzelheiten darüber, wie man die Dokumentation generiert, erstellt und schreibt, werfen Sie einen Blick auf das [README](https://github.com/huggingface/transformers/tree/main/docs) der Dokumentation.
108
+
109
+ ## Eine Pull-Anfrage erstellen
110
+
111
+ Bevor Sie irgendwelchen Code schreiben, empfehlen wir Ihnen dringend, die bestehenden PRs oder Issues zu durchsuchen, um sicherzustellen, dass niemand bereits an diesem Thema arbeitet. Wenn Sie sich unsicher sind, ist es immer eine gute Idee, nach Feedback in einem neuen Issue zu fragen.
112
+
113
+ Sie benötigen grundlegende `git`-Kenntnisse, um zu 🤗 Transformers beizutragen. Obwohl `git` nicht das einfachste Werkzeug ist, hat es ein sehr gutes Handbuch. Geben Sie `git --help` in eine Shell ein und genießen Sie es! Wenn Sie Bücher bevorzugen, ist [Pro Git](https://git-scm.com/book/en/v2) eine gute Anlaufstelle.
114
+
115
+ Sie benötigen **[Python 3.8](https://github.com/huggingface/transformers/blob/main/setup.py#L426)** oder höher, um zu 🤗 Transformers beizutragen. Folgen Sie den nachstehenden Schritten, um mit dem Beitrag zu beginnen:
116
+
117
+ 1. Forken Sie das [Repository](https://github.com/huggingface/transformers), indem Sie auf den **[Fork](https://github.com/huggingface/transformers/fork)**-Button auf der Seite des Repositorys klicken. Dadurch wird eine Kopie des Codes auf Ihrem GitHub-Account erstellt.
118
+
119
+ 1. Klonen Sie Ihren Fork auf Ihre lokale Festplatte und fügen Sie das ursprüngliche Repository als Remote hinzu:
120
+
121
+ ```bash
122
+ git clone git@github.com:<your Github handle>/transformers.git
123
+ cd transformers
124
+ git remote add upstream https://github.com/huggingface/transformers.git
125
+ ```
126
+
127
+ 1. Erstellen Sie einen neuen Branch, um Ihre Änderungen zu speichern:
128
+
129
+ ```bash
130
+ git checkout -b a-descriptive-name-for-my-changes
131
+ ```
132
+
133
+ 🚨 Arbeiten Sie **nicht** auf dem `main` Branch!
134
+
135
+ 1. Richten Sie eine Entwicklungsumgebung ein, indem Sie den folgenden Befehl in einer virtuellen Umgebung ausführen:
136
+
137
+ ```bash
138
+ pip install -e ".[dev]"
139
+ ```
140
+
141
+ Wenn 🤗 Transformers bereits in der virtuellen Umgebung installiert war, entfernen Sie es mit `pip uninstall transformers`, bevor Sie es im bearbeitbaren Modus mit dem `-e` Flag neu installieren.
142
+
143
+ Abhängig von Ihrem Betriebssystem und durch die wachsende Anzahl der optionalen Abhängigkeiten von Transformers könnten Sie mit diesem Befehl einen Fehler verursachen. Wenn das der Fall ist, stellen Sie sicher, dass Sie ihr bevorzugtes Deep-Learning-Framework (PyTorch, TensorFlow und/oder Flax) installieren und anschließend den folgenden Befehl ausführen:
144
+
145
+ ```bash
146
+ pip install -e ".[quality]"
147
+ ```
148
+
149
+ Dies sollte für die meisten Anwendungsfälle ausreichend sein.
150
+
151
+ 1. Entwickeln Sie die Funktionen in Ihrem Branch.
152
+
153
+ Während Sie an Ihrem Code arbeiten, sollten Sie sicherstellen, dass die Test-Suite erfolgreich durchläuft. Führen Sie die von Ihren ��nderungen betroffenen Tests wie folgt aus:
154
+
155
+ ```bash
156
+ pytest tests/<TEST_TO_RUN>.py
157
+ ```
158
+
159
+ Weitere Informationen über Tests finden Sie in der Anleitung zum Thema [Testen](https://huggingface.co/docs/transformers/testing).
160
+
161
+ 🤗 Transformers stützt sich auf `black` und `ruff`, um seinen Quellcode konsistent zu formatieren. Nachdem Sie Änderungen vorgenommen haben, wenden Sie automatische Stilkorrekturen und Codeprüfungen, die nicht automatisiert werden können, in einem Schritt an:
162
+
163
+ ```bash
164
+ make fixup
165
+ ```
166
+
167
+ Dieser Task ist optimiert, nur mit Dateien zu arbeiten, die von Ihrer PR modifiziert wurden.
168
+
169
+ Wenn Sie die Prüfungen nacheinander ausführen möchten, wendet der folgende Befehl die Stilkorrekturen an:
170
+
171
+ ```bash
172
+ make style
173
+ ```
174
+
175
+ 🤗 Transformers verwendet auch `ruff` und einige benutzerdefinierte Skripte, um auf Programmierfehler zu prüfen. Qualitätskontrollen werden von der CI durchgeführt, aber Sie können die gleichen Überprüfungen auch selbst ausführen:
176
+
177
+ ```bash
178
+ make quality
179
+ ```
180
+
181
+ Abschließend haben wir viele Skripte, die sicherstellen, dass wir alle betroffenen Dateien aktualisieren, wenn wir ein neues Modell hinzufügen. Sie können diese wie folgt ausführen:
182
+
183
+ ```bash
184
+ make repo-consistency
185
+ ```
186
+
187
+ Um mehr über diese Prüfungen zu erfahren und wie man mit ihnen Probleme behebt, lesen Sie den Leitfaden zu [Überprüfungen bei einer Pull-Anfrage](https://huggingface.co/docs/transformers/pr_checks).
188
+
189
+ Wenn Sie Dokumente im Verzeichnis `docs/source` ändern, stellen Sie sicher, dass die Dokumentation noch generiert werden kann. Diese Prüfung wird auch im CI laufen, wenn Sie eine Pull-Anfrage erstellen. Um eine lokale Prüfung durchzuführen, müssen Sie den Dukumentation-Builder installieren:
190
+
191
+ ```bash
192
+ pip install ".[docs]"
193
+ ```
194
+
195
+ Führen Sie den folgenden Befehl im Hauptverzeichnis des Repositorys aus:
196
+
197
+ ```bash
198
+ doc-builder build transformers docs/source/en --build_dir ~/tmp/test-build
199
+ ```
200
+
201
+ Dadurch wird die Dokumentation im Ordner `~/tmp/test-build` erstellt, wo Sie die erzeugten Markdown-Dateien mit Ihrem bevorzugten Editor überprüfen können. Sie können auch eine Vorschau der Dokumentation auf GitHub sehen, wenn Sie eine Pull-Anfrage öffnen.
202
+
203
+ Wenn Sie mit Ihren Änderungen zufrieden sind, fügen Sie die geänderten Dateien mit `git add` hinzu und speichern Sie Ihre Änderungen lokal mit `git commit`:
204
+
205
+ ```bash
206
+ git add modified_file.py
207
+ git commit
208
+ ```
209
+
210
+ Bitte achten Sie darauf, [gute Commit-Nachrichten](https://chris.beams.io/posts/git-commit/) zu schreiben, um die von Ihnen vorgenommenen Änderungen klar zu kommunizieren!
211
+
212
+ Um Ihre Kopie des Codes auf dem aktuellen Stand des ursprünglichen Repositorys zu halten, rebasen Sie Ihren Branch auf `upstream/branch` *bevor* Sie eine Pull-Anfrage öffnen oder falls Sie von einem Maintainer dazu aufgefordert werden:
213
+
214
+ ```bash
215
+ git fetch upstream
216
+ git rebase upstream/main
217
+ ```
218
+
219
+ Pushen Sie Ihre Änderungen in Ihrem Branch:
220
+
221
+ ```bash
222
+ git push -u origin a-descriptive-name-for-my-changes
223
+ ```
224
+
225
+ Wenn Sie bereits eine Pull-Anfrage erstellt haben, müssen Sie den Push mit dem `--force` Flag erzwingen. Andernfalls, wenn die Pull-Anfrage noch nicht erstellt wurde, können Sie Ihre Änderungen normal pushen.
226
+
227
+ 1. Jetzt können Sie zu Ihrem Fork des Repositorys auf GitHub gehen und auf **Pull-Anfrage** klicken, um eine Pull-Anfrage zu erstellen. Stellen Sie sicher, dass Sie alle Punkte auf unserer [Checkliste](#checkliste-für-pull-anfragen) unten abhaken. Wenn Sie fertig sind, können Sie Ihre Änderungen zur Überprüfung an die Projektverantwortlichen senden.
228
+
229
+ 1. Es ist kein Problem, wenn die Maintainer Änderungen beantragen, das geschieht auch bei unseren Kernmitarbeitern! Damit jeder die Änderungen in der Pull-Anfrage sehen kann, arbeiten Sie in Ihrem lokalen Branch und pushen die Änderungen zu Ihrem Fork. Sie werden automatisch in der Pull-Anfrage erscheinen.
230
+
231
+ ### Checkliste für Pull-Anfragen
232
+
233
+ ☐ Der Titel der Pull-Anfrage sollte Ihren Beitrag zusammenfassen.<br>
234
+ ☐ Wenn Ihre Pull-Anfrage ein bestimmtes Issue bearbeitet, erwähnen Sie bitte die zugehörige Nummer in der Beschreibung der Pull-Anfrage, sodass diese verlinkt sind (und Personen, die das Issue lesen, wissen, dass Sie daran arbeiten).<br>
235
+ ☐ Um eine fortlaufende Bearbeitung anzuzeigen, versehen Sie bitte den Titel mit einem `[WIP]` Präfix. Diese sind nützlich, um doppelte Arbeit zu verhindern und sie von PRs abzuheben, die bereit zum Zusammenführen sind.<br>
236
+ ☐ Stellen Sie sicher, dass existierende Tests bestanden werden.<br>
237
+ ☐ Wenn Sie eine neue Funktion hinzufügen, erstellen Sie auch Tests dafür.<br>
238
+
239
+ * Wenn Sie ein neues Modell hinzufügen, stellen Sie sicher, dass Sie `ModelTester.all_model_classes = (MyModel, MyModelWithLMHead,...)` verwenden, um die gemeinsamen Tests auszulösen.
240
+ * Wenn Sie neue `@slow` Tests hinzufügen, stellen Sie mit `RUN_SLOW=1 python -m pytest tests/models/my_new_model/test_my_new_model.py` sicher, dass diese erfolgreich durchlaufen.
241
+ * Wenn Sie einen neuen Tokenizer hinzufügen, schreiben Sie Tests und stellen Sie mit `RUN_SLOW=1 python -m pytest tests/models/{your_model_name}/test_tokenization_{your_model_name}.py` sicher, dass diese erfolgreich durchlaufen.
242
+ * CircleCI führt die langsamen Tests nicht aus, aber GitHub Actions tut dies jede Nacht!<br>
243
+
244
+ ☐ Alle public Methoden müssen informative Docstrings haben (siehe [`modeling_bert.py`](https://github.com/huggingface/transformers/blob/main/src/transformers/models/bert/modeling_bert.py) als Beispiel).<br>
245
+ ☐ Aufgrund des schnell wachsenden Repositorys fügen Sie bitte keine Bilder, Videos oder andere Nicht-Textdateien hinzu, die das Repository erheblich belasten würden. Verwenden Sie stattdessen ein Hub-Repository wie [`hf-internal-testing`](https://huggingface.co/hf-internal-testing), um diese Dateien zu hosten und sie per URL zu verlinken. Wir empfehlen Bilder, die zur Dokumentation gehören, im folgenden Repository abzulegen: [huggingface/documentation-images](https://huggingface.co/datasets/huggingface/documentation-images). Sie können eine PR in diesem Datasets-Repository erstellen und ein Hugging-Face-Mitglied bitten, sie zu mergen.
246
+
247
+ Um mehr über die Prüfungen zu erfahren, die bei einer Pull-Anfrage ausgelöst werden, lesen Sie unseren Leitfaden zu [Überprüfungen bei einer Pull-Anfrage](https://huggingface.co/docs/transformers/pr_checks).
248
+
249
+ ### Tests
250
+
251
+ Eine umfangreiche Test-Suite ist enthalten, um das Verhalten der Bibliothek und mehrerer Beispiele zu testen. Tests für die Bibliothek und Beispiele finden Sie jeweils im [tests](https://github.com/huggingface/transformers/tree/main/tests) und im [examples](https://github.com/huggingface/transformers/tree/main/examples) Ordner.
252
+
253
+ Wir bevorzugen `pytest` und `pytest-xdist`, weil es schneller ist. Geben Sie einen *Pfad zu einem Unterordner oder einer Testdatei* vom Hauptverzeichnis des Repositorys aus an, um den Test auszuführen:
254
+
255
+ ```bash
256
+ python -m pytest -n auto --dist=loadfile -s -v ./tests/models/my_new_model
257
+ ```
258
+
259
+ Analog für den `examples` Ordner, geben Sie einen *Pfad zu einem Unterordner oder einer Testdatei* an, um den Test auszuführen. Z. B. führt der folgende Befehl den Test des Unterordners für Textklassifizierung im PyTorch `examples` Ordner durch:
260
+
261
+ ```bash
262
+ pip install -r examples/xxx/requirements.txt # nur beim ersten Mal erforderlich
263
+ python -m pytest -n auto --dist=loadfile -s -v ./examples/pytorch/text-classification
264
+ ```
265
+
266
+ Tatsächlich ist dies genau, wie unsere `make test` und `make test-examples` Befehle implementiert sind (abgesehen von `pip install`)!
267
+
268
+ Sie können auch eine kleinere Anzahl an Tests angeben, um nur die Funktion, an der Sie arbeiten, zu testen.
269
+
270
+ Standardmäßig werden langsame Tests übersprungen, aber Sie können die Umgebungsvariable `RUN_SLOW` auf `yes` setzen, um sie auszuführen. Dies wird den Download vieler Gigabyte an Modellen starten - stellen Sie also sicher, dass Sie sowohl genügend Festplattenspeicher als auch eine gute Internetverbindung oder die nötige Geduld haben!
271
+
272
+ <Tip warning={true}>
273
+
274
+ Vergessen Sie nicht, einen *Pfad zu einem Unterordner oder einer Testdatei* anzugeben, um den Test auszuführen. Sonst führen Sie alle Tests im `tests` oder `examples` Ordner aus, was sehr lange dauern wird!
275
+
276
+ </Tip>
277
+
278
+ ```bash
279
+ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./tests/models/my_new_model
280
+ RUN_SLOW=yes python -m pytest -n auto --dist=loadfile -s -v ./examples/pytorch/text-classification
281
+ ```
282
+
283
+ Wie bei den langsamen Tests gibt es auch andere Umgebungsvariablen, die standardmäßig beim Testen nicht gesetzt sind:
284
+
285
+ * `RUN_CUSTOM_TOKENIZERS`: Aktiviert Tests für benutzerdefinierte Tokenizer.
286
+ * `RUN_PT_FLAX_CROSS_TESTS`: Aktiviert Tests für die Integration von PyTorch + Flax.
287
+ * `RUN_PT_TF_CROSS_TESTS`: Aktiviert Tests für die Integration von TensorFlow + PyTorch.
288
+
289
+ Weitere Umgebungsvariablen und zusätzliche Informationen finden Sie in der [testing_utils.py](src/transformers/testing_utils.py).
290
+
291
+ 🤗 Transformers verwendet `pytest` nur als Test-Runner. Es verwendet keine `pytest`-spezifischen Funktionen in der Test-Suite selbst.
292
+
293
+ Das bedeutet, `unittest` wird vollständig unterstützt. Folgend wird beschrieben, wie man Tests mit `unittest` ausführt:
294
+
295
+ ```bash
296
+ python -m unittest discover -s tests -t . -v
297
+ python -m unittest discover -s examples -t examples -v
298
+ ```
299
+
300
+ ### Stil-Leitfaden
301
+
302
+ Für Docstrings befolgt 🤗 Transformers den [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html).
303
+ Lesen Sie unseren [Leitfaden zum Schreiben von Dokumentationen](https://github.com/huggingface/transformers/tree/main/docs#writing-documentation---specification) für weitere Informationen.
304
+
305
+ ### Entwickeln unter Windows
306
+
307
+ Unter Windows (falls Sie nicht im [Windows-Subsystem für Linux](https://learn.microsoft.com/en-us/windows/wsl/) oder WSL arbeiten) müssen Sie git so konfigurieren, dass Windows `CRLF` in Linux `LF` Zeilenenden umgewandelt werden:
308
+
309
+ ```bash
310
+ git config core.autocrlf input
311
+ ```
312
+
313
+ Eine Möglichkeit, den `make`-Befehl unter Windows auszuführen, ist mit MSYS2:
314
+
315
+ 1. Laden Sie [MSYS2](https://www.msys2.org/) herunter und installieren Sie es nach `C:\msys64`.
316
+ 1. Öffnen Sie die Kommandozeile `C:\msys64\msys2.exe` (sie sollte vom **Start**-Menü aus verfügbar sein).
317
+ 1. Führen Sie den Befehl in der Shell aus: `pacman -Syu` und installieren Sie `make` mit `pacman -S make`.
318
+ 1. Fügen Sie `C:\msys64\usr\bin` an Ihrer PATH-Umgebungsvariable an.
319
+
320
+ Sie können nun `make` aus jedem Terminal heraus verwenden (PowerShell, cmd.exe usw.)! 🎉
321
+
322
+ ### Ein geforktes Repository mit dem Haupt-Repository von Hugging Face synchronisieren
323
+
324
+ Beim Aktualisieren des main-Branches eines geforkten Repositories beachten Sie bitte die folgenden Schritte, um das Anpingen des Haupt-Repositorys zu vermeiden, was unnötige Verweise in abhängigen PRs vermerkt und beteiligte Entwickler benachrichtigt:
325
+
326
+ 1. Wenn möglich, vermeiden Sie die Synchronisation mit dem Haupt-Repository über einen Branch und PR im geforkten Repository. Mergen Sie stattdessen direkt in den main-Branch des Forks.
327
+ 1. Wenn ein PR unbedingt notwendig ist, verwenden Sie die folgenden Schritte, nachdem Sie Ihren Branch ausgecheckt haben:
328
+
329
+ ```bash
330
+ git checkout -b your-branch-for-syncing
331
+ git pull --squash --no-commit upstream main
332
+ git commit -m '<your message without GitHub references>'
333
+ git push --set-upstream origin your-branch-for-syncing
334
+ ```
custom_models.md ADDED
@@ -0,0 +1,384 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2020 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Building custom models
18
+
19
+ The 🤗 Transformers library is designed to be easily extensible. Every model is fully coded in a given subfolder
20
+ of the repository with no abstraction, so you can easily copy a modeling file and tweak it to your needs.
21
+
22
+ If you are writing a brand new model, it might be easier to start from scratch. In this tutorial, we will show you
23
+ how to write a custom model and its configuration so it can be used inside Transformers, and how you can share it
24
+ with the community (with the code it relies on) so that anyone can use it, even if it's not present in the 🤗
25
+ Transformers library. We'll see how to build upon transformers and extend the framework with your hooks and
26
+ custom code.
27
+
28
+ We will illustrate all of this on a ResNet model, by wrapping the ResNet class of the
29
+ [timm library](https://github.com/rwightman/pytorch-image-models) into a [`PreTrainedModel`].
30
+
31
+ ## Writing a custom configuration
32
+
33
+ Before we dive into the model, let's first write its configuration. The configuration of a model is an object that
34
+ will contain all the necessary information to build the model. As we will see in the next section, the model can only
35
+ take a `config` to be initialized, so we really need that object to be as complete as possible.
36
+
37
+ <Tip>
38
+
39
+ Models in the `transformers` library itself generally follow the convention that they accept a `config` object
40
+ in their `__init__` method, and then pass the whole `config` to sub-layers in the model, rather than breaking the
41
+ config object into multiple arguments that are all passed individually to sub-layers. Writing your model in this
42
+ style results in simpler code with a clear "source of truth" for any hyperparameters, and also makes it easier
43
+ to reuse code from other models in `transformers`.
44
+
45
+ </Tip>
46
+
47
+ In our example, we will take a couple of arguments of the ResNet class that we might want to tweak. Different
48
+ configurations will then give us the different types of ResNets that are possible. We then just store those arguments,
49
+ after checking the validity of a few of them.
50
+
51
+ ```python
52
+ from transformers import PretrainedConfig
53
+ from typing import List
54
+
55
+
56
+ class ResnetConfig(PretrainedConfig):
57
+ model_type = "resnet"
58
+
59
+ def __init__(
60
+ self,
61
+ block_type="bottleneck",
62
+ layers: List[int] = [3, 4, 6, 3],
63
+ num_classes: int = 1000,
64
+ input_channels: int = 3,
65
+ cardinality: int = 1,
66
+ base_width: int = 64,
67
+ stem_width: int = 64,
68
+ stem_type: str = "",
69
+ avg_down: bool = False,
70
+ **kwargs,
71
+ ):
72
+ if block_type not in ["basic", "bottleneck"]:
73
+ raise ValueError(f"`block_type` must be 'basic' or bottleneck', got {block_type}.")
74
+ if stem_type not in ["", "deep", "deep-tiered"]:
75
+ raise ValueError(f"`stem_type` must be '', 'deep' or 'deep-tiered', got {stem_type}.")
76
+
77
+ self.block_type = block_type
78
+ self.layers = layers
79
+ self.num_classes = num_classes
80
+ self.input_channels = input_channels
81
+ self.cardinality = cardinality
82
+ self.base_width = base_width
83
+ self.stem_width = stem_width
84
+ self.stem_type = stem_type
85
+ self.avg_down = avg_down
86
+ super().__init__(**kwargs)
87
+ ```
88
+
89
+ The three important things to remember when writing you own configuration are the following:
90
+ - you have to inherit from `PretrainedConfig`,
91
+ - the `__init__` of your `PretrainedConfig` must accept any kwargs,
92
+ - those `kwargs` need to be passed to the superclass `__init__`.
93
+
94
+ The inheritance is to make sure you get all the functionality from the 🤗 Transformers library, while the two other
95
+ constraints come from the fact a `PretrainedConfig` has more fields than the ones you are setting. When reloading a
96
+ config with the `from_pretrained` method, those fields need to be accepted by your config and then sent to the
97
+ superclass.
98
+
99
+ Defining a `model_type` for your configuration (here `model_type="resnet"`) is not mandatory, unless you want to
100
+ register your model with the auto classes (see last section).
101
+
102
+ With this done, you can easily create and save your configuration like you would do with any other model config of the
103
+ library. Here is how we can create a resnet50d config and save it:
104
+
105
+ ```py
106
+ resnet50d_config = ResnetConfig(block_type="bottleneck", stem_width=32, stem_type="deep", avg_down=True)
107
+ resnet50d_config.save_pretrained("custom-resnet")
108
+ ```
109
+
110
+ This will save a file named `config.json` inside the folder `custom-resnet`. You can then reload your config with the
111
+ `from_pretrained` method:
112
+
113
+ ```py
114
+ resnet50d_config = ResnetConfig.from_pretrained("custom-resnet")
115
+ ```
116
+
117
+ You can also use any other method of the [`PretrainedConfig`] class, like [`~PretrainedConfig.push_to_hub`] to
118
+ directly upload your config to the Hub.
119
+
120
+ ## Writing a custom model
121
+
122
+ Now that we have our ResNet configuration, we can go on writing the model. We will actually write two: one that
123
+ extracts the hidden features from a batch of images (like [`BertModel`]) and one that is suitable for image
124
+ classification (like [`BertForSequenceClassification`]).
125
+
126
+ As we mentioned before, we'll only write a loose wrapper of the model to keep it simple for this example. The only
127
+ thing we need to do before writing this class is a map between the block types and actual block classes. Then the
128
+ model is defined from the configuration by passing everything to the `ResNet` class:
129
+
130
+ ```py
131
+ from transformers import PreTrainedModel
132
+ from timm.models.resnet import BasicBlock, Bottleneck, ResNet
133
+ from .configuration_resnet import ResnetConfig
134
+
135
+
136
+ BLOCK_MAPPING = {"basic": BasicBlock, "bottleneck": Bottleneck}
137
+
138
+
139
+ class ResnetModel(PreTrainedModel):
140
+ config_class = ResnetConfig
141
+
142
+ def __init__(self, config):
143
+ super().__init__(config)
144
+ block_layer = BLOCK_MAPPING[config.block_type]
145
+ self.model = ResNet(
146
+ block_layer,
147
+ config.layers,
148
+ num_classes=config.num_classes,
149
+ in_chans=config.input_channels,
150
+ cardinality=config.cardinality,
151
+ base_width=config.base_width,
152
+ stem_width=config.stem_width,
153
+ stem_type=config.stem_type,
154
+ avg_down=config.avg_down,
155
+ )
156
+
157
+ def forward(self, tensor):
158
+ return self.model.forward_features(tensor)
159
+ ```
160
+
161
+ For the model that will classify images, we just change the forward method:
162
+
163
+ ```py
164
+ import torch
165
+
166
+
167
+ class ResnetModelForImageClassification(PreTrainedModel):
168
+ config_class = ResnetConfig
169
+
170
+ def __init__(self, config):
171
+ super().__init__(config)
172
+ block_layer = BLOCK_MAPPING[config.block_type]
173
+ self.model = ResNet(
174
+ block_layer,
175
+ config.layers,
176
+ num_classes=config.num_classes,
177
+ in_chans=config.input_channels,
178
+ cardinality=config.cardinality,
179
+ base_width=config.base_width,
180
+ stem_width=config.stem_width,
181
+ stem_type=config.stem_type,
182
+ avg_down=config.avg_down,
183
+ )
184
+
185
+ def forward(self, tensor, labels=None):
186
+ logits = self.model(tensor)
187
+ if labels is not None:
188
+ loss = torch.nn.cross_entropy(logits, labels)
189
+ return {"loss": loss, "logits": logits}
190
+ return {"logits": logits}
191
+ ```
192
+
193
+ In both cases, notice how we inherit from `PreTrainedModel` and call the superclass initialization with the `config`
194
+ (a bit like when you write a regular `torch.nn.Module`). The line that sets the `config_class` is not mandatory, unless
195
+ you want to register your model with the auto classes (see last section).
196
+
197
+ <Tip>
198
+
199
+ If your model is very similar to a model inside the library, you can re-use the same configuration as this model.
200
+
201
+ </Tip>
202
+
203
+ You can have your model return anything you want, but returning a dictionary like we did for
204
+ `ResnetModelForImageClassification`, with the loss included when labels are passed, will make your model directly
205
+ usable inside the [`Trainer`] class. Using another output format is fine as long as you are planning on using your own
206
+ training loop or another library for training.
207
+
208
+ Now that we have our model class, let's create one:
209
+
210
+ ```py
211
+ resnet50d = ResnetModelForImageClassification(resnet50d_config)
212
+ ```
213
+
214
+ Again, you can use any of the methods of [`PreTrainedModel`], like [`~PreTrainedModel.save_pretrained`] or
215
+ [`~PreTrainedModel.push_to_hub`]. We will use the second in the next section, and see how to push the model weights
216
+ with the code of our model. But first, let's load some pretrained weights inside our model.
217
+
218
+ In your own use case, you will probably be training your custom model on your own data. To go fast for this tutorial,
219
+ we will use the pretrained version of the resnet50d. Since our model is just a wrapper around it, it's going to be
220
+ easy to transfer those weights:
221
+
222
+ ```py
223
+ import timm
224
+
225
+ pretrained_model = timm.create_model("resnet50d", pretrained=True)
226
+ resnet50d.model.load_state_dict(pretrained_model.state_dict())
227
+ ```
228
+
229
+ Now let's see how to make sure that when we do [`~PreTrainedModel.save_pretrained`] or [`~PreTrainedModel.push_to_hub`], the
230
+ code of the model is saved.
231
+
232
+ ## Registering a model with custom code to the auto classes
233
+
234
+ If you are writing a library that extends 🤗 Transformers, you may want to extend the auto classes to include your own
235
+ model. This is different from pushing the code to the Hub in the sense that users will need to import your library to
236
+ get the custom models (contrarily to automatically downloading the model code from the Hub).
237
+
238
+ As long as your config has a `model_type` attribute that is different from existing model types, and that your model
239
+ classes have the right `config_class` attributes, you can just add them to the auto classes like this:
240
+
241
+ ```py
242
+ from transformers import AutoConfig, AutoModel, AutoModelForImageClassification
243
+
244
+ AutoConfig.register("resnet", ResnetConfig)
245
+ AutoModel.register(ResnetConfig, ResnetModel)
246
+ AutoModelForImageClassification.register(ResnetConfig, ResnetModelForImageClassification)
247
+ ```
248
+
249
+ Note that the first argument used when registering your custom config to [`AutoConfig`] needs to match the `model_type`
250
+ of your custom config, and the first argument used when registering your custom models to any auto model class needs
251
+ to match the `config_class` of those models.
252
+
253
+ ## Sending the code to the Hub
254
+
255
+ <Tip warning={true}>
256
+
257
+ This API is experimental and may have some slight breaking changes in the next releases.
258
+
259
+ </Tip>
260
+
261
+ First, make sure your model is fully defined in a `.py` file. It can rely on relative imports to some other files as
262
+ long as all the files are in the same directory (we don't support submodules for this feature yet). For our example,
263
+ we'll define a `modeling_resnet.py` file and a `configuration_resnet.py` file in a folder of the current working
264
+ directory named `resnet_model`. The configuration file contains the code for `ResnetConfig` and the modeling file
265
+ contains the code of `ResnetModel` and `ResnetModelForImageClassification`.
266
+
267
+ ```
268
+ .
269
+ └── resnet_model
270
+ ├── __init__.py
271
+ ├── configuration_resnet.py
272
+ └── modeling_resnet.py
273
+ ```
274
+
275
+ The `__init__.py` can be empty, it's just there so that Python detects `resnet_model` can be use as a module.
276
+
277
+ <Tip warning={true}>
278
+
279
+ If copying a modeling files from the library, you will need to replace all the relative imports at the top of the file
280
+ to import from the `transformers` package.
281
+
282
+ </Tip>
283
+
284
+ Note that you can re-use (or subclass) an existing configuration/model.
285
+
286
+ To share your model with the community, follow those steps: first import the ResNet model and config from the newly
287
+ created files:
288
+
289
+ ```py
290
+ from resnet_model.configuration_resnet import ResnetConfig
291
+ from resnet_model.modeling_resnet import ResnetModel, ResnetModelForImageClassification
292
+ ```
293
+
294
+ Then you have to tell the library you want to copy the code files of those objects when using the `save_pretrained`
295
+ method and properly register them with a given Auto class (especially for models), just run:
296
+
297
+ ```py
298
+ ResnetConfig.register_for_auto_class()
299
+ ResnetModel.register_for_auto_class("AutoModel")
300
+ ResnetModelForImageClassification.register_for_auto_class("AutoModelForImageClassification")
301
+ ```
302
+
303
+ Note that there is no need to specify an auto class for the configuration (there is only one auto class for them,
304
+ [`AutoConfig`]) but it's different for models. Your custom model could be suitable for many different tasks, so you
305
+ have to specify which one of the auto classes is the correct one for your model.
306
+
307
+ <Tip>
308
+
309
+ Use `register_for_auto_class()` if you want the code files to be copied. If you instead prefer to use code on the Hub from another repo,
310
+ you don't need to call it. In cases where there's more than one auto class, you can modify the `config.json` directly using the
311
+ following structure:
312
+
313
+ ```json
314
+ "auto_map": {
315
+ "AutoConfig": "<your-repo-name>--<config-name>",
316
+ "AutoModel": "<your-repo-name>--<config-name>",
317
+ "AutoModelFor<Task>": "<your-repo-name>--<config-name>",
318
+ },
319
+ ```
320
+
321
+ </Tip>
322
+
323
+ Next, let's create the config and models as we did before:
324
+
325
+ ```py
326
+ resnet50d_config = ResnetConfig(block_type="bottleneck", stem_width=32, stem_type="deep", avg_down=True)
327
+ resnet50d = ResnetModelForImageClassification(resnet50d_config)
328
+
329
+ pretrained_model = timm.create_model("resnet50d", pretrained=True)
330
+ resnet50d.model.load_state_dict(pretrained_model.state_dict())
331
+ ```
332
+
333
+ Now to send the model to the Hub, make sure you are logged in. Either run in your terminal:
334
+
335
+ ```bash
336
+ huggingface-cli login
337
+ ```
338
+
339
+ or from a notebook:
340
+
341
+ ```py
342
+ from huggingface_hub import notebook_login
343
+
344
+ notebook_login()
345
+ ```
346
+
347
+ You can then push to your own namespace (or an organization you are a member of) like this:
348
+
349
+ ```py
350
+ resnet50d.push_to_hub("custom-resnet50d")
351
+ ```
352
+
353
+ On top of the modeling weights and the configuration in json format, this also copied the modeling and
354
+ configuration `.py` files in the folder `custom-resnet50d` and uploaded the result to the Hub. You can check the result
355
+ in this [model repo](https://huggingface.co/sgugger/custom-resnet50d).
356
+
357
+ See the [sharing tutorial](model_sharing) for more information on the push to Hub method.
358
+
359
+ ## Using a model with custom code
360
+
361
+ You can use any configuration, model or tokenizer with custom code files in its repository with the auto-classes and
362
+ the `from_pretrained` method. All files and code uploaded to the Hub are scanned for malware (refer to the [Hub security](https://huggingface.co/docs/hub/security#malware-scanning) documentation for more information), but you should still
363
+ review the model code and author to avoid executing malicious code on your machine. Set `trust_remote_code=True` to use
364
+ a model with custom code:
365
+
366
+ ```py
367
+ from transformers import AutoModelForImageClassification
368
+
369
+ model = AutoModelForImageClassification.from_pretrained("sgugger/custom-resnet50d", trust_remote_code=True)
370
+ ```
371
+
372
+ It is also strongly encouraged to pass a commit hash as a `revision` to make sure the author of the models did not
373
+ update the code with some malicious new lines (unless you fully trust the authors of the models).
374
+
375
+ ```py
376
+ commit_hash = "ed94a7c6247d8aedce4647f00f20de6875b5b292"
377
+ model = AutoModelForImageClassification.from_pretrained(
378
+ "sgugger/custom-resnet50d", trust_remote_code=True, revision=commit_hash
379
+ )
380
+ ```
381
+
382
+ Note that when browsing the commit history of the model repo on the Hub, there is a button to easily copy the commit
383
+ hash of any commit.
384
+
docker-entrypoint.sh ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ source ~/.bashrc
3
+ echo "running docker-entrypoint.sh"
4
+ conda activate container
5
+ echo $KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS
6
+ echo "printed TPU info"
7
+ export XRT_TPU_CONFIG="tpu_worker;0;${KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS:7}"
8
+ exec "$@"#!/bin/bash
optimum_benchmark_wrapper.py ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import argparse
2
+ import subprocess
3
+
4
+
5
+ def main(config_dir, config_name, args):
6
+ subprocess.run(["optimum-benchmark", "--config-dir", f"{config_dir}", "--config-name", f"{config_name}"] + ["hydra/job_logging=disabled", "hydra/hydra_logging=disabled"] + args)
7
+
8
+
9
+ if __name__ == "__main__":
10
+ parser = argparse.ArgumentParser()
11
+
12
+ parser.add_argument("--config-dir", type=str, required=True, help="The path to the config directory.")
13
+ parser.add_argument("--config-name", type=str, required=True, help="The config name.")
14
+ args, unknown = parser.parse_known_args()
15
+
16
+ main(args.config_dir, args.config_name, unknown)
run_scripts.md ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--Copyright 2022 The HuggingFace Team. All rights reserved.
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
4
+ the License. You may obtain a copy of the License at
5
+
6
+ http://www.apache.org/licenses/LICENSE-2.0
7
+
8
+ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
9
+ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
10
+ specific language governing permissions and limitations under the License.
11
+
12
+ ⚠️ Note that this file is in Markdown but contain specific syntax for our doc-builder (similar to MDX) that may not be
13
+ rendered properly in your Markdown viewer.
14
+
15
+ -->
16
+
17
+ # Trainieren mit einem Skript
18
+
19
+ Neben den 🤗 Transformers [notebooks](./notebooks) gibt es auch Beispielskripte, die zeigen, wie man ein Modell für eine Aufgabe mit [PyTorch](https://github.com/huggingface/transformers/tree/main/examples/pytorch), [TensorFlow](https://github.com/huggingface/transformers/tree/main/examples/tensorflow) oder [JAX/Flax](https://github.com/huggingface/transformers/tree/main/examples/flax) trainiert.
20
+
21
+ Sie werden auch Skripte finden, die wir in unseren [Forschungsprojekten](https://github.com/huggingface/transformers/tree/main/examples/research_projects) und [Legacy-Beispielen](https://github.com/huggingface/transformers/tree/main/examples/legacy) verwendet haben und die größtenteils von der Community stammen. Diese Skripte werden nicht aktiv gepflegt und erfordern eine bestimmte Version von 🤗 Transformers, die höchstwahrscheinlich nicht mit der neuesten Version der Bibliothek kompatibel ist.
22
+
23
+ Es wird nicht erwartet, dass die Beispielskripte bei jedem Problem sofort funktionieren. Möglicherweise müssen Sie das Skript an das Problem anpassen, das Sie zu lösen versuchen. Um Ihnen dabei zu helfen, legen die meisten Skripte vollständig offen, wie die Daten vorverarbeitet werden, so dass Sie sie nach Bedarf für Ihren Anwendungsfall bearbeiten können.
24
+
25
+ Für jede Funktion, die Sie in einem Beispielskript implementieren möchten, diskutieren Sie bitte im [Forum](https://discuss.huggingface.co/) oder in einem [issue](https://github.com/huggingface/transformers/issues), bevor Sie einen Pull Request einreichen. Wir freuen uns zwar über Fehlerkorrekturen, aber es ist unwahrscheinlich, dass wir einen Pull Request zusammenführen, der mehr Funktionalität auf Kosten der Lesbarkeit hinzufügt.
26
+
27
+ Diese Anleitung zeigt Ihnen, wie Sie ein Beispiel für ein Trainingsskript zur Zusammenfassung in [PyTorch](https://github.com/huggingface/transformers/tree/main/examples/pytorch/summarization) und [TensorFlow](https://github.com/huggingface/transformers/tree/main/examples/tensorflow/summarization) ausführen können. Sofern nicht anders angegeben, sollten alle Beispiele mit beiden Frameworks funktionieren.
28
+
29
+ ## Einrichtung
30
+
31
+ Um die neueste Version der Beispielskripte erfolgreich auszuführen, **müssen Sie 🤗 Transformers aus dem Quellcode** in einer neuen virtuellen Umgebung installieren:
32
+
33
+ ```bash
34
+ git clone https://github.com/huggingface/transformers
35
+ cd transformers
36
+ pip install .
37
+ ```
38
+
39
+ Für ältere Versionen der Beispielskripte klicken Sie auf die Umschalttaste unten:
40
+
41
+ <details>
42
+ <summary>Beispiele für ältere Versionen von 🤗 Transformers</summary>
43
+ <ul>
44
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.5.1/examples">v4.5.1</a></li>
45
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.4.2/examples">v4.4.2</a></li>
46
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.3.3/examples">v4.3.3</a></li>
47
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.2.2/examples">v4.2.2</a></li>
48
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.1.1/examples">v4.1.1</a></li>
49
+ <li><a href="https://github.com/huggingface/transformers/tree/v4.0.1/examples">v4.0.1</a></li>
50
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.5.1/examples">v3.5.1</a></li>
51
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.4.0/examples">v3.4.0</a></li>
52
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.3.1/examples">v3.3.1</a></li>
53
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.2.0/examples">v3.2.0</a></li>
54
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.1.0/examples">v3.1.0</a></li>
55
+ <li><a href="https://github.com/huggingface/transformers/tree/v3.0.2/examples">v3.0.2</a></li>
56
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.11.0/examples">v2.11.0</a></li>
57
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.10.0/examples">v2.10.0</a></li>
58
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.9.1/examples">v2.9.1</a></li>
59
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.8.0/examples">v2.8.0</a></li>
60
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.7.0/examples">v2.7.0</a></li>
61
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.6.0/examples">v2.6.0</a></li>
62
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.5.1/examples">v2.5.1</a></li>
63
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.4.0/examples">v2.4.0</a></li>
64
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.3.0/examples">v2.3.0</a></li>
65
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.2.0/examples">v2.2.0</a></li>
66
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.1.0/examples">v2.1.1</a></li>
67
+ <li><a href="https://github.com/huggingface/transformers/tree/v2.0.0/examples">v2.0.0</a></li>
68
+ <li><a href="https://github.com/huggingface/transformers/tree/v1.2.0/examples">v1.2.0</a></li>
69
+ <li><a href="https://github.com/huggingface/transformers/tree/v1.1.0/examples">v1.1.0</a></li>
70
+ <li><a href="https://github.com/huggingface/transformers/tree/v1.0.0/examples">v1.0.0</a></li>
71
+ </ul>
72
+ </details>
73
+
74
+ Dann stellen Sie Ihren aktuellen Klon von 🤗 Transformers auf eine bestimmte Version um, z.B. v3.5.1:
75
+
76
+ ```bash
77
+ git checkout tags/v3.5.1
78
+ ```
79
+
80
+ Nachdem Sie die richtige Bibliotheksversion eingerichtet haben, navigieren Sie zu dem Beispielordner Ihrer Wahl und installieren die beispielspezifischen Anforderungen:
81
+
82
+ ```bash
83
+ pip install -r requirements.txt
84
+ ```
85
+
86
+ ## Ein Skript ausführen
87
+
88
+ <frameworkcontent>
89
+ <pt>
90
+ Das Beispielskript lädt einen Datensatz aus der 🤗 [Datasets](https://huggingface.co/docs/datasets/) Bibliothek herunter und verarbeitet ihn vor. Dann nimmt das Skript eine Feinabstimmung eines Datensatzes mit dem [Trainer](https://huggingface.co/docs/transformers/main_classes/trainer) auf einer Architektur vor, die eine Zusammenfassung unterstützt. Das folgende Beispiel zeigt, wie die Feinabstimmung von [T5-small](https://huggingface.co/google-t5/t5-small) auf dem Datensatz [CNN/DailyMail](https://huggingface.co/datasets/cnn_dailymail) durchgeführt wird. Das T5-Modell benötigt aufgrund der Art und Weise, wie es trainiert wurde, ein zusätzliches Argument `source_prefix`. Mit dieser Eingabeaufforderung weiß T5, dass es sich um eine Zusammenfassungsaufgabe handelt.
91
+
92
+ ```bash
93
+ python examples/pytorch/summarization/run_summarization.py \
94
+ --model_name_or_path google-t5/t5-small \
95
+ --do_train \
96
+ --do_eval \
97
+ --dataset_name cnn_dailymail \
98
+ --dataset_config "3.0.0" \
99
+ --source_prefix "summarize: " \
100
+ --output_dir /tmp/tst-summarization \
101
+ --per_device_train_batch_size=4 \
102
+ --per_device_eval_batch_size=4 \
103
+ --overwrite_output_dir \
104
+ --predict_with_generate
105
+ ```
106
+ </pt>
107
+ <tf>
108
+ Das Beispielskript lädt einen Datensatz aus der 🤗 [Datasets](https://huggingface.co/docs/datasets/) Bibliothek herunter und verarbeitet ihn vor. Anschließend nimmt das Skript die Feinabstimmung eines Datensatzes mit Keras auf einer Architektur vor, die die Zusammenfassung unterstützt. Das folgende Beispiel zeigt, wie die Feinabstimmung von [T5-small](https://huggingface.co/google-t5/t5-small) auf dem [CNN/DailyMail](https://huggingface.co/datasets/cnn_dailymail) Datensatz durchgeführt wird. Das T5-Modell benötigt aufgrund der Art und Weise, wie es trainiert wurde, ein zusätzliches Argument `source_prefix`. Mit dieser Eingabeaufforderung weiß T5, dass es sich um eine Zusammenfassungsaufgabe handelt.
109
+
110
+ ```bash
111
+ python examples/tensorflow/summarization/run_summarization.py \
112
+ --model_name_or_path google-t5/t5-small \
113
+ --dataset_name cnn_dailymail \
114
+ --dataset_config "3.0.0" \
115
+ --output_dir /tmp/tst-summarization \
116
+ --per_device_train_batch_size 8 \
117
+ --per_device_eval_batch_size 16 \
118
+ --num_train_epochs 3 \
119
+ --do_train \
120
+ --do_eval
121
+ ```
122
+ </tf>
123
+ </frameworkcontent>
124
+
125
+ ## Verteiltes Training und gemischte Präzision
126
+
127
+ Der [Trainer](https://huggingface.co/docs/transformers/main_classes/trainer) unterstützt verteiltes Training und gemischte Präzision, d.h. Sie können ihn auch in einem Skript verwenden. So aktivieren Sie diese beiden Funktionen:
128
+
129
+ - Fügen Sie das Argument `fp16` hinzu, um gemischte Genauigkeit zu aktivieren.
130
+ - Legen Sie die Anzahl der zu verwendenden GPUs mit dem Argument `nproc_per_node` fest.
131
+
132
+ ```bash
133
+ torchrun \
134
+ --nproc_per_node 8 pytorch/summarization/run_summarization.py \
135
+ --fp16 \
136
+ --model_name_or_path google-t5/t5-small \
137
+ --do_train \
138
+ --do_eval \
139
+ --dataset_name cnn_dailymail \
140
+ --dataset_config "3.0.0" \
141
+ --source_prefix "summarize: " \
142
+ --output_dir /tmp/tst-summarization \
143
+ --per_device_train_batch_size=4 \
144
+ --per_device_eval_batch_size=4 \
145
+ --overwrite_output_dir \
146
+ --predict_with_generate
147
+ ```
148
+
149
+ TensorFlow-Skripte verwenden eine [`MirroredStrategy`](https://www.tensorflow.org/guide/distributed_training#mirroredstrategy) für verteiltes Training, und Sie müssen dem Trainingsskript keine zusätzlichen Argumente hinzufügen. Das TensorFlow-Skript verwendet standardmäßig mehrere GPUs, wenn diese verfügbar sind.
150
+
151
+ ## Ein Skript auf einer TPU ausführen
152
+
153
+ <frameworkcontent>
154
+ <pt>
155
+ Tensor Processing Units (TPUs) sind speziell für die Beschleunigung der Leistung konzipiert. PyTorch unterstützt TPUs mit dem [XLA](https://www.tensorflow.org/xla) Deep Learning Compiler (siehe [hier](https://github.com/pytorch/xla/blob/master/README.md) für weitere Details). Um eine TPU zu verwenden, starten Sie das Skript `xla_spawn.py` und verwenden das Argument `num_cores`, um die Anzahl der TPU-Kerne festzulegen, die Sie verwenden möchten.
156
+
157
+ ```bash
158
+ python xla_spawn.py --num_cores 8 \
159
+ summarization/run_summarization.py \
160
+ --model_name_or_path google-t5/t5-small \
161
+ --do_train \
162
+ --do_eval \
163
+ --dataset_name cnn_dailymail \
164
+ --dataset_config "3.0.0" \
165
+ --source_prefix "summarize: " \
166
+ --output_dir /tmp/tst-summarization \
167
+ --per_device_train_batch_size=4 \
168
+ --per_device_eval_batch_size=4 \
169
+ --overwrite_output_dir \
170
+ --predict_with_generate
171
+ ```
172
+ </pt>
173
+ <tf>
174
+ Tensor Processing Units (TPUs) sind speziell für die Beschleunigung der Leistung konzipiert. TensorFlow Skripte verwenden eine [`TPUStrategy`](https://www.tensorflow.org/guide/distributed_training#tpustrategy) für das Training auf TPUs. Um eine TPU zu verwenden, übergeben Sie den Namen der TPU-Ressource an das Argument `tpu`.
175
+
176
+ ```bash
177
+ python run_summarization.py \
178
+ --tpu name_of_tpu_resource \
179
+ --model_name_or_path google-t5/t5-small \
180
+ --dataset_name cnn_dailymail \
181
+ --dataset_config "3.0.0" \
182
+ --output_dir /tmp/tst-summarization \
183
+ --per_device_train_batch_size 8 \
184
+ --per_device_eval_batch_size 16 \
185
+ --num_train_epochs 3 \
186
+ --do_train \
187
+ --do_eval
188
+ ```
189
+ </tf>
190
+ </frameworkcontent>
191
+
192
+ ## Führen Sie ein Skript mit 🤗 Accelerate aus.
193
+
194
+ 🤗 [Accelerate](https://huggingface.co/docs/accelerate) ist eine reine PyTorch-Bibliothek, die eine einheitliche Methode für das Training eines Modells auf verschiedenen Arten von Setups (nur CPU, mehrere GPUs, TPUs) bietet und dabei die vollständige Transparenz der PyTorch-Trainingsschleife beibehält. Stellen Sie sicher, dass Sie 🤗 Accelerate installiert haben, wenn Sie es nicht bereits haben:
195
+
196
+ > Hinweis: Da Accelerate schnell weiterentwickelt wird, muss die Git-Version von Accelerate installiert sein, um die Skripte auszuführen.
197
+ ```bash
198
+ pip install git+https://github.com/huggingface/accelerate
199
+ ```
200
+
201
+ Anstelle des Skripts `run_summarization.py` müssen Sie das Skript `run_summarization_no_trainer.py` verwenden. Die von Accelerate unterstützten Skripte haben eine Datei `task_no_trainer.py` im Ordner. Beginnen Sie mit dem folgenden Befehl, um eine Konfigurationsdatei zu erstellen und zu speichern:
202
+
203
+ ```bash
204
+ accelerate config
205
+ ```
206
+
207
+ Testen Sie Ihre Einrichtung, um sicherzustellen, dass sie korrekt konfiguriert ist:
208
+
209
+ ```bash
210
+ accelerate test
211
+ ```
212
+
213
+ Jetzt sind Sie bereit, das Training zu starten:
214
+
215
+ ```bash
216
+ accelerate launch run_summarization_no_trainer.py \
217
+ --model_name_or_path google-t5/t5-small \
218
+ --dataset_name cnn_dailymail \
219
+ --dataset_config "3.0.0" \
220
+ --source_prefix "summarize: " \
221
+ --output_dir ~/tmp/tst-summarization
222
+ ```
223
+
224
+ ## Verwenden Sie einen benutzerdefinierten Datensatz
225
+
226
+ Das Verdichtungsskript unterstützt benutzerdefinierte Datensätze, solange es sich um eine CSV- oder JSON-Line-Datei handelt. Wenn Sie Ihren eigenen Datensatz verwenden, müssen Sie mehrere zusätzliche Argumente angeben:
227
+
228
+ - `train_file` und `validation_file` geben den Pfad zu Ihren Trainings- und Validierungsdateien an.
229
+ - `text_column` ist der Eingabetext, der zusammengefasst werden soll.
230
+ - Summary_column" ist der auszugebende Zieltext.
231
+
232
+ Ein Zusammenfassungsskript, das einen benutzerdefinierten Datensatz verwendet, würde wie folgt aussehen:
233
+
234
+ ```bash
235
+ python examples/pytorch/summarization/run_summarization.py \
236
+ --model_name_or_path google-t5/t5-small \
237
+ --do_train \
238
+ --do_eval \
239
+ --train_file path_to_csv_or_jsonlines_file \
240
+ --validation_file path_to_csv_or_jsonlines_file \
241
+ --text_column text_column_name \
242
+ --summary_column summary_column_name \
243
+ --source_prefix "summarize: " \
244
+ --output_dir /tmp/tst-summarization \
245
+ --overwrite_output_dir \
246
+ --per_device_train_batch_size=4 \
247
+ --per_device_eval_batch_size=4 \
248
+ --predict_with_generate
249
+ ```
250
+
251
+ ## Testen Sie ein Skript
252
+
253
+ Es ist oft eine gute Idee, Ihr Skript an einer kleineren Anzahl von Beispielen für Datensätze auszuführen, um sicherzustellen, dass alles wie erwartet funktioniert, bevor Sie sich auf einen ganzen Datensatz festlegen, dessen Fertigstellung Stunden dauern kann. Verwenden Sie die folgenden Argumente, um den Datensatz auf eine maximale Anzahl von Stichproben zu beschränken:
254
+
255
+ - `max_train_samples`
256
+ - `max_eval_samples`
257
+ - `max_predict_samples`
258
+
259
+ ```bash
260
+ python examples/pytorch/summarization/run_summarization.py \
261
+ --model_name_or_path google-t5/t5-small \
262
+ --max_train_samples 50 \
263
+ --max_eval_samples 50 \
264
+ --max_predict_samples 50 \
265
+ --do_train \
266
+ --do_eval \
267
+ --dataset_name cnn_dailymail \
268
+ --dataset_config "3.0.0" \
269
+ --source_prefix "summarize: " \
270
+ --output_dir /tmp/tst-summarization \
271
+ --per_device_train_batch_size=4 \
272
+ --per_device_eval_batch_size=4 \
273
+ --overwrite_output_dir \
274
+ --predict_with_generate
275
+ ```
276
+
277
+ Nicht alle Beispielskripte unterstützen das Argument `max_predict_samples`. Wenn Sie sich nicht sicher sind, ob Ihr Skript dieses Argument unterstützt, fügen Sie das Argument `-h` hinzu, um dies zu überprüfen:
278
+
279
+ ```bash
280
+ examples/pytorch/summarization/run_summarization.py -h
281
+ ```
282
+
283
+ ## Training vom Kontrollpunkt fortsetzen
284
+
285
+ Eine weitere hilfreiche Option, die Sie aktivieren können, ist die Wiederaufnahme des Trainings von einem früheren Kontrollpunkt aus. Auf diese Weise können Sie im Falle einer Unterbrechung Ihres Trainings dort weitermachen, wo Sie aufgehört haben, ohne von vorne beginnen zu müssen. Es gibt zwei Methoden, um das Training von einem Kontrollpunkt aus wieder aufzunehmen.
286
+
287
+ Die erste Methode verwendet das Argument `output_dir previous_output_dir`, um das Training ab dem letzten in `output_dir` gespeicherten Kontrollpunkt wieder aufzunehmen. In diesem Fall sollten Sie `overwrite_output_dir` entfernen:
288
+
289
+ ```bash
290
+ python examples/pytorch/summarization/run_summarization.py
291
+ --model_name_or_path google-t5/t5-small \
292
+ --do_train \
293
+ --do_eval \
294
+ --dataset_name cnn_dailymail \
295
+ --dataset_config "3.0.0" \
296
+ --source_prefix "summarize: " \
297
+ --output_dir /tmp/tst-summarization \
298
+ --per_device_train_batch_size=4 \
299
+ --per_device_eval_batch_size=4 \
300
+ --output_dir previous_output_dir \
301
+ --predict_with_generate
302
+ ```
303
+
304
+ Die zweite Methode verwendet das Argument `Resume_from_checkpoint path_to_specific_checkpoint`, um das Training ab einem bestimmten Checkpoint-Ordner wieder aufzunehmen.
305
+
306
+ ```bash
307
+ python examples/pytorch/summarization/run_summarization.py
308
+ --model_name_or_path google-t5/t5-small \
309
+ --do_train \
310
+ --do_eval \
311
+ --dataset_name cnn_dailymail \
312
+ --dataset_config "3.0.0" \
313
+ --source_prefix "summarize: " \
314
+ --output_dir /tmp/tst-summarization \
315
+ --per_device_train_batch_size=4 \
316
+ --per_device_eval_batch_size=4 \
317
+ --overwrite_output_dir \
318
+ --resume_from_checkpoint path_to_specific_checkpoint \
319
+ --predict_with_generate
320
+ ```
321
+
322
+ ## Teilen Sie Ihr Modell
323
+
324
+ Alle Skripte können Ihr endgültiges Modell in den [Model Hub](https://huggingface.co/models) hochladen. Stellen Sie sicher, dass Sie bei Hugging Face angemeldet sind, bevor Sie beginnen:
325
+
326
+ ```bash
327
+ huggingface-cli login
328
+ ```
329
+
330
+ Dann fügen Sie dem Skript das Argument `push_to_hub` hinzu. Mit diesem Argument wird ein Repository mit Ihrem Hugging Face-Benutzernamen und dem in `output_dir` angegebenen Ordnernamen erstellt.
331
+
332
+ Wenn Sie Ihrem Repository einen bestimmten Namen geben möchten, fügen Sie ihn mit dem Argument `push_to_hub_model_id` hinzu. Das Repository wird automatisch unter Ihrem Namensraum aufgeführt.
333
+
334
+ Das folgende Beispiel zeigt, wie Sie ein Modell mit einem bestimmten Repository-Namen hochladen können:
335
+
336
+ ```bash
337
+ python examples/pytorch/summarization/run_summarization.py
338
+ --model_name_or_path google-t5/t5-small \
339
+ --do_train \
340
+ --do_eval \
341
+ --dataset_name cnn_dailymail \
342
+ --dataset_config "3.0.0" \
343
+ --source_prefix "summarize: " \
344
+ --push_to_hub \
345
+ --push_to_hub_model_id finetuned-t5-cnn_dailymail \
346
+ --output_dir /tmp/tst-summarization \
347
+ --per_device_train_batch_size=4 \
348
+ --per_device_eval_batch_size=4 \
349
+ --overwrite_output_dir \
350
+ --predict_with_generate
351
+ ```