Search papers, labs, and topics across Lattice.
This paper introduces a significantly faster implementation of BoundlessBPE and SuperBPE, tokenization algorithms that extend BPE by allowing tokens to span pre-tokenization boundaries, forming "superwords". The key innovation is aggregating supermerge candidates by frequency, avoiding the need to keep full documents in memory, which was a bottleneck in previous implementations. The new implementation achieves a 600x speedup, training on 1GB of data in approximately 10 minutes compared to the original BoundlessBPE's 4.7 CPU days.
Training superword tokenizers just got 600x faster, unlocking practical use of subword tokenization across pre-tokenization boundaries.
Byte Pair Encoding (BPE) is a widely used tokenization algorithm, whose tokens cannot extend across pre-tokenization boundaries, functionally limiting it to representing at most full words. The BoundlessBPE and SuperBPE algorithms extend and improve BPE by relaxing this limitation and allowing the formation of superwords, which are combinations of pretokens that form phrases. However, previous implementations were impractical to train: for example, BoundlessBPE took 4.7 CPU days to train on 1GB of data. We show that supermerge candidates, two or more consecutive pretokens eligible to form a supermerge, can be aggregated by frequency much like regular pretokens. This avoids keeping full documents in memory, as the original implementations of BoundlessBPE and SuperBPE required, leading to a significant training speedup. We present a two-phase formulation of BoundlessBPE that separates first-phase learning of regular merges from second-phase learning of supermerges, producing identical results to the original implementation. We also show a near-equivalence between two-phase BoundlessBPE and SuperBPE, with the difference being that a manually selected hyperparameter used in SuperBPE can be automatically determined in the second phase of BoundlessBPE. These changes enable a much faster implementation, allowing training on that same 1GB of data in 603 and 593 seconds for BoundlessBPE and SuperBPE, respectively, a more than 600x increase in speed. For each of BoundlessBPE, SuperBPE, and BPE, we open-source both a reference Python implementation and a fast Rust implementation.