# Efficient Large Scale Language Modeling with Mixtures of Experts ## Introduction Mixture of Experts layers (MoEs) enable efficient scaling of language models through conditional computation. This work empirically compares how autoregressive MoE language models scale in comparison with dense models in a wide range of settings: in- and out-of-domain language modeling, zero- and few-shot priming, and full fine-tuning. See the associated paper for more details. This repo contains instructions for reproducing results from the paper. ## Pre-trained models These models are intended for research purposes only in order to reproduce the results from the paper, and to enable further research on the capabilities and limitations of language models. Please see the [model card](model_card.md) for more details about how the models were trained and evaluated, as well as their limitations and intended use. #### Dense models Dense models can be run directly from the `main` branch. Model | Layers | Model Dim | Languages | Download ---|---|---|---|--- `dense_125m` | 12 | 768 | English | [en_dense_lm_125m.tar.gz (0.2GB)](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_dense_lm_125m.tar.gz) `dense_355m` | 24 | 1024 | English | [en_dense_lm_355m.tar.gz (0.6GB)](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_dense_lm_355m.tar.gz) `dense_1_3b` | 24 | 2048 | English | [en_dense_lm_1_3b.tar.gz (2.3GB)](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_dense_lm_1_3b.tar.gz) `dense_2_7b` | 32 | 2560 | English | [en_dense_lm_2_7b.tar.gz (4.6GB)](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_dense_lm_2_7b.tar.gz) `dense_6_7b` | 32 | 4096 | English | [en_dense_lm_6_7b.tar.gz (12GB)](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_dense_lm_6_7b.tar.gz) `dense_13b` | 40 | 5120 | English | [en_dense_lm_13b.tar.gz (23GB)](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_dense_lm_13b.tar.gz) #### Mixture of expert models MoE models must be run from the `moe` branch. Please see the [MoE README](https://github.com/pytorch/fairseq/tree/moe#evaluating-moe-language-models) for more details about how to load and evaluate MoE models. Model | Layers | Model Dim | Languages | Download ---|---|---|---|--- `moe_15b` | 12 | 768 | English | [en_moe_lm_15b.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_moe_lm_15b.tar.gz) `moe_52b` | 24 | 1024 | English | [en_moe_lm_52b.tar.gz](https://dl.fbaipublicfiles.com/fairseq/models/lm/en_moe_lm_52b.tar.gz) `moe_207b` | 24 | 2048 | English | Available by request `moe_1_1t` | 32 | 4096 | English | Available by request ## Evaluation ### Example (COPA) The following snippet shows how to evaluate our dense models on the [Choice of Plausible Alternatives (COPA)](https://people.ict.usc.edu/~gordon/copa.html) task. ```python from fairseq.models.transformer_lm import TransformerLanguageModel model_dir = '/path/to/en_dense_lm_125m' lm = TransformerLanguageModel.from_pretrained(model_dir, bpe='gpt2') lm = lm.eval(); # disable dropout lm = lm.half(); # use FP16 for evaluation lm = lm.cuda(); # move to GPU def get_logprobs(prompt): import re prompt = re.sub('\n+' , '\n', prompt) # collapse repeated newlines, which indicate separate documents return lm.score(prompt, replace_newlines_with_eos=True)['positional_scores'] # Zero-shot evaluation for the Choice of Plausible Alternatives (COPA) task. # A return value of 1 indicates that the first alternative is more plausible, # while 2 indicates that the second alternative is more plausible. def COPA_eval(prompt, alternative1, alternative2): lprob1 = get_logprobs(prompt + "\n" + alternative1).sum() lprob2 = get_logprobs(prompt + "\n" + alternative2).sum() return 1 if lprob1 > lprob2 else 2 COPA_eval("The man broke his toe. What was the CAUSE of this?", "He got a hole in his sock.", "He dropped a hammer on his foot.") # 2 COPA_eval("I tipped the bottle. What happened as a RESULT?", "The liquid in the bottle froze.", "The liquid in the bottle poured out.") # 2 COPA_eval("I knocked on my neighbor's door. What happened as a RESULT?", "My neighbor invited me in.", "My neighbor left his house.") # 1 ``` ### Data format Few-shot prompting is known to be sensitive to the input formatting, and it is usually best to match the formatting used in pretraining. During pretraining our models were presented with data in the following format (i.e., one paragraph per line, with a blank line separating documents): ``` ... ... ... ... ``` #### Newlines While we use the byte-level BPE from GPT-2/3, fairseq's preprocessing replaces newlines with the end-of-sentence symbol (``), which corresponds to embedding index `2`. Thus **the model never saw newline characters during pretraining** and newlines should not be used during few-shot prompting. This is more clearly illustrated in the following example, which uses fairseq's Hub Interface to tokenize two documents in the desired format: ```python from fairseq.models.transformer_lm import TransformerLanguageModel model_dir = '/path/to/en_dense_lm_125m' lm = TransformerLanguageModel.from_pretrained(model_dir, bpe='gpt2') data = """\ This is the first paragraph of the first document. This is the second paragraph of the first document. This is the first paragraph of the second document.\ """ # The following is wrong, since it will encode newlines present in `data`. tokens_bad = lm.score(data)['tokens'] assert '\n' in lm.decode(tokens_bad) # oops, we encoded a newline # Instead pass the replace_newlines_with_eos option to get the correct behavior. tokens_good = lm.score(data, replace_newline_with_eos=True)['tokens'] assert '\n' not in lm.decode(tokens_good) # no newlines were encoded ``` ## Citation Coming soon.