jacobfulano commited on
Commit
d9748e0
1 Parent(s): b7a0389

Create README.md

Browse files
Files changed (1) hide show
  1. README.md +182 -0
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
+ ```