jacobfulano commited on
Commit
82a6d46
1 Parent(s): 51f2ae5

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +184 -0
README.md ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ datasets:
4
+ - c4
5
+ language:
6
+ - en
7
+ inference: false
8
+ ---
9
+
10
+ # MosaicBERT: mosaic-bert-base-seqlen-512 Pretrained Model
11
+
12
+ MosaicBERT-Base is a new BERT architecture and training recipe optimized for fast pretraining.
13
+ MosaicBERT trains faster and achieves higher pretraining and finetuning accuracy when benchmarked against
14
+ Hugging Face's [bert-base-uncased](https://huggingface.co/bert-base-uncased). It incorporates efficiency insights
15
+ from the past half a decade of transformers research, from RoBERTa to T5 and GPT.
16
+
17
+ __This particular model was trained with [ALiBi](https://arxiv.org/abs/2108.12409) on a sequence length of 256 tokens.__
18
+
19
+ ALiBi allows a model trained with a sequence length n to easily extrapolate to sequence lengths >2n during finetuning. For more details, see [Train Short, Test Long: Attention with Linear
20
+ Biases Enables Input Length Extrapolation (Press et al. 2022)](https://arxiv.org/abs/2108.12409)
21
+
22
+ It is part of the **family of MosaicBERT-Base models** trained using ALiBi on different sequence lengths:
23
+
24
+ * [mosaic-bert-base](https://huggingface.co/mosaicml/mosaic-bert-base) (trained on a sequence length of 128 tokens)
25
+ * mosaic-bert-base-seqlen-256
26
+ * [mosaic-bert-base-seqlen-512](https://huggingface.co/mosaicml/mosaic-bert-base-seqlen-512)
27
+ * [mosaic-bert-base-seqlen-1024](https://huggingface.co/mosaicml/mosaic-bert-base-seqlen-1024)
28
+ * [mosaic-bert-base-seqlen-2048](https://huggingface.co/mosaicml/mosaic-bert-base-seqlen-2048)
29
+
30
+
31
+
32
+ ## Model Date
33
+
34
+ April 2023
35
+
36
+ ## Documentation
37
+
38
+ * [Blog post](https://www.mosaicml.com/blog/mosaicbert)
39
+ * [Github (mosaicml/examples/bert repo)](https://github.com/mosaicml/examples/tree/main/examples/bert)
40
+
41
+ ## How to use
42
+
43
+ ```python
44
+ from transformers import AutoModelForMaskedLM
45
+ mlm = AutoModelForMaskedLM.from_pretrained('mosaicml/mosaic-bert-base', trust_remote_code=True)
46
+ ```
47
+
48
+ The tokenizer for this model is simply the Hugging Face `bert-base-uncased` tokenizer.
49
+
50
+ ```python
51
+ from transformers import BertTokenizer
52
+ tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
53
+ ```
54
+
55
+ To use this model directly for masked language modeling, use `pipeline`:
56
+
57
+ ```python
58
+ from transformers import AutoModelForMaskedLM, BertTokenizer, pipeline
59
+
60
+ tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
61
+ mlm = AutoModelForMaskedLM.from_pretrained('mosaicml/mosaic-bert-base', trust_remote_code=True)
62
+
63
+ classifier = pipeline('fill-mask', model=mlm, tokenizer=tokenizer)
64
+
65
+ classifier("I [MASK] to the store yesterday.")
66
+ ```
67
+
68
+ **To continue MLM pretraining**, follow the [MLM pre-training section of the mosaicml/examples/bert repo](https://github.com/mosaicml/examples/tree/main/examples/bert#mlm-pre-training).
69
+
70
+ **To fine-tune this model for classification**, follow the [Single-task fine-tuning section of the mosaicml/examples/bert repo](https://github.com/mosaicml/examples/tree/main/examples/bert#single-task-fine-tuning).
71
+
72
+ ### Remote Code
73
+
74
+ This model requires that `trust_remote_code=True` be passed to the `from_pretrained` method. This is because we train using [FlashAttention (Dao et al. 2022)](https://arxiv.org/pdf/2205.14135.pdf), which is not part of the `transformers` library and depends on [Triton](https://github.com/openai/triton) and some custom PyTorch code. Since this involves executing arbitrary code, you should consider passing a git `revision` argument that specifies the exact commit of the code, for example:
75
+
76
+ ```python
77
+ mlm = AutoModelForMaskedLM.from_pretrained(
78
+ 'mosaicml/mosaic-bert-base',
79
+ trust_remote_code=True,
80
+ revision='24512df',
81
+ )
82
+ ```
83
+
84
+ However, if there are updates to this model or code and you specify a revision, you will need to manually check for them and update the commit hash accordingly.
85
+
86
+ ## MosaicBERT Model description
87
+
88
+ In order to build MosaicBERT, we adopted architectural choices from the recent transformer literature.
89
+ These include [FlashAttention (Dao et al. 2022)](https://arxiv.org/pdf/2205.14135.pdf), [ALiBi (Press et al. 2021)](https://arxiv.org/abs/2108.12409),
90
+ and [Gated Linear Units (Shazeer 2020)](https://arxiv.org/abs/2002.05202). In addition, we remove padding inside the transformer block,
91
+ and apply LayerNorm with low precision.
92
+
93
+ ### Modifications to the Attention Mechanism
94
+ 1. **FlashAttention**: Attention layers are core components of the transformer architecture. The recently proposed FlashAttention layer
95
+ reduces the number of read/write operations between the GPU HBM (high bandwidth memory, i.e. long-term memory) and the GPU SRAM
96
+ (i.e. short-term memory) [[Dao et al. 2022]](https://arxiv.org/pdf/2205.14135.pdf). We used the FlashAttention module built by
97
+ [hazy research](https://github.com/HazyResearch/flash-attention) with [OpenAI’s triton library](https://github.com/openai/triton).
98
+
99
+ 2. **Attention with Linear Biases (ALiBi)**: In most BERT models, the positions of tokens in a sequence are encoded with a position embedding layer;
100
+ this embedding allows subsequent layers to keep track of the order of tokens in a sequence. ALiBi eliminates position embeddings and
101
+ instead conveys this information using a bias matrix in the attention operation. It modifies the attention mechanism such that nearby
102
+ tokens strongly attend to one another [[Press et al. 2021]](https://arxiv.org/abs/2108.12409). In addition to improving the performance of the final model, ALiBi helps the
103
+ model to handle sequences longer than it saw during training. Details on our ALiBi implementation can be found [in the mosaicml/examples repo here](https://github.com/mosaicml/examples/blob/d14a7c94a0f805f56a7c865802082bf6d8ac8903/examples/bert/src/bert_layers.py#L425).
104
+
105
+ 3. **Unpadding**: Standard NLP practice is to combine text sequences of different lengths into a batch, and pad the sequences with empty
106
+ tokens so that all sequence lengths are the same. During training, however, this can lead to many superfluous operations on those
107
+ padding tokens. In MosaicBERT, we take a different approach: we concatenate all the examples in a minibatch into a single sequence
108
+ of batch size 1. Results from NVIDIA and others have shown that this approach leads to speed improvements during training, since
109
+ operations are not performed on padding tokens (see for example [Zeng et al. 2022](https://arxiv.org/pdf/2208.08124.pdf)).
110
+ Details on our “unpadding” implementation can be found [in the mosaicml/examples repo here](https://github.com/mosaicml/examples/blob/main/examples/bert/src/bert_padding.py).
111
+
112
+ 4. **Low Precision LayerNorm**: this small tweak forces LayerNorm modules to run in float16 or bfloat16 precision instead of float32, improving utilization.
113
+ Our implementation can be found [in the mosaicml/examples repo here](https://docs.mosaicml.com/en/v0.12.1/method_cards/low_precision_layernorm.html).
114
+
115
+ ### Modifications to the Feedforward Layers
116
+
117
+ 5. **Gated Linear Units (GLU)**: We used Gated Linear Units for the feedforward sublayer of a transformer. GLUs were first proposed in 2016 [[Dauphin et al. 2016]](https://arxiv.org/abs/1612.08083),
118
+ and incorporate an extra learnable matrix that “gates” the outputs of the feedforward layer. More recent work has shown that
119
+ GLUs can improve performance quality in transformers [[Shazeer, 2020](https://arxiv.org/abs/2002.05202), [Narang et al. 2021](https://arxiv.org/pdf/2102.11972.pdf)]. We used the GeLU (Gaussian-error Linear Unit)
120
+ activation function with GLU, which is sometimes referred to as GeGLU. The GeLU activation function is a smooth, fully differentiable
121
+ approximation to ReLU; we found that this led to a nominal improvement over ReLU. More details on our implementation of GLU can be found here.
122
+ The extra gating matrix in a GLU model potentially adds additional parameters to a model; we chose to augment our BERT-Base model with
123
+ additional parameters due to GLU modules as it leads to a Pareto improvement across all timescales (which is not true of all larger
124
+ models such as BERT-Large). While BERT-Base has 110 million parameters, MosaicBERT-Base has 137 million parameters. Note that
125
+ MosaicBERT-Base trains faster than BERT-Base despite having more parameters.
126
+
127
+
128
+
129
+
130
+ ## Training data
131
+
132
+ MosaicBERT is pretrained using a standard Masked Language Modeling (MLM) objective: the model is given a sequence of
133
+ text with some tokens hidden, and it has to predict these masked tokens. MosaicBERT is trained on
134
+ the English [“Colossal, Cleaned, Common Crawl” C4 dataset](https://github.com/allenai/allennlp/discussions/5056), which contains roughly 365 million curated text documents scraped
135
+ from the internet (equivalent to 156 billion tokens). We used this more modern dataset in place of traditional BERT pretraining
136
+ corpora like English Wikipedia and BooksCorpus.
137
+
138
+ ## Pretraining Optimizations
139
+
140
+ Many of these pretraining optimizations below were informed by our [BERT results for the MLPerf v2.1 speed benchmark](https://www.mosaicml.com/blog/mlperf-nlp-nov2022).
141
+
142
+ 1. **MosaicML Streaming Dataset**: As part of our efficiency pipeline, we converted the C4 dataset to [MosaicML’s StreamingDataset format](https://www.mosaicml.com/blog/mosaicml-streamingdataset) and used this
143
+ for both MosaicBERT-Base and the baseline BERT-Base. For all BERT-Base models, we chose the training duration to be 286,720,000 samples of **sequence length 256**; this covers 78.6% of C4.
144
+
145
+
146
+ 2. **Higher Masking Ratio for the Masked Language Modeling Objective**: We used the standard Masked Language Modeling (MLM) pretraining objective.
147
+ While the original BERT paper also included a Next Sentence Prediction (NSP) task in the pretraining objective,
148
+ subsequent papers have shown this to be unnecessary [Liu et al. 2019](https://arxiv.org/abs/1907.11692).
149
+ However, we found that a 30% masking ratio led to slight accuracy improvements in both pretraining MLM and downstream GLUE performance.
150
+ We therefore included this simple change as part of our MosaicBERT training recipe. Recent studies have also found that this simple
151
+ change can lead to downstream improvements [Wettig et al. 2022](https://arxiv.org/abs/2202.08005).
152
+
153
+ 3. **Bfloat16 Precision**: We use [bf16 (bfloat16) mixed precision training](https://cloud.google.com/blog/products/ai-machine-learning/bfloat16-the-secret-to-high-performance-on-cloud-tpus) for all the models, where a matrix multiplication layer uses bf16
154
+ for the multiplication and 32-bit IEEE floating point for gradient accumulation. We found this to be more stable than using float16 mixed precision.
155
+
156
+ 4. **Vocab Size as a Multiple of 64**: We increased the vocab size to be a multiple of 8 as well as 64 (i.e. from 30,522 to 30,528).
157
+ This small constraint is something of [a magic trick among ML practitioners](https://twitter.com/karpathy/status/1621578354024677377), and leads to a throughput speedup.
158
+
159
+ 5. **Hyperparameters**: For all models, we use Decoupled AdamW with Beta_1=0.9 and Beta_2=0.98, and a weight decay value of 1.0e-5.
160
+ The learning rate schedule begins with a warmup to a maximum learning rate of 5.0e-4 followed by a linear decay to zero.
161
+ Warmup lasted for 6% of the full training duration. Global batch size was set to 4096, and microbatch size was **256**; since global batch size was 4096, full pretraining consisted of 70,000 batches.
162
+ We set the **maximum sequence length during pretraining to 256**, and we used the standard embedding dimension of 768.
163
+ For MosaicBERT, we applied 0.1 dropout to the feedforward layers but no dropout to the FlashAttention module, as this was not possible with the OpenAI triton implementation.
164
+ Full configuration details for pretraining MosaicBERT-Base can be found in the configuration yamls [in the mosaicml/examples repo here](https://github.com/mosaicml/examples/tree/main/bert/yamls/main).
165
+
166
+
167
+ ## Intended uses & limitations
168
+
169
+ This model is intended to be finetuned on downstream tasks.
170
+
171
+ ## Citation
172
+
173
+ Please cite this model using the following format:
174
+
175
+ ```
176
+ @online{Portes2023MosaicBERT,
177
+ author = {Jacob Portes and Alex Trott and Daniel King and Sam Havens},
178
+ title = {MosaicBERT: Pretraining BERT from Scratch for \$20},
179
+ year = {2023},
180
+ url = {https://www.mosaicml.com/blog/mosaicbert},
181
+ note = {Accessed: 2023-03-28}, % change this date
182
+ urldate = {2023-03-28} % change this date
183
+ }
184
+ ```