Compare commits
61
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4114a96831 | ||
|
|
fa6a4414bb | ||
|
|
1b073be34e | ||
|
|
4abf78f2b1 | ||
|
|
bf5819f6f4 | ||
|
|
8fd0275066 | ||
|
|
daf2a4a37e | ||
|
|
8202330d24 | ||
|
|
995c47b1fe | ||
|
|
e36a51ed58 | ||
|
|
d0be398f50 | ||
|
|
896f8aaefc | ||
|
|
520b558a6a | ||
|
|
4ee2f6f4d8 | ||
|
|
0ca151b168 | ||
|
|
6fc3849dce | ||
|
|
ba4c3a9a07 | ||
|
|
342db2aaf6 | ||
|
|
1108ec9bfd | ||
|
|
7968051aba | ||
|
|
2977bd528f | ||
|
|
2d6e2ad4fa | ||
|
|
7e73c12805 | ||
|
|
8cb4ecca25 | ||
|
|
52f7d74398 | ||
|
|
82b09a8481 | ||
|
|
2d4e928d97 | ||
|
|
dcba9ee03b | ||
|
|
f34b4cd1bd | ||
|
|
9c2b2db2cd | ||
|
|
aacac8f708 | ||
|
|
1f1d950b28 | ||
|
|
d9ffb87efb | ||
|
|
d6175a4268 | ||
|
|
1d5ea34f6a | ||
|
|
f176e70723 | ||
|
|
34fcfb44e3 | ||
|
|
2f34bcf3e7 | ||
|
|
13c1857718 | ||
|
|
83086858f8 | ||
|
|
03ec02a667 | ||
|
|
827c519494 | ||
|
|
ba4bbd92bc | ||
|
|
26d5475d4b | ||
|
|
c6e18de9f8 | ||
|
|
2c9e83f7b8 | ||
|
|
9618cd6964 | ||
|
|
4dcc424de3 | ||
|
|
a3cea6a8cc | ||
|
|
0af53b1ef9 | ||
|
|
b0f05e0c4c | ||
|
|
bc00b37a0d | ||
|
|
76e05518bb | ||
|
|
9ad830596d | ||
|
|
a1ac082879 | ||
|
|
21ed3a6b99 | ||
|
|
5668fdb09e | ||
|
|
0578a91300 | ||
|
|
297233fa92 | ||
|
|
a1ecc90d6b | ||
|
|
06a973fd2a |
No files matched your search
@@ -37,25 +37,27 @@ members/contributors which may be interested in your PR.
|
|||||||
If you know how to use git blame, that is the easiest way, otherwise, here is a rough guide of **who to tag**.
|
If you know how to use git blame, that is the easiest way, otherwise, here is a rough guide of **who to tag**.
|
||||||
Please tag fewer than 3 people.
|
Please tag fewer than 3 people.
|
||||||
|
|
||||||
albert, bert, GPT2, XLM: @LysandreJik
|
albert, bert, XLM: @LysandreJik
|
||||||
|
GPT2: @LysandreJik, @patrickvonplaten
|
||||||
tokenizers: @mfuntowicz
|
tokenizers: @mfuntowicz
|
||||||
Trainer: @sgugger
|
Trainer: @sgugger
|
||||||
Speed and Memory Benchmarks: @patrickvonplaten
|
Benchmarks: @patrickvonplaten
|
||||||
Model Cards: @julien-c
|
Model Cards: @julien-c
|
||||||
Translation: @sshleifer
|
Translation: @sshleifer
|
||||||
Summarization: @sshleifer
|
Summarization: @sshleifer
|
||||||
TextGeneration: @TevenLeScao
|
|
||||||
examples/distillation: @VictorSanh
|
examples/distillation: @VictorSanh
|
||||||
nlp datasets: [different repo](https://github.com/huggingface/nlp)
|
nlp datasets: [different repo](https://github.com/huggingface/nlp)
|
||||||
rust tokenizers: [different repo](https://github.com/huggingface/tokenizers)
|
rust tokenizers: [different repo](https://github.com/huggingface/tokenizers)
|
||||||
Text Generation: @TevenLeScao
|
Text Generation: @patrickvonplaten, @TevenLeScao
|
||||||
Blenderbot, Bart, Marian, Pegasus: @sshleifer
|
Blenderbot, Bart, Marian, Pegasus: @sshleifer
|
||||||
T5: @patrickvonplaten
|
T5: @patrickvonplaten
|
||||||
Longformer/Reformer: @patrickvonplaten
|
Rag: @patrickvonplaten, @lhoestq
|
||||||
TransfoXL/XLNet: @TevenLeScao
|
EncoderDecoder: @patrickvonplaten
|
||||||
|
Longformer, Reformer: @patrickvonplaten
|
||||||
|
TransfoXL, XLNet: @TevenLeScao, @patrickvonplaten
|
||||||
examples/seq2seq: @sshleifer
|
examples/seq2seq: @sshleifer
|
||||||
examples/bert-loses-patience: @JetRunner
|
examples/bert-loses-patience: @JetRunner
|
||||||
tensorflow: @jplu
|
tensorflow: @jplu
|
||||||
examples/token-classification: @stefan-it
|
examples/token-classification: @stefan-it
|
||||||
documentation: @sgugger
|
documentation: @sgugger
|
||||||
-->
|
-->
|
||||||
@@ -12,6 +12,7 @@ __pycache__/
|
|||||||
tests/fixtures
|
tests/fixtures
|
||||||
logs/
|
logs/
|
||||||
lightning_logs/
|
lightning_logs/
|
||||||
|
lang_code_data/
|
||||||
|
|
||||||
# Distribution / packaging
|
# Distribution / packaging
|
||||||
.Python
|
.Python
|
||||||
|
|||||||
@@ -161,31 +161,31 @@ If you'd like to play with the examples, you must [install the library from sour
|
|||||||
1. **[ALBERT](https://huggingface.co/transformers/model_doc/albert.html)** (from Google Research and the Toyota Technological Institute at Chicago) released with the paper [ALBERT: A Lite BERT for Self-supervised Learning of Language Representations](https://arxiv.org/abs/1909.11942), by Zhenzhong Lan, Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush Sharma, Radu Soricut.
|
1. **[ALBERT](https://huggingface.co/transformers/model_doc/albert.html)** (from Google Research and the Toyota Technological Institute at Chicago) released with the paper [ALBERT: A Lite BERT for Self-supervised Learning of Language Representations](https://arxiv.org/abs/1909.11942), by Zhenzhong Lan, Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush Sharma, Radu Soricut.
|
||||||
1. **[BART](https://huggingface.co/transformers/model_doc/bart.html)** (from Facebook) released with the paper [BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension](https://arxiv.org/pdf/1910.13461.pdf) by Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Ves Stoyanov and Luke Zettlemoyer.
|
1. **[BART](https://huggingface.co/transformers/model_doc/bart.html)** (from Facebook) released with the paper [BART: Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension](https://arxiv.org/pdf/1910.13461.pdf) by Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman Mohamed, Omer Levy, Ves Stoyanov and Luke Zettlemoyer.
|
||||||
1. **[BERT](https://huggingface.co/transformers/model_doc/bert.html)** (from Google) released with the paper [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) by Jacob Devlin, Ming-Wei Chang, Kenton Lee and Kristina Toutanova.
|
1. **[BERT](https://huggingface.co/transformers/model_doc/bert.html)** (from Google) released with the paper [BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding](https://arxiv.org/abs/1810.04805) by Jacob Devlin, Ming-Wei Chang, Kenton Lee and Kristina Toutanova.
|
||||||
1. **[BERT For Sequence Generation](https://tfhub.dev/s?module-type=text-generation&subtype=module,placeholder)** (from Google) released with the paper [Leveraging Pre-trained Checkpoints for Sequence Generation Tasks](https://arxiv.org/abs/1907.12461) by Sascha Rothe, Shashi Narayan, Aliaksei Severyn.
|
1. **[BERT For Sequence Generation](https://huggingface.co/transformers/model_doc/bertgeneration.html)** (from Google) released with the paper [Leveraging Pre-trained Checkpoints for Sequence Generation Tasks](https://arxiv.org/abs/1907.12461) by Sascha Rothe, Shashi Narayan, Aliaksei Severyn.
|
||||||
|
1. **[Blenderbot](https://huggingface.co/transformers/master/model_doc/blenderbot.html)** (from Facebook) released with the paper [Recipes for building an open-domain chatbot](https://arxiv.org/abs/2004.13637) by Stephen Roller, Emily Dinan, Naman Goyal, Da Ju, Mary Williamson, Yinhan Liu, Jing Xu, Myle Ott, Kurt Shuster, Eric M. Smith, Y-Lan Boureau, Jason Weston.
|
||||||
1. **[CamemBERT](https://huggingface.co/transformers/model_doc/camembert.html)** (from Inria/Facebook/Sorbonne) released with the paper [CamemBERT: a Tasty French Language Model](https://arxiv.org/abs/1911.03894) by Louis Martin*, Benjamin Muller*, Pedro Javier Ortiz Suárez*, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah and Benoît Sagot.
|
1. **[CamemBERT](https://huggingface.co/transformers/model_doc/camembert.html)** (from Inria/Facebook/Sorbonne) released with the paper [CamemBERT: a Tasty French Language Model](https://arxiv.org/abs/1911.03894) by Louis Martin*, Benjamin Muller*, Pedro Javier Ortiz Suárez*, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah and Benoît Sagot.
|
||||||
1. **[CTRL](https://huggingface.co/transformers/model_doc/ctrl.html)** (from Salesforce) released with the paper [CTRL: A Conditional Transformer Language Model for Controllable Generation](https://arxiv.org/abs/1909.05858) by Nitish Shirish Keskar*, Bryan McCann*, Lav R. Varshney, Caiming Xiong and Richard Socher.
|
1. **[CTRL](https://huggingface.co/transformers/model_doc/ctrl.html)** (from Salesforce) released with the paper [CTRL: A Conditional Transformer Language Model for Controllable Generation](https://arxiv.org/abs/1909.05858) by Nitish Shirish Keskar*, Bryan McCann*, Lav R. Varshney, Caiming Xiong and Richard Socher.
|
||||||
1. **[DeBERTa](https://huggingface.co/transformers/model_doc/deberta.html)** (from Microsoft Research) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
1. **[DeBERTa](https://huggingface.co/transformers/master/model_doc/deberta.html)** (from Microsoft Research) released with the paper [DeBERTa: Decoding-enhanced BERT with Disentangled Attention](https://arxiv.org/abs/2006.03654) by Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
1. **[DialoGPT](https://huggingface.co/transformers/model_doc/dialogpt.html)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
1. **[DialoGPT](https://huggingface.co/transformers/model_doc/dialogpt.html)** (from Microsoft Research) released with the paper [DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation](https://arxiv.org/abs/1911.00536) by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
||||||
1. **[DistilBERT](https://huggingface.co/transformers/model_doc/distilbert.html)** (from HuggingFace), released together with the paper [DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter](https://arxiv.org/abs/1910.01108) by Victor Sanh, Lysandre Debut and Thomas Wolf. The same method has been applied to compress GPT2 into [DistilGPT2](https://github.com/huggingface/transformers/tree/master/examples/distillation), RoBERTa into [DistilRoBERTa](https://github.com/huggingface/transformers/tree/master/examples/distillation), Multilingual BERT into [DistilmBERT](https://github.com/huggingface/transformers/tree/master/examples/distillation) and a German version of DistilBERT.
|
1. **[DistilBERT](https://huggingface.co/transformers/model_doc/distilbert.html)** (from HuggingFace), released together with the paper [DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter](https://arxiv.org/abs/1910.01108) by Victor Sanh, Lysandre Debut and Thomas Wolf. The same method has been applied to compress GPT2 into [DistilGPT2](https://github.com/huggingface/transformers/tree/master/examples/distillation), RoBERTa into [DistilRoBERTa](https://github.com/huggingface/transformers/tree/master/examples/distillation), Multilingual BERT into [DistilmBERT](https://github.com/huggingface/transformers/tree/master/examples/distillation) and a German version of DistilBERT.
|
||||||
1. **[DPR](https://github.com/facebookresearch/DPR)** (from Facebook) released with the paper [Dense Passage Retrieval
|
1. **[DPR](https://huggingface.co/transformers/model_doc/dpr.html)** (from Facebook) released with the paper [Dense Passage Retrieval
|
||||||
for Open-Domain Question Answering](https://arxiv.org/abs/2004.04906) by Vladimir Karpukhin, Barlas Oğuz, Sewon
|
for Open-Domain Question Answering](https://arxiv.org/abs/2004.04906) by Vladimir Karpukhin, Barlas Oğuz, Sewon
|
||||||
Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and Wen-tau Yih.
|
Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and Wen-tau Yih.
|
||||||
1. **[ELECTRA](https://huggingface.co/transformers/model_doc/electra.html)** (from Google Research/Stanford University) released with the paper [ELECTRA: Pre-training text encoders as discriminators rather than generators](https://arxiv.org/abs/2003.10555) by Kevin Clark, Minh-Thang Luong, Quoc V. Le, Christopher D. Manning.
|
1. **[ELECTRA](https://huggingface.co/transformers/model_doc/electra.html)** (from Google Research/Stanford University) released with the paper [ELECTRA: Pre-training text encoders as discriminators rather than generators](https://arxiv.org/abs/2003.10555) by Kevin Clark, Minh-Thang Luong, Quoc V. Le, Christopher D. Manning.
|
||||||
1. **[FlauBERT](https://huggingface.co/transformers/model_doc/flaubert.html)** (from CNRS) released with the paper [FlauBERT: Unsupervised Language Model Pre-training for French](https://arxiv.org/abs/1912.05372) by Hang Le, Loïc Vial, Jibril Frej, Vincent Segonne, Maximin Coavoux, Benjamin Lecouteux, Alexandre Allauzen, Benoît Crabbé, Laurent Besacier, Didier Schwab.
|
1. **[FlauBERT](https://huggingface.co/transformers/model_doc/flaubert.html)** (from CNRS) released with the paper [FlauBERT: Unsupervised Language Model Pre-training for French](https://arxiv.org/abs/1912.05372) by Hang Le, Loïc Vial, Jibril Frej, Vincent Segonne, Maximin Coavoux, Benjamin Lecouteux, Alexandre Allauzen, Benoît Crabbé, Laurent Besacier, Didier Schwab.
|
||||||
1. **[Funnel Transformer](https://github.com/laiguokun/Funnel-Transformer)** (from CMU/Google Brain) released with the paper [Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing](https://arxiv.org/abs/2006.03236) by Zihang Dai, Guokun Lai, Yiming Yang, Quoc V. Le.
|
1. **[Funnel Transformer](https://huggingface.co/transformers/model_doc/funnel.html)** (from CMU/Google Brain) released with the paper [Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing](https://arxiv.org/abs/2006.03236) by Zihang Dai, Guokun Lai, Yiming Yang, Quoc V. Le.
|
||||||
1. **[GPT](https://huggingface.co/transformers/model_doc/gpt.html)** (from OpenAI) released with the paper [Improving Language Understanding by Generative Pre-Training](https://blog.openai.com/language-unsupervised/) by Alec Radford, Karthik Narasimhan, Tim Salimans and Ilya Sutskever.
|
1. **[GPT](https://huggingface.co/transformers/model_doc/gpt.html)** (from OpenAI) released with the paper [Improving Language Understanding by Generative Pre-Training](https://blog.openai.com/language-unsupervised/) by Alec Radford, Karthik Narasimhan, Tim Salimans and Ilya Sutskever.
|
||||||
1. **[GPT-2](https://huggingface.co/transformers/model_doc/gpt2.html)** (from OpenAI) released with the paper [Language Models are Unsupervised Multitask Learners](https://blog.openai.com/better-language-models/) by Alec Radford*, Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei** and Ilya Sutskever**.
|
1. **[GPT-2](https://huggingface.co/transformers/model_doc/gpt2.html)** (from OpenAI) released with the paper [Language Models are Unsupervised Multitask Learners](https://blog.openai.com/better-language-models/) by Alec Radford*, Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei** and Ilya Sutskever**.
|
||||||
1. **[LayoutLM](https://github.com/microsoft/unilm/tree/master/layoutlm)** (from Microsoft Research Asia) released with the paper [LayoutLM: Pre-training of Text and Layout for Document Image Understanding](https://arxiv.org/abs/1912.13318) by Yiheng Xu, Minghao Li, Lei Cui, Shaohan Huang, Furu Wei, Ming Zhou.
|
1. **[LayoutLM](https://huggingface.co/transformers/model_doc/layoutlm.html)** (from Microsoft Research Asia) released with the paper [LayoutLM: Pre-training of Text and Layout for Document Image Understanding](https://arxiv.org/abs/1912.13318) by Yiheng Xu, Minghao Li, Lei Cui, Shaohan Huang, Furu Wei, Ming Zhou.
|
||||||
1. **[Longformer](https://huggingface.co/transformers/model_doc/longformer.html)** (from AllenAI) released with the paper [Longformer: The Long-Document Transformer](https://arxiv.org/abs/2004.05150) by Iz Beltagy, Matthew E. Peters, Arman Cohan.
|
1. **[Longformer](https://huggingface.co/transformers/model_doc/longformer.html)** (from AllenAI) released with the paper [Longformer: The Long-Document Transformer](https://arxiv.org/abs/2004.05150) by Iz Beltagy, Matthew E. Peters, Arman Cohan.
|
||||||
1. **[LXMERT](https://github.com/airsplay/lxmert)** (from UNC Chapel Hill) released with the paper [LXMERT: Learning Cross-Modality Encoder Representations from Transformers for Open-Domain Question Answering](https://arxiv.org/abs/1908.07490) by Hao Tan and Mohit Bansal.
|
1. **[LXMERT](https://huggingface.co/transformers/model_doc/lxmert.html)** (from UNC Chapel Hill) released with the paper [LXMERT: Learning Cross-Modality Encoder Representations from Transformers for Open-Domain Question Answering](https://arxiv.org/abs/1908.07490) by Hao Tan and Mohit Bansal.
|
||||||
1. **[MarianMT](https://huggingface.co/transformers/model_doc/marian.html)** Machine translation models trained using [OPUS](http://opus.nlpl.eu/) data by Jörg Tiedemann. The [Marian Framework](https://marian-nmt.github.io/) is being developed by the Microsoft Translator Team.
|
1. **[MarianMT](https://huggingface.co/transformers/model_doc/marian.html)** Machine translation models trained using [OPUS](http://opus.nlpl.eu/) data by Jörg Tiedemann. The [Marian Framework](https://marian-nmt.github.io/) is being developed by the Microsoft Translator Team.
|
||||||
1. **[MBart](https://github.com/pytorch/fairseq/tree/master/examples/mbart)** (from Facebook) released with the paper [Multilingual Denoising Pre-training for Neural Machine Translation](https://arxiv.org/abs/2001.08210) by Yinhan Liu, Jiatao Gu, Naman Goyal, Xian Li, Sergey Edunov, Marjan Ghazvininejad, Mike Lewis, Luke Zettlemoyer.
|
1. **[MBart](https://huggingface.co/transformers/model_doc/mbart.html)** (from Facebook) released with the paper [Multilingual Denoising Pre-training for Neural Machine Translation](https://arxiv.org/abs/2001.08210) by Yinhan Liu, Jiatao Gu, Naman Goyal, Xian Li, Sergey Edunov, Marjan Ghazvininejad, Mike Lewis, Luke Zettlemoyer.
|
||||||
1. **[MMBT](https://github.com/facebookresearch/mmbt/)** (from Facebook), released together with the paper a [Supervised Multimodal Bitransformers for Classifying Images and Text](https://arxiv.org/pdf/1909.02950.pdf) by Douwe Kiela, Suvrat Bhooshan, Hamed Firooz, Davide Testuggine.
|
1. **[Pegasus](https://huggingface.co/transformers/model_doc/pegasus.html)** (from Google) released with the paper [PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization](https://arxiv.org/abs/1912.08777)> by Jingqing Zhang, Yao Zhao, Mohammad Saleh and Peter J. Liu.
|
||||||
1. **[Pegasus](https://github.com/google-research/pegasus)** (from Google) released with the paper [PEGASUS: Pre-training with Extracted Gap-sentences for Abstractive Summarization](https://arxiv.org/abs/1912.08777)> by Jingqing Zhang, Yao Zhao, Mohammad Saleh and Peter J. Liu.
|
|
||||||
1. **[Reformer](https://huggingface.co/transformers/model_doc/reformer.html)** (from Google Research) released with the paper [Reformer: The Efficient Transformer](https://arxiv.org/abs/2001.04451) by Nikita Kitaev, Łukasz Kaiser, Anselm Levskaya.
|
1. **[Reformer](https://huggingface.co/transformers/model_doc/reformer.html)** (from Google Research) released with the paper [Reformer: The Efficient Transformer](https://arxiv.org/abs/2001.04451) by Nikita Kitaev, Łukasz Kaiser, Anselm Levskaya.
|
||||||
1. **[RoBERTa](https://huggingface.co/transformers/model_doc/roberta.html)** (from Facebook), released together with the paper a [Robustly Optimized BERT Pretraining Approach](https://arxiv.org/abs/1907.11692) by Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov.
|
1. **[RoBERTa](https://huggingface.co/transformers/model_doc/roberta.html)** (from Facebook), released together with the paper a [Robustly Optimized BERT Pretraining Approach](https://arxiv.org/abs/1907.11692) by Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov.
|
||||||
ultilingual BERT into [DistilmBERT](https://github.com/huggingface/transformers/tree/master/examples/distillation) and a German version of DistilBERT.
|
ultilingual BERT into [DistilmBERT](https://github.com/huggingface/transformers/tree/master/examples/distillation) and a German version of DistilBERT.
|
||||||
1. **[SqueezeBert](https://huggingface.co/transformers/model_doc/squeezebert.html)** released with the paper [SqueezeBERT: What can computer vision teach NLP about efficient neural networks?](https://arxiv.org/abs/2006.11316) by Forrest N. Iandola, Albert E. Shaw, Ravi Krishna, and Kurt W. Keutzer.
|
1. **[SqueezeBert](https://huggingface.co/transformers/master/model_doc/squeezebert.html)** released with the paper [SqueezeBERT: What can computer vision teach NLP about efficient neural networks?](https://arxiv.org/abs/2006.11316) by Forrest N. Iandola, Albert E. Shaw, Ravi Krishna, and Kurt W. Keutzer.
|
||||||
1. **[T5](https://huggingface.co/transformers/model_doc/t5.html)** (from Google AI) released with the paper [Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer](https://arxiv.org/abs/1910.10683) by Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu.
|
1. **[T5](https://huggingface.co/transformers/model_doc/t5.html)** (from Google AI) released with the paper [Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer](https://arxiv.org/abs/1910.10683) by Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu.
|
||||||
1. **[Transformer-XL](https://huggingface.co/transformers/model_doc/transformerxl.html)** (from Google/CMU) released with the paper [Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context](https://arxiv.org/abs/1901.02860) by Zihang Dai*, Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov.
|
1. **[Transformer-XL](https://huggingface.co/transformers/model_doc/transformerxl.html)** (from Google/CMU) released with the paper [Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context](https://arxiv.org/abs/1901.02860) by Zihang Dai*, Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov.
|
||||||
1. **[XLM](https://huggingface.co/transformers/model_doc/xlm.html)** (from Facebook) released together with the paper [Cross-lingual Language Model Pretraining](https://arxiv.org/abs/1901.07291) by Guillaume Lample and Alexis Conneau.
|
1. **[XLM](https://huggingface.co/transformers/model_doc/xlm.html)** (from Facebook) released together with the paper [Cross-lingual Language Model Pretraining](https://arxiv.org/abs/1901.07291) by Guillaume Lample and Alexis Conneau.
|
||||||
|
|||||||
+90
-99
@@ -57,112 +57,103 @@ conversion utilities for the following models:
|
|||||||
..
|
..
|
||||||
This list is updated automatically from the README with `make fix-copies`. Do not update manually!
|
This list is updated automatically from the README with `make fix-copies`. Do not update manually!
|
||||||
|
|
||||||
1. `ALBERT <https://huggingface.co/transformers/model_doc/albert.html>`__ (from Google Research and the Toyota
|
1. :doc:`ALBERT <model_doc/albert>` (from Google Research and the Toyota Technological Institute at Chicago) released
|
||||||
Technological Institute at Chicago) released with the paper `ALBERT: A Lite BERT for Self-supervised Learning of
|
with the paper `ALBERT: A Lite BERT for Self-supervised Learning of Language Representations
|
||||||
Language Representations <https://arxiv.org/abs/1909.11942>`__, by Zhenzhong Lan, Mingda Chen, Sebastian Goodman,
|
<https://arxiv.org/abs/1909.11942>`__, by Zhenzhong Lan, Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush
|
||||||
Kevin Gimpel, Piyush Sharma, Radu Soricut.
|
Sharma, Radu Soricut.
|
||||||
2. `BART <https://huggingface.co/transformers/model_doc/bart.html>`__ (from Facebook) released with the paper `BART:
|
2. :doc:`BART <model_doc/bart>` (from Facebook) released with the paper `BART: Denoising Sequence-to-Sequence
|
||||||
Denoising Sequence-to-Sequence Pre-training for Natural Language Generation, Translation, and Comprehension
|
Pre-training for Natural Language Generation, Translation, and Comprehension
|
||||||
<https://arxiv.org/pdf/1910.13461.pdf>`__ by Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman
|
<https://arxiv.org/pdf/1910.13461.pdf>`__ by Mike Lewis, Yinhan Liu, Naman Goyal, Marjan Ghazvininejad, Abdelrahman
|
||||||
Mohamed, Omer Levy, Ves Stoyanov and Luke Zettlemoyer.
|
Mohamed, Omer Levy, Ves Stoyanov and Luke Zettlemoyer.
|
||||||
3. `BERT <https://huggingface.co/transformers/model_doc/bert.html>`__ (from Google) released with the paper `BERT:
|
3. :doc:`BERT <model_doc/bert>` (from Google) released with the paper `BERT: Pre-training of Deep Bidirectional
|
||||||
Pre-training of Deep Bidirectional Transformers for Language Understanding <https://arxiv.org/abs/1810.04805>`__ by
|
Transformers for Language Understanding <https://arxiv.org/abs/1810.04805>`__ by Jacob Devlin, Ming-Wei Chang,
|
||||||
Jacob Devlin, Ming-Wei Chang, Kenton Lee and Kristina Toutanova.
|
Kenton Lee and Kristina Toutanova.
|
||||||
4. `BERT For Sequence Generation <https://tfhub.dev/s?module-type=text-generation&subtype=module,placeholder>`__ (from
|
4. :doc:`BERT For Sequence Generation <model_doc/bertgeneration>` (from Google) released with the paper `Leveraging
|
||||||
Google) released with the paper `Leveraging Pre-trained Checkpoints for Sequence Generation Tasks
|
Pre-trained Checkpoints for Sequence Generation Tasks <https://arxiv.org/abs/1907.12461>`__ by Sascha Rothe, Shashi
|
||||||
<https://arxiv.org/abs/1907.12461>`__ by Sascha Rothe, Shashi Narayan, Aliaksei Severyn.
|
Narayan, Aliaksei Severyn.
|
||||||
5. `CamemBERT <https://huggingface.co/transformers/model_doc/camembert.html>`__ (from Inria/Facebook/Sorbonne) released
|
5. `Blenderbot <https://huggingface.co/transformers/master/model_doc/blenderbot.html>`__ (from Facebook) released with
|
||||||
with the paper `CamemBERT: a Tasty French Language Model <https://arxiv.org/abs/1911.03894>`__ by Louis Martin*,
|
the paper `Recipes for building an open-domain chatbot <https://arxiv.org/abs/2004.13637>`__ by Stephen Roller,
|
||||||
Benjamin Muller*, Pedro Javier Ortiz Suárez*, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé
|
Emily Dinan, Naman Goyal, Da Ju, Mary Williamson, Yinhan Liu, Jing Xu, Myle Ott, Kurt Shuster, Eric M. Smith, Y-Lan
|
||||||
Seddah and Benoît Sagot.
|
Boureau, Jason Weston.
|
||||||
6. `CTRL <https://huggingface.co/transformers/model_doc/ctrl.html>`__ (from Salesforce) released with the paper `CTRL:
|
6. :doc:`CamemBERT <model_doc/camembert>` (from Inria/Facebook/Sorbonne) released with the paper `CamemBERT: a Tasty
|
||||||
A Conditional Transformer Language Model for Controllable Generation <https://arxiv.org/abs/1909.05858>`__ by Nitish
|
French Language Model <https://arxiv.org/abs/1911.03894>`__ by Louis Martin*, Benjamin Muller*, Pedro Javier Ortiz
|
||||||
Shirish Keskar*, Bryan McCann*, Lav R. Varshney, Caiming Xiong and Richard Socher.
|
Suárez*, Yoann Dupont, Laurent Romary, Éric Villemonte de la Clergerie, Djamé Seddah and Benoît Sagot.
|
||||||
7. `DeBERTa <https://huggingface.co/transformers/model_doc/deberta.html>`__ (from Microsoft Research) released with the
|
7. :doc:`CTRL <model_doc/ctrl>` (from Salesforce) released with the paper `CTRL: A Conditional Transformer Language
|
||||||
paper `DeBERTa: Decoding-enhanced BERT with Disentangled Attention <https://arxiv.org/abs/2006.03654>`__ by
|
Model for Controllable Generation <https://arxiv.org/abs/1909.05858>`__ by Nitish Shirish Keskar*, Bryan McCann*,
|
||||||
|
Lav R. Varshney, Caiming Xiong and Richard Socher.
|
||||||
|
8. `DeBERTa <https://huggingface.co/transformers/master/model_doc/deberta.html>`__ (from Microsoft Research) released
|
||||||
|
with the paper `DeBERTa: Decoding-enhanced BERT with Disentangled Attention <https://arxiv.org/abs/2006.03654>`__ by
|
||||||
Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
Pengcheng He, Xiaodong Liu, Jianfeng Gao, Weizhu Chen.
|
||||||
8. `DialoGPT <https://huggingface.co/transformers/model_doc/dialogpt.html>`__ (from Microsoft Research) released with
|
9. :doc:`DialoGPT <model_doc/dialogpt>` (from Microsoft Research) released with the paper `DialoGPT: Large-Scale
|
||||||
the paper `DialoGPT: Large-Scale Generative Pre-training for Conversational Response Generation
|
Generative Pre-training for Conversational Response Generation <https://arxiv.org/abs/1911.00536>`__ by Yizhe Zhang,
|
||||||
<https://arxiv.org/abs/1911.00536>`__ by Yizhe Zhang, Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang
|
Siqi Sun, Michel Galley, Yen-Chun Chen, Chris Brockett, Xiang Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
||||||
Gao, Jianfeng Gao, Jingjing Liu, Bill Dolan.
|
10. :doc:`DistilBERT <model_doc/distilbert>` (from HuggingFace), released together with the paper `DistilBERT, a
|
||||||
9. `DistilBERT <https://huggingface.co/transformers/model_doc/distilbert.html>`__ (from HuggingFace), released together
|
distilled version of BERT: smaller, faster, cheaper and lighter <https://arxiv.org/abs/1910.01108>`__ by Victor
|
||||||
with the paper `DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter
|
Sanh, Lysandre Debut and Thomas Wolf. The same method has been applied to compress GPT2 into `DistilGPT2
|
||||||
<https://arxiv.org/abs/1910.01108>`__ by Victor Sanh, Lysandre Debut and Thomas Wolf. The same method has been
|
<https://github.com/huggingface/transformers/tree/master/examples/distillation>`__, RoBERTa into `DistilRoBERTa
|
||||||
applied to compress GPT2 into `DistilGPT2
|
<https://github.com/huggingface/transformers/tree/master/examples/distillation>`__, Multilingual BERT into
|
||||||
<https://github.com/huggingface/transformers/tree/master/examples/distillation>`__, RoBERTa into `DistilRoBERTa
|
`DistilmBERT <https://github.com/huggingface/transformers/tree/master/examples/distillation>`__ and a German
|
||||||
<https://github.com/huggingface/transformers/tree/master/examples/distillation>`__, Multilingual BERT into
|
version of DistilBERT.
|
||||||
`DistilmBERT <https://github.com/huggingface/transformers/tree/master/examples/distillation>`__ and a German version
|
11. :doc:`DPR <model_doc/dpr>` (from Facebook) released with the paper `Dense Passage Retrieval for Open-Domain
|
||||||
of DistilBERT.
|
Question Answering <https://arxiv.org/abs/2004.04906>`__ by Vladimir Karpukhin, Barlas Oğuz, Sewon Min, Patrick
|
||||||
10. `DPR <https://github.com/facebookresearch/DPR>`__ (from Facebook) released with the paper `Dense Passage Retrieval
|
Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and Wen-tau Yih.
|
||||||
for Open-Domain Question Answering <https://arxiv.org/abs/2004.04906>`__ by Vladimir Karpukhin, Barlas Oğuz, Sewon
|
12. :doc:`ELECTRA <model_doc/electra>` (from Google Research/Stanford University) released with the paper `ELECTRA:
|
||||||
Min, Patrick Lewis, Ledell Wu, Sergey Edunov, Danqi Chen, and Wen-tau Yih.
|
Pre-training text encoders as discriminators rather than generators <https://arxiv.org/abs/2003.10555>`__ by Kevin
|
||||||
11. `ELECTRA <https://huggingface.co/transformers/model_doc/electra.html>`__ (from Google Research/Stanford University)
|
Clark, Minh-Thang Luong, Quoc V. Le, Christopher D. Manning.
|
||||||
released with the paper `ELECTRA: Pre-training text encoders as discriminators rather than generators
|
13. :doc:`FlauBERT <model_doc/flaubert>` (from CNRS) released with the paper `FlauBERT: Unsupervised Language Model
|
||||||
<https://arxiv.org/abs/2003.10555>`__ by Kevin Clark, Minh-Thang Luong, Quoc V. Le, Christopher D. Manning.
|
Pre-training for French <https://arxiv.org/abs/1912.05372>`__ by Hang Le, Loïc Vial, Jibril Frej, Vincent Segonne,
|
||||||
12. `FlauBERT <https://huggingface.co/transformers/model_doc/flaubert.html>`__ (from CNRS) released with the paper
|
Maximin Coavoux, Benjamin Lecouteux, Alexandre Allauzen, Benoît Crabbé, Laurent Besacier, Didier Schwab.
|
||||||
`FlauBERT: Unsupervised Language Model Pre-training for French <https://arxiv.org/abs/1912.05372>`__ by Hang Le,
|
14. :doc:`Funnel Transformer <model_doc/funnel>` (from CMU/Google Brain) released with the paper `Funnel-Transformer:
|
||||||
Loïc Vial, Jibril Frej, Vincent Segonne, Maximin Coavoux, Benjamin Lecouteux, Alexandre Allauzen, Benoît Crabbé,
|
Filtering out Sequential Redundancy for Efficient Language Processing <https://arxiv.org/abs/2006.03236>`__ by
|
||||||
Laurent Besacier, Didier Schwab.
|
Zihang Dai, Guokun Lai, Yiming Yang, Quoc V. Le.
|
||||||
13. `Funnel Transformer <https://github.com/laiguokun/Funnel-Transformer>`__ (from CMU/Google Brain) released with the
|
15. :doc:`GPT <model_doc/gpt>` (from OpenAI) released with the paper `Improving Language Understanding by Generative
|
||||||
paper `Funnel-Transformer: Filtering out Sequential Redundancy for Efficient Language Processing
|
Pre-Training <https://blog.openai.com/language-unsupervised/>`__ by Alec Radford, Karthik Narasimhan, Tim Salimans
|
||||||
<https://arxiv.org/abs/2006.03236>`__ by Zihang Dai, Guokun Lai, Yiming Yang, Quoc V. Le.
|
and Ilya Sutskever.
|
||||||
14. `GPT <https://huggingface.co/transformers/model_doc/gpt.html>`__ (from OpenAI) released with the paper `Improving
|
16. :doc:`GPT-2 <model_doc/gpt2>` (from OpenAI) released with the paper `Language Models are Unsupervised Multitask
|
||||||
Language Understanding by Generative Pre-Training <https://blog.openai.com/language-unsupervised/>`__ by Alec
|
Learners <https://blog.openai.com/better-language-models/>`__ by Alec Radford*, Jeffrey Wu*, Rewon Child, David
|
||||||
Radford, Karthik Narasimhan, Tim Salimans and Ilya Sutskever.
|
Luan, Dario Amodei** and Ilya Sutskever**.
|
||||||
15. `GPT-2 <https://huggingface.co/transformers/model_doc/gpt2.html>`__ (from OpenAI) released with the paper `Language
|
17. :doc:`LayoutLM <model_doc/layoutlm>` (from Microsoft Research Asia) released with the paper `LayoutLM: Pre-training
|
||||||
Models are Unsupervised Multitask Learners <https://blog.openai.com/better-language-models/>`__ by Alec Radford*,
|
of Text and Layout for Document Image Understanding <https://arxiv.org/abs/1912.13318>`__ by Yiheng Xu, Minghao Li,
|
||||||
Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei** and Ilya Sutskever**.
|
Lei Cui, Shaohan Huang, Furu Wei, Ming Zhou.
|
||||||
16. `LayoutLM <https://github.com/microsoft/unilm/tree/master/layoutlm>`__ (from Microsoft Research Asia) released with
|
18. :doc:`Longformer <model_doc/longformer>` (from AllenAI) released with the paper `Longformer: The Long-Document
|
||||||
the paper `LayoutLM: Pre-training of Text and Layout for Document Image Understanding
|
Transformer <https://arxiv.org/abs/2004.05150>`__ by Iz Beltagy, Matthew E. Peters, Arman Cohan.
|
||||||
<https://arxiv.org/abs/1912.13318>`__ by Yiheng Xu, Minghao Li, Lei Cui, Shaohan Huang, Furu Wei, Ming Zhou.
|
19. :doc:`LXMERT <model_doc/lxmert>` (from UNC Chapel Hill) released with the paper `LXMERT: Learning Cross-Modality
|
||||||
17. `Longformer <https://huggingface.co/transformers/model_doc/longformer.html>`__ (from AllenAI) released with the
|
Encoder Representations from Transformers for Open-Domain Question Answering <https://arxiv.org/abs/1908.07490>`__
|
||||||
paper `Longformer: The Long-Document Transformer <https://arxiv.org/abs/2004.05150>`__ by Iz Beltagy, Matthew E.
|
by Hao Tan and Mohit Bansal.
|
||||||
Peters, Arman Cohan.
|
20. :doc:`MarianMT <model_doc/marian>` Machine translation models trained using `OPUS <http://opus.nlpl.eu/>`__ data by
|
||||||
18. `LXMERT <https://github.com/airsplay/lxmert>`__ (from UNC Chapel Hill) released with the paper `LXMERT: Learning
|
Jörg Tiedemann. The `Marian Framework <https://marian-nmt.github.io/>`__ is being developed by the Microsoft
|
||||||
Cross-Modality Encoder Representations from Transformers for Open-Domain Question Answering
|
Translator Team.
|
||||||
<https://arxiv.org/abs/1908.07490>`__ by Hao Tan and Mohit Bansal.
|
21. :doc:`MBart <model_doc/mbart>` (from Facebook) released with the paper `Multilingual Denoising Pre-training for
|
||||||
19. `MarianMT <https://huggingface.co/transformers/model_doc/marian.html>`__ Machine translation models trained using
|
Neural Machine Translation <https://arxiv.org/abs/2001.08210>`__ by Yinhan Liu, Jiatao Gu, Naman Goyal, Xian Li,
|
||||||
`OPUS <http://opus.nlpl.eu/>`__ data by Jörg Tiedemann. The `Marian Framework <https://marian-nmt.github.io/>`__ is
|
Sergey Edunov, Marjan Ghazvininejad, Mike Lewis, Luke Zettlemoyer.
|
||||||
being developed by the Microsoft Translator Team.
|
22. :doc:`Pegasus <model_doc/pegasus>` (from Google) released with the paper `PEGASUS: Pre-training with Extracted
|
||||||
20. `MBart <https://github.com/pytorch/fairseq/tree/master/examples/mbart>`__ (from Facebook) released with the paper
|
Gap-sentences for Abstractive Summarization <https://arxiv.org/abs/1912.08777>`__> by Jingqing Zhang, Yao Zhao,
|
||||||
`Multilingual Denoising Pre-training for Neural Machine Translation <https://arxiv.org/abs/2001.08210>`__ by Yinhan
|
Mohammad Saleh and Peter J. Liu.
|
||||||
Liu, Jiatao Gu, Naman Goyal, Xian Li, Sergey Edunov, Marjan Ghazvininejad, Mike Lewis, Luke Zettlemoyer.
|
23. :doc:`Reformer <model_doc/reformer>` (from Google Research) released with the paper `Reformer: The Efficient
|
||||||
21. `MMBT <https://github.com/facebookresearch/mmbt/>`__ (from Facebook), released together with the paper a
|
Transformer <https://arxiv.org/abs/2001.04451>`__ by Nikita Kitaev, Łukasz Kaiser, Anselm Levskaya.
|
||||||
`Supervised Multimodal Bitransformers for Classifying Images and Text <https://arxiv.org/pdf/1909.02950.pdf>`__ by
|
24. :doc:`RoBERTa <model_doc/roberta>` (from Facebook), released together with the paper a `Robustly Optimized BERT
|
||||||
Douwe Kiela, Suvrat Bhooshan, Hamed Firooz, Davide Testuggine.
|
Pretraining Approach <https://arxiv.org/abs/1907.11692>`__ by Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar
|
||||||
22. `Pegasus <https://github.com/google-research/pegasus>`__ (from Google) released with the paper `PEGASUS:
|
Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov. ultilingual BERT into `DistilmBERT
|
||||||
Pre-training with Extracted Gap-sentences for Abstractive Summarization <https://arxiv.org/abs/1912.08777>`__> by
|
|
||||||
Jingqing Zhang, Yao Zhao, Mohammad Saleh and Peter J. Liu.
|
|
||||||
23. `Reformer <https://huggingface.co/transformers/model_doc/reformer.html>`__ (from Google Research) released with the
|
|
||||||
paper `Reformer: The Efficient Transformer <https://arxiv.org/abs/2001.04451>`__ by Nikita Kitaev, Łukasz Kaiser,
|
|
||||||
Anselm Levskaya.
|
|
||||||
24. `RoBERTa <https://huggingface.co/transformers/model_doc/roberta.html>`__ (from Facebook), released together with
|
|
||||||
the paper a `Robustly Optimized BERT Pretraining Approach <https://arxiv.org/abs/1907.11692>`__ by Yinhan Liu, Myle
|
|
||||||
Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, Veselin Stoyanov.
|
|
||||||
ultilingual BERT into `DistilmBERT
|
|
||||||
<https://github.com/huggingface/transformers/tree/master/examples/distillation>`__ and a German version of
|
<https://github.com/huggingface/transformers/tree/master/examples/distillation>`__ and a German version of
|
||||||
DistilBERT.
|
DistilBERT.
|
||||||
25. `SqueezeBert <https://huggingface.co/transformers/model_doc/squeezebert.html>`__ released with the paper
|
25. `SqueezeBert <https://huggingface.co/transformers/master/model_doc/squeezebert.html>`__ released with the paper
|
||||||
`SqueezeBERT: What can computer vision teach NLP about efficient neural networks?
|
`SqueezeBERT: What can computer vision teach NLP about efficient neural networks?
|
||||||
<https://arxiv.org/abs/2006.11316>`__ by Forrest N. Iandola, Albert E. Shaw, Ravi Krishna, and Kurt W. Keutzer.
|
<https://arxiv.org/abs/2006.11316>`__ by Forrest N. Iandola, Albert E. Shaw, Ravi Krishna, and Kurt W. Keutzer.
|
||||||
26. `T5 <https://huggingface.co/transformers/model_doc/t5.html>`__ (from Google AI) released with the paper `Exploring
|
26. :doc:`T5 <model_doc/t5>` (from Google AI) released with the paper `Exploring the Limits of Transfer Learning with a
|
||||||
the Limits of Transfer Learning with a Unified Text-to-Text Transformer <https://arxiv.org/abs/1910.10683>`__ by
|
Unified Text-to-Text Transformer <https://arxiv.org/abs/1910.10683>`__ by Colin Raffel and Noam Shazeer and Adam
|
||||||
Colin Raffel and Noam Shazeer and Adam Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi
|
Roberts and Katherine Lee and Sharan Narang and Michael Matena and Yanqi Zhou and Wei Li and Peter J. Liu.
|
||||||
Zhou and Wei Li and Peter J. Liu.
|
27. :doc:`Transformer-XL <model_doc/transformerxl>` (from Google/CMU) released with the paper `Transformer-XL:
|
||||||
27. `Transformer-XL <https://huggingface.co/transformers/model_doc/transformerxl.html>`__ (from Google/CMU) released
|
Attentive Language Models Beyond a Fixed-Length Context <https://arxiv.org/abs/1901.02860>`__ by Zihang Dai*,
|
||||||
with the paper `Transformer-XL: Attentive Language Models Beyond a Fixed-Length Context
|
Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan Salakhutdinov.
|
||||||
<https://arxiv.org/abs/1901.02860>`__ by Zihang Dai*, Zhilin Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le,
|
28. :doc:`XLM <model_doc/xlm>` (from Facebook) released together with the paper `Cross-lingual Language Model
|
||||||
Ruslan Salakhutdinov.
|
Pretraining <https://arxiv.org/abs/1901.07291>`__ by Guillaume Lample and Alexis Conneau.
|
||||||
28. `XLM <https://huggingface.co/transformers/model_doc/xlm.html>`__ (from Facebook) released together with the paper
|
29. :doc:`XLM-RoBERTa <model_doc/xlmroberta>` (from Facebook AI), released together with the paper `Unsupervised
|
||||||
`Cross-lingual Language Model Pretraining <https://arxiv.org/abs/1901.07291>`__ by Guillaume Lample and Alexis
|
Cross-lingual Representation Learning at Scale <https://arxiv.org/abs/1911.02116>`__ by Alexis Conneau*, Kartikay
|
||||||
Conneau.
|
Khandelwal*, Naman Goyal, Vishrav Chaudhary, Guillaume Wenzek, Francisco Guzmán, Edouard Grave, Myle Ott, Luke
|
||||||
29. `XLM-RoBERTa <https://huggingface.co/transformers/model_doc/xlmroberta.html>`__ (from Facebook AI), released
|
Zettlemoyer and Veselin Stoyanov.
|
||||||
together with the paper `Unsupervised Cross-lingual Representation Learning at Scale
|
30. :doc:`XLNet <model_doc/xlnet>` (from Google/CMU) released with the paper `XLNet: Generalized Autoregressive
|
||||||
<https://arxiv.org/abs/1911.02116>`__ by Alexis Conneau*, Kartikay Khandelwal*, Naman Goyal, Vishrav Chaudhary,
|
Pretraining for Language Understanding <https://arxiv.org/abs/1906.08237>`__ by Zhilin Yang*, Zihang Dai*, Yiming
|
||||||
Guillaume Wenzek, Francisco Guzmán, Edouard Grave, Myle Ott, Luke Zettlemoyer and Veselin Stoyanov.
|
Yang, Jaime Carbonell, Ruslan Salakhutdinov, Quoc V. Le.
|
||||||
30. `XLNet <https://huggingface.co/transformers/model_doc/xlnet.html>`__ (from Google/CMU) released with the paper
|
|
||||||
`XLNet: Generalized Autoregressive Pretraining for Language Understanding <https://arxiv.org/abs/1906.08237>`__ by
|
|
||||||
Zhilin Yang*, Zihang Dai*, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov, Quoc V. Le.
|
|
||||||
31. `Other community models <https://huggingface.co/models>`__, contributed by the `community
|
31. `Other community models <https://huggingface.co/models>`__, contributed by the `community
|
||||||
<https://huggingface.co/users>`__.
|
<https://huggingface.co/users>`__.
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ subclass :class:`~transformers.Trainer` and override the methods you need (see :
|
|||||||
|
|
||||||
By default a :class:`~transformers.Trainer` will use the following callbacks:
|
By default a :class:`~transformers.Trainer` will use the following callbacks:
|
||||||
|
|
||||||
- :class:`~transformers.DefaultFlowCallback` which handles the default beahvior for logging, saving and evaluation.
|
- :class:`~transformers.DefaultFlowCallback` which handles the default behavior for logging, saving and evaluation.
|
||||||
- :class:`~transformers.PrinterCallback` or :class:`~transformers.ProrgressCallback` to display progress and print the
|
- :class:`~transformers.PrinterCallback` or :class:`~transformers.ProrgressCallback` to display progress and print the
|
||||||
logs (the first one is used if you deactivate tqdm through the :class:`~transformers.TrainingArguments`, otherwise
|
logs (the first one is used if you deactivate tqdm through the :class:`~transformers.TrainingArguments`, otherwise
|
||||||
it's the second one).
|
it's the second one).
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ Both :class:`~transformers.Trainer` and :class:`~transformers.TFTrainer` contain
|
|||||||
previous features. To inject custom behavior you can subclass them and override the following methods:
|
previous features. To inject custom behavior you can subclass them and override the following methods:
|
||||||
|
|
||||||
- **get_train_dataloader**/**get_train_tfdataset** -- Creates the training DataLoader (PyTorch) or TF Dataset.
|
- **get_train_dataloader**/**get_train_tfdataset** -- Creates the training DataLoader (PyTorch) or TF Dataset.
|
||||||
- **get_eval_dataloader**/**get_eval_tfdataset** -- Creates the evaulation DataLoader (PyTorch) or TF Dataset.
|
- **get_eval_dataloader**/**get_eval_tfdataset** -- Creates the evaluation DataLoader (PyTorch) or TF Dataset.
|
||||||
- **get_test_dataloader**/**get_test_tfdataset** -- Creates the test DataLoader (PyTorch) or TF Dataset.
|
- **get_test_dataloader**/**get_test_tfdataset** -- Creates the test DataLoader (PyTorch) or TF Dataset.
|
||||||
- **log** -- Logs information on the various objects watching training.
|
- **log** -- Logs information on the various objects watching training.
|
||||||
- **create_optimizer_and_scheduler** -- Setups the optimizer and learning rate scheduler if they were not passed at
|
- **create_optimizer_and_scheduler** -- Setups the optimizer and learning rate scheduler if they were not passed at
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Blenderbot
|
Blenderbot
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
-----------------------------------------------------------------------------------------------------------------------
|
||||||
**DISCLAIMER:** If you see something strange,
|
**DISCLAIMER:** If you see something strange,
|
||||||
file a `Github Issue <https://github.com/huggingface/transformers/issues/new?assignees=&labels=&template=bug-report.md&title>`__ .
|
file a `Github Issue <https://github.com/huggingface/transformers/issues/new?assignees=&labels=&template=bug-report.md&title>`__ .
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,13 @@ OpenAIGPTDoubleHeadsModel
|
|||||||
:members: forward
|
:members: forward
|
||||||
|
|
||||||
|
|
||||||
|
OpenAIGPTForSequenceClassification
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. autoclass:: transformers.OpenAIGPTForSequenceClassification
|
||||||
|
:members: forward
|
||||||
|
|
||||||
|
|
||||||
TFOpenAIGPTModel
|
TFOpenAIGPTModel
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ The library is built around three types of classes for each model:
|
|||||||
All these classes can be instantiated from pretrained instances and saved locally using two methods:
|
All these classes can be instantiated from pretrained instances and saved locally using two methods:
|
||||||
|
|
||||||
- :obj:`from_pretrained()` lets you instantiate a model/configuration/tokenizer from a pretrained version either
|
- :obj:`from_pretrained()` lets you instantiate a model/configuration/tokenizer from a pretrained version either
|
||||||
provided by the library itself (the suported models are provided in the list :doc:`here <pretrained_models>`
|
provided by the library itself (the supported models are provided in the list :doc:`here <pretrained_models>`
|
||||||
or stored locally (or on a server) by the user,
|
or stored locally (or on a server) by the user,
|
||||||
- :obj:`save_pretrained()` lets you save a model/configuration/tokenizer locally so that it can be reloaded using
|
- :obj:`save_pretrained()` lets you save a model/configuration/tokenizer locally so that it can be reloaded using
|
||||||
:obj:`from_pretrained()`.
|
:obj:`from_pretrained()`.
|
||||||
|
|||||||
@@ -294,10 +294,10 @@ For a list that includes community-uploaded models, refer to `https://huggingfac
|
|||||||
| | ``t5-11B`` | | ~11B parameters with 24-layers, 1024-hidden-state, 65536 feed-forward hidden-state, 128-heads, |
|
| | ``t5-11B`` | | ~11B parameters with 24-layers, 1024-hidden-state, 65536 feed-forward hidden-state, 128-heads, |
|
||||||
| | | | Trained on English text: the Colossal Clean Crawled Corpus (C4) |
|
| | | | Trained on English text: the Colossal Clean Crawled Corpus (C4) |
|
||||||
+--------------------+------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
|
+--------------------+------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| XLM-RoBERTa | ``xlm-roberta-base`` | | ~125M parameters with 12-layers, 768-hidden-state, 3072 feed-forward hidden-state, 8-heads, |
|
| XLM-RoBERTa | ``xlm-roberta-base`` | | ~270M parameters with 12-layers, 768-hidden-state, 3072 feed-forward hidden-state, 8-heads, |
|
||||||
| | | | Trained on on 2.5 TB of newly created clean CommonCrawl data in 100 languages |
|
| | | | Trained on on 2.5 TB of newly created clean CommonCrawl data in 100 languages |
|
||||||
| +------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
|
| +------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| | ``xlm-roberta-large`` | | ~355M parameters with 24-layers, 1027-hidden-state, 4096 feed-forward hidden-state, 16-heads, |
|
| | ``xlm-roberta-large`` | | ~550M parameters with 24-layers, 1024-hidden-state, 4096 feed-forward hidden-state, 16-heads, |
|
||||||
| | | | Trained on 2.5 TB of newly created clean CommonCrawl data in 100 languages |
|
| | | | Trained on 2.5 TB of newly created clean CommonCrawl data in 100 languages |
|
||||||
+--------------------+------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
|
+--------------------+------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------+
|
||||||
| FlauBERT | ``flaubert/flaubert_small_cased`` | | 6-layer, 512-hidden, 8-heads, 54M parameters |
|
| FlauBERT | ``flaubert/flaubert_small_cased`` | | 6-layer, 512-hidden, 8-heads, 54M parameters |
|
||||||
|
|||||||
@@ -24,8 +24,11 @@ import logging
|
|||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
|
from glob import glob
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
from torch.utils.data import ConcatDataset
|
||||||
|
|
||||||
from transformers import (
|
from transformers import (
|
||||||
CONFIG_MAPPING,
|
CONFIG_MAPPING,
|
||||||
MODEL_WITH_LM_HEAD_MAPPING,
|
MODEL_WITH_LM_HEAD_MAPPING,
|
||||||
@@ -87,6 +90,13 @@ class DataTrainingArguments:
|
|||||||
train_data_file: Optional[str] = field(
|
train_data_file: Optional[str] = field(
|
||||||
default=None, metadata={"help": "The input training data file (a text file)."}
|
default=None, metadata={"help": "The input training data file (a text file)."}
|
||||||
)
|
)
|
||||||
|
train_data_files: Optional[str] = field(
|
||||||
|
default=None,
|
||||||
|
metadata={
|
||||||
|
"help": "The input training data files (multiple files in glob format). "
|
||||||
|
"Very often splitting large files to smaller files can prevent tokenizer going out of memory"
|
||||||
|
},
|
||||||
|
)
|
||||||
eval_data_file: Optional[str] = field(
|
eval_data_file: Optional[str] = field(
|
||||||
default=None,
|
default=None,
|
||||||
metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."},
|
metadata={"help": "An optional input evaluation data file to evaluate the perplexity on (a text file)."},
|
||||||
@@ -131,17 +141,24 @@ def get_dataset(
|
|||||||
evaluate: bool = False,
|
evaluate: bool = False,
|
||||||
cache_dir: Optional[str] = None,
|
cache_dir: Optional[str] = None,
|
||||||
):
|
):
|
||||||
file_path = args.eval_data_file if evaluate else args.train_data_file
|
def _dataset(file_path):
|
||||||
if args.line_by_line:
|
if args.line_by_line:
|
||||||
return LineByLineTextDataset(tokenizer=tokenizer, file_path=file_path, block_size=args.block_size)
|
return LineByLineTextDataset(tokenizer=tokenizer, file_path=file_path, block_size=args.block_size)
|
||||||
|
else:
|
||||||
|
return TextDataset(
|
||||||
|
tokenizer=tokenizer,
|
||||||
|
file_path=file_path,
|
||||||
|
block_size=args.block_size,
|
||||||
|
overwrite_cache=args.overwrite_cache,
|
||||||
|
cache_dir=cache_dir,
|
||||||
|
)
|
||||||
|
|
||||||
|
if evaluate:
|
||||||
|
return _dataset(args.eval_data_file)
|
||||||
|
elif args.train_data_files:
|
||||||
|
return ConcatDataset([_dataset(f) for f in glob(args.train_data_files)])
|
||||||
else:
|
else:
|
||||||
return TextDataset(
|
return _dataset(args.train_data_file)
|
||||||
tokenizer=tokenizer,
|
|
||||||
file_path=file_path,
|
|
||||||
block_size=args.block_size,
|
|
||||||
overwrite_cache=args.overwrite_cache,
|
|
||||||
cache_dir=cache_dir,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ class BaseTransformer(pl.LightningModule):
|
|||||||
def get_lr_scheduler(self):
|
def get_lr_scheduler(self):
|
||||||
get_schedule_func = arg_to_scheduler[self.hparams.lr_scheduler]
|
get_schedule_func = arg_to_scheduler[self.hparams.lr_scheduler]
|
||||||
scheduler = get_schedule_func(
|
scheduler = get_schedule_func(
|
||||||
self.opt, num_warmup_steps=self.hparams.warmup_steps, num_training_steps=self.total_steps
|
self.opt, num_warmup_steps=self.hparams.warmup_steps, num_training_steps=self.total_steps()
|
||||||
)
|
)
|
||||||
scheduler = {"scheduler": scheduler, "interval": "step", "frequency": 1}
|
scheduler = {"scheduler": scheduler, "interval": "step", "frequency": 1}
|
||||||
return scheduler
|
return scheduler
|
||||||
@@ -159,19 +159,20 @@ class BaseTransformer(pl.LightningModule):
|
|||||||
def test_epoch_end(self, outputs):
|
def test_epoch_end(self, outputs):
|
||||||
return self.validation_end(outputs)
|
return self.validation_end(outputs)
|
||||||
|
|
||||||
@property
|
|
||||||
def total_steps(self) -> int:
|
def total_steps(self) -> int:
|
||||||
"""The number of total training steps that will be run. Used for lr scheduler purposes."""
|
"""The number of total training steps that will be run. Used for lr scheduler purposes."""
|
||||||
num_devices = max(1, self.hparams.gpus) # TODO: consider num_tpu_cores
|
num_devices = max(1, self.hparams.gpus) # TODO: consider num_tpu_cores
|
||||||
effective_batch_size = self.hparams.train_batch_size * self.hparams.accumulate_grad_batches * num_devices
|
effective_batch_size = self.hparams.train_batch_size * self.hparams.accumulate_grad_batches * num_devices
|
||||||
dataset_size = len(self.train_loader.dataset)
|
return (self.dataset_size / effective_batch_size) * self.hparams.max_epochs
|
||||||
return (dataset_size / effective_batch_size) * self.hparams.max_epochs
|
|
||||||
|
|
||||||
def setup(self, mode):
|
def setup(self, mode):
|
||||||
if mode == "fit":
|
if mode == "test":
|
||||||
|
self.dataset_size = len(self.test_dataloader().dataset)
|
||||||
|
else:
|
||||||
self.train_loader = self.get_dataloader("train", self.hparams.train_batch_size, shuffle=True)
|
self.train_loader = self.get_dataloader("train", self.hparams.train_batch_size, shuffle=True)
|
||||||
|
self.dataset_size = len(self.train_loader.dataset)
|
||||||
|
|
||||||
def get_dataloader(self, type_path, batch_size, shuffle=False):
|
def get_dataloader(self, type_path: str, batch_size: int, shuffle: bool = False):
|
||||||
raise NotImplementedError("You must implement this for your task")
|
raise NotImplementedError("You must implement this for your task")
|
||||||
|
|
||||||
def train_dataloader(self):
|
def train_dataloader(self):
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ psutil
|
|||||||
sacrebleu
|
sacrebleu
|
||||||
rouge-score
|
rouge-score
|
||||||
tensorflow_datasets
|
tensorflow_datasets
|
||||||
pytorch-lightning==0.8.5
|
pytorch-lightning==0.9.0
|
||||||
matplotlib
|
matplotlib
|
||||||
git-python==1.0.3
|
git-python==1.0.3
|
||||||
faiss-cpu
|
faiss-cpu
|
||||||
|
|||||||
@@ -12,14 +12,13 @@ For `bertabs` instructions, see [`bertabs/README.md`](bertabs/README.md).
|
|||||||
- `MBartForConditionalGeneration`
|
- `MBartForConditionalGeneration`
|
||||||
- `FSMTForConditionalGeneration`
|
- `FSMTForConditionalGeneration`
|
||||||
- `T5ForConditionalGeneration`
|
- `T5ForConditionalGeneration`
|
||||||
|
|
||||||
|
|
||||||
## Datasets
|
## Datasets
|
||||||
|
|
||||||
#### XSUM:
|
#### XSUM:
|
||||||
```bash
|
```bash
|
||||||
cd examples/seq2seq
|
cd examples/seq2seq
|
||||||
wget https://s3.amazonaws.com/datasets.huggingface.co/summarization/xsum.tar.gz
|
wget https://cdn-datasets.huggingface.co/summarization/xsum.tar.gz
|
||||||
tar -xzvf xsum.tar.gz
|
tar -xzvf xsum.tar.gz
|
||||||
export XSUM_DIR=${PWD}/xsum
|
export XSUM_DIR=${PWD}/xsum
|
||||||
```
|
```
|
||||||
@@ -29,7 +28,7 @@ To use your own data, copy that files format. Each article to be summarized is o
|
|||||||
#### CNN/DailyMail
|
#### CNN/DailyMail
|
||||||
```bash
|
```bash
|
||||||
cd examples/seq2seq
|
cd examples/seq2seq
|
||||||
wget https://s3.amazonaws.com/datasets.huggingface.co/summarization/cnn_dm_v2.tgz
|
wget https://cdn-datasets.huggingface.co/summarization/cnn_dm_v2.tgz
|
||||||
tar -xzvf cnn_dm_v2.tgz # empty lines removed
|
tar -xzvf cnn_dm_v2.tgz # empty lines removed
|
||||||
mv cnn_cln cnn_dm
|
mv cnn_cln cnn_dm
|
||||||
export CNN_DIR=${PWD}/cnn_dm
|
export CNN_DIR=${PWD}/cnn_dm
|
||||||
@@ -39,7 +38,7 @@ this should make a directory called `cnn_dm/` with 6 files.
|
|||||||
#### WMT16 English-Romanian Translation Data:
|
#### WMT16 English-Romanian Translation Data:
|
||||||
download with this command:
|
download with this command:
|
||||||
```bash
|
```bash
|
||||||
wget https://s3.amazonaws.com/datasets.huggingface.co/translation/wmt_en_ro.tar.gz
|
wget https://cdn-datasets.huggingface.co/translation/wmt_en_ro.tar.gz
|
||||||
tar -xzvf wmt_en_ro.tar.gz
|
tar -xzvf wmt_en_ro.tar.gz
|
||||||
export ENRO_DIR=${PWD}/wmt_en_ro
|
export ENRO_DIR=${PWD}/wmt_en_ro
|
||||||
```
|
```
|
||||||
@@ -47,7 +46,7 @@ this should make a directory called `wmt_en_ro/` with 6 files.
|
|||||||
|
|
||||||
#### WMT English-German:
|
#### WMT English-German:
|
||||||
```bash
|
```bash
|
||||||
wget https://s3.amazonaws.com/datasets.huggingface.co/translation/wmt_en_de.tgz
|
wget https://cdn-datasets.huggingface.co/translation/wmt_en_de.tgz
|
||||||
tar -xzvf wmt_en_de.tgz
|
tar -xzvf wmt_en_de.tgz
|
||||||
export DATA_DIR=${PWD}/wmt_en_de
|
export DATA_DIR=${PWD}/wmt_en_de
|
||||||
```
|
```
|
||||||
@@ -100,7 +99,7 @@ All finetuning bash scripts call finetune.py (or distillation.py) with reasonabl
|
|||||||
To see all the possible command line options, run:
|
To see all the possible command line options, run:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./finetune.py --help
|
./finetune.py --help
|
||||||
```
|
```
|
||||||
|
|
||||||
### Finetuning Training Params
|
### Finetuning Training Params
|
||||||
@@ -192,7 +191,7 @@ model = AutoModelForSeq2SeqLM.from_pretrained(f'{output_dir}/best_tfmr')
|
|||||||
### Fine-tuning using Seq2SeqTrainer
|
### Fine-tuning using Seq2SeqTrainer
|
||||||
To use `Seq2SeqTrainer` for fine-tuning you should use the `finetune_trainer.py` script. It subclasses `Trainer` to extend it for seq2seq training. Except the `Trainer` releated `TrainingArguments`, it shares the same argument names as that of `finetune.py` file. One notable difference is that, calculating generative metrics (BLEU, ROUGE) is optional and is controlled using the `--predict_with_generate` argument, set this argument to calculate BLEU and ROUGE metrics.
|
To use `Seq2SeqTrainer` for fine-tuning you should use the `finetune_trainer.py` script. It subclasses `Trainer` to extend it for seq2seq training. Except the `Trainer` releated `TrainingArguments`, it shares the same argument names as that of `finetune.py` file. One notable difference is that, calculating generative metrics (BLEU, ROUGE) is optional and is controlled using the `--predict_with_generate` argument, set this argument to calculate BLEU and ROUGE metrics.
|
||||||
|
|
||||||
With PyTorch 1.6+ it'll automatically use `native AMP` when `--fp16` is set.
|
With PyTorch 1.6+ it'll automatically use `native AMP` when `--fp16` is set.
|
||||||
|
|
||||||
To see all the possible command line options, run:
|
To see all the possible command line options, run:
|
||||||
|
|
||||||
@@ -265,6 +264,7 @@ export DATA_DIR=cnn_dm
|
|||||||
--fp16 \
|
--fp16 \
|
||||||
--bs 32
|
--bs 32
|
||||||
```
|
```
|
||||||
|
|
||||||
### Multi-GPU Evaluation
|
### Multi-GPU Evaluation
|
||||||
here is a command to run xsum evaluation on 8 GPUS. It is more than linearly faster than run_eval.py in some cases
|
here is a command to run xsum evaluation on 8 GPUS. It is more than linearly faster than run_eval.py in some cases
|
||||||
because it uses SortishSampler to minimize padding. You can also use it on 1 GPU. `data_dir` must have
|
because it uses SortishSampler to minimize padding. You can also use it on 1 GPU. `data_dir` must have
|
||||||
@@ -391,6 +391,17 @@ runtime: 13H on V-100 16GB GPU.
|
|||||||
pytest examples/seq2seq/
|
pytest examples/seq2seq/
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Converting pytorch-lightning checkpoints
|
||||||
|
pytorch lightning ``-do_predict`` often fails, after you are done training, the best way to evaluate your model is to convert it.
|
||||||
|
|
||||||
|
This should be done for you, with a file called `{save_dir}/best_tfmr`.
|
||||||
|
|
||||||
|
If that file doesn't exist but you have a lightning `.ckpt` file, you can run
|
||||||
|
```bash
|
||||||
|
python convert_pl_checkpoint_to_hf.py PATH_TO_CKPT randomly_initialized_hf_model_path save_dir/best_tfmr
|
||||||
|
```
|
||||||
|
Then either `run_eval` or `run_distributed_eval` with `save_dir/best_tfmr` (see previous sections)
|
||||||
|
|
||||||
|
|
||||||
## Experimental Features
|
## Experimental Features
|
||||||
These features are harder to use and not always useful.
|
These features are harder to use and not always useful.
|
||||||
@@ -419,4 +430,3 @@ uses 12,723 batches of length 48 and takes slightly more time 9.5 minutes.
|
|||||||
The feature is still experimental, because:
|
The feature is still experimental, because:
|
||||||
+ we can make it much more robust if we have memory mapped/preprocessed datasets.
|
+ we can make it much more robust if we have memory mapped/preprocessed datasets.
|
||||||
+ The speedup over sortish sampler is not that large at the moment.
|
+ The speedup over sortish sampler is not that large at the moment.
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ python run_summarization.py \
|
|||||||
--compute_rouge true
|
--compute_rouge true
|
||||||
```
|
```
|
||||||
|
|
||||||
The scripts executes on GPU if one is available and if `no_cuda` is not set to `true`. Inference on multiple GPUs is not suported yet. The ROUGE scores will be displayed in the console at the end of evaluation and written in a `rouge_scores.txt` file. The script takes 30 hours to compute with a single Tesla V100 GPU and a batch size of 10 (300,000 texts to summarize).
|
The scripts executes on GPU if one is available and if `no_cuda` is not set to `true`. Inference on multiple GPUs is not supported yet. The ROUGE scores will be displayed in the console at the end of evaluation and written in a `rouge_scores.txt` file. The script takes 30 hours to compute with a single Tesla V100 GPU and a batch size of 10 (300,000 texts to summarize).
|
||||||
|
|
||||||
## Summarize any text
|
## Summarize any text
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ from finetune import main as ft_main
|
|||||||
from make_student import create_student_by_copying_alternating_layers, get_layers_to_supervise
|
from make_student import create_student_by_copying_alternating_layers, get_layers_to_supervise
|
||||||
from transformers import AutoModelForSeq2SeqLM, MBartTokenizer, T5ForConditionalGeneration
|
from transformers import AutoModelForSeq2SeqLM, MBartTokenizer, T5ForConditionalGeneration
|
||||||
from transformers.modeling_bart import shift_tokens_right
|
from transformers.modeling_bart import shift_tokens_right
|
||||||
from utils import calculate_bleu, freeze_params, label_smoothed_nll_loss, pickle_load, use_task_specific_params
|
from utils import calculate_bleu, freeze_params, label_smoothed_nll_loss, use_task_specific_params
|
||||||
|
|
||||||
|
|
||||||
# need the parent dir module
|
# need the parent dir module
|
||||||
@@ -264,30 +264,6 @@ def create_module(args):
|
|||||||
return model
|
return model
|
||||||
|
|
||||||
|
|
||||||
def evaluate_checkpoint(ckpt_path: Path, dest_dir=None):
|
|
||||||
# TODO(SS): DELETE? Better to convert_pl_ckpt_to_hf and run_eval.py
|
|
||||||
exp_dir = ckpt_path.parent
|
|
||||||
if dest_dir is None:
|
|
||||||
dest_dir = exp_dir
|
|
||||||
clash = list(dest_dir.glob("test_generations*"))
|
|
||||||
if clash:
|
|
||||||
print(f"SKIPPING to avoid overwriting {clash}")
|
|
||||||
ckpt = torch.load(ckpt_path, map_location="cpu")
|
|
||||||
if "hparams" in ckpt:
|
|
||||||
args = argparse.Namespace(**ckpt["hparams"])
|
|
||||||
else:
|
|
||||||
args = argparse.Namespace(**pickle_load(exp_dir / "hparams.pkl"))
|
|
||||||
args.resume_from_checkpoint = str(ckpt_path)
|
|
||||||
args.do_train = False
|
|
||||||
args.output_dir = str(dest_dir)
|
|
||||||
args.n_gpu = 1
|
|
||||||
args.eval_batch_size = 16
|
|
||||||
Path(args.output_dir).mkdir(exist_ok=True)
|
|
||||||
model = create_module(args)
|
|
||||||
trainer: pl.Trainer = generic_train(model, args, early_stopping_callback=False)
|
|
||||||
trainer.test(model)
|
|
||||||
|
|
||||||
|
|
||||||
def distill_main(args):
|
def distill_main(args):
|
||||||
Path(args.output_dir).mkdir(exist_ok=True)
|
Path(args.output_dir).mkdir(exist_ok=True)
|
||||||
if len(os.listdir(args.output_dir)) > 3 and args.do_train:
|
if len(os.listdir(args.output_dir)) > 3 and args.do_train:
|
||||||
|
|||||||
@@ -181,6 +181,7 @@ class SummarizationModule(BaseTransformer):
|
|||||||
return self._generative_step(batch)
|
return self._generative_step(batch)
|
||||||
|
|
||||||
def validation_epoch_end(self, outputs, prefix="val") -> Dict:
|
def validation_epoch_end(self, outputs, prefix="val") -> Dict:
|
||||||
|
|
||||||
self.step_count += 1
|
self.step_count += 1
|
||||||
losses = {k: torch.stack([x[k] for x in outputs]).mean() for k in self.loss_names}
|
losses = {k: torch.stack([x[k] for x in outputs]).mean() for k in self.loss_names}
|
||||||
loss = losses["loss"]
|
loss = losses["loss"]
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# Script for verifying that run_bart_sum can be invoked from its directory
|
# Script for verifying that run_bart_sum can be invoked from its directory
|
||||||
|
|
||||||
# Get tiny dataset with cnn_dm format (4 examples for train, val, test)
|
# Get tiny dataset with cnn_dm format (4 examples for train, val, test)
|
||||||
wget https://s3.amazonaws.com/datasets.huggingface.co/summarization/cnn_tiny.tgz
|
wget https://cdn-datasets.huggingface.co/summarization/cnn_tiny.tgz
|
||||||
tar -xzvf cnn_tiny.tgz
|
tar -xzvf cnn_tiny.tgz
|
||||||
rm cnn_tiny.tgz
|
rm cnn_tiny.tgz
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import sys
|
|||||||
from dataclasses import dataclass, field
|
from dataclasses import dataclass, field
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
from seq2seq_trainer import Seq2SeqTrainer
|
from seq2seq_trainer import Seq2SeqTrainer, arg_to_scheduler_choices
|
||||||
from transformers import (
|
from transformers import (
|
||||||
AutoConfig,
|
AutoConfig,
|
||||||
AutoModelForSeq2SeqLM,
|
AutoModelForSeq2SeqLM,
|
||||||
@@ -63,6 +63,9 @@ class Seq2SeqTrainingArguments(TrainingArguments):
|
|||||||
attention_dropout: Optional[float] = field(
|
attention_dropout: Optional[float] = field(
|
||||||
default=None, metadata={"help": "Attention dropout probability. Goes into model.config."}
|
default=None, metadata={"help": "Attention dropout probability. Goes into model.config."}
|
||||||
)
|
)
|
||||||
|
lr_scheduler: Optional[str] = field(
|
||||||
|
default="linear", metadata={"help": f"Which lr scheduler to use. Selected in {arg_to_scheduler_choices}"}
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
|
|||||||
@@ -4,24 +4,24 @@ These are the generations of various large models on various large **training**
|
|||||||
### Available Pseudo-labels
|
### Available Pseudo-labels
|
||||||
| Dataset | Model | Link | Rouge Scores | Notes
|
| Dataset | Model | Link | Rouge Scores | Notes
|
||||||
|---------|-----------------------------|----------------------------------------------------------------------------------------|--------------------|-------------------------------------------------------------------------------------------------------------
|
|---------|-----------------------------|----------------------------------------------------------------------------------------|--------------------|-------------------------------------------------------------------------------------------------------------
|
||||||
| XSUM | `facebook/bart-large-xsum` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/xsum/bart_xsum_pl.tgz) | 49.8/28.0/42.5 |
|
| XSUM | `facebook/bart-large-xsum` | [download](https://cdn-datasets.huggingface.co/pseudo/xsum/bart_xsum_pl.tgz) | 49.8/28.0/42.5 |
|
||||||
| XSUM | `google/pegasus-xsum` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/xsum/pegasus_xsum.tgz) | 53.3/32.7/46.5 |
|
| XSUM | `google/pegasus-xsum` | [download](https://cdn-datasets.huggingface.co/pseudo/xsum/pegasus_xsum.tgz) | 53.3/32.7/46.5 |
|
||||||
| XSUM | `facebook/bart-large-xsum` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/xsum/xsum_pl2_bart.tgz) | | Bart pseudolabels filtered to those with Rouge2 > 10.0 w GT.
|
| XSUM | `facebook/bart-large-xsum` | [download](https://cdn-datasets.huggingface.co/pseudo/xsum/xsum_pl2_bart.tgz) | | Bart pseudolabels filtered to those with Rouge2 > 10.0 w GT.
|
||||||
| CNN/DM | `sshleifer/pegasus-cnn-ft-v2` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/cnn_dm/pegasus_cnn_cnn_pls.tgz) | 47.316/26.65/44.56 | do not worry about the fact that train.source is one line shorter.
|
| CNN/DM | `sshleifer/pegasus-cnn-ft-v2` | [download](https://cdn-datasets.huggingface.co/pseudo/cnn_dm/pegasus_cnn_cnn_pls.tgz) | 47.316/26.65/44.56 | do not worry about the fact that train.source is one line shorter.
|
||||||
| CNN/DM | `facebook/bart-large-cnn` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/cnn_dm/cnn_bart_pl.tgz) | | 5K (2%) are missing, there should be 282173
|
| CNN/DM | `facebook/bart-large-cnn` | [download](https://cdn-datasets.huggingface.co/pseudo/cnn_dm/cnn_bart_pl.tgz) | | 5K (2%) are missing, there should be 282173
|
||||||
| CNN/DM | `google/pegasus-xsum` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/cnn_dm/pegasus_xsum_on_cnn.tgz) | 21.5/6.76/25 | extra labels for xsum distillation Used max_source_length=512, (and all other pegasus-xsum configuration).
|
| CNN/DM | `google/pegasus-xsum` | [download](https://cdn-datasets.huggingface.co/pseudo/cnn_dm/pegasus_xsum_on_cnn.tgz) | 21.5/6.76/25 | extra labels for xsum distillation Used max_source_length=512, (and all other pegasus-xsum configuration).
|
||||||
| EN-RO | `Helsinki-NLP/opus-mt-en-ro` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/wmt_en_ro/opus_mt_en_ro.tgz) | |
|
| EN-RO | `Helsinki-NLP/opus-mt-en-ro` | [download](https://cdn-datasets.huggingface.co/pseudo/wmt_en_ro/opus_mt_en_ro.tgz) | |
|
||||||
| EN-RO | `facebook/mbart-large-en-ro` | [download](https://s3.amazonaws.com/datasets.huggingface.co/pseudo/wmt_en_ro/mbart_large_en_ro.tgz) | |
|
| EN-RO | `facebook/mbart-large-en-ro` | [download](https://cdn-datasets.huggingface.co/pseudo/wmt_en_ro/mbart_large_en_ro.tgz) | |
|
||||||
|
|
||||||
|
|
||||||
(EN_RO = WMT 2016 English-Romanian).
|
(EN_RO = WMT 2016 English-Romanian).
|
||||||
|
|
||||||
Example Download Command:
|
Example Download Command:
|
||||||
```bash
|
```bash
|
||||||
curl -S https://s3.amazonaws.com/datasets.huggingface.co/pseudo/xsum/bart_xsum_pl.tgz | tar -xvz -C .
|
curl -S https://cdn-datasets.huggingface.co/pseudo/xsum/bart_xsum_pl.tgz | tar -xvz -C .
|
||||||
```
|
```
|
||||||
### Generating New Pseudolabels
|
### Generating New Pseudolabels
|
||||||
Here is the command I used to generate the pseudolabels in the second row of the table, after downloading XSUM from [here](https://s3.amazonaws.com/datasets.huggingface.co/summarization/xsum.tar.gz).
|
Here is the command I used to generate the pseudolabels in the second row of the table, after downloading XSUM from [here](https://cdn-datasets.huggingface.co/summarization/xsum.tar.gz).
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
python -m torch.distributed.launch --nproc_per_node=8 run_distributed_eval.py \
|
python -m torch.distributed.launch --nproc_per_node=8 run_distributed_eval.py \
|
||||||
|
|||||||
@@ -8,7 +8,16 @@ from torch.utils.data import DistributedSampler, RandomSampler
|
|||||||
from transformers import Trainer
|
from transformers import Trainer
|
||||||
from transformers.configuration_fsmt import FSMTConfig
|
from transformers.configuration_fsmt import FSMTConfig
|
||||||
from transformers.file_utils import is_torch_tpu_available
|
from transformers.file_utils import is_torch_tpu_available
|
||||||
from transformers.optimization import Adafactor, AdamW, get_linear_schedule_with_warmup
|
from transformers.optimization import (
|
||||||
|
Adafactor,
|
||||||
|
AdamW,
|
||||||
|
get_constant_schedule,
|
||||||
|
get_constant_schedule_with_warmup,
|
||||||
|
get_cosine_schedule_with_warmup,
|
||||||
|
get_cosine_with_hard_restarts_schedule_with_warmup,
|
||||||
|
get_linear_schedule_with_warmup,
|
||||||
|
get_polynomial_decay_schedule_with_warmup,
|
||||||
|
)
|
||||||
from transformers.trainer_pt_utils import get_tpu_sampler
|
from transformers.trainer_pt_utils import get_tpu_sampler
|
||||||
|
|
||||||
|
|
||||||
@@ -20,6 +29,16 @@ except ImportError:
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
arg_to_scheduler = {
|
||||||
|
"linear": get_linear_schedule_with_warmup,
|
||||||
|
"cosine": get_cosine_schedule_with_warmup,
|
||||||
|
"cosine_w_restarts": get_cosine_with_hard_restarts_schedule_with_warmup,
|
||||||
|
"polynomial": get_polynomial_decay_schedule_with_warmup,
|
||||||
|
"constant": get_constant_schedule,
|
||||||
|
"constant_w_warmup": get_constant_schedule_with_warmup,
|
||||||
|
}
|
||||||
|
arg_to_scheduler_choices = sorted(arg_to_scheduler.keys())
|
||||||
|
|
||||||
|
|
||||||
class Seq2SeqTrainer(Trainer):
|
class Seq2SeqTrainer(Trainer):
|
||||||
def __init__(self, config, data_args, *args, **kwargs):
|
def __init__(self, config, data_args, *args, **kwargs):
|
||||||
@@ -62,9 +81,21 @@ class Seq2SeqTrainer(Trainer):
|
|||||||
)
|
)
|
||||||
|
|
||||||
if self.lr_scheduler is None:
|
if self.lr_scheduler is None:
|
||||||
self.lr_scheduler = get_linear_schedule_with_warmup(
|
self.lr_scheduler = self._get_lr_scheduler(num_training_steps)
|
||||||
|
else: # ignoring --lr_scheduler
|
||||||
|
logger.warn("scheduler is passed to `Seq2SeqTrainer`, `--lr_scheduler` arg is ignored.")
|
||||||
|
|
||||||
|
def _get_lr_scheduler(self, num_training_steps):
|
||||||
|
schedule_func = arg_to_scheduler[self.args.lr_scheduler]
|
||||||
|
if self.args.lr_scheduler == "constant":
|
||||||
|
scheduler = schedule_func(self.optimizer)
|
||||||
|
elif self.args.lr_scheduler == "constant_w_warmup":
|
||||||
|
scheduler = schedule_func(self.optimizer, num_warmup_steps=self.args.warmup_steps)
|
||||||
|
else:
|
||||||
|
scheduler = schedule_func(
|
||||||
self.optimizer, num_warmup_steps=self.args.warmup_steps, num_training_steps=num_training_steps
|
self.optimizer, num_warmup_steps=self.args.warmup_steps, num_training_steps=num_training_steps
|
||||||
)
|
)
|
||||||
|
return scheduler
|
||||||
|
|
||||||
def _get_train_sampler(self) -> Optional[torch.utils.data.sampler.Sampler]:
|
def _get_train_sampler(self) -> Optional[torch.utils.data.sampler.Sampler]:
|
||||||
if isinstance(self.train_dataset, torch.utils.data.IterableDataset):
|
if isinstance(self.train_dataset, torch.utils.data.IterableDataset):
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import torch
|
|||||||
|
|
||||||
import lightning_base
|
import lightning_base
|
||||||
from convert_pl_checkpoint_to_hf import convert_pl_to_hf
|
from convert_pl_checkpoint_to_hf import convert_pl_to_hf
|
||||||
from distillation import distill_main, evaluate_checkpoint
|
from distillation import distill_main
|
||||||
from finetune import SummarizationModule, main
|
from finetune import SummarizationModule, main
|
||||||
from run_eval import generate_summaries_or_translations, run_generate
|
from run_eval import generate_summaries_or_translations, run_generate
|
||||||
from run_eval_search import run_search
|
from run_eval_search import run_search
|
||||||
@@ -178,7 +178,6 @@ class TestSummarizationDistiller(unittest.TestCase):
|
|||||||
generate_summaries_or_translations(examples, out_path, str(model.output_dir / "best_tfmr"))
|
generate_summaries_or_translations(examples, out_path, str(model.output_dir / "best_tfmr"))
|
||||||
self.assertTrue(Path(out_path).exists())
|
self.assertTrue(Path(out_path).exists())
|
||||||
|
|
||||||
evaluate_checkpoint(ckpts[0], dest_dir=Path(tempfile.mkdtemp()))
|
|
||||||
out_path_new = tempfile.mkdtemp()
|
out_path_new = tempfile.mkdtemp()
|
||||||
convert_pl_to_hf(ckpts[0], transformer_ckpts[0].parent, out_path_new)
|
convert_pl_to_hf(ckpts[0], transformer_ckpts[0].parent, out_path_new)
|
||||||
assert os.path.exists(os.path.join(out_path_new, "pytorch_model.bin"))
|
assert os.path.exists(os.path.join(out_path_new, "pytorch_model.bin"))
|
||||||
@@ -227,8 +226,6 @@ class TestSummarizationDistiller(unittest.TestCase):
|
|||||||
assert len(all_files) > 2
|
assert len(all_files) > 2
|
||||||
self.assertEqual(len(transformer_ckpts), 2)
|
self.assertEqual(len(transformer_ckpts), 2)
|
||||||
|
|
||||||
evaluate_checkpoint(ckpts[0], dest_dir=Path(tempfile.mkdtemp()))
|
|
||||||
|
|
||||||
def test_distill_t5(self):
|
def test_distill_t5(self):
|
||||||
updates = dict(
|
updates = dict(
|
||||||
student_encoder_layers=1,
|
student_encoder_layers=1,
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
import tempfile
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
from transformers.convert_marian_tatoeba_to_pytorch import TatoebaConverter
|
||||||
|
from transformers.file_utils import cached_property
|
||||||
|
from transformers.testing_utils import slow
|
||||||
|
|
||||||
|
|
||||||
|
class TatoebaConversionTester(unittest.TestCase):
|
||||||
|
@cached_property
|
||||||
|
def resolver(self):
|
||||||
|
tmp_dir = tempfile.mkdtemp()
|
||||||
|
return TatoebaConverter(save_dir=tmp_dir)
|
||||||
|
|
||||||
|
@slow
|
||||||
|
def test_resolver(self):
|
||||||
|
self.resolver.convert_models(["heb-eng"])
|
||||||
|
|
||||||
|
@slow
|
||||||
|
def test_model_card(self):
|
||||||
|
content, mmeta = self.resolver.write_model_card("opus-mt-he-en", dry_run=True)
|
||||||
|
assert mmeta["long_pair"] == "heb-eng"
|
||||||
@@ -116,8 +116,8 @@ class ExamplesTests(TestCasePlus):
|
|||||||
testargs.append("--fp16")
|
testargs.append("--fp16")
|
||||||
|
|
||||||
with patch.object(sys, "argv", testargs):
|
with patch.object(sys, "argv", testargs):
|
||||||
result = run_pl_glue.main()
|
result = run_pl_glue.main()[0]
|
||||||
# for now just testing that the script can run to a completion
|
# for now just testing that the script can run to completion
|
||||||
self.assertGreater(result["acc"], 0.25)
|
self.assertGreater(result["acc"], 0.25)
|
||||||
#
|
#
|
||||||
# TODO: this fails on CI - doesn't get acc/f1>=0.75:
|
# TODO: this fails on CI - doesn't get acc/f1>=0.75:
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ def get_tfds(
|
|||||||
for k in files.keys():
|
for k in files.keys():
|
||||||
transformed_ds[k] = ds[k].map(
|
transformed_ds[k] = ds[k].map(
|
||||||
lambda example: tokenizer.batch_encode_plus(
|
lambda example: tokenizer.batch_encode_plus(
|
||||||
(example[features_name[0]], features_name[1]),
|
(example[features_name[0]], example[features_name[1]]),
|
||||||
truncation=True,
|
truncation=True,
|
||||||
max_length=max_seq_length,
|
max_length=max_seq_length,
|
||||||
padding="max_length",
|
padding="max_length",
|
||||||
@@ -96,6 +96,9 @@ def get_tfds(
|
|||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if train_ds is not None:
|
||||||
|
train_ds = train_ds.apply(tf.data.experimental.assert_cardinality(len(ds[datasets.Split.TRAIN])))
|
||||||
|
|
||||||
val_ds = (
|
val_ds = (
|
||||||
tf.data.Dataset.from_generator(
|
tf.data.Dataset.from_generator(
|
||||||
gen_val,
|
gen_val,
|
||||||
@@ -106,6 +109,9 @@ def get_tfds(
|
|||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if val_ds is not None:
|
||||||
|
val_ds = val_ds.apply(tf.data.experimental.assert_cardinality(len(ds[datasets.Split.VALIDATION])))
|
||||||
|
|
||||||
test_ds = (
|
test_ds = (
|
||||||
tf.data.Dataset.from_generator(
|
tf.data.Dataset.from_generator(
|
||||||
gen_test,
|
gen_test,
|
||||||
@@ -116,6 +122,9 @@ def get_tfds(
|
|||||||
else None
|
else None
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if test_ds is not None:
|
||||||
|
test_ds = test_ds.apply(tf.data.experimental.assert_cardinality(len(ds[datasets.Split.TEST])))
|
||||||
|
|
||||||
return train_ds, val_ds, test_ds, label2id
|
return train_ds, val_ds, test_ds, label2id
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
license: apache-2.0
|
||||||
|
---
|
||||||
@@ -4,4 +4,5 @@ datasets:
|
|||||||
- squad
|
- squad
|
||||||
metrics:
|
metrics:
|
||||||
- squad
|
- squad
|
||||||
|
license: apache-2.0
|
||||||
---
|
---
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
---
|
---
|
||||||
language: de
|
language: de
|
||||||
|
license: apache-2.0
|
||||||
---
|
---
|
||||||
## distilbert-base-german-cased
|
## distilbert-base-german-cased
|
||||||
@@ -6,4 +6,5 @@ widget:
|
|||||||
context: "The Amazon rainforest (Portuguese: Floresta Amazônica or Amazônia; Spanish: Selva Amazónica, Amazonía or usually Amazonia; French: Forêt amazonienne; Dutch: Amazoneregenwoud), also known in English as Amazonia or the Amazon Jungle, is a moist broadleaf forest that covers most of the Amazon basin of South America. This basin encompasses 7,000,000 square kilometres (2,700,000 sq mi), of which 5,500,000 square kilometres (2,100,000 sq mi) are covered by the rainforest. This region includes territory belonging to nine nations. The majority of the forest is contained within Brazil, with 60% of the rainforest, followed by Peru with 13%, Colombia with 10%, and with minor amounts in Venezuela, Ecuador, Bolivia, Guyana, Suriname and French Guiana. States or departments in four nations contain \"Amazonas\" in their names. The Amazon represents over half of the planet's remaining rainforests, and comprises the largest and most biodiverse tract of tropical rainforest in the world, with an estimated 390 billion individual trees divided into 16,000 species."
|
context: "The Amazon rainforest (Portuguese: Floresta Amazônica or Amazônia; Spanish: Selva Amazónica, Amazonía or usually Amazonia; French: Forêt amazonienne; Dutch: Amazoneregenwoud), also known in English as Amazonia or the Amazon Jungle, is a moist broadleaf forest that covers most of the Amazon basin of South America. This basin encompasses 7,000,000 square kilometres (2,700,000 sq mi), of which 5,500,000 square kilometres (2,100,000 sq mi) are covered by the rainforest. This region includes territory belonging to nine nations. The majority of the forest is contained within Brazil, with 60% of the rainforest, followed by Peru with 13%, Colombia with 10%, and with minor amounts in Venezuela, Ecuador, Bolivia, Guyana, Suriname and French Guiana. States or departments in four nations contain \"Amazonas\" in their names. The Amazon represents over half of the planet's remaining rainforests, and comprises the largest and most biodiverse tract of tropical rainforest in the world, with an estimated 390 billion individual trees divided into 16,000 species."
|
||||||
- text: "How many square kilometers of rainforest is covered in the basin?"
|
- text: "How many square kilometers of rainforest is covered in the basin?"
|
||||||
context: "The Amazon rainforest (Portuguese: Floresta Amazônica or Amazônia; Spanish: Selva Amazónica, Amazonía or usually Amazonia; French: Forêt amazonienne; Dutch: Amazoneregenwoud), also known in English as Amazonia or the Amazon Jungle, is a moist broadleaf forest that covers most of the Amazon basin of South America. This basin encompasses 7,000,000 square kilometres (2,700,000 sq mi), of which 5,500,000 square kilometres (2,100,000 sq mi) are covered by the rainforest. This region includes territory belonging to nine nations. The majority of the forest is contained within Brazil, with 60% of the rainforest, followed by Peru with 13%, Colombia with 10%, and with minor amounts in Venezuela, Ecuador, Bolivia, Guyana, Suriname and French Guiana. States or departments in four nations contain \"Amazonas\" in their names. The Amazon represents over half of the planet's remaining rainforests, and comprises the largest and most biodiverse tract of tropical rainforest in the world, with an estimated 390 billion individual trees divided into 16,000 species."
|
context: "The Amazon rainforest (Portuguese: Floresta Amazônica or Amazônia; Spanish: Selva Amazónica, Amazonía or usually Amazonia; French: Forêt amazonienne; Dutch: Amazoneregenwoud), also known in English as Amazonia or the Amazon Jungle, is a moist broadleaf forest that covers most of the Amazon basin of South America. This basin encompasses 7,000,000 square kilometres (2,700,000 sq mi), of which 5,500,000 square kilometres (2,100,000 sq mi) are covered by the rainforest. This region includes territory belonging to nine nations. The majority of the forest is contained within Brazil, with 60% of the rainforest, followed by Peru with 13%, Colombia with 10%, and with minor amounts in Venezuela, Ecuador, Bolivia, Guyana, Suriname and French Guiana. States or departments in four nations contain \"Amazonas\" in their names. The Amazon represents over half of the planet's remaining rainforests, and comprises the largest and most biodiverse tract of tropical rainforest in the world, with an estimated 390 billion individual trees divided into 16,000 species."
|
||||||
|
license: apache-2.0
|
||||||
---
|
---
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
license: apache-2.0
|
||||||
|
---
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
license: mit
|
||||||
|
---
|
||||||
@@ -9,6 +9,7 @@ datasets:
|
|||||||
- xnli
|
- xnli
|
||||||
widget:
|
widget:
|
||||||
- text: "За кого вы голосуете в 2020 году? <sep> This text is about politique."
|
- text: "За кого вы голосуете в 2020 году? <sep> This text is about politique."
|
||||||
|
license: mit
|
||||||
---
|
---
|
||||||
|
|
||||||
# xlm-roberta-large-xnli
|
# xlm-roberta-large-xnli
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ language:
|
|||||||
- fr
|
- fr
|
||||||
- it
|
- it
|
||||||
- es
|
- es
|
||||||
|
|
||||||
|
license: mit
|
||||||
---
|
---
|
||||||
|
|
||||||
# bert-base-multilingual-uncased-sentiment
|
# bert-base-multilingual-uncased-sentiment
|
||||||
|
|||||||
+20
@@ -0,0 +1,20 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
# this script builds a small sample spm file tests/fixtures/test_sentencepiece_no_bos.model, with features needed by pegasus
|
||||||
|
|
||||||
|
# 1. pip install sentencepiece
|
||||||
|
#
|
||||||
|
# 2. wget https://raw.githubusercontent.com/google/sentencepiece/master/data/botchan.txt
|
||||||
|
|
||||||
|
# 3. build
|
||||||
|
import sentencepiece as spm
|
||||||
|
|
||||||
|
# pegasus:
|
||||||
|
# 1. no bos
|
||||||
|
# 2. eos_id is 1
|
||||||
|
# 3. unk_id is 2
|
||||||
|
# build a sample spm file accordingly
|
||||||
|
spm.SentencePieceTrainer.train('--input=botchan.txt --model_prefix=test_sentencepiece_no_bos --bos_id=-1 --unk_id=2 --eos_id=1 --vocab_size=1000')
|
||||||
|
|
||||||
|
# 4. now update the fixture
|
||||||
|
# mv test_sentencepiece_no_bos.model ../../tests/fixtures/
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
Setup transformers following instructions in README.md, (I would fork first).
|
||||||
|
```bash
|
||||||
|
git clone git@github.com:huggingface/transformers.git
|
||||||
|
cd transformers
|
||||||
|
pip install -e .
|
||||||
|
pip install pandas
|
||||||
|
```
|
||||||
|
|
||||||
|
Get required metadata
|
||||||
|
```
|
||||||
|
curl https://cdn-datasets.huggingface.co/language_codes/language-codes-3b2.csv > language-codes-3b2.csv
|
||||||
|
curl https://cdn-datasets.huggingface.co/language_codes/iso-639-3.csv > iso-639-3.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
Install Tatoeba-Challenge repo inside transformers
|
||||||
|
```bash
|
||||||
|
git clone git@github.com:Helsinki-NLP/Tatoeba-Challenge.git
|
||||||
|
```
|
||||||
|
|
||||||
|
To convert a few models, call the conversion script from command line:
|
||||||
|
```bash
|
||||||
|
python src/transformers/convert_marian_tatoeba_to_pytorch.py --models heb-eng eng-heb --save_dir converted
|
||||||
|
```
|
||||||
|
|
||||||
|
To convert lots of models you can pass your list of Tatoeba model names to `resolver.convert_models` in a python client or script.
|
||||||
|
|
||||||
|
```python
|
||||||
|
from transformers.convert_marian_tatoeba_to_pytorch import TatoebaConverter
|
||||||
|
resolver = TatoebaConverter(save_dir='converted')
|
||||||
|
resolver.convert_models(['heb-eng', 'eng-heb'])
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Upload converted models
|
||||||
|
```bash
|
||||||
|
cd converted
|
||||||
|
transformers-cli login
|
||||||
|
for FILE in *; do transformers-cli upload $FILE; done
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Modifications
|
||||||
|
- To change naming logic, change the code near `os.rename`. The model card creation code may also need to change.
|
||||||
|
- To change model card content, you must modify `TatoebaCodeResolver.write_model_card`
|
||||||
@@ -3,7 +3,10 @@ Simple check list from AllenNLP repo: https://github.com/allenai/allennlp/blob/m
|
|||||||
|
|
||||||
To create the package for pypi.
|
To create the package for pypi.
|
||||||
|
|
||||||
1. Change the version in __init__.py, setup.py as well as docs/source/conf.py.
|
1. Change the version in __init__.py, setup.py as well as docs/source/conf.py. Remove the master from the links in
|
||||||
|
the new models of the README:
|
||||||
|
(https://huggingface.co/transformers/master/model_doc/ -> https://huggingface.co/transformers/model_doc/)
|
||||||
|
then run `make fix-copies` to fix the index of the documentation.
|
||||||
|
|
||||||
2. Unpin specific versions from setup.py that use a git install.
|
2. Unpin specific versions from setup.py that use a git install.
|
||||||
|
|
||||||
@@ -131,9 +134,7 @@ setup(
|
|||||||
"sacremoses",
|
"sacremoses",
|
||||||
],
|
],
|
||||||
extras_require=extras,
|
extras_require=extras,
|
||||||
entry_points={
|
entry_points={"console_scripts": ["transformers-cli=transformers.commands.transformers_cli:main"]},
|
||||||
"console_scripts": ["transformers-cli=transformers.commands.transformers_cli:main"]
|
|
||||||
},
|
|
||||||
python_requires=">=3.6.0",
|
python_requires=">=3.6.0",
|
||||||
classifiers=[
|
classifiers=[
|
||||||
"Development Status :: 5 - Production/Stable",
|
"Development Status :: 5 - Production/Stable",
|
||||||
|
|||||||
@@ -437,6 +437,7 @@ if is_torch_available():
|
|||||||
from .modeling_openai import (
|
from .modeling_openai import (
|
||||||
OPENAI_GPT_PRETRAINED_MODEL_ARCHIVE_LIST,
|
OPENAI_GPT_PRETRAINED_MODEL_ARCHIVE_LIST,
|
||||||
OpenAIGPTDoubleHeadsModel,
|
OpenAIGPTDoubleHeadsModel,
|
||||||
|
OpenAIGPTForSequenceClassification,
|
||||||
OpenAIGPTLMHeadModel,
|
OpenAIGPTLMHeadModel,
|
||||||
OpenAIGPTModel,
|
OpenAIGPTModel,
|
||||||
OpenAIGPTPreTrainedModel,
|
OpenAIGPTPreTrainedModel,
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class MMBTConfig(object):
|
|||||||
Config of the underlying Transformer models. Its values are copied over to use a single config.
|
Config of the underlying Transformer models. Its values are copied over to use a single config.
|
||||||
num_labels (:obj:`int`, `optional`):
|
num_labels (:obj:`int`, `optional`):
|
||||||
Size of final Linear layer for classification.
|
Size of final Linear layer for classification.
|
||||||
modal_hidden_size (:obj:`int`, `optional`, defautls to 2048):
|
modal_hidden_size (:obj:`int`, `optional`, defaults to 2048):
|
||||||
Embedding dimension of the non-text modality encoder.
|
Embedding dimension of the non-text modality encoder.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|||||||
@@ -274,7 +274,7 @@ class PretrainedConfig(object):
|
|||||||
Path to a directory in which a downloaded pretrained model configuration should be cached if the
|
Path to a directory in which a downloaded pretrained model configuration should be cached if the
|
||||||
standard cache should not be used.
|
standard cache should not be used.
|
||||||
force_download (:obj:`bool`, `optional`, defaults to :obj:`False`):
|
force_download (:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Wheter or not to force to (re-)download the configuration files and override the cached versions if they
|
Whether or not to force to (re-)download the configuration files and override the cached versions if they
|
||||||
exist.
|
exist.
|
||||||
resume_download (:obj:`bool`, `optional`, defaults to :obj:`False`):
|
resume_download (:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether or not to delete incompletely received file. Attempts to resume the download if such a file
|
Whether or not to delete incompletely received file. Attempts to resume the download if such a file
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ class XLNetConfig(PretrainedConfig):
|
|||||||
if mem_len is None or mem_len == 0:
|
if mem_len is None or mem_len == 0:
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"This config doesn't use attention memories, a core feature of XLNet."
|
"This config doesn't use attention memories, a core feature of XLNet."
|
||||||
" Consider setting `men_len` to a non-zero value, for example "
|
" Consider setting `mem_len` to a non-zero value, for example "
|
||||||
"`xlnet = XLNetLMHeadModel.from_pretrained('xlnet-base-cased'', mem_len=1024)`,"
|
"`xlnet = XLNetLMHeadModel.from_pretrained('xlnet-base-cased'', mem_len=1024)`,"
|
||||||
" for accurate training performance as well as an order of magnitude faster inference."
|
" for accurate training performance as well as an order of magnitude faster inference."
|
||||||
" Starting from version 3.5.0, the default parameter will be 1024, following"
|
" Starting from version 3.5.0, the default parameter will be 1024, following"
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ def load_graph_from_args(pipeline_name: str, framework: str, model: str, tokeniz
|
|||||||
pipeline_name: The kind of pipeline to use (ner, question-answering, etc.)
|
pipeline_name: The kind of pipeline to use (ner, question-answering, etc.)
|
||||||
framework: The actual model to convert the pipeline from ("pt" or "tf")
|
framework: The actual model to convert the pipeline from ("pt" or "tf")
|
||||||
model: The model name which will be loaded by the pipeline
|
model: The model name which will be loaded by the pipeline
|
||||||
tokenizer: The tokenizer name which will be loaded by the pipeline, defaut to the model's value
|
tokenizer: The tokenizer name which will be loaded by the pipeline, default to the model's value
|
||||||
|
|
||||||
Returns: Pipeline object
|
Returns: Pipeline object
|
||||||
|
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -1,12 +1,11 @@
|
|||||||
import argparse
|
import argparse
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import shutil
|
|
||||||
import socket
|
import socket
|
||||||
import time
|
import time
|
||||||
import warnings
|
import warnings
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Dict, List, Tuple, Union
|
from typing import Dict, List, Union
|
||||||
from zipfile import ZipFile
|
from zipfile import ZipFile
|
||||||
|
|
||||||
import numpy as np
|
import numpy as np
|
||||||
@@ -23,85 +22,6 @@ def remove_suffix(text: str, suffix: str):
|
|||||||
return text # or whatever
|
return text # or whatever
|
||||||
|
|
||||||
|
|
||||||
def _process_benchmark_table_row(x):
|
|
||||||
fields = lmap(str.strip, x.replace("\t", "").split("|")[1:-1])
|
|
||||||
assert len(fields) == 3
|
|
||||||
return (fields[0], float(fields[1]), float(fields[2]))
|
|
||||||
|
|
||||||
|
|
||||||
def process_last_benchmark_table(readme_path) -> List[Tuple[str, float, float]]:
|
|
||||||
md_content = Path(readme_path).open().read()
|
|
||||||
entries = md_content.split("## Benchmarks")[-1].strip().split("\n")[2:]
|
|
||||||
data = lmap(_process_benchmark_table_row, entries)
|
|
||||||
return data
|
|
||||||
|
|
||||||
|
|
||||||
def check_if_models_are_dominated(old_repo_path="OPUS-MT-train/models", new_repo_path="Tatoeba-Challenge/models/"):
|
|
||||||
"""Make a blacklist for models where we have already ported the same language pair, and the ported model has higher BLEU score."""
|
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
newest_released, old_reg, released = get_released_df(new_repo_path, old_repo_path)
|
|
||||||
|
|
||||||
short_to_new_bleu = newest_released.set_index("short_pair").bleu
|
|
||||||
|
|
||||||
assert released.groupby("short_pair").pair.nunique().max() == 1
|
|
||||||
|
|
||||||
short_to_long = released.groupby("short_pair").pair.first().to_dict()
|
|
||||||
|
|
||||||
overlap_short = old_reg.index.intersection(released.short_pair.unique())
|
|
||||||
overlap_long = [short_to_long[o] for o in overlap_short]
|
|
||||||
new_reported_bleu = [short_to_new_bleu[o] for o in overlap_short]
|
|
||||||
|
|
||||||
def get_old_bleu(o) -> float:
|
|
||||||
pat = old_repo_path + "/{}/README.md"
|
|
||||||
bm_data = process_last_benchmark_table(pat.format(o))
|
|
||||||
tab = pd.DataFrame(bm_data, columns=["testset", "bleu", "chr-f"])
|
|
||||||
tato_bleu = tab.loc[lambda x: x.testset.str.startswith("Tato")].bleu
|
|
||||||
if tato_bleu.shape[0] > 0:
|
|
||||||
return tato_bleu.iloc[0]
|
|
||||||
else:
|
|
||||||
return np.nan
|
|
||||||
|
|
||||||
old_bleu = [get_old_bleu(o) for o in overlap_short]
|
|
||||||
cmp_df = pd.DataFrame(
|
|
||||||
dict(short=overlap_short, long=overlap_long, old_bleu=old_bleu, new_bleu=new_reported_bleu)
|
|
||||||
).fillna(-1)
|
|
||||||
|
|
||||||
dominated = cmp_df[cmp_df.old_bleu > cmp_df.new_bleu]
|
|
||||||
whitelist_df = cmp_df[cmp_df.old_bleu <= cmp_df.new_bleu]
|
|
||||||
blacklist = dominated.long.unique().tolist() # 3 letter codes
|
|
||||||
return whitelist_df, dominated, blacklist
|
|
||||||
|
|
||||||
|
|
||||||
def get_released_df(new_repo_path, old_repo_path):
|
|
||||||
import pandas as pd
|
|
||||||
|
|
||||||
released_cols = [
|
|
||||||
"url_base",
|
|
||||||
"pair", # (ISO639-3/ISO639-5 codes),
|
|
||||||
"short_pair", # (reduced codes),
|
|
||||||
"chrF2_score",
|
|
||||||
"bleu",
|
|
||||||
"brevity_penalty",
|
|
||||||
"ref_len",
|
|
||||||
"src_name",
|
|
||||||
"tgt_name",
|
|
||||||
]
|
|
||||||
released = pd.read_csv(f"{new_repo_path}/released-models.txt", sep="\t", header=None).iloc[:-1]
|
|
||||||
released.columns = released_cols
|
|
||||||
old_reg = make_registry(repo_path=old_repo_path)
|
|
||||||
old_reg = pd.DataFrame(old_reg, columns=["id", "prepro", "url_model", "url_test_set"])
|
|
||||||
assert old_reg.id.value_counts().max() == 1
|
|
||||||
old_reg = old_reg.set_index("id")
|
|
||||||
released["fname"] = released["url_base"].apply(
|
|
||||||
lambda x: remove_suffix(remove_prefix(x, "https://object.pouta.csc.fi/Tatoeba-Challenge/opus"), ".zip")
|
|
||||||
)
|
|
||||||
released["2m"] = released.fname.str.startswith("2m")
|
|
||||||
released["date"] = pd.to_datetime(released["fname"].apply(lambda x: remove_prefix(remove_prefix(x, "2m-"), "-")))
|
|
||||||
newest_released = released.dsort("date").drop_duplicates(["short_pair"], keep="first")
|
|
||||||
return newest_released, old_reg, released
|
|
||||||
|
|
||||||
|
|
||||||
def remove_prefix(text: str, prefix: str):
|
def remove_prefix(text: str, prefix: str):
|
||||||
if text.startswith(prefix):
|
if text.startswith(prefix):
|
||||||
return text[len(prefix) :]
|
return text[len(prefix) :]
|
||||||
@@ -183,7 +103,11 @@ def find_model_file(dest_dir): # this one better
|
|||||||
|
|
||||||
|
|
||||||
# Group Names Logic: change long opus model names to something shorter, like opus-mt-en-ROMANCE
|
# Group Names Logic: change long opus model names to something shorter, like opus-mt-en-ROMANCE
|
||||||
ROM_GROUP = "fr+fr_BE+fr_CA+fr_FR+wa+frp+oc+ca+rm+lld+fur+lij+lmo+es+es_AR+es_CL+es_CO+es_CR+es_DO+es_EC+es_ES+es_GT+es_HN+es_MX+es_NI+es_PA+es_PE+es_PR+es_SV+es_UY+es_VE+pt+pt_br+pt_BR+pt_PT+gl+lad+an+mwl+it+it_IT+co+nap+scn+vec+sc+ro+la"
|
ROM_GROUP = (
|
||||||
|
"fr+fr_BE+fr_CA+fr_FR+wa+frp+oc+ca+rm+lld+fur+lij+lmo+es+es_AR+es_CL+es_CO+es_CR+es_DO+es_EC+es_ES+es_GT"
|
||||||
|
"+es_HN+es_MX+es_NI+es_PA+es_PE+es_PR+es_SV+es_UY+es_VE+pt+pt_br+pt_BR+pt_PT+gl+lad+an+mwl+it+it_IT+co"
|
||||||
|
"+nap+scn+vec+sc+ro+la"
|
||||||
|
)
|
||||||
GROUPS = [
|
GROUPS = [
|
||||||
("cmn+cn+yue+ze_zh+zh_cn+zh_CN+zh_HK+zh_tw+zh_TW+zh_yue+zhs+zht+zh", "ZH"),
|
("cmn+cn+yue+ze_zh+zh_cn+zh_CN+zh_HK+zh_tw+zh_TW+zh_yue+zhs+zht+zh", "ZH"),
|
||||||
(ROM_GROUP, "ROMANCE"),
|
(ROM_GROUP, "ROMANCE"),
|
||||||
@@ -221,13 +145,15 @@ ORG_NAME = "Helsinki-NLP/"
|
|||||||
|
|
||||||
|
|
||||||
def convert_opus_name_to_hf_name(x):
|
def convert_opus_name_to_hf_name(x):
|
||||||
|
"""For OPUS-MT-Train/ DEPRECATED"""
|
||||||
for substr, grp_name in GROUPS:
|
for substr, grp_name in GROUPS:
|
||||||
x = x.replace(substr, grp_name)
|
x = x.replace(substr, grp_name)
|
||||||
return x.replace("+", "_")
|
return x.replace("+", "_")
|
||||||
|
|
||||||
|
|
||||||
def convert_hf_name_to_opus_name(hf_model_name):
|
def convert_hf_name_to_opus_name(hf_model_name):
|
||||||
"""Relies on the assumption that there are no language codes like pt_br in models that are not in GROUP_TO_OPUS_NAME."""
|
"""Relies on the assumption that there are no language codes like pt_br in models that are not in
|
||||||
|
GROUP_TO_OPUS_NAME."""
|
||||||
hf_model_name = remove_prefix(hf_model_name, ORG_NAME)
|
hf_model_name = remove_prefix(hf_model_name, ORG_NAME)
|
||||||
if hf_model_name in GROUP_TO_OPUS_NAME:
|
if hf_model_name in GROUP_TO_OPUS_NAME:
|
||||||
opus_w_prefix = GROUP_TO_OPUS_NAME[hf_model_name]
|
opus_w_prefix = GROUP_TO_OPUS_NAME[hf_model_name]
|
||||||
@@ -247,8 +173,9 @@ def get_system_metadata(repo_root):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
front_matter = """---
|
FRONT_MATTER_TEMPLATE = """---
|
||||||
language: {}
|
language:
|
||||||
|
{}
|
||||||
tags:
|
tags:
|
||||||
- translation
|
- translation
|
||||||
|
|
||||||
@@ -256,11 +183,13 @@ license: apache-2.0
|
|||||||
---
|
---
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
DEFAULT_REPO = "Tatoeba-Challenge"
|
||||||
|
DEFAULT_MODEL_DIR = os.path.join(DEFAULT_REPO, "models")
|
||||||
|
|
||||||
|
|
||||||
def write_model_card(
|
def write_model_card(
|
||||||
hf_model_name: str,
|
hf_model_name: str,
|
||||||
repo_root="OPUS-MT-train",
|
repo_root=DEFAULT_REPO,
|
||||||
save_dir=Path("marian_converted"),
|
save_dir=Path("marian_converted"),
|
||||||
dry_run=False,
|
dry_run=False,
|
||||||
extra_metadata={},
|
extra_metadata={},
|
||||||
@@ -294,7 +223,10 @@ def write_model_card(
|
|||||||
|
|
||||||
# combine with opus markdown
|
# combine with opus markdown
|
||||||
|
|
||||||
extra_markdown = f"### {hf_model_name}\n\n* source group: {metadata['src_name']} \n* target group: {metadata['tgt_name']} \n* OPUS readme: [{opus_name}]({readme_url})\n"
|
extra_markdown = (
|
||||||
|
f"### {hf_model_name}\n\n* source group: {metadata['src_name']} \n* target group: "
|
||||||
|
f"{metadata['tgt_name']} \n* OPUS readme: [{opus_name}]({readme_url})\n"
|
||||||
|
)
|
||||||
|
|
||||||
content = opus_readme_path.open().read()
|
content = opus_readme_path.open().read()
|
||||||
content = content.split("\n# ")[-1] # Get the lowest level 1 header in the README -- the most recent model.
|
content = content.split("\n# ")[-1] # Get the lowest level 1 header in the README -- the most recent model.
|
||||||
@@ -302,7 +234,7 @@ def write_model_card(
|
|||||||
print(splat[3])
|
print(splat[3])
|
||||||
content = "*".join(splat)
|
content = "*".join(splat)
|
||||||
content = (
|
content = (
|
||||||
front_matter.format(metadata["src_alpha2"])
|
FRONT_MATTER_TEMPLATE.format(metadata["src_alpha2"])
|
||||||
+ extra_markdown
|
+ extra_markdown
|
||||||
+ "\n* "
|
+ "\n* "
|
||||||
+ content.replace("download", "download original weights")
|
+ content.replace("download", "download original weights")
|
||||||
@@ -323,48 +255,6 @@ def write_model_card(
|
|||||||
return content, metadata
|
return content, metadata
|
||||||
|
|
||||||
|
|
||||||
def get_clean_model_id_mapping(multiling_model_ids):
|
|
||||||
return {x: convert_opus_name_to_hf_name(x) for x in multiling_model_ids}
|
|
||||||
|
|
||||||
|
|
||||||
def expand_group_to_two_letter_codes(grp_name):
|
|
||||||
raise NotImplementedError()
|
|
||||||
|
|
||||||
|
|
||||||
def get_two_letter_code(three_letter_code):
|
|
||||||
raise NotImplementedError()
|
|
||||||
# return two_letter_code
|
|
||||||
|
|
||||||
|
|
||||||
def get_tags(code, ref_name):
|
|
||||||
if len(code) == 2:
|
|
||||||
assert "languages" not in ref_name, f"{code}: {ref_name}"
|
|
||||||
return [code], False
|
|
||||||
elif "languages" in ref_name:
|
|
||||||
group = expand_group_to_two_letter_codes(code)
|
|
||||||
group.append(code)
|
|
||||||
return group, True
|
|
||||||
else: # zho-> zh
|
|
||||||
raise ValueError(f"Three letter monolingual code: {code}")
|
|
||||||
|
|
||||||
|
|
||||||
def resolve_lang_code(r):
|
|
||||||
"""R is a row in ported"""
|
|
||||||
short_pair = r.short_pair
|
|
||||||
src, tgt = short_pair.split("-")
|
|
||||||
src_tags, src_multilingual = get_tags(src, r.src_name)
|
|
||||||
assert isinstance(src_tags, list)
|
|
||||||
tgt_tags, tgt_multilingual = get_tags(src, r.tgt_name)
|
|
||||||
assert isinstance(tgt_tags, list)
|
|
||||||
if src_multilingual:
|
|
||||||
src_tags.append("multilingual_src")
|
|
||||||
if tgt_multilingual:
|
|
||||||
tgt_tags.append("multilingual_tgt")
|
|
||||||
return src_tags + tgt_tags
|
|
||||||
|
|
||||||
# process target
|
|
||||||
|
|
||||||
|
|
||||||
def make_registry(repo_path="Opus-MT-train/models"):
|
def make_registry(repo_path="Opus-MT-train/models"):
|
||||||
if not (Path(repo_path) / "fr-en" / "README.md").exists():
|
if not (Path(repo_path) / "fr-en" / "README.md").exists():
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
@@ -382,36 +272,25 @@ def make_registry(repo_path="Opus-MT-train/models"):
|
|||||||
return [(k, v["pre-processing"], v["download"], v["download"][:-4] + ".test.txt") for k, v in results.items()]
|
return [(k, v["pre-processing"], v["download"], v["download"][:-4] + ".test.txt") for k, v in results.items()]
|
||||||
|
|
||||||
|
|
||||||
def make_tatoeba_registry(repo_path="Tatoeba-Challenge/models"):
|
def convert_all_sentencepiece_models(model_list=None, repo_path=None, dest_dir=Path("marian_converted")):
|
||||||
if not (Path(repo_path) / "zho-eng" / "README.md").exists():
|
|
||||||
raise ValueError(
|
|
||||||
f"repo_path:{repo_path} does not exist: "
|
|
||||||
"You must run: git clone git@github.com:Helsinki-NLP/Tatoeba-Challenge.git before calling."
|
|
||||||
)
|
|
||||||
results = {}
|
|
||||||
for p in Path(repo_path).iterdir():
|
|
||||||
if len(p.name) != 7:
|
|
||||||
continue
|
|
||||||
lns = list(open(p / "README.md").readlines())
|
|
||||||
results[p.name] = _parse_readme(lns)
|
|
||||||
return [(k, v["pre-processing"], v["download"], v["download"][:-4] + ".test.txt") for k, v in results.items()]
|
|
||||||
|
|
||||||
|
|
||||||
def convert_all_sentencepiece_models(model_list=None, repo_path=None):
|
|
||||||
"""Requires 300GB"""
|
"""Requires 300GB"""
|
||||||
save_dir = Path("marian_ckpt")
|
save_dir = Path("marian_ckpt")
|
||||||
dest_dir = Path("marian_converted")
|
dest_dir = Path(dest_dir)
|
||||||
dest_dir.mkdir(exist_ok=True)
|
dest_dir.mkdir(exist_ok=True)
|
||||||
|
save_paths = []
|
||||||
if model_list is None:
|
if model_list is None:
|
||||||
model_list: list = make_registry(repo_path=repo_path)
|
model_list: list = make_registry(repo_path=repo_path)
|
||||||
for k, prepro, download, test_set_url in tqdm(model_list):
|
for k, prepro, download, test_set_url in tqdm(model_list):
|
||||||
if "SentencePiece" not in prepro: # dont convert BPE models.
|
if "SentencePiece" not in prepro: # dont convert BPE models.
|
||||||
continue
|
continue
|
||||||
if not os.path.exists(save_dir / k / "pytorch_model.bin"):
|
if not os.path.exists(save_dir / k):
|
||||||
download_and_unzip(download, save_dir / k)
|
download_and_unzip(download, save_dir / k)
|
||||||
pair_name = convert_opus_name_to_hf_name(k)
|
pair_name = convert_opus_name_to_hf_name(k)
|
||||||
convert(save_dir / k, dest_dir / f"opus-mt-{pair_name}")
|
convert(save_dir / k, dest_dir / f"opus-mt-{pair_name}")
|
||||||
|
|
||||||
|
save_paths.append(dest_dir / f"opus-mt-{pair_name}")
|
||||||
|
return save_paths
|
||||||
|
|
||||||
|
|
||||||
def lmap(f, x) -> List:
|
def lmap(f, x) -> List:
|
||||||
return list(map(f, x))
|
return list(map(f, x))
|
||||||
@@ -493,15 +372,6 @@ def add_special_tokens_to_vocab(model_dir: Path) -> None:
|
|||||||
save_tokenizer_config(model_dir)
|
save_tokenizer_config(model_dir)
|
||||||
|
|
||||||
|
|
||||||
def save_tokenizer(self, save_directory):
|
|
||||||
dest = Path(save_directory)
|
|
||||||
src_path = Path(self.init_kwargs["source_spm"])
|
|
||||||
|
|
||||||
for dest_name in {"source.spm", "target.spm", "tokenizer_config.json"}:
|
|
||||||
shutil.copyfile(src_path.parent / dest_name, dest / dest_name)
|
|
||||||
save_json(self.encoder, dest / "vocab.json")
|
|
||||||
|
|
||||||
|
|
||||||
def check_equal(marian_cfg, k1, k2):
|
def check_equal(marian_cfg, k1, k2):
|
||||||
v1, v2 = marian_cfg[k1], marian_cfg[k2]
|
v1, v2 = marian_cfg[k1], marian_cfg[k2]
|
||||||
assert v1 == v2, f"hparams {k1},{k2} differ: {v1} != {v2}"
|
assert v1 == v2, f"hparams {k1},{k2} differ: {v1} != {v2}"
|
||||||
@@ -698,14 +568,14 @@ def convert(source_dir: Path, dest_dir):
|
|||||||
|
|
||||||
add_special_tokens_to_vocab(source_dir)
|
add_special_tokens_to_vocab(source_dir)
|
||||||
tokenizer = MarianTokenizer.from_pretrained(str(source_dir))
|
tokenizer = MarianTokenizer.from_pretrained(str(source_dir))
|
||||||
save_tokenizer(tokenizer, dest_dir)
|
tokenizer.save_pretrained(dest_dir)
|
||||||
|
|
||||||
opus_state = OpusState(source_dir)
|
opus_state = OpusState(source_dir)
|
||||||
assert opus_state.cfg["vocab_size"] == len(
|
assert opus_state.cfg["vocab_size"] == len(
|
||||||
tokenizer.encoder
|
tokenizer.encoder
|
||||||
), f"Original vocab size {opus_state.cfg['vocab_size']} and new vocab size {len(tokenizer.encoder)} mismatched"
|
), f"Original vocab size {opus_state.cfg['vocab_size']} and new vocab size {len(tokenizer.encoder)} mismatched"
|
||||||
# save_json(opus_state.cfg, dest_dir / "marian_original_config.json")
|
# save_json(opus_state.cfg, dest_dir / "marian_original_config.json")
|
||||||
# ^^ Save human readable marian config for debugging
|
# ^^ Uncomment to save human readable marian config for debugging
|
||||||
|
|
||||||
model = opus_state.load_marian_model()
|
model = opus_state.load_marian_model()
|
||||||
model = model.half()
|
model = model.half()
|
||||||
@@ -732,15 +602,11 @@ def unzip(zip_path: str, dest_dir: str) -> None:
|
|||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
"""
|
"""
|
||||||
To bulk convert, run
|
Tatoeba conversion instructions in scripts/tatoeba/README.md
|
||||||
>>> from transformers.convert_marian_to_pytorch import make_tatoeba_registry, convert_all_sentencepiece_models
|
|
||||||
>>> reg = make_tatoeba_registry()
|
|
||||||
>>> convert_all_sentencepiece_models(model_list=reg) # saves to marian_converted
|
|
||||||
(bash) aws s3 sync marian_converted s3://models.huggingface.co/bert/Helsinki-NLP/ --dryrun
|
|
||||||
"""
|
"""
|
||||||
parser = argparse.ArgumentParser()
|
parser = argparse.ArgumentParser()
|
||||||
# Required parameters
|
# Required parameters
|
||||||
parser.add_argument("--src", type=str, help="path to marian model dir", default="en-de")
|
parser.add_argument("--src", type=str, help="path to marian model sub dir", default="en-de")
|
||||||
parser.add_argument("--dest", type=str, default=None, help="Path to the output PyTorch model.")
|
parser.add_argument("--dest", type=str, default=None, help="Path to the output PyTorch model.")
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
|||||||
@@ -547,6 +547,7 @@ CONVERTERS = {
|
|||||||
"DPRReaderTokenizer": BertConverter,
|
"DPRReaderTokenizer": BertConverter,
|
||||||
"DPRQuestionEncoderTokenizer": BertConverter,
|
"DPRQuestionEncoderTokenizer": BertConverter,
|
||||||
"DPRContextEncoderTokenizer": BertConverter,
|
"DPRContextEncoderTokenizer": BertConverter,
|
||||||
|
"ElectraTokenizer": BertConverter,
|
||||||
"FunnelTokenizer": FunnelConverter,
|
"FunnelTokenizer": FunnelConverter,
|
||||||
"GPT2Tokenizer": GPT2Converter,
|
"GPT2Tokenizer": GPT2Converter,
|
||||||
"LxmertTokenizer": BertConverter,
|
"LxmertTokenizer": BertConverter,
|
||||||
|
|||||||
@@ -560,7 +560,7 @@ class SquadProcessor(DataProcessor):
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
dataset: The tfds dataset loaded from `tensorflow_datasets.load("squad")`
|
dataset: The tfds dataset loaded from `tensorflow_datasets.load("squad")`
|
||||||
evaluate: boolean specifying if in evaluation mode or in training mode
|
evaluate: Boolean specifying if in evaluation mode or in training mode
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
List of SquadExample
|
List of SquadExample
|
||||||
|
|||||||
@@ -1093,7 +1093,7 @@ def is_tensor(x):
|
|||||||
class ModelOutput(OrderedDict):
|
class ModelOutput(OrderedDict):
|
||||||
"""
|
"""
|
||||||
Base class for all model outputs as dataclass. Has a ``__getitem__`` that allows indexing by integer or slice (like
|
Base class for all model outputs as dataclass. Has a ``__getitem__`` that allows indexing by integer or slice (like
|
||||||
a tuple) or strings (like a dictionnary) that will ignore the ``None`` attributes. Otherwise behaves like a
|
a tuple) or strings (like a dictionary) that will ignore the ``None`` attributes. Otherwise behaves like a
|
||||||
regular python dictionary.
|
regular python dictionary.
|
||||||
|
|
||||||
.. warning::
|
.. warning::
|
||||||
|
|||||||
@@ -2,13 +2,11 @@
|
|||||||
import math
|
import math
|
||||||
import os
|
import os
|
||||||
|
|
||||||
from .file_utils import is_torch_tpu_available
|
|
||||||
from .trainer_callback import TrainerCallback
|
|
||||||
from .trainer_utils import PREFIX_CHECKPOINT_DIR, BestRun
|
|
||||||
from .utils import logging
|
|
||||||
|
|
||||||
|
# Import 3rd-party integrations first:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
# Comet needs to be imported before any ML frameworks
|
||||||
import comet_ml # noqa: F401
|
import comet_ml # noqa: F401
|
||||||
|
|
||||||
_has_comet = True
|
_has_comet = True
|
||||||
@@ -53,6 +51,14 @@ except ImportError:
|
|||||||
except ImportError:
|
except ImportError:
|
||||||
_has_tensorboard = False
|
_has_tensorboard = False
|
||||||
|
|
||||||
|
# No transformer imports above this point
|
||||||
|
|
||||||
|
from .file_utils import is_torch_tpu_available
|
||||||
|
from .trainer_callback import TrainerCallback
|
||||||
|
from .trainer_utils import PREFIX_CHECKPOINT_DIR, BestRun
|
||||||
|
from .utils import logging
|
||||||
|
|
||||||
|
|
||||||
logger = logging.get_logger(__name__)
|
logger = logging.get_logger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@@ -191,7 +197,7 @@ class TensorBoardCallback(TrainerCallback):
|
|||||||
|
|
||||||
Args:
|
Args:
|
||||||
tb_writer (:obj:`SummaryWriter`, `optional`):
|
tb_writer (:obj:`SummaryWriter`, `optional`):
|
||||||
The writer to use. Will instatiate one if not set.
|
The writer to use. Will instantiate one if not set.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, tb_writer=None):
|
def __init__(self, tb_writer=None):
|
||||||
|
|||||||
@@ -539,7 +539,7 @@ ALBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ from .modeling_mobilebert import (
|
|||||||
MobileBertForTokenClassification,
|
MobileBertForTokenClassification,
|
||||||
MobileBertModel,
|
MobileBertModel,
|
||||||
)
|
)
|
||||||
from .modeling_openai import OpenAIGPTLMHeadModel, OpenAIGPTModel
|
from .modeling_openai import OpenAIGPTForSequenceClassification, OpenAIGPTLMHeadModel, OpenAIGPTModel
|
||||||
from .modeling_pegasus import PegasusForConditionalGeneration
|
from .modeling_pegasus import PegasusForConditionalGeneration
|
||||||
from .modeling_rag import ( # noqa: F401 - need to import all RagModels to be in globals() function
|
from .modeling_rag import ( # noqa: F401 - need to import all RagModels to be in globals() function
|
||||||
RagModel,
|
RagModel,
|
||||||
@@ -381,6 +381,7 @@ MODEL_FOR_SEQUENCE_CLASSIFICATION_MAPPING = OrderedDict(
|
|||||||
(FunnelConfig, FunnelForSequenceClassification),
|
(FunnelConfig, FunnelForSequenceClassification),
|
||||||
(DebertaConfig, DebertaForSequenceClassification),
|
(DebertaConfig, DebertaForSequenceClassification),
|
||||||
(GPT2Config, GPT2ForSequenceClassification),
|
(GPT2Config, GPT2ForSequenceClassification),
|
||||||
|
(OpenAIGPTConfig, OpenAIGPTForSequenceClassification),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -506,7 +507,7 @@ AUTO_MODEL_PRETRAINED_DOCSTRING = r"""
|
|||||||
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
||||||
request.
|
request.
|
||||||
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether ot not to also return a dictionnary containing missing keys, unexpected keys and error
|
Whether ot not to also return a dictionary containing missing keys, unexpected keys and error
|
||||||
messages.
|
messages.
|
||||||
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether or not to only look at local files (e.g., not try doanloading the model).
|
Whether or not to only look at local files (e.g., not try doanloading the model).
|
||||||
@@ -532,7 +533,7 @@ AUTO_MODEL_PRETRAINED_DOCSTRING = r"""
|
|||||||
class AutoModel:
|
class AutoModel:
|
||||||
r"""
|
r"""
|
||||||
This is a generic model class that will be instantiated as one of the base model classes of the library
|
This is a generic model class that will be instantiated as one of the base model classes of the library
|
||||||
when created with the when created with the :meth:`~transformers.AutoModel.from_pretrained` class method or the
|
when created with the :meth:`~transformers.AutoModel.from_pretrained` class method or the
|
||||||
:meth:`~transformers.AutoModel.from_config` class methods.
|
:meth:`~transformers.AutoModel.from_config` class methods.
|
||||||
|
|
||||||
This class cannot be instantiated directly using ``__init__()`` (throws an error).
|
This class cannot be instantiated directly using ``__init__()`` (throws an error).
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ BART_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -667,7 +667,7 @@ BERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
@@ -781,7 +781,7 @@ class BertModel(BertPreTrainedModel):
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
"""
|
"""
|
||||||
output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
|
output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
|
||||||
output_hidden_states = (
|
output_hidden_states = (
|
||||||
@@ -1012,7 +1012,7 @@ class BertLMHeadModel(BertPreTrainedModel):
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
Labels for computing the left-to-right language modeling loss (next word prediction).
|
Labels for computing the left-to-right language modeling loss (next word prediction).
|
||||||
Indices should be in ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring)
|
Indices should be in ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring)
|
||||||
|
|||||||
@@ -218,7 +218,7 @@ BERT_GENERATION_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
position_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
position_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
@@ -450,7 +450,7 @@ class BertGenerationDecoder(BertGenerationPreTrainedModel):
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
Labels for computing the left-to-right language modeling loss (next word prediction).
|
Labels for computing the left-to-right language modeling loss (next word prediction).
|
||||||
Indices should be in ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring)
|
Indices should be in ``[-100, 0, ..., config.vocab_size]`` (see ``input_ids`` docstring)
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ CTRL_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -401,7 +401,7 @@ DISTILBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
head_mask (:obj:`torch.FloatTensor` of shape :obj:`(num_heads,)` or :obj:`(num_layers, num_heads)`, `optional`):
|
head_mask (:obj:`torch.FloatTensor` of shape :obj:`(num_heads,)` or :obj:`(num_layers, num_heads)`, `optional`):
|
||||||
|
|||||||
@@ -358,7 +358,7 @@ DPR_ENCODERS_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
@@ -403,7 +403,7 @@ DPR_READER_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
inputs_embeds (:obj:`torch.FloatTensor` of shape :obj:`(n_passages, sequence_length, hidden_size)`, `optional`):
|
inputs_embeds (:obj:`torch.FloatTensor` of shape :obj:`(n_passages, sequence_length, hidden_size)`, `optional`):
|
||||||
|
|||||||
@@ -611,7 +611,7 @@ ELECTRA_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ ENCODER_DECODER_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ FLAUBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -224,7 +224,7 @@ FSMT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -857,7 +857,7 @@ FUNNEL_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -33,7 +33,11 @@ from .file_utils import (
|
|||||||
add_start_docstrings_to_callable,
|
add_start_docstrings_to_callable,
|
||||||
replace_return_docstrings,
|
replace_return_docstrings,
|
||||||
)
|
)
|
||||||
from .modeling_outputs import BaseModelOutputWithPast, CausalLMOutputWithPast, SequenceClassifierOutputWithPast
|
from .modeling_outputs import (
|
||||||
|
BaseModelOutputWithPast,
|
||||||
|
CausalLMOutputWithPast,
|
||||||
|
SequenceClassifierOutputWithPast,
|
||||||
|
)
|
||||||
from .modeling_utils import (
|
from .modeling_utils import (
|
||||||
Conv1D,
|
Conv1D,
|
||||||
PreTrainedModel,
|
PreTrainedModel,
|
||||||
@@ -42,6 +46,7 @@ from .modeling_utils import (
|
|||||||
prune_conv1d_layer,
|
prune_conv1d_layer,
|
||||||
)
|
)
|
||||||
from .utils import logging
|
from .utils import logging
|
||||||
|
from .utils.model_parallel_utils import assert_device_map, get_device_map
|
||||||
|
|
||||||
|
|
||||||
logger = logging.get_logger(__name__)
|
logger = logging.get_logger(__name__)
|
||||||
@@ -124,7 +129,10 @@ class Attention(nn.Module):
|
|||||||
# [switch nx => n_state from Block to Attention to keep identical to TF implem]
|
# [switch nx => n_state from Block to Attention to keep identical to TF implem]
|
||||||
assert n_state % config.n_head == 0
|
assert n_state % config.n_head == 0
|
||||||
self.register_buffer(
|
self.register_buffer(
|
||||||
"bias", torch.tril(torch.ones((n_ctx, n_ctx), dtype=torch.uint8)).view(1, 1, n_ctx, n_ctx)
|
"bias",
|
||||||
|
torch.tril(torch.ones((n_ctx, n_ctx), dtype=torch.uint8)).view(
|
||||||
|
1, 1, n_ctx, n_ctx
|
||||||
|
),
|
||||||
)
|
)
|
||||||
self.register_buffer("masked_bias", torch.tensor(-1e4))
|
self.register_buffer("masked_bias", torch.tensor(-1e4))
|
||||||
self.n_head = config.n_head
|
self.n_head = config.n_head
|
||||||
@@ -147,7 +155,9 @@ class Attention(nn.Module):
|
|||||||
heads, index = find_pruneable_heads_and_indices(
|
heads, index = find_pruneable_heads_and_indices(
|
||||||
heads, self.n_head, self.split_size // self.n_head, self.pruned_heads
|
heads, self.n_head, self.split_size // self.n_head, self.pruned_heads
|
||||||
)
|
)
|
||||||
index_attn = torch.cat([index, index + self.split_size, index + (2 * self.split_size)])
|
index_attn = torch.cat(
|
||||||
|
[index, index + self.split_size, index + (2 * self.split_size)]
|
||||||
|
)
|
||||||
|
|
||||||
# Prune conv1d layers
|
# Prune conv1d layers
|
||||||
self.c_attn = prune_conv1d_layer(self.c_attn, index_attn, dim=1)
|
self.c_attn = prune_conv1d_layer(self.c_attn, index_attn, dim=1)
|
||||||
@@ -158,7 +168,9 @@ class Attention(nn.Module):
|
|||||||
self.n_head = self.n_head - len(heads)
|
self.n_head = self.n_head - len(heads)
|
||||||
self.pruned_heads = self.pruned_heads.union(heads)
|
self.pruned_heads = self.pruned_heads.union(heads)
|
||||||
|
|
||||||
def _attn(self, q, k, v, attention_mask=None, head_mask=None, output_attentions=False):
|
def _attn(
|
||||||
|
self, q, k, v, attention_mask=None, head_mask=None, output_attentions=False
|
||||||
|
):
|
||||||
w = torch.matmul(q, k)
|
w = torch.matmul(q, k)
|
||||||
if self.scale:
|
if self.scale:
|
||||||
w = w / (float(v.size(-1)) ** 0.5)
|
w = w / (float(v.size(-1)) ** 0.5)
|
||||||
@@ -214,7 +226,9 @@ class Attention(nn.Module):
|
|||||||
self, "q_attn"
|
self, "q_attn"
|
||||||
), "If class is used as cross attention, the weights `q_attn` have to be defined. Please make sure to instantiate class with `Attention(..., is_cross_attention=True)`."
|
), "If class is used as cross attention, the weights `q_attn` have to be defined. Please make sure to instantiate class with `Attention(..., is_cross_attention=True)`."
|
||||||
query = self.q_attn(hidden_states)
|
query = self.q_attn(hidden_states)
|
||||||
key, value = self.c_attn(encoder_hidden_states).split(self.split_size, dim=2)
|
key, value = self.c_attn(encoder_hidden_states).split(
|
||||||
|
self.split_size, dim=2
|
||||||
|
)
|
||||||
attention_mask = encoder_attention_mask
|
attention_mask = encoder_attention_mask
|
||||||
else:
|
else:
|
||||||
query, key, value = self.c_attn(hidden_states).split(self.split_size, dim=2)
|
query, key, value = self.c_attn(hidden_states).split(self.split_size, dim=2)
|
||||||
@@ -223,16 +237,23 @@ class Attention(nn.Module):
|
|||||||
key = self.split_heads(key, k=True)
|
key = self.split_heads(key, k=True)
|
||||||
value = self.split_heads(value)
|
value = self.split_heads(value)
|
||||||
if layer_past is not None:
|
if layer_past is not None:
|
||||||
past_key, past_value = layer_past[0].transpose(-2, -1), layer_past[1] # transpose back cf below
|
past_key, past_value = (
|
||||||
|
layer_past[0].transpose(-2, -1),
|
||||||
|
layer_past[1],
|
||||||
|
) # transpose back cf below
|
||||||
key = torch.cat((past_key, key), dim=-1)
|
key = torch.cat((past_key, key), dim=-1)
|
||||||
value = torch.cat((past_value, value), dim=-2)
|
value = torch.cat((past_value, value), dim=-2)
|
||||||
|
|
||||||
if use_cache is True:
|
if use_cache is True:
|
||||||
present = torch.stack((key.transpose(-2, -1), value)) # transpose to have same shapes for stacking
|
present = torch.stack(
|
||||||
|
(key.transpose(-2, -1), value)
|
||||||
|
) # transpose to have same shapes for stacking
|
||||||
else:
|
else:
|
||||||
present = (None,)
|
present = (None,)
|
||||||
|
|
||||||
attn_outputs = self._attn(query, key, value, attention_mask, head_mask, output_attentions)
|
attn_outputs = self._attn(
|
||||||
|
query, key, value, attention_mask, head_mask, output_attentions
|
||||||
|
)
|
||||||
a = attn_outputs[0]
|
a = attn_outputs[0]
|
||||||
|
|
||||||
a = self.merge_heads(a)
|
a = self.merge_heads(a)
|
||||||
@@ -267,8 +288,12 @@ class Block(nn.Module):
|
|||||||
self.attn = Attention(hidden_size, n_ctx, config, scale)
|
self.attn = Attention(hidden_size, n_ctx, config, scale)
|
||||||
self.ln_2 = nn.LayerNorm(hidden_size, eps=config.layer_norm_epsilon)
|
self.ln_2 = nn.LayerNorm(hidden_size, eps=config.layer_norm_epsilon)
|
||||||
if config.add_cross_attention:
|
if config.add_cross_attention:
|
||||||
self.crossattention = Attention(hidden_size, n_ctx, config, scale, is_cross_attention=True)
|
self.crossattention = Attention(
|
||||||
self.ln_cross_attn = nn.LayerNorm(hidden_size, eps=config.layer_norm_epsilon)
|
hidden_size, n_ctx, config, scale, is_cross_attention=True
|
||||||
|
)
|
||||||
|
self.ln_cross_attn = nn.LayerNorm(
|
||||||
|
hidden_size, eps=config.layer_norm_epsilon
|
||||||
|
)
|
||||||
self.mlp = MLP(inner_dim, config)
|
self.mlp = MLP(inner_dim, config)
|
||||||
|
|
||||||
def forward(
|
def forward(
|
||||||
@@ -311,7 +336,9 @@ class Block(nn.Module):
|
|||||||
attn_output = cross_attn_outputs[0]
|
attn_output = cross_attn_outputs[0]
|
||||||
# residual connection
|
# residual connection
|
||||||
hidden_states = hidden_states + attn_output
|
hidden_states = hidden_states + attn_output
|
||||||
outputs = outputs + cross_attn_outputs[1:] # add cross attentions if we output attention weights
|
outputs = (
|
||||||
|
outputs + cross_attn_outputs[1:]
|
||||||
|
) # add cross attentions if we output attention weights
|
||||||
|
|
||||||
feed_forward_hidden_states = self.mlp(self.ln_2(hidden_states))
|
feed_forward_hidden_states = self.mlp(self.ln_2(hidden_states))
|
||||||
# residual connection
|
# residual connection
|
||||||
@@ -429,7 +456,7 @@ GPT2_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, input_ids_length)`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, input_ids_length)`, `optional`):
|
||||||
@@ -472,6 +499,48 @@ GPT2_INPUTS_DOCSTRING = r"""
|
|||||||
Whether or not to return a :class:`~transformers.file_utils.ModelOutput` instead of a plain tuple.
|
Whether or not to return a :class:`~transformers.file_utils.ModelOutput` instead of a plain tuple.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
PARALLELIZE_DOCSTRING = r"""
|
||||||
|
Uses a device map to distribute attention modules of the model across several devices. If no device map is given, it
|
||||||
|
will evenly distribute blocks across all devices.
|
||||||
|
Args:
|
||||||
|
device_map (:obj:`Dict[int, list]`, optional, defaults to None):
|
||||||
|
A dictionary that maps attention modules to devices. Note that the embedding module and LMHead are
|
||||||
|
always automatically mapped to the first device (for esoteric reasons). That means that the first
|
||||||
|
device should have fewer attention modules mapped to it than other devices.
|
||||||
|
|
||||||
|
For reference, the gpt2 models have the following number of attention modules:
|
||||||
|
|
||||||
|
- gpt2: 12
|
||||||
|
- gpt2-medium: 24
|
||||||
|
- gpt2-large: 36
|
||||||
|
- gpt2-xl: 48
|
||||||
|
|
||||||
|
Example::
|
||||||
|
Here is an example of a device map on a machine with 4 GPUs using gpt2-xl, which has a total of 48 attention modules:
|
||||||
|
|
||||||
|
model = GPT2LMHeadModel.from_pretrained('gpt2-xl')
|
||||||
|
device_map = {0: [0, 1, 2, 3, 4, 5, 6, 7, 8],
|
||||||
|
1: [9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
|
||||||
|
2: [22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34],
|
||||||
|
3: [35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47]}
|
||||||
|
model.parallelize(device_map)
|
||||||
|
"""
|
||||||
|
|
||||||
|
DEPARALLELIZE_DOCSTRING = r"""
|
||||||
|
Moves the model to cpu from a model parallel state.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
On a 4 GPU machine with gpt2-large:
|
||||||
|
|
||||||
|
model = GPT2LMHeadModel.from_pretrained('gpt2-large')
|
||||||
|
device_map = {0: [0, 1, 2, 3, 4, 5, 6, 7],
|
||||||
|
1: [8, 9, 10, 11, 12, 13, 14, 15],
|
||||||
|
2: [16, 17, 18, 19, 20, 21, 22, 23],
|
||||||
|
3: [24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]}
|
||||||
|
model.parallelize(device_map) # Splits the model across several devices
|
||||||
|
model.deparallelize() # Put the model back on cpu and cleans memory by calling torch.cuda.empty_cache()
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
@add_start_docstrings(
|
@add_start_docstrings(
|
||||||
"The bare GPT2 Model transformer outputting raw hidden-states without any specific head on top.",
|
"The bare GPT2 Model transformer outputting raw hidden-states without any specific head on top.",
|
||||||
@@ -484,11 +553,58 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
self.wte = nn.Embedding(config.vocab_size, config.n_embd)
|
self.wte = nn.Embedding(config.vocab_size, config.n_embd)
|
||||||
self.wpe = nn.Embedding(config.n_positions, config.n_embd)
|
self.wpe = nn.Embedding(config.n_positions, config.n_embd)
|
||||||
self.drop = nn.Dropout(config.embd_pdrop)
|
self.drop = nn.Dropout(config.embd_pdrop)
|
||||||
self.h = nn.ModuleList([Block(config.n_ctx, config, scale=True) for _ in range(config.n_layer)])
|
self.h = nn.ModuleList(
|
||||||
|
[Block(config.n_ctx, config, scale=True) for _ in range(config.n_layer)]
|
||||||
|
)
|
||||||
self.ln_f = nn.LayerNorm(config.n_embd, eps=config.layer_norm_epsilon)
|
self.ln_f = nn.LayerNorm(config.n_embd, eps=config.layer_norm_epsilon)
|
||||||
|
|
||||||
self.init_weights()
|
self.init_weights()
|
||||||
|
|
||||||
|
# Model parallel
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
|
||||||
|
@add_start_docstrings(PARALLELIZE_DOCSTRING)
|
||||||
|
def parallelize(self, device_map=None):
|
||||||
|
# Check validity of device_map
|
||||||
|
self.device_map = (
|
||||||
|
get_device_map(len(self.h), range(torch.cuda.device_count()))
|
||||||
|
if device_map is None
|
||||||
|
else device_map
|
||||||
|
)
|
||||||
|
assert_device_map(self.device_map, len(self.h))
|
||||||
|
|
||||||
|
self.model_parallel = True
|
||||||
|
self.first_device = (
|
||||||
|
"cpu"
|
||||||
|
if "cpu" in self.device_map.keys()
|
||||||
|
else "cuda:" + str(min(self.device_map.keys()))
|
||||||
|
)
|
||||||
|
self.last_device = "cuda:" + str(max(self.device_map.keys()))
|
||||||
|
self.wte = self.wte.to(self.first_device)
|
||||||
|
self.wpe = self.wpe.to(self.first_device)
|
||||||
|
# Load onto devices
|
||||||
|
for k, v in self.device_map.items():
|
||||||
|
for block in v:
|
||||||
|
cuda_device = "cuda:" + str(k)
|
||||||
|
self.h[block] = self.h[block].to(cuda_device)
|
||||||
|
# ln_f to last
|
||||||
|
self.ln_f = self.ln_f.to(self.last_device)
|
||||||
|
|
||||||
|
@add_start_docstrings(DEPARALLELIZE_DOCSTRING)
|
||||||
|
def deparallelize(self):
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
self.first_device = "cpu"
|
||||||
|
self.last_device = "cpu"
|
||||||
|
self.wte = self.wte.to("cpu")
|
||||||
|
self.wpe = self.wpe.to("cpu")
|
||||||
|
for index in range(len(self.h)):
|
||||||
|
self.h[index] = self.h[index].to("cpu")
|
||||||
|
|
||||||
|
self.ln_f = self.ln_f.to("cpu")
|
||||||
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
def get_input_embeddings(self):
|
def get_input_embeddings(self):
|
||||||
return self.wte
|
return self.wte
|
||||||
|
|
||||||
@@ -534,15 +650,25 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
past_key_values = kwargs.pop("past")
|
past_key_values = kwargs.pop("past")
|
||||||
assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
|
assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
|
||||||
|
|
||||||
output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
|
output_attentions = (
|
||||||
|
output_attentions
|
||||||
|
if output_attentions is not None
|
||||||
|
else self.config.output_attentions
|
||||||
|
)
|
||||||
output_hidden_states = (
|
output_hidden_states = (
|
||||||
output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
|
output_hidden_states
|
||||||
|
if output_hidden_states is not None
|
||||||
|
else self.config.output_hidden_states
|
||||||
)
|
)
|
||||||
use_cache = use_cache if use_cache is not None else self.config.use_cache
|
use_cache = use_cache if use_cache is not None else self.config.use_cache
|
||||||
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
return_dict = (
|
||||||
|
return_dict if return_dict is not None else self.config.use_return_dict
|
||||||
|
)
|
||||||
|
|
||||||
if input_ids is not None and inputs_embeds is not None:
|
if input_ids is not None and inputs_embeds is not None:
|
||||||
raise ValueError("You cannot specify both input_ids and inputs_embeds at the same time")
|
raise ValueError(
|
||||||
|
"You cannot specify both input_ids and inputs_embeds at the same time"
|
||||||
|
)
|
||||||
elif input_ids is not None:
|
elif input_ids is not None:
|
||||||
input_shape = input_ids.size()
|
input_shape = input_ids.size()
|
||||||
input_ids = input_ids.view(-1, input_shape[-1])
|
input_ids = input_ids.view(-1, input_shape[-1])
|
||||||
@@ -565,7 +691,12 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
past_length = past_key_values[0][0].size(-2)
|
past_length = past_key_values[0][0].size(-2)
|
||||||
if position_ids is None:
|
if position_ids is None:
|
||||||
device = input_ids.device if input_ids is not None else inputs_embeds.device
|
device = input_ids.device if input_ids is not None else inputs_embeds.device
|
||||||
position_ids = torch.arange(past_length, input_shape[-1] + past_length, dtype=torch.long, device=device)
|
position_ids = torch.arange(
|
||||||
|
past_length,
|
||||||
|
input_shape[-1] + past_length,
|
||||||
|
dtype=torch.long,
|
||||||
|
device=device,
|
||||||
|
)
|
||||||
position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1])
|
position_ids = position_ids.unsqueeze(0).view(-1, input_shape[-1])
|
||||||
|
|
||||||
# Attention mask.
|
# Attention mask.
|
||||||
@@ -584,13 +715,17 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
# positions we want to attend and -10000.0 for masked positions.
|
# positions we want to attend and -10000.0 for masked positions.
|
||||||
# Since we are adding it to the raw scores before the softmax, this is
|
# Since we are adding it to the raw scores before the softmax, this is
|
||||||
# effectively the same as removing these entirely.
|
# effectively the same as removing these entirely.
|
||||||
attention_mask = attention_mask.to(dtype=next(self.parameters()).dtype) # fp16 compatibility
|
attention_mask = attention_mask.to(dtype=self.dtype) # fp16 compatibility
|
||||||
attention_mask = (1.0 - attention_mask) * -10000.0
|
attention_mask = (1.0 - attention_mask) * -10000.0
|
||||||
|
|
||||||
# If a 2D ou 3D attention mask is provided for the cross-attention
|
# If a 2D ou 3D attention mask is provided for the cross-attention
|
||||||
# we need to make broadcastabe to [batch_size, num_heads, seq_length, seq_length]
|
# we need to make broadcastabe to [batch_size, num_heads, seq_length, seq_length]
|
||||||
if self.config.add_cross_attention and encoder_hidden_states is not None:
|
if self.config.add_cross_attention and encoder_hidden_states is not None:
|
||||||
encoder_batch_size, encoder_sequence_length, _ = encoder_hidden_states.size()
|
(
|
||||||
|
encoder_batch_size,
|
||||||
|
encoder_sequence_length,
|
||||||
|
_,
|
||||||
|
) = encoder_hidden_states.size()
|
||||||
encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length)
|
encoder_hidden_shape = (encoder_batch_size, encoder_sequence_length)
|
||||||
if encoder_attention_mask is None:
|
if encoder_attention_mask is None:
|
||||||
encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device)
|
encoder_attention_mask = torch.ones(encoder_hidden_shape, device=device)
|
||||||
@@ -620,15 +755,33 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
all_attentions = () if output_attentions else None
|
all_attentions = () if output_attentions else None
|
||||||
all_hidden_states = () if output_hidden_states else None
|
all_hidden_states = () if output_hidden_states else None
|
||||||
for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)):
|
for i, (block, layer_past) in enumerate(zip(self.h, past_key_values)):
|
||||||
|
# Model parallel
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(hidden_states.device)
|
||||||
|
# Ensure layer_past is on same device as hidden_states (might not be correct)
|
||||||
|
if layer_past is not None:
|
||||||
|
layer_past = layer_past.to(hidden_states.device)
|
||||||
|
# Ensure that attention_mask is always on the same device as hidden_states
|
||||||
|
if attention_mask is not None:
|
||||||
|
attention_mask = attention_mask.to(hidden_states.device)
|
||||||
|
|
||||||
|
if isinstance(head_mask, torch.Tensor):
|
||||||
|
head_mask = head_mask.to(hidden_states.device)
|
||||||
|
|
||||||
if output_hidden_states:
|
if output_hidden_states:
|
||||||
all_hidden_states = all_hidden_states + (hidden_states.view(*output_shape),)
|
all_hidden_states = all_hidden_states + (
|
||||||
|
hidden_states.view(*output_shape),
|
||||||
|
)
|
||||||
|
|
||||||
if getattr(self.config, "gradient_checkpointing", False):
|
if getattr(self.config, "gradient_checkpointing", False):
|
||||||
|
|
||||||
def create_custom_forward(module):
|
def create_custom_forward(module):
|
||||||
def custom_forward(*inputs):
|
def custom_forward(*inputs):
|
||||||
# checkpointing only works with tuple returns, not with lists
|
# checkpointing only works with tuple returns, not with lists
|
||||||
return tuple(output for output in module(*inputs, use_cache, output_attentions))
|
return tuple(
|
||||||
|
output
|
||||||
|
for output in module(*inputs, use_cache, output_attentions)
|
||||||
|
)
|
||||||
|
|
||||||
return custom_forward
|
return custom_forward
|
||||||
|
|
||||||
@@ -660,6 +813,12 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
if output_attentions:
|
if output_attentions:
|
||||||
all_attentions = all_attentions + (outputs[2],)
|
all_attentions = all_attentions + (outputs[2],)
|
||||||
|
|
||||||
|
# Model Parallel: If it's the last layer for that device, put things on the next device
|
||||||
|
if self.model_parallel:
|
||||||
|
for k, v in self.device_map.items():
|
||||||
|
if i == v[-1] and "cuda:" + str(k) != self.last_device:
|
||||||
|
hidden_states = hidden_states.to("cuda:" + str(k + 1))
|
||||||
|
|
||||||
hidden_states = self.ln_f(hidden_states)
|
hidden_states = self.ln_f(hidden_states)
|
||||||
|
|
||||||
hidden_states = hidden_states.view(*output_shape)
|
hidden_states = hidden_states.view(*output_shape)
|
||||||
@@ -668,7 +827,11 @@ class GPT2Model(GPT2PreTrainedModel):
|
|||||||
all_hidden_states = all_hidden_states + (hidden_states,)
|
all_hidden_states = all_hidden_states + (hidden_states,)
|
||||||
|
|
||||||
if not return_dict:
|
if not return_dict:
|
||||||
return tuple(v for v in [hidden_states, presents, all_hidden_states, all_attentions] if v is not None)
|
return tuple(
|
||||||
|
v
|
||||||
|
for v in [hidden_states, presents, all_hidden_states, all_attentions]
|
||||||
|
if v is not None
|
||||||
|
)
|
||||||
|
|
||||||
return BaseModelOutputWithPast(
|
return BaseModelOutputWithPast(
|
||||||
last_hidden_state=hidden_states,
|
last_hidden_state=hidden_states,
|
||||||
@@ -693,6 +856,29 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
|
|
||||||
self.init_weights()
|
self.init_weights()
|
||||||
|
|
||||||
|
self.model_parallel = False
|
||||||
|
|
||||||
|
@add_start_docstrings(PARALLELIZE_DOCSTRING)
|
||||||
|
def parallelize(self, device_map=None):
|
||||||
|
self.device_map = (
|
||||||
|
get_device_map(len(self.transformer.h), range(torch.cuda.device_count()))
|
||||||
|
if device_map is None
|
||||||
|
else device_map
|
||||||
|
)
|
||||||
|
assert_device_map(self.device_map, len(self.transformer.h))
|
||||||
|
|
||||||
|
self.transformer.parallelize(self.device_map)
|
||||||
|
self.lm_head = self.lm_head.to(self.transformer.first_device)
|
||||||
|
self.model_parallel = True
|
||||||
|
|
||||||
|
@add_start_docstrings(DEPARALLELIZE_DOCSTRING)
|
||||||
|
def deparallelize(self):
|
||||||
|
self.transformer.deparallelize()
|
||||||
|
self.transformer = self.transformer.to("cpu")
|
||||||
|
self.lm_head = self.lm_head.to("cpu")
|
||||||
|
self.model_parallel = False
|
||||||
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
def get_output_embeddings(self):
|
def get_output_embeddings(self):
|
||||||
return self.lm_head
|
return self.lm_head
|
||||||
|
|
||||||
@@ -747,7 +933,9 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
)
|
)
|
||||||
past_key_values = kwargs.pop("past")
|
past_key_values = kwargs.pop("past")
|
||||||
assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
|
assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
|
||||||
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
return_dict = (
|
||||||
|
return_dict if return_dict is not None else self.config.use_return_dict
|
||||||
|
)
|
||||||
|
|
||||||
transformer_outputs = self.transformer(
|
transformer_outputs = self.transformer(
|
||||||
input_ids,
|
input_ids,
|
||||||
@@ -766,6 +954,11 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
)
|
)
|
||||||
hidden_states = transformer_outputs[0]
|
hidden_states = transformer_outputs[0]
|
||||||
|
|
||||||
|
# Set device for model parallelism
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.transformer.first_device)
|
||||||
|
hidden_states = hidden_states.to(self.lm_head.weight.device)
|
||||||
|
|
||||||
lm_logits = self.lm_head(hidden_states)
|
lm_logits = self.lm_head(hidden_states)
|
||||||
|
|
||||||
loss = None
|
loss = None
|
||||||
@@ -775,7 +968,9 @@ class GPT2LMHeadModel(GPT2PreTrainedModel):
|
|||||||
shift_labels = labels[..., 1:].contiguous()
|
shift_labels = labels[..., 1:].contiguous()
|
||||||
# Flatten the tokens
|
# Flatten the tokens
|
||||||
loss_fct = CrossEntropyLoss()
|
loss_fct = CrossEntropyLoss()
|
||||||
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
|
loss = loss_fct(
|
||||||
|
shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)
|
||||||
|
)
|
||||||
|
|
||||||
if not return_dict:
|
if not return_dict:
|
||||||
output = (lm_logits,) + transformer_outputs[1:]
|
output = (lm_logits,) + transformer_outputs[1:]
|
||||||
@@ -823,7 +1018,9 @@ class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
|||||||
}
|
}
|
||||||
|
|
||||||
@add_start_docstrings_to_callable(GPT2_INPUTS_DOCSTRING)
|
@add_start_docstrings_to_callable(GPT2_INPUTS_DOCSTRING)
|
||||||
@replace_return_docstrings(output_type=GPT2DoubleHeadsModelOutput, config_class=_CONFIG_FOR_DOC)
|
@replace_return_docstrings(
|
||||||
|
output_type=GPT2DoubleHeadsModelOutput, config_class=_CONFIG_FOR_DOC
|
||||||
|
)
|
||||||
def forward(
|
def forward(
|
||||||
self,
|
self,
|
||||||
input_ids=None,
|
input_ids=None,
|
||||||
@@ -899,7 +1096,9 @@ class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
|||||||
)
|
)
|
||||||
past_key_values = kwargs.pop("past")
|
past_key_values = kwargs.pop("past")
|
||||||
assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
|
assert kwargs == {}, f"Unexpected keyword arguments: {list(kwargs.keys())}."
|
||||||
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
return_dict = (
|
||||||
|
return_dict if return_dict is not None else self.config.use_return_dict
|
||||||
|
)
|
||||||
|
|
||||||
transformer_outputs = self.transformer(
|
transformer_outputs = self.transformer(
|
||||||
input_ids,
|
input_ids,
|
||||||
@@ -923,13 +1122,17 @@ class GPT2DoubleHeadsModel(GPT2PreTrainedModel):
|
|||||||
mc_loss = None
|
mc_loss = None
|
||||||
if mc_labels is not None:
|
if mc_labels is not None:
|
||||||
loss_fct = CrossEntropyLoss()
|
loss_fct = CrossEntropyLoss()
|
||||||
mc_loss = loss_fct(mc_logits.view(-1, mc_logits.size(-1)), mc_labels.view(-1))
|
mc_loss = loss_fct(
|
||||||
|
mc_logits.view(-1, mc_logits.size(-1)), mc_labels.view(-1)
|
||||||
|
)
|
||||||
lm_loss = None
|
lm_loss = None
|
||||||
if labels is not None:
|
if labels is not None:
|
||||||
shift_logits = lm_logits[..., :-1, :].contiguous()
|
shift_logits = lm_logits[..., :-1, :].contiguous()
|
||||||
shift_labels = labels[..., 1:].contiguous()
|
shift_labels = labels[..., 1:].contiguous()
|
||||||
loss_fct = CrossEntropyLoss()
|
loss_fct = CrossEntropyLoss()
|
||||||
lm_loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
|
lm_loss = loss_fct(
|
||||||
|
shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)
|
||||||
|
)
|
||||||
|
|
||||||
if not return_dict:
|
if not return_dict:
|
||||||
output = (lm_logits, mc_logits) + transformer_outputs[1:]
|
output = (lm_logits, mc_logits) + transformer_outputs[1:]
|
||||||
@@ -1003,7 +1206,9 @@ class GPT2ForSequenceClassification(GPT2PreTrainedModel):
|
|||||||
If :obj:`config.num_labels == 1` a regression loss is computed (Mean-Square loss),
|
If :obj:`config.num_labels == 1` a regression loss is computed (Mean-Square loss),
|
||||||
If :obj:`config.num_labels > 1` a classification loss is computed (Cross-Entropy).
|
If :obj:`config.num_labels > 1` a classification loss is computed (Cross-Entropy).
|
||||||
"""
|
"""
|
||||||
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
return_dict = (
|
||||||
|
return_dict if return_dict is not None else self.config.use_return_dict
|
||||||
|
)
|
||||||
|
|
||||||
transformer_outputs = self.transformer(
|
transformer_outputs = self.transformer(
|
||||||
input_ids,
|
input_ids,
|
||||||
@@ -1033,7 +1238,9 @@ class GPT2ForSequenceClassification(GPT2PreTrainedModel):
|
|||||||
sequence_lengths = -1
|
sequence_lengths = -1
|
||||||
else:
|
else:
|
||||||
if input_ids is not None:
|
if input_ids is not None:
|
||||||
sequence_lengths = torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1
|
sequence_lengths = (
|
||||||
|
torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
sequence_lengths = -1
|
sequence_lengths = -1
|
||||||
logger.warning(
|
logger.warning(
|
||||||
@@ -1051,7 +1258,9 @@ class GPT2ForSequenceClassification(GPT2PreTrainedModel):
|
|||||||
loss = loss_fct(pooled_logits.view(-1), labels.view(-1))
|
loss = loss_fct(pooled_logits.view(-1), labels.view(-1))
|
||||||
else:
|
else:
|
||||||
loss_fct = CrossEntropyLoss()
|
loss_fct = CrossEntropyLoss()
|
||||||
loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1))
|
loss = loss_fct(
|
||||||
|
pooled_logits.view(-1, self.num_labels), labels.view(-1)
|
||||||
|
)
|
||||||
|
|
||||||
if not return_dict:
|
if not return_dict:
|
||||||
output = (pooled_logits,) + transformer_outputs[1:]
|
output = (pooled_logits,) + transformer_outputs[1:]
|
||||||
|
|||||||
@@ -1018,7 +1018,7 @@ LONGFORMER_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
global_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`({0})`, `optional`):
|
global_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -848,7 +848,7 @@ LXMERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
visual_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`({0})`, `optional`):
|
visual_attention_mask (:obj:`torch.FloatTensor` of shape :obj:`({0})`, `optional`):
|
||||||
@@ -856,7 +856,7 @@ LXMERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
@@ -964,7 +964,7 @@ class LxmertModel(LxmertPreTrainedModel):
|
|||||||
# Process the visual attention mask
|
# Process the visual attention mask
|
||||||
if visual_attention_mask is not None:
|
if visual_attention_mask is not None:
|
||||||
extended_visual_attention_mask = visual_attention_mask.unsqueeze(1).unsqueeze(2)
|
extended_visual_attention_mask = visual_attention_mask.unsqueeze(1).unsqueeze(2)
|
||||||
extended_visual_attention_mask = extended_visual_attention_mask.to(dtype=next(self.parameters()).dtype)
|
extended_visual_attention_mask = extended_visual_attention_mask.to(dtype=self.dtype)
|
||||||
extended_visual_attention_mask = (1.0 - extended_visual_attention_mask) * -10000.0
|
extended_visual_attention_mask = (1.0 - extended_visual_attention_mask) * -10000.0
|
||||||
else:
|
else:
|
||||||
extended_visual_attention_mask = None
|
extended_visual_attention_mask = None
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ MMBT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (`optional`) ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
token_type_ids (`optional`) ``torch.LongTensor`` of shape ``(batch_size, sequence_length)``:
|
||||||
@@ -167,7 +167,7 @@ MMBT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
output_attentions (:obj:`bool`, `optional`):
|
output_attentions (:obj:`bool`, `optional`):
|
||||||
Whether or not to return the attentions tensors of all attention layers. See ``attentions`` under returned
|
Whether or not to return the attentions tensors of all attention layers. See ``attentions`` under returned
|
||||||
|
|||||||
@@ -756,7 +756,7 @@ MOBILEBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
@@ -792,7 +792,7 @@ MOBILEBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
output_attentions (:obj:`bool`, `optional`):
|
output_attentions (:obj:`bool`, `optional`):
|
||||||
Whether or not to return the attentions tensors of all attention layers. See ``attentions`` under returned
|
Whether or not to return the attentions tensors of all attention layers. See ``attentions`` under returned
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ from typing import Optional, Tuple
|
|||||||
|
|
||||||
import torch
|
import torch
|
||||||
import torch.nn as nn
|
import torch.nn as nn
|
||||||
from torch.nn import CrossEntropyLoss
|
from torch.nn import CrossEntropyLoss, MSELoss
|
||||||
|
|
||||||
from .activations import gelu_new, swish
|
from .activations import gelu_new, swish
|
||||||
from .configuration_openai import OpenAIGPTConfig
|
from .configuration_openai import OpenAIGPTConfig
|
||||||
@@ -36,7 +36,7 @@ from .file_utils import (
|
|||||||
add_start_docstrings_to_callable,
|
add_start_docstrings_to_callable,
|
||||||
replace_return_docstrings,
|
replace_return_docstrings,
|
||||||
)
|
)
|
||||||
from .modeling_outputs import BaseModelOutput, CausalLMOutput
|
from .modeling_outputs import BaseModelOutput, CausalLMOutput, SequenceClassifierOutput
|
||||||
from .modeling_utils import (
|
from .modeling_utils import (
|
||||||
Conv1D,
|
Conv1D,
|
||||||
PreTrainedModel,
|
PreTrainedModel,
|
||||||
@@ -360,7 +360,7 @@ OPENAI_GPT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
@@ -732,3 +732,113 @@ class OpenAIGPTDoubleHeadsModel(OpenAIGPTPreTrainedModel):
|
|||||||
hidden_states=transformer_outputs.hidden_states,
|
hidden_states=transformer_outputs.hidden_states,
|
||||||
attentions=transformer_outputs.attentions,
|
attentions=transformer_outputs.attentions,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@add_start_docstrings(
|
||||||
|
"""The Original OpenAI GPT Model transformer with a sequence classification head on top
|
||||||
|
(linear layer).
|
||||||
|
:class:`~transformers.OpenAIGPTForSequenceClassification` uses the last token in order to do the classification, as
|
||||||
|
other causal models (e.g. GPT-2) do.
|
||||||
|
Since it does classification on the last token, it requires to know the position of the last token.
|
||||||
|
If a :obj:`pad_token_id` is defined in the configuration, it finds the last token that is not a padding token
|
||||||
|
in each row. If no :obj:`pad_token_id` is defined, it simply takes the last value in each row of the batch.
|
||||||
|
Since it cannot guess the padding tokens when :obj:`inputs_embeds` are passed instead of :obj:`input_ids`, it
|
||||||
|
does the same (take the last value in each row of the batch).
|
||||||
|
""",
|
||||||
|
OPENAI_GPT_START_DOCSTRING,
|
||||||
|
)
|
||||||
|
class OpenAIGPTForSequenceClassification(OpenAIGPTPreTrainedModel):
|
||||||
|
def __init__(self, config):
|
||||||
|
super().__init__(config)
|
||||||
|
self.num_labels = config.num_labels
|
||||||
|
self.transformer = OpenAIGPTModel(config)
|
||||||
|
self.score = nn.Linear(config.n_embd, self.num_labels, bias=False)
|
||||||
|
|
||||||
|
self.init_weights()
|
||||||
|
|
||||||
|
@add_start_docstrings_to_callable(OPENAI_GPT_INPUTS_DOCSTRING)
|
||||||
|
@add_code_sample_docstrings(
|
||||||
|
tokenizer_class=_TOKENIZER_FOR_DOC,
|
||||||
|
checkpoint="openai-gpt",
|
||||||
|
output_type=SequenceClassifierOutput,
|
||||||
|
config_class=_CONFIG_FOR_DOC,
|
||||||
|
)
|
||||||
|
def forward(
|
||||||
|
self,
|
||||||
|
input_ids=None,
|
||||||
|
attention_mask=None,
|
||||||
|
token_type_ids=None,
|
||||||
|
position_ids=None,
|
||||||
|
head_mask=None,
|
||||||
|
inputs_embeds=None,
|
||||||
|
labels=None,
|
||||||
|
output_attentions=None,
|
||||||
|
output_hidden_states=None,
|
||||||
|
return_dict=None,
|
||||||
|
):
|
||||||
|
r"""
|
||||||
|
labels (:obj:`torch.LongTensor` of shape :obj:`(batch_size,)`, `optional`):
|
||||||
|
Labels for computing the sequence classification/regression loss.
|
||||||
|
Indices should be in :obj:`[0, ..., config.num_labels - 1]`.
|
||||||
|
If :obj:`config.num_labels == 1` a regression loss is computed (Mean-Square loss),
|
||||||
|
If :obj:`config.num_labels > 1` a classification loss is computed (Cross-Entropy).
|
||||||
|
"""
|
||||||
|
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
||||||
|
|
||||||
|
transformer_outputs = self.transformer(
|
||||||
|
input_ids,
|
||||||
|
attention_mask=attention_mask,
|
||||||
|
token_type_ids=token_type_ids,
|
||||||
|
position_ids=position_ids,
|
||||||
|
head_mask=head_mask,
|
||||||
|
inputs_embeds=inputs_embeds,
|
||||||
|
output_attentions=output_attentions,
|
||||||
|
output_hidden_states=output_hidden_states,
|
||||||
|
return_dict=return_dict,
|
||||||
|
)
|
||||||
|
|
||||||
|
hidden_states = transformer_outputs[0]
|
||||||
|
logits = self.score(hidden_states)
|
||||||
|
|
||||||
|
if input_ids is not None:
|
||||||
|
batch_size, sequence_length = input_ids.shape[:2]
|
||||||
|
else:
|
||||||
|
batch_size, sequence_length = inputs_embeds.shape[:2]
|
||||||
|
|
||||||
|
assert (
|
||||||
|
self.config.pad_token_id is not None or batch_size == 1
|
||||||
|
), "Cannot handle batch sizes > 1 if no padding token is defined."
|
||||||
|
if self.config.pad_token_id is None:
|
||||||
|
sequence_lengths = -1
|
||||||
|
else:
|
||||||
|
if input_ids is not None:
|
||||||
|
sequence_lengths = torch.ne(input_ids, self.config.pad_token_id).sum(-1) - 1
|
||||||
|
else:
|
||||||
|
sequence_lengths = -1
|
||||||
|
logger.warning(
|
||||||
|
f"{self.__class__.__name__} will not detect padding tokens in `inputs_embeds`. Results may be "
|
||||||
|
f"unexpected if using padding tokens in conjuction with `inputs_embeds.`"
|
||||||
|
)
|
||||||
|
|
||||||
|
pooled_logits = logits[range(batch_size), sequence_lengths]
|
||||||
|
|
||||||
|
loss = None
|
||||||
|
if labels is not None:
|
||||||
|
if self.num_labels == 1:
|
||||||
|
# We are doing regression
|
||||||
|
loss_fct = MSELoss()
|
||||||
|
loss = loss_fct(pooled_logits.view(-1), labels.view(-1))
|
||||||
|
else:
|
||||||
|
loss_fct = CrossEntropyLoss()
|
||||||
|
loss = loss_fct(pooled_logits.view(-1, self.num_labels), labels.view(-1))
|
||||||
|
|
||||||
|
if not return_dict:
|
||||||
|
output = (pooled_logits,) + transformer_outputs[1:]
|
||||||
|
return ((loss,) + output) if loss is not None else output
|
||||||
|
|
||||||
|
return SequenceClassifierOutput(
|
||||||
|
loss=loss,
|
||||||
|
logits=pooled_logits,
|
||||||
|
hidden_states=transformer_outputs.hidden_states,
|
||||||
|
attentions=transformer_outputs.attentions,
|
||||||
|
)
|
||||||
@@ -406,7 +406,7 @@ RAG_FORWARD_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
encoder_outputs (:obj:`tuple(tuple(torch.FloatTensor)`, `optional`)
|
encoder_outputs (:obj:`tuple(tuple(torch.FloatTensor)`, `optional`)
|
||||||
@@ -836,7 +836,7 @@ class RagSequenceForGeneration(RagPreTrainedModel):
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
context_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size * config.n_docs, config.max_combined_length)`, `optional`, returned when `output_retrieved=True`):
|
context_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size * config.n_docs, config.max_combined_length)`, `optional`, returned when `output_retrieved=True`):
|
||||||
@@ -1221,7 +1221,7 @@ class RagTokenForGeneration(RagPreTrainedModel):
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
context_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size * config.n_docs, config.max_combined_length)`, `optional`, returned when `output_retrieved=True`):
|
context_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size * config.n_docs, config.max_combined_length)`, `optional`, returned when `output_retrieved=True`):
|
||||||
|
|||||||
@@ -1926,7 +1926,7 @@ REFORMER_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
position_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
position_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ class RetriBertModel(RetriBertPreTrainedModel):
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
input_ids_doc (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`):
|
input_ids_doc (:obj:`torch.LongTensor` of shape :obj:`(batch_size, sequence_length)`):
|
||||||
|
|||||||
@@ -506,7 +506,7 @@ ROBERTA_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -461,7 +461,7 @@ SQUEEZEBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ from .file_utils import (
|
|||||||
from .modeling_outputs import BaseModelOutput, BaseModelOutputWithPast, Seq2SeqLMOutput, Seq2SeqModelOutput
|
from .modeling_outputs import BaseModelOutput, BaseModelOutputWithPast, Seq2SeqLMOutput, Seq2SeqModelOutput
|
||||||
from .modeling_utils import PreTrainedModel, find_pruneable_heads_and_indices, prune_linear_layer
|
from .modeling_utils import PreTrainedModel, find_pruneable_heads_and_indices, prune_linear_layer
|
||||||
from .utils import logging
|
from .utils import logging
|
||||||
|
from .utils.model_parallel_utils import assert_device_map, get_device_map
|
||||||
|
|
||||||
|
|
||||||
logger = logging.get_logger(__name__)
|
logger = logging.get_logger(__name__)
|
||||||
@@ -151,7 +152,48 @@ def load_tf_weights_in_t5(model, config, tf_checkpoint_path):
|
|||||||
# - torch.nn.Module for the layers and
|
# - torch.nn.Module for the layers and
|
||||||
# - PreTrainedModel for the models (it-self a sub-class of torch.nn.Module)
|
# - PreTrainedModel for the models (it-self a sub-class of torch.nn.Module)
|
||||||
####################################################
|
####################################################
|
||||||
|
PARALLELIZE_DOCSTRING = r"""
|
||||||
|
Uses a device map to distribute attention modules of the model across several devices. If no device map is given, it
|
||||||
|
will evenly distribute blocks across all devices.
|
||||||
|
Args:
|
||||||
|
device_map (:obj:`Dict[int, list]`, optional, defaults to None):
|
||||||
|
A dictionary that maps attention modules to devices. Note that the embedding module and LMHead are
|
||||||
|
always automatically mapped to the first device (for esoteric reasons). That means that the first
|
||||||
|
device should have fewer attention modules mapped to it than other devices.
|
||||||
|
|
||||||
|
For reference, the t5 models have the following number of attention modules:
|
||||||
|
|
||||||
|
- t5-small: 6
|
||||||
|
- t5-base: 12
|
||||||
|
- t5-large: 24
|
||||||
|
- t5-3b: 24
|
||||||
|
- t5-11b: 24
|
||||||
|
|
||||||
|
Example::
|
||||||
|
Here is an example of a device map on a machine with 4 GPUs using t5-3b, which has a total of 24 attention modules:
|
||||||
|
|
||||||
|
model = T5ForConditionalGeneration.from_pretrained('t5-3b')
|
||||||
|
device_map = {0: [0, 1, 2],
|
||||||
|
1: [3, 4, 5, 6, 7, 8, 9],
|
||||||
|
2: [10, 11, 12, 13, 14, 15, 16],
|
||||||
|
3: [17, 18, 19, 20, 21, 22, 23]}
|
||||||
|
model.parallelize(device_map)
|
||||||
|
"""
|
||||||
|
|
||||||
|
DEPARALLELIZE_DOCSTRING = r"""
|
||||||
|
Moves the model to cpu from a model parallel state.
|
||||||
|
|
||||||
|
Example::
|
||||||
|
On a 4 GPU machine with t5-3b:
|
||||||
|
|
||||||
|
model = T5ForConditionalGeneration.from_pretrained('t5-3b')
|
||||||
|
device_map = {0: [0, 1, 2],
|
||||||
|
1: [3, 4, 5, 6, 7, 8, 9],
|
||||||
|
2: [10, 11, 12, 13, 14, 15, 16],
|
||||||
|
3: [17, 18, 19, 20, 21, 22, 23]}
|
||||||
|
model.parallelize(device_map) # Splits the model across several devices
|
||||||
|
model.deparallelize() # Put the model back on cpu and cleans memory by calling torch.cuda.empty_cache()
|
||||||
|
"""
|
||||||
|
|
||||||
class T5LayerNorm(nn.Module):
|
class T5LayerNorm(nn.Module):
|
||||||
def __init__(self, hidden_size, eps=1e-6):
|
def __init__(self, hidden_size, eps=1e-6):
|
||||||
@@ -661,6 +703,43 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
|
|
||||||
self.init_weights()
|
self.init_weights()
|
||||||
|
|
||||||
|
# Model parallel
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
|
||||||
|
@add_start_docstrings(PARALLELIZE_DOCSTRING)
|
||||||
|
def parallelize(self, device_map=None):
|
||||||
|
# Check validity of device_map
|
||||||
|
self.device_map = get_device_map(len(self.block), torch.cuda.device_count()) if device_map is None else device_map
|
||||||
|
assert_device_map(self.device_map, len(self.block))
|
||||||
|
|
||||||
|
self.model_parallel = True
|
||||||
|
self.first_device = "cpu" if "cpu" in self.device_map.keys() else "cuda:" + str(min(self.device_map.keys()))
|
||||||
|
self.last_device = "cuda:" + str(max(self.device_map.keys()))
|
||||||
|
# Load onto devices
|
||||||
|
for k, v in self.device_map.items():
|
||||||
|
for layer in v:
|
||||||
|
cuda_device = "cuda:" + str(k)
|
||||||
|
self.block[layer] = self.block[layer].to(cuda_device)
|
||||||
|
|
||||||
|
# Set embed_tokens to first layer
|
||||||
|
self.embed_tokens = self.embed_tokens.to(self.first_device)
|
||||||
|
|
||||||
|
# Set final layer norm to last device
|
||||||
|
self.final_layer_norm = self.final_layer_norm.to(self.last_device)
|
||||||
|
|
||||||
|
@add_start_docstrings(PARALLELIZE_DOCSTRING)
|
||||||
|
def deparallelize(self):
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
self.first_device = "cpu"
|
||||||
|
self.last_device = "cpu"
|
||||||
|
for i in range(len(self.block)):
|
||||||
|
self.block[i] = self.block[i].to("cpu")
|
||||||
|
self.embed_tokens = self.embed_tokens.to("cpu")
|
||||||
|
self.final_layer_norm = self.final_layer_norm.to("cpu")
|
||||||
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
def get_input_embeddings(self):
|
def get_input_embeddings(self):
|
||||||
return self.embed_tokens
|
return self.embed_tokens
|
||||||
|
|
||||||
@@ -684,15 +763,19 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
output_hidden_states=None,
|
output_hidden_states=None,
|
||||||
return_dict=None,
|
return_dict=None,
|
||||||
):
|
):
|
||||||
|
# # Model parallel
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.first_device)
|
||||||
|
self.embed_tokens = self.embed_tokens.to(self.first_device)
|
||||||
use_cache = use_cache if use_cache is not None else self.config.use_cache
|
use_cache = use_cache if use_cache is not None else self.config.use_cache
|
||||||
output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
|
output_attentions = output_attentions if output_attentions is not None else self.config.output_attentions
|
||||||
output_hidden_states = (
|
output_hidden_states = (
|
||||||
output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
|
output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
|
||||||
)
|
)
|
||||||
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
return_dict = return_dict if return_dict is not None else self.config.use_return_dict
|
||||||
|
|
||||||
if input_ids is not None and inputs_embeds is not None:
|
if input_ids is not None and inputs_embeds is not None:
|
||||||
|
|
||||||
err_msg_prefix = "decoder_" if self.is_decoder else ""
|
err_msg_prefix = "decoder_" if self.is_decoder else ""
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"You cannot specify both {err_msg_prefix}inputs and {err_msg_prefix}inputs_embeds at the same time"
|
f"You cannot specify both {err_msg_prefix}inputs and {err_msg_prefix}inputs_embeds at the same time"
|
||||||
@@ -705,7 +788,6 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
else:
|
else:
|
||||||
err_msg_prefix = "decoder_" if self.is_decoder else ""
|
err_msg_prefix = "decoder_" if self.is_decoder else ""
|
||||||
raise ValueError(f"You have to specify either {err_msg_prefix}inputs or {err_msg_prefix}inputs_embeds")
|
raise ValueError(f"You have to specify either {err_msg_prefix}inputs or {err_msg_prefix}inputs_embeds")
|
||||||
|
|
||||||
if inputs_embeds is None:
|
if inputs_embeds is None:
|
||||||
assert self.embed_tokens is not None, "You have to intialize the model with valid token embeddings"
|
assert self.embed_tokens is not None, "You have to intialize the model with valid token embeddings"
|
||||||
inputs_embeds = self.embed_tokens(input_ids)
|
inputs_embeds = self.embed_tokens(input_ids)
|
||||||
@@ -719,7 +801,6 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
assert self.is_decoder, ":obj:`use_cache` can only be set to `True` if {} is used as a decoder".format(
|
assert self.is_decoder, ":obj:`use_cache` can only be set to `True` if {} is used as a decoder".format(
|
||||||
self
|
self
|
||||||
)
|
)
|
||||||
|
|
||||||
if attention_mask is None:
|
if attention_mask is None:
|
||||||
attention_mask = torch.ones(batch_size, mask_seq_length).to(inputs_embeds.device)
|
attention_mask = torch.ones(batch_size, mask_seq_length).to(inputs_embeds.device)
|
||||||
if self.is_decoder and encoder_attention_mask is None and encoder_hidden_states is not None:
|
if self.is_decoder and encoder_attention_mask is None and encoder_hidden_states is not None:
|
||||||
@@ -727,7 +808,6 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
encoder_attention_mask = torch.ones(
|
encoder_attention_mask = torch.ones(
|
||||||
batch_size, encoder_seq_length, device=inputs_embeds.device, dtype=torch.long
|
batch_size, encoder_seq_length, device=inputs_embeds.device, dtype=torch.long
|
||||||
)
|
)
|
||||||
|
|
||||||
# initialize past_key_values with `None` if past does not exist
|
# initialize past_key_values with `None` if past does not exist
|
||||||
if past_key_values is None:
|
if past_key_values is None:
|
||||||
past_key_values = [None] * len(self.block)
|
past_key_values = [None] * len(self.block)
|
||||||
@@ -751,6 +831,21 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
hidden_states = self.dropout(inputs_embeds)
|
hidden_states = self.dropout(inputs_embeds)
|
||||||
|
|
||||||
for i, (layer_module, past_key_value) in enumerate(zip(self.block, past_key_values)):
|
for i, (layer_module, past_key_value) in enumerate(zip(self.block, past_key_values)):
|
||||||
|
# Model parallel
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(hidden_states.device)
|
||||||
|
# Ensure that attention_mask is always on the same device as hidden_states
|
||||||
|
if attention_mask is not None:
|
||||||
|
attention_mask = attention_mask.to(hidden_states.device)
|
||||||
|
if position_bias is not None:
|
||||||
|
position_bias = position_bias.to(hidden_states.device)
|
||||||
|
if encoder_hidden_states is not None:
|
||||||
|
encoder_hidden_states = encoder_hidden_states.to(hidden_states.device)
|
||||||
|
if encoder_extended_attention_mask is not None:
|
||||||
|
encoder_extended_attention_mask = encoder_extended_attention_mask.to(hidden_states.device)
|
||||||
|
if encoder_decoder_position_bias is not None:
|
||||||
|
encoder_decoder_position_bias = encoder_decoder_position_bias.to(hidden_states.device)
|
||||||
|
|
||||||
if output_hidden_states:
|
if output_hidden_states:
|
||||||
all_hidden_states = all_hidden_states + (hidden_states,)
|
all_hidden_states = all_hidden_states + (hidden_states,)
|
||||||
|
|
||||||
@@ -782,6 +877,11 @@ class T5Stack(T5PreTrainedModel):
|
|||||||
|
|
||||||
if output_attentions:
|
if output_attentions:
|
||||||
all_attentions = all_attentions + (layer_outputs[2],) # We keep only self-attention weights for now
|
all_attentions = all_attentions + (layer_outputs[2],) # We keep only self-attention weights for now
|
||||||
|
# Model Parallel: If it's the last layer for that device, put things on the next device
|
||||||
|
if self.model_parallel:
|
||||||
|
for k, v in self.device_map.items():
|
||||||
|
if i == v[-1] and "cuda:" + str(k) != self.last_device:
|
||||||
|
hidden_states = hidden_states.to("cuda:" + str(k + 1))
|
||||||
|
|
||||||
hidden_states = self.final_layer_norm(hidden_states)
|
hidden_states = self.final_layer_norm(hidden_states)
|
||||||
hidden_states = self.dropout(hidden_states)
|
hidden_states = self.dropout(hidden_states)
|
||||||
@@ -843,7 +943,7 @@ T5_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
decoder_input_ids (:obj:`torch.LongTensor` of shape :obj:`(batch_size, target_sequence_length)`, `optional`):
|
||||||
@@ -904,7 +1004,6 @@ T5_INPUTS_DOCSTRING = r"""
|
|||||||
Whether or not to return a :class:`~transformers.file_utils.ModelOutput` instead of a plain tuple.
|
Whether or not to return a :class:`~transformers.file_utils.ModelOutput` instead of a plain tuple.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
@add_start_docstrings(
|
@add_start_docstrings(
|
||||||
"The bare T5 Model transformer outputting raw hidden-states" "without any specific head on top.",
|
"The bare T5 Model transformer outputting raw hidden-states" "without any specific head on top.",
|
||||||
T5_START_DOCSTRING,
|
T5_START_DOCSTRING,
|
||||||
@@ -927,6 +1026,32 @@ class T5Model(T5PreTrainedModel):
|
|||||||
|
|
||||||
self.init_weights()
|
self.init_weights()
|
||||||
|
|
||||||
|
# Model parallel
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
|
||||||
|
@add_start_docstrings(PARALLELIZE_DOCSTRING)
|
||||||
|
def parallelize(self, device_map=None):
|
||||||
|
|
||||||
|
self.device_map = (
|
||||||
|
get_device_map(len(self.encoder.block), range(torch.cuda.device_count())) if device_map is None else device_map
|
||||||
|
)
|
||||||
|
assert_device_map(self.device_map, len(self.encoder.block))
|
||||||
|
|
||||||
|
self.encoder.parallelize(self.device_map)
|
||||||
|
self.decoder.parallelize(self.device_map)
|
||||||
|
self.model_parallel = True
|
||||||
|
|
||||||
|
@add_start_docstrings(DEPARALLELIZE_DOCSTRING)
|
||||||
|
def deparallelize(self):
|
||||||
|
self.encoder.deparallelize()
|
||||||
|
self.decoder.deparallelize()
|
||||||
|
self.encoder = self.encoder.to("cpu")
|
||||||
|
self.decoder = self.decoder.to("cpu")
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
def get_input_embeddings(self):
|
def get_input_embeddings(self):
|
||||||
return self.shared
|
return self.shared
|
||||||
|
|
||||||
@@ -1020,6 +1145,19 @@ class T5Model(T5PreTrainedModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
hidden_states = encoder_outputs[0]
|
hidden_states = encoder_outputs[0]
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.decoder.first_device)
|
||||||
|
|
||||||
|
# Set device for model parallelism
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.decoder.first_device)
|
||||||
|
hidden_states = hidden_states.to(self.decoder.first_device)
|
||||||
|
if decoder_input_ids is not None:
|
||||||
|
decoder_input_ids = decoder_input_ids.to(self.decoder.first_device)
|
||||||
|
if attention_mask is not None:
|
||||||
|
attention_mask = attention_mask.to(self.decoder.first_device)
|
||||||
|
if decoder_attention_mask is not None:
|
||||||
|
decoder_attention_mask = decoder_attention_mask.to(self.decoder.first_device)
|
||||||
|
|
||||||
# Decode
|
# Decode
|
||||||
decoder_outputs = self.decoder(
|
decoder_outputs = self.decoder(
|
||||||
@@ -1075,6 +1213,34 @@ class T5ForConditionalGeneration(T5PreTrainedModel):
|
|||||||
|
|
||||||
self.init_weights()
|
self.init_weights()
|
||||||
|
|
||||||
|
# Model parallel
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
|
||||||
|
@add_start_docstrings(PARALLELIZE_DOCSTRING)
|
||||||
|
def parallelize(self, device_map=None):
|
||||||
|
|
||||||
|
self.device_map = (
|
||||||
|
get_device_map(len(self.encoder.block), range(torch.cuda.device_count())) if device_map is None else device_map
|
||||||
|
)
|
||||||
|
assert_device_map(self.device_map, len(self.encoder.block))
|
||||||
|
|
||||||
|
self.encoder.parallelize(self.device_map)
|
||||||
|
self.decoder.parallelize(self.device_map)
|
||||||
|
self.lm_head = self.lm_head.to(self.decoder.first_device)
|
||||||
|
self.model_parallel = True
|
||||||
|
|
||||||
|
@add_start_docstrings(DEPARALLELIZE_DOCSTRING)
|
||||||
|
def deparallelize(self):
|
||||||
|
self.encoder.deparallelize()
|
||||||
|
self.decoder.deparallelize()
|
||||||
|
self.encoder = self.encoder.to("cpu")
|
||||||
|
self.decoder = self.decoder.to("cpu")
|
||||||
|
self.lm_head = self.lm_head.to("cpu")
|
||||||
|
self.model_parallel = False
|
||||||
|
self.device_map = None
|
||||||
|
torch.cuda.empty_cache()
|
||||||
|
|
||||||
def get_input_embeddings(self):
|
def get_input_embeddings(self):
|
||||||
return self.shared
|
return self.shared
|
||||||
|
|
||||||
@@ -1139,7 +1305,6 @@ class T5ForConditionalGeneration(T5PreTrainedModel):
|
|||||||
>>> input_ids = tokenizer("summarize: studies have shown that owning a dog is good for you ", return_tensors="pt").input_ids # Batch size 1
|
>>> input_ids = tokenizer("summarize: studies have shown that owning a dog is good for you ", return_tensors="pt").input_ids # Batch size 1
|
||||||
>>> outputs = model.generate(input_ids)
|
>>> outputs = model.generate(input_ids)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if "lm_labels" in kwargs:
|
if "lm_labels" in kwargs:
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"The `lm_labels` argument is deprecated and will be removed in a future version, use `labels` instead.",
|
"The `lm_labels` argument is deprecated and will be removed in a future version, use `labels` instead.",
|
||||||
@@ -1175,6 +1340,7 @@ class T5ForConditionalGeneration(T5PreTrainedModel):
|
|||||||
output_hidden_states=output_hidden_states,
|
output_hidden_states=output_hidden_states,
|
||||||
return_dict=return_dict,
|
return_dict=return_dict,
|
||||||
)
|
)
|
||||||
|
|
||||||
elif return_dict and not isinstance(encoder_outputs, BaseModelOutput):
|
elif return_dict and not isinstance(encoder_outputs, BaseModelOutput):
|
||||||
encoder_outputs = BaseModelOutput(
|
encoder_outputs = BaseModelOutput(
|
||||||
last_hidden_state=encoder_outputs[0],
|
last_hidden_state=encoder_outputs[0],
|
||||||
@@ -1184,6 +1350,9 @@ class T5ForConditionalGeneration(T5PreTrainedModel):
|
|||||||
|
|
||||||
hidden_states = encoder_outputs[0]
|
hidden_states = encoder_outputs[0]
|
||||||
|
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.decoder.first_device)
|
||||||
|
|
||||||
if labels is not None and decoder_input_ids is None and decoder_inputs_embeds is None:
|
if labels is not None and decoder_input_ids is None and decoder_inputs_embeds is None:
|
||||||
# get decoder inputs from shifting lm labels to the right
|
# get decoder inputs from shifting lm labels to the right
|
||||||
decoder_input_ids = self._shift_right(labels)
|
decoder_input_ids = self._shift_right(labels)
|
||||||
@@ -1197,6 +1366,17 @@ class T5ForConditionalGeneration(T5PreTrainedModel):
|
|||||||
if decoder_inputs_embeds is not None:
|
if decoder_inputs_embeds is not None:
|
||||||
decoder_inputs_embeds = decoder_inputs_embeds[:, -1:]
|
decoder_inputs_embeds = decoder_inputs_embeds[:, -1:]
|
||||||
|
|
||||||
|
# Set device for model parallelism
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.decoder.first_device)
|
||||||
|
hidden_states = hidden_states.to(self.decoder.first_device)
|
||||||
|
if decoder_input_ids is not None:
|
||||||
|
decoder_input_ids = decoder_input_ids.to(self.decoder.first_device)
|
||||||
|
if attention_mask is not None:
|
||||||
|
attention_mask = attention_mask.to(self.decoder.first_device)
|
||||||
|
if decoder_attention_mask is not None:
|
||||||
|
decoder_attention_mask = decoder_attention_mask.to(self.decoder.first_device)
|
||||||
|
|
||||||
# Decode
|
# Decode
|
||||||
decoder_outputs = self.decoder(
|
decoder_outputs = self.decoder(
|
||||||
input_ids=decoder_input_ids,
|
input_ids=decoder_input_ids,
|
||||||
@@ -1213,6 +1393,11 @@ class T5ForConditionalGeneration(T5PreTrainedModel):
|
|||||||
)
|
)
|
||||||
|
|
||||||
sequence_output = decoder_outputs[0]
|
sequence_output = decoder_outputs[0]
|
||||||
|
# Set device for model parallelism
|
||||||
|
if self.model_parallel:
|
||||||
|
torch.cuda.set_device(self.encoder.first_device)
|
||||||
|
self.lm_head = self.lm_head.to(self.encoder.first_device)
|
||||||
|
sequence_output = sequence_output.to(self.lm_head.weight.device)
|
||||||
# Rescale output before projecting on vocab
|
# Rescale output before projecting on vocab
|
||||||
# See https://github.com/tensorflow/mesh/blob/fa19d69eafc9a482aff0b59ddd96b025c0cb207d/mesh_tensorflow/transformer/transformer.py#L586
|
# See https://github.com/tensorflow/mesh/blob/fa19d69eafc9a482aff0b59ddd96b025c0cb207d/mesh_tensorflow/transformer/transformer.py#L586
|
||||||
sequence_output = sequence_output * (self.model_dim ** -0.5)
|
sequence_output = sequence_output * (self.model_dim ** -0.5)
|
||||||
|
|||||||
@@ -690,7 +690,7 @@ ALBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -390,7 +390,7 @@ TF_AUTO_MODEL_PRETRAINED_DOCSTRING = r"""
|
|||||||
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
||||||
request.
|
request.
|
||||||
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether ot not to also return a dictionnary containing missing keys, unexpected keys and error
|
Whether ot not to also return a dictionary containing missing keys, unexpected keys and error
|
||||||
messages.
|
messages.
|
||||||
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether or not to only look at local files (e.g., not try doanloading the model).
|
Whether or not to only look at local files (e.g., not try doanloading the model).
|
||||||
|
|||||||
@@ -735,7 +735,7 @@ BERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -495,7 +495,7 @@ CTRL_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -550,7 +550,7 @@ DISTILBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
head_mask (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`(num_heads,)` or :obj:`(num_layers, num_heads)`, `optional`):
|
head_mask (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`(num_heads,)` or :obj:`(num_layers, num_heads)`, `optional`):
|
||||||
|
|||||||
@@ -665,7 +665,7 @@ ELECTRA_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
position_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
position_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ FLAUBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- ``1`` for tokens that are **not masked**,
|
- ``1`` for tokens that are **not masked**,
|
||||||
- ``0`` for tokens that are **maked**.
|
- ``0`` for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
langs (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
langs (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -1099,7 +1099,7 @@ FUNNEL_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -508,7 +508,7 @@ GPT2_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -1534,7 +1534,7 @@ LONGFORMER_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
global_attention_mask (:obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
global_attention_mask (:obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -921,7 +921,7 @@ LXMERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
visual_attention_mask (:obj:`tf.Tensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
visual_attention_mask (:obj:`tf.Tensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
@@ -929,7 +929,7 @@ LXMERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`tf.Tensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`tf.Tensor` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -903,7 +903,7 @@ MOBILEBERT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -444,7 +444,7 @@ OPENAI_GPT_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
token_type_ids (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`(batch_size, sequence_length)`, `optional`):
|
||||||
|
|||||||
@@ -654,7 +654,7 @@ ROBERTA_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
token_type_ids (:obj:`Numpy array` or :obj:`tf.Tensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -913,7 +913,7 @@ T5_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
decoder_attention_mask (:obj:`tf.Tensor` of shape :obj:`(batch_size, tgt_seq_len)`, `optional`):
|
decoder_attention_mask (:obj:`tf.Tensor` of shape :obj:`(batch_size, tgt_seq_len)`, `optional`):
|
||||||
|
|||||||
@@ -569,7 +569,7 @@ class TFPreTrainedModel(tf.keras.Model, TFModelUtilsMixin, TFGenerationMixin):
|
|||||||
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
||||||
request.
|
request.
|
||||||
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether ot not to also return a dictionnary containing missing keys, unexpected keys and error
|
Whether ot not to also return a dictionary containing missing keys, unexpected keys and error
|
||||||
messages.
|
messages.
|
||||||
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether or not to only look at local files (e.g., not try doanloading the model).
|
Whether or not to only look at local files (e.g., not try doanloading the model).
|
||||||
|
|||||||
@@ -626,7 +626,7 @@ XLM_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
langs (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`({0})`, `optional`):
|
langs (:obj:`tf.Tensor` or :obj:`Numpy array` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -1057,7 +1057,7 @@ XLNET_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
mems (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers`):
|
mems (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers`):
|
||||||
|
|||||||
@@ -716,7 +716,7 @@ class PreTrainedModel(nn.Module, ModuleUtilsMixin, GenerationMixin):
|
|||||||
# If we save using the predefined names, we can load using `from_pretrained`
|
# If we save using the predefined names, we can load using `from_pretrained`
|
||||||
output_model_file = os.path.join(save_directory, WEIGHTS_NAME)
|
output_model_file = os.path.join(save_directory, WEIGHTS_NAME)
|
||||||
|
|
||||||
if getattr(self.config, "xla_device", False):
|
if getattr(self.config, "xla_device", False) and is_torch_tpu_available():
|
||||||
import torch_xla.core.xla_model as xm
|
import torch_xla.core.xla_model as xm
|
||||||
|
|
||||||
if xm.is_master_ordinal():
|
if xm.is_master_ordinal():
|
||||||
@@ -802,7 +802,7 @@ class PreTrainedModel(nn.Module, ModuleUtilsMixin, GenerationMixin):
|
|||||||
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
:obj:`{'http': 'foo.bar:3128', 'http://hostname': 'foo.bar:4012'}`. The proxies are used on each
|
||||||
request.
|
request.
|
||||||
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
output_loading_info(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether ot not to also return a dictionnary containing missing keys, unexpected keys and error
|
Whether ot not to also return a dictionary containing missing keys, unexpected keys and error
|
||||||
messages.
|
messages.
|
||||||
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
local_files_only(:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Whether or not to only look at local files (e.g., not try doanloading the model).
|
Whether or not to only look at local files (e.g., not try doanloading the model).
|
||||||
|
|||||||
@@ -337,7 +337,7 @@ XLM_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
langs (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
langs (:obj:`torch.LongTensor` of shape :obj:`({0})`, `optional`):
|
||||||
|
|||||||
@@ -866,7 +866,7 @@ XLNET_INPUTS_DOCSTRING = r"""
|
|||||||
Mask values selected in ``[0, 1]``:
|
Mask values selected in ``[0, 1]``:
|
||||||
|
|
||||||
- 1 for tokens that are **not masked**,
|
- 1 for tokens that are **not masked**,
|
||||||
- 0 for tokens that are **maked**.
|
- 0 for tokens that are **masked**.
|
||||||
|
|
||||||
`What are attention masks? <../glossary.html#attention-mask>`__
|
`What are attention masks? <../glossary.html#attention-mask>`__
|
||||||
mems (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers`):
|
mems (:obj:`List[torch.FloatTensor]` of length :obj:`config.n_layers`):
|
||||||
|
|||||||
@@ -169,7 +169,7 @@ class AdamWeightDecay(tf.keras.optimizers.Adam):
|
|||||||
epsilon (:obj:`float`, `optional`, defaults to 1e-7):
|
epsilon (:obj:`float`, `optional`, defaults to 1e-7):
|
||||||
The epsilon paramenter in Adam, which is a small constant for numerical stability.
|
The epsilon paramenter in Adam, which is a small constant for numerical stability.
|
||||||
amsgrad (:obj:`bool`, `optional`, default to `False`):
|
amsgrad (:obj:`bool`, `optional`, default to `False`):
|
||||||
Wheter to apply AMSGrad varient of this algorithm or not, see
|
Whether to apply AMSGrad varient of this algorithm or not, see
|
||||||
`On the Convergence of Adam and Beyond <https://arxiv.org/abs/1904.09237>`__.
|
`On the Convergence of Adam and Beyond <https://arxiv.org/abs/1904.09237>`__.
|
||||||
weight_decay_rate (:obj:`float`, `optional`, defaults to 0):
|
weight_decay_rate (:obj:`float`, `optional`, defaults to 0):
|
||||||
The weight decay to apply.
|
The weight decay to apply.
|
||||||
|
|||||||
@@ -943,6 +943,9 @@ class TextClassificationPipeline(Pipeline):
|
|||||||
task identifier: :obj:`"sentiment-analysis"` (for classifying sequences according to positive or negative
|
task identifier: :obj:`"sentiment-analysis"` (for classifying sequences according to positive or negative
|
||||||
sentiments).
|
sentiments).
|
||||||
|
|
||||||
|
If multiple classification labels are available (:obj:`model.config.num_labels >= 2`), the pipeline will run
|
||||||
|
a softmax over the results. If there is a single label, the pipeline will run a sigmoid over the result.
|
||||||
|
|
||||||
The models that this pipeline can use are models that have been fine-tuned on a sequence classification task.
|
The models that this pipeline can use are models that have been fine-tuned on a sequence classification task.
|
||||||
See the up-to-date list of available models on
|
See the up-to-date list of available models on
|
||||||
`huggingface.co/models <https://huggingface.co/models?filter=text-classification>`__.
|
`huggingface.co/models <https://huggingface.co/models?filter=text-classification>`__.
|
||||||
@@ -977,7 +980,11 @@ class TextClassificationPipeline(Pipeline):
|
|||||||
If ``self.return_all_scores=True``, one such dictionary is returned per label.
|
If ``self.return_all_scores=True``, one such dictionary is returned per label.
|
||||||
"""
|
"""
|
||||||
outputs = super().__call__(*args, **kwargs)
|
outputs = super().__call__(*args, **kwargs)
|
||||||
scores = np.exp(outputs) / np.exp(outputs).sum(-1, keepdims=True)
|
|
||||||
|
if self.model.config.num_labels == 1:
|
||||||
|
scores = 1.0 / (1.0 + np.exp(-outputs))
|
||||||
|
else:
|
||||||
|
scores = np.exp(outputs) / np.exp(outputs).sum(-1, keepdims=True)
|
||||||
if self.return_all_scores:
|
if self.return_all_scores:
|
||||||
return [
|
return [
|
||||||
[{"label": self.model.config.id2label[i], "score": score.item()} for i, score in enumerate(item)]
|
[{"label": self.model.config.id2label[i], "score": score.item()} for i, score in enumerate(item)]
|
||||||
@@ -1759,7 +1766,7 @@ class QuestionAnsweringPipeline(Pipeline):
|
|||||||
|
|
||||||
def decode(self, start: np.ndarray, end: np.ndarray, topk: int, max_answer_len: int) -> Tuple:
|
def decode(self, start: np.ndarray, end: np.ndarray, topk: int, max_answer_len: int) -> Tuple:
|
||||||
"""
|
"""
|
||||||
Take the output of any :obj:`ModelForQuestionAnswering` and will generate probalities for each span to be
|
Take the output of any :obj:`ModelForQuestionAnswering` and will generate probabilities for each span to be
|
||||||
the actual answer.
|
the actual answer.
|
||||||
|
|
||||||
In addition, it filters out some unwanted/impossible cases like answer len being greater than
|
In addition, it filters out some unwanted/impossible cases like answer len being greater than
|
||||||
@@ -1800,7 +1807,7 @@ class QuestionAnsweringPipeline(Pipeline):
|
|||||||
|
|
||||||
def span_to_answer(self, text: str, start: int, end: int) -> Dict[str, Union[str, int]]:
|
def span_to_answer(self, text: str, start: int, end: int) -> Dict[str, Union[str, int]]:
|
||||||
"""
|
"""
|
||||||
When decoding from token probalities, this method maps token indexes to actual word in
|
When decoding from token probabilities, this method maps token indexes to actual word in
|
||||||
the initial context.
|
the initial context.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|||||||
@@ -184,13 +184,23 @@ def require_faiss(test_case):
|
|||||||
return test_case
|
return test_case
|
||||||
|
|
||||||
|
|
||||||
def get_tests_dir():
|
def get_tests_dir(append_path=None):
|
||||||
"""
|
"""
|
||||||
returns the full path to the `tests` dir, so that the tests can be invoked from anywhere
|
Args:
|
||||||
|
append_path: optional path to append to the tests dir path
|
||||||
|
|
||||||
|
Return:
|
||||||
|
The full path to the `tests` dir, so that the tests can be invoked from anywhere.
|
||||||
|
Optionally `append_path` is joined after the `tests` dir the former is provided.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# this function caller's __file__
|
# this function caller's __file__
|
||||||
caller__file__ = inspect.stack()[1][1]
|
caller__file__ = inspect.stack()[1][1]
|
||||||
return os.path.abspath(os.path.dirname(caller__file__))
|
tests_dir = os.path.abspath(os.path.dirname(caller__file__))
|
||||||
|
if append_path:
|
||||||
|
return os.path.join(tests_dir, append_path)
|
||||||
|
else:
|
||||||
|
return tests_dir
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -398,6 +398,7 @@ class BasicTokenizer(object):
|
|||||||
"""
|
"""
|
||||||
# union() returns a new set by concatenating the two sets.
|
# union() returns a new set by concatenating the two sets.
|
||||||
never_split = self.never_split.union(set(never_split)) if never_split else self.never_split
|
never_split = self.never_split.union(set(never_split)) if never_split else self.never_split
|
||||||
|
text = self._clean_text(text)
|
||||||
|
|
||||||
# This was added on November 1st, 2018 for the multilingual and Chinese
|
# This was added on November 1st, 2018 for the multilingual and Chinese
|
||||||
# models. This is also applied to the English models now, but it doesn't
|
# models. This is also applied to the English models now, but it doesn't
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class PegasusTokenizer(ReformerTokenizer):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
# Dont use reserved words added_token_encoder, added_tokens_decoder because of
|
# Don't use reserved words added_token_encoder, added_tokens_decoder because of
|
||||||
# AssertionError: Non-consecutive added token '1' found. in from_pretrained
|
# AssertionError: Non-consecutive added token '1' found. in from_pretrained
|
||||||
assert len(self.added_tokens_decoder) == 0
|
assert len(self.added_tokens_decoder) == 0
|
||||||
self.encoder: Dict[int, str] = {0: self.pad_token, 1: self.eos_token}
|
self.encoder: Dict[int, str] = {0: self.pad_token, 1: self.eos_token}
|
||||||
@@ -58,7 +58,7 @@ class PegasusTokenizer(ReformerTokenizer):
|
|||||||
self.decoder: Dict[str, int] = {v: k for k, v in self.encoder.items()}
|
self.decoder: Dict[str, int] = {v: k for k, v in self.encoder.items()}
|
||||||
|
|
||||||
def _convert_token_to_id(self, token: str) -> int:
|
def _convert_token_to_id(self, token: str) -> int:
|
||||||
""" Converts a token (str) in an id using the vocab. """
|
""" Converts a token (str) to an id using the vocab. """
|
||||||
if token in self.decoder:
|
if token in self.decoder:
|
||||||
return self.decoder[token]
|
return self.decoder[token]
|
||||||
elif token in self.added_tokens_decoder:
|
elif token in self.added_tokens_decoder:
|
||||||
@@ -67,7 +67,7 @@ class PegasusTokenizer(ReformerTokenizer):
|
|||||||
return sp_id + self.offset
|
return sp_id + self.offset
|
||||||
|
|
||||||
def _convert_id_to_token(self, index: int) -> str:
|
def _convert_id_to_token(self, index: int) -> str:
|
||||||
"""Converts an index (integer) in a token (str) using the vocab."""
|
"""Converts an index (integer) to a token (str) using the vocab."""
|
||||||
if index in self.encoder:
|
if index in self.encoder:
|
||||||
return self.encoder[index]
|
return self.encoder[index]
|
||||||
elif index in self.added_tokens_encoder:
|
elif index in self.added_tokens_encoder:
|
||||||
@@ -81,11 +81,6 @@ class PegasusTokenizer(ReformerTokenizer):
|
|||||||
def vocab_size(self) -> int:
|
def vocab_size(self) -> int:
|
||||||
return len(self.sp_model) + self.offset
|
return len(self.sp_model) + self.offset
|
||||||
|
|
||||||
def get_vocab(self) -> Dict[str, int]:
|
|
||||||
vocab = {self.convert_ids_to_tokens(i): i for i in range(self.vocab_size)}
|
|
||||||
vocab.update(self.added_tokens_encoder)
|
|
||||||
return vocab
|
|
||||||
|
|
||||||
def num_special_tokens_to_add(self, pair=False):
|
def num_special_tokens_to_add(self, pair=False):
|
||||||
"""Just EOS"""
|
"""Just EOS"""
|
||||||
return 1
|
return 1
|
||||||
@@ -109,12 +104,12 @@ class PegasusTokenizer(ReformerTokenizer):
|
|||||||
|
|
||||||
def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None) -> List[int]:
|
def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None) -> List[int]:
|
||||||
"""
|
"""
|
||||||
Build model inputs from a sequence or a pair of sequence for sequence classification tasks
|
Build model inputs from a sequence or a pair of sequences for sequence classification tasks
|
||||||
by concatenating and adding special tokens.
|
by concatenating and adding special tokens.
|
||||||
A Pegasus sequence has the following format, where ``X`` represents the sequence:
|
A Pegasus sequence has the following format, where ``X`` represents the sequence:
|
||||||
|
|
||||||
- single sequence: ``X </s>``
|
- single sequence: ``X </s>``
|
||||||
- pair of sequences: ``A B </s>`` (not intended use)
|
- pair of sequences: ``A B </s>`` (not intended use)
|
||||||
|
|
||||||
BOS is never used.
|
BOS is never used.
|
||||||
Pairs of sequences are not the expected use case, but they will be handled without a separator.
|
Pairs of sequences are not the expected use case, but they will be handled without a separator.
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
from shutil import copyfile
|
from shutil import copyfile
|
||||||
|
from typing import Dict
|
||||||
|
|
||||||
from .tokenization_utils import PreTrainedTokenizer
|
from .tokenization_utils import PreTrainedTokenizer
|
||||||
from .tokenization_utils_fast import PreTrainedTokenizerFast
|
from .tokenization_utils_fast import PreTrainedTokenizerFast
|
||||||
@@ -119,7 +120,7 @@ class ReformerTokenizer(PreTrainedTokenizer):
|
|||||||
def vocab_size(self):
|
def vocab_size(self):
|
||||||
return self.sp_model.get_piece_size()
|
return self.sp_model.get_piece_size()
|
||||||
|
|
||||||
def get_vocab(self):
|
def get_vocab(self) -> Dict[str, int]:
|
||||||
vocab = {self.convert_ids_to_tokens(i): i for i in range(self.vocab_size)}
|
vocab = {self.convert_ids_to_tokens(i): i for i in range(self.vocab_size)}
|
||||||
vocab.update(self.added_tokens_encoder)
|
vocab.update(self.added_tokens_encoder)
|
||||||
return vocab
|
return vocab
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ class PreTrainedTokenizer(PreTrainedTokenizerBase):
|
|||||||
|
|
||||||
num_added_toks = tokenizer.add_tokens(['new_tok1', 'my_new-tok2'])
|
num_added_toks = tokenizer.add_tokens(['new_tok1', 'my_new-tok2'])
|
||||||
print('We have added', num_added_toks, 'tokens')
|
print('We have added', num_added_toks, 'tokens')
|
||||||
# Notice: resize_token_embeddings expect to receive the full size of the new vocabulary, i.e. the length of the tokenizer.
|
# Note: resize_token_embeddings expects to receive the full size of the new vocabulary, i.e. the length of the tokenizer.
|
||||||
model.resize_token_embeddings(len(tokenizer))
|
model.resize_token_embeddings(len(tokenizer))
|
||||||
"""
|
"""
|
||||||
new_tokens = [str(tok) for tok in new_tokens]
|
new_tokens = [str(tok) for tok in new_tokens]
|
||||||
@@ -682,7 +682,7 @@ class PreTrainedTokenizer(PreTrainedTokenizerBase):
|
|||||||
token_ids_1 (:obj:`List[int]`, `optional`):
|
token_ids_1 (:obj:`List[int]`, `optional`):
|
||||||
List of ids of the second sequence.
|
List of ids of the second sequence.
|
||||||
already_has_special_tokens (:obj:`bool`, `optional`, defaults to :obj:`False`):
|
already_has_special_tokens (:obj:`bool`, `optional`, defaults to :obj:`False`):
|
||||||
Wheter or not the token list is already formated with special tokens for the model.
|
Whether or not the token list is already formated with special tokens for the model.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A list of integers in the range [0, 1]: 1 for a special token, 0 for a sequence token.
|
A list of integers in the range [0, 1]: 1 for a special token, 0 for a sequence token.
|
||||||
@@ -815,7 +815,7 @@ class PreTrainedTokenizer(PreTrainedTokenizerBase):
|
|||||||
you want to reload it using the :meth:`~transformers.PreTrainedTokenizer.from_pretrained` class method.
|
you want to reload it using the :meth:`~transformers.PreTrainedTokenizer.from_pretrained` class method.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
save_directory (:obj:`str`): The path to adirectory where the tokenizer will be saved.
|
save_directory (:obj:`str`): The path to a directory where the tokenizer will be saved.
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
A tuple of :obj:`str`: The files saved.
|
A tuple of :obj:`str`: The files saved.
|
||||||
|
|||||||
Loaded 100 of 122 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user