jacobfulano
commited on
Commit
•
d9748e0
1
Parent(s):
b7a0389
Create README.md
Browse files
README.md
ADDED
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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-2048 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).
|
15 |
+
|
16 |
+
__This model was trained with [ALiBi](https://arxiv.org/abs/2108.12409) on a sequence length of 2048 tokens.__
|
17 |
+
|
18 |
+
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
|
19 |
+
Biases Enables Input Length Extrapolation (Press et al. 2022)](https://arxiv.org/abs/2108.12409)
|
20 |
+
|
21 |
+
It is part of the family of MosaicBERT-Base models:
|
22 |
+
|
23 |
+
* [mosaic-bert-base](https://huggingface.co/mosaicml/mosaic-bert-base) (trained on a sequence length of 128 tokens)
|
24 |
+
* [mosaic-bert-base-seqlen-512](https://huggingface.co/mosaicml/mosaic-bert-base-seqlen-512)
|
25 |
+
* [mosaic-bert-base-seqlen-1024]](https://huggingface.co/mosaicml/mosaic-bert-base-seqlen-1024)
|
26 |
+
* mosaic-bert-base-seqlen-2048
|
27 |
+
|
28 |
+
|
29 |
+
|
30 |
+
## Model Date
|
31 |
+
|
32 |
+
April 2023
|
33 |
+
|
34 |
+
## Documentation
|
35 |
+
|
36 |
+
* [Blog post](https://www.mosaicml.com/blog/mosaicbert)
|
37 |
+
* [Github (mosaicml/examples/bert repo)](https://github.com/mosaicml/examples/tree/main/examples/bert)
|
38 |
+
|
39 |
+
## How to use
|
40 |
+
|
41 |
+
```python
|
42 |
+
from transformers import AutoModelForMaskedLM
|
43 |
+
mlm = AutoModelForMaskedLM.from_pretrained('mosaicml/mosaic-bert-base', trust_remote_code=True)
|
44 |
+
```
|
45 |
+
|
46 |
+
The tokenizer for this model is simply the Hugging Face `bert-base-uncased` tokenizer.
|
47 |
+
|
48 |
+
```python
|
49 |
+
from transformers import BertTokenizer
|
50 |
+
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
|
51 |
+
```
|
52 |
+
|
53 |
+
To use this model directly for masked language modeling, use `pipeline`:
|
54 |
+
|
55 |
+
```python
|
56 |
+
from transformers import AutoModelForMaskedLM, BertTokenizer, pipeline
|
57 |
+
|
58 |
+
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
|
59 |
+
mlm = AutoModelForMaskedLM.from_pretrained('mosaicml/mosaic-bert-base', trust_remote_code=True)
|
60 |
+
|
61 |
+
classifier = pipeline('fill-mask', model=mlm, tokenizer=tokenizer)
|
62 |
+
|
63 |
+
classifier("I [MASK] to the store yesterday.")
|
64 |
+
```
|
65 |
+
|
66 |
+
**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).
|
67 |
+
|
68 |
+
**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).
|
69 |
+
|
70 |
+
### Remote Code
|
71 |
+
|
72 |
+
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:
|
73 |
+
|
74 |
+
```python
|
75 |
+
mlm = AutoModelForMaskedLM.from_pretrained(
|
76 |
+
'mosaicml/mosaic-bert-base',
|
77 |
+
trust_remote_code=True,
|
78 |
+
revision='24512df',
|
79 |
+
)
|
80 |
+
```
|
81 |
+
|
82 |
+
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.
|
83 |
+
|
84 |
+
## MosaicBERT Model description
|
85 |
+
|
86 |
+
In order to build MosaicBERT, we adopted architectural choices from the recent transformer literature.
|
87 |
+
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),
|
88 |
+
and [Gated Linear Units (Shazeer 2020)](https://arxiv.org/abs/2002.05202). In addition, we remove padding inside the transformer block,
|
89 |
+
and apply LayerNorm with low precision.
|
90 |
+
|
91 |
+
### Modifications to the Attention Mechanism
|
92 |
+
1. **FlashAttention**: Attention layers are core components of the transformer architecture. The recently proposed FlashAttention layer
|
93 |
+
reduces the number of read/write operations between the GPU HBM (high bandwidth memory, i.e. long-term memory) and the GPU SRAM
|
94 |
+
(i.e. short-term memory) [[Dao et al. 2022]](https://arxiv.org/pdf/2205.14135.pdf). We used the FlashAttention module built by
|
95 |
+
[hazy research](https://github.com/HazyResearch/flash-attention) with [OpenAI’s triton library](https://github.com/openai/triton).
|
96 |
+
|
97 |
+
2. **Attention with Linear Biases (ALiBi)**: In most BERT models, the positions of tokens in a sequence are encoded with a position embedding layer;
|
98 |
+
this embedding allows subsequent layers to keep track of the order of tokens in a sequence. ALiBi eliminates position embeddings and
|
99 |
+
instead conveys this information using a bias matrix in the attention operation. It modifies the attention mechanism such that nearby
|
100 |
+
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
|
101 |
+
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).
|
102 |
+
|
103 |
+
3. **Unpadding**: Standard NLP practice is to combine text sequences of different lengths into a batch, and pad the sequences with empty
|
104 |
+
tokens so that all sequence lengths are the same. During training, however, this can lead to many superfluous operations on those
|
105 |
+
padding tokens. In MosaicBERT, we take a different approach: we concatenate all the examples in a minibatch into a single sequence
|
106 |
+
of batch size 1. Results from NVIDIA and others have shown that this approach leads to speed improvements during training, since
|
107 |
+
operations are not performed on padding tokens (see for example [Zeng et al. 2022](https://arxiv.org/pdf/2208.08124.pdf)).
|
108 |
+
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).
|
109 |
+
|
110 |
+
4. **Low Precision LayerNorm**: this small tweak forces LayerNorm modules to run in float16 or bfloat16 precision instead of float32, improving utilization.
|
111 |
+
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).
|
112 |
+
|
113 |
+
### Modifications to the Feedforward Layers
|
114 |
+
|
115 |
+
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),
|
116 |
+
and incorporate an extra learnable matrix that “gates” the outputs of the feedforward layer. More recent work has shown that
|
117 |
+
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)
|
118 |
+
activation function with GLU, which is sometimes referred to as GeGLU. The GeLU activation function is a smooth, fully differentiable
|
119 |
+
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.
|
120 |
+
The extra gating matrix in a GLU model potentially adds additional parameters to a model; we chose to augment our BERT-Base model with
|
121 |
+
additional parameters due to GLU modules as it leads to a Pareto improvement across all timescales (which is not true of all larger
|
122 |
+
models such as BERT-Large). While BERT-Base has 110 million parameters, MosaicBERT-Base has 137 million parameters. Note that
|
123 |
+
MosaicBERT-Base trains faster than BERT-Base despite having more parameters.
|
124 |
+
|
125 |
+
|
126 |
+
|
127 |
+
|
128 |
+
## Training data
|
129 |
+
|
130 |
+
MosaicBERT is pretrained using a standard Masked Language Modeling (MLM) objective: the model is given a sequence of
|
131 |
+
text with some tokens hidden, and it has to predict these masked tokens. MosaicBERT is trained on
|
132 |
+
the English [“Colossal, Cleaned, Common Crawl” C4 dataset](https://github.com/allenai/allennlp/discussions/5056), which contains roughly 365 million curated text documents scraped
|
133 |
+
from the internet (equivalent to 156 billion tokens). We used this more modern dataset in place of traditional BERT pretraining
|
134 |
+
corpora like English Wikipedia and BooksCorpus.
|
135 |
+
|
136 |
+
## Pretraining Optimizations
|
137 |
+
|
138 |
+
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).
|
139 |
+
|
140 |
+
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
|
141 |
+
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 2048**; this covers 78.6% of C4.
|
142 |
+
|
143 |
+
|
144 |
+
2. **Higher Masking Ratio for the Masked Language Modeling Objective**: We used the standard Masked Language Modeling (MLM) pretraining objective.
|
145 |
+
While the original BERT paper also included a Next Sentence Prediction (NSP) task in the pretraining objective,
|
146 |
+
subsequent papers have shown this to be unnecessary [Liu et al. 2019](https://arxiv.org/abs/1907.11692).
|
147 |
+
However, we found that a 30% masking ratio led to slight accuracy improvements in both pretraining MLM and downstream GLUE performance.
|
148 |
+
We therefore included this simple change as part of our MosaicBERT training recipe. Recent studies have also found that this simple
|
149 |
+
change can lead to downstream improvements [Wettig et al. 2022](https://arxiv.org/abs/2202.08005).
|
150 |
+
|
151 |
+
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
|
152 |
+
for the multiplication and 32-bit IEEE floating point for gradient accumulation. We found this to be more stable than using float16 mixed precision.
|
153 |
+
|
154 |
+
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).
|
155 |
+
This small constraint is something of [a magic trick among ML practitioners](https://twitter.com/karpathy/status/1621578354024677377), and leads to a throughput speedup.
|
156 |
+
|
157 |
+
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.
|
158 |
+
The learning rate schedule begins with a warmup to a maximum learning rate of 5.0e-4 followed by a linear decay to zero.
|
159 |
+
Warmup lasted for 6% of the full training duration. Global batch size was set to 4096, and microbatch size was **32**; since global batch size was 4096, full pretraining consisted of 70,000 batches.
|
160 |
+
We set the **maximum sequence length during pretraining to 2048**, and we used the standard embedding dimension of 768.
|
161 |
+
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.
|
162 |
+
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).
|
163 |
+
|
164 |
+
|
165 |
+
## Intended uses & limitations
|
166 |
+
|
167 |
+
This model is intended to be finetuned on downstream tasks.
|
168 |
+
|
169 |
+
## Citation
|
170 |
+
|
171 |
+
Please cite this model using the following format:
|
172 |
+
|
173 |
+
```
|
174 |
+
@online{Portes2023MosaicBERT,
|
175 |
+
author = {Jacob Portes and Alex Trott and Daniel King and Sam Havens},
|
176 |
+
title = {MosaicBERT: Pretraining BERT from Scratch for \$20},
|
177 |
+
year = {2023},
|
178 |
+
url = {https://www.mosaicml.com/blog/mosaicbert},
|
179 |
+
note = {Accessed: 2023-03-28}, % change this date
|
180 |
+
urldate = {2023-03-28} % change this date
|
181 |
+
}
|
182 |
+
```
|