TL;DR: Organize your neurons into a tree to get 78x faster inference (theoretical limit is 341x).

This was demonstrated on BERT-base, where this change preserved 96% of its downstream GLUE performance. For a quick comparison, DistilBERT offers 1.6x acceleration while preserving 97% of GLUE performance.

This is a HuggingFace Featured Paper from 11/21/2023.

Paper: https://arxiv.org/abs/2311.10770

Code: https://github.com/pbelcak/UltraFastBERT

Model: https://huggingface.co/pbelcak/UltraFastBERT-1x11-long

Abstract:

Language models only really need to use an exponential fraction of their neurons for individual inferences.

As proof, we present UltraFastBERT, a BERT variant that uses 0.3% of its neurons during inference while performing on par with similar BERT models. UltraFastBERT selectively engages just 12 out of 4095 neurons for each layer inference. This is achieved by replacing feedforward networks with fast feedforward networks (FFFs).

While no truly efficient implementation currently exists to unlock the full acceleration potential of conditional neural execution, we provide high-level CPU code achieving 78x speedup over the optimized baseline feedforward implementation, and a PyTorch implementation delivering 40x speedup over the equivalent batched feedforward inference.

We publish our training code, benchmarking setup, and model weights.

This exponential acceleration was achieved on a 180mn BERT model. Just imagine how amazing the speedup would be on a multi-bn parameter model such as LLaMA if the tree trick (i.e. “fast feedforward networks”) continues to scale up to larger layer sizes…

  • DaBobcat@alien.topB
    link
    fedilink
    English
    arrow-up
    1
    ·
    1 year ago

    Maybe I missed it, but how did they select which neurons should be used in each layer? Max values after the activation function? Something else? Did they just fix the number of neurons that should be used fixed? e.g., to 12? So just taking the max 12 values?

    • StartledWatermelon@alien.topB
      link
      fedilink
      English
      arrow-up
      1
      ·
      1 year ago

      The output of each parent neuron is basically treated as logit. So no activation is necessary. At inference, the logits below zero correspond to the choice of one child node and logits above zero correspond to the choice of alternative child node. At their deepest model, there are 11 such consecutive choices to be made, a descent down the binary tree.

      The specifics of training are discussed in the previous paper of the authors. All nodes are computed during training so there’s no speed-up at this stage compared to vanilla dense layer.

      The number of neurons that should be used is fixed in advance. Basically, it’s determined by the shape of the tree in which neurons are organised.