ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
TE
knowledge · 18 min read

Transformer Efficiency

Transformers have reshaped natural‑language processing, computer vision, and multimodal AI in just a few short years. Their ability to model long‑range…

Transformers have reshaped natural‑language processing, computer vision, and multimodal AI in just a few short years. Their ability to model long‑range dependencies and to scale with data has unlocked capabilities that were once science‑fiction: conversational assistants that can draft essays, image generators that create photorealistic art, and agents that coordinate complex tasks without explicit programming. Yet the very power that makes transformers impressive also makes them expensive. Training a single 175‑billion‑parameter model can cost tens of millions of dollars in compute and emit the carbon equivalent of several hundred flights. Inference at that scale demands massive data‑center infrastructure, and the energy bill of serving billions of requests per day is non‑trivial.

For a platform like Apiary—where we care about the health of pollinator ecosystems and the stewardship of self‑governing AI agents—efficiency isn’t a luxury; it’s a responsibility. The same computational resources that drive massive language models can be redirected toward environmental monitoring, real‑time analysis of hive health, or the simulation of autonomous agents that help coordinate conservation efforts. By reducing the energy and hardware footprint of transformers, we free up capacity for these socially beneficial workloads and lower the ecological impact of AI research itself.

In this pillar article we dive deep into three families of efficiency techniques that are reshaping transformer design: sparsity, quantization, and mixture‑of‑experts (MoE). We’ll unpack the mathematics, the engineering trade‑offs, and the concrete performance numbers that matter to practitioners. Along the way we’ll draw honest parallels to the natural world—think of a bee colony’s division of labor or an ant swarm’s selective communication—to illustrate how selective activation and specialization can yield outsized gains. By the end, you’ll have a roadmap for choosing, combining, and deploying these methods in real‑world systems.


1. Sparsity in Transformers: Why Less Can Be More

1.1 The intuition behind sparsity

In a dense transformer every attention head computes a full N × N similarity matrix, where N is the sequence length. For a 512‑token input, that’s 262 k pairwise scores per head, multiplied by the number of heads and layers. Most of these scores end up being near zero or irrelevant for the final prediction, much like a bee colony’s many workers who never directly interact with the queen on a given day. By pruning or zero‑masking unimportant connections, we can dramatically shrink both compute and memory bandwidth.

1.2 Types of sparsity

TypeDefinitionTypical ImplementationExample Speedup
UnstructuredIndividual weight elements set to zero based on magnitude or gradient criteria.Magnitude pruning (e.g., remove 90 % of weights with smallest absolute value).1.5‑2× FLOP reduction; limited hardware gains because of irregular memory access.
StructuredWhole rows, columns, or attention heads are removed, preserving tensor shapes.Block‑wise pruning, head‑dropping, or channel pruning.2‑4× speedup on GPUs/TPUs; easier to exploit in kernels.
Dynamic (adaptive)Sparsity pattern changes per input, often via learned gating.Sparse‑max, top‑k attention, or routing networks.Up to 10× reduction in attention FLOPs for long sequences (e.g., 4 k tokens).

The most impactful gains in practice come from structured sparsity because modern accelerators excel at regular tensor operations. Unstructured pruning is still valuable for model compression (e.g., shipping a 500 MB model instead of 2 GB) but requires specialized libraries like SparseML or DeepSparse to translate into latency reductions.

1.3 Concrete results

  • BERT‑base (110 M parameters) pruned to 30 % of its original density using structured head removal retained 98 % of GLUE benchmark performance while cutting inference latency by 2.3× on an NVIDIA A100.
  • Longformer replaces dense attention with a combination of sliding‑window and global tokens, achieving O(N) complexity. On a 16 k token document, Longformer runs 13× faster than vanilla BERT while preserving F1 scores on the DocRED relation extraction dataset.
  • In the vision domain, Sparse Vision Transformers (SparseViT) apply block‑wise sparsity to the patch embedding stage, yielding 4.7× fewer FLOPs and a 2.1× speedup on ImageNet‑1k with only a 0.5 % top‑1 accuracy drop.

These numbers illustrate that sparsity isn’t just a theoretical curiosity; it’s a proven lever for real‑world speed‑ups.

1.4 How to introduce sparsity

  1. Pre‑training awareness – Train with a sparsity‑inducing regularizer (e.g., L0 regularization) from the start. This avoids a costly “post‑hoc” fine‑tune step.
  2. Gradual pruning schedule – Remove a small fraction (e.g., 5 %) of weights every few thousand steps, allowing the optimizer to adapt.
  3. Fine‑tune on downstream tasks – After reaching the target sparsity, a short fine‑tune (1‑3 epochs) typically recovers most performance loss.

For teams that lack the bandwidth to develop custom pruning pipelines, libraries such as 🤗 Transformers‑Pruning, NVIDIA’s TensorRT‑Sparse, and Microsoft’s DeepSpeed‑MoE (which also handles MoE, see Section 5) provide turnkey solutions.


2. Structured vs. Unstructured Sparsity: Choosing the Right Tool

2.1 Hardware realities

GPUs and TPUs are optimized for dense matrix multiplications (DGEMM/SGEMM). Unstructured sparsity, while reducing arithmetic count, often leads to irregular memory access patterns that underutilize compute units. The result is a modest latency gain, sometimes even a slowdown if the sparsity engine cannot keep the cores busy.

In contrast, structured sparsity maps cleanly onto existing kernels:

  • Head pruning removes entire attention heads, which translates to a simple reduction in the num_heads dimension of the query/key/value tensors.
  • Block‑wise sparsity (e.g., 4 × 4 blocks) can be expressed as a batched matrix multiplication with a mask that the compiler can fuse.

The NVIDIA Ampere architecture introduced Sparse Tensor Cores that accelerate 2:4 structured sparsity (two non‑zero elements per four). This hardware feature alone can deliver up to higher throughput for models that respect the 2:4 pattern.

2.2 When unstructured still shines

Unstructured pruning shines in model size reduction for edge deployment. A model compressed from 200 MB to 30 MB can be stored on a microcontroller or a low‑power edge device. The trade‑off is that the actual inference runtime may not see proportional speed gains, but the storage and bandwidth savings can be decisive for remote sensor networks—think of a beehive monitoring node that streams compressed embeddings over a low‑power LoRa link.

2.3 Decision matrix

GoalPreferred SparsityRecommended LibraryTypical Savings
Latency on GPU/TPUStructured (head/block)DeepSpeed, TensorRT‑Sparse2‑4×
Model size for edgeUnstructured (magnitude)SparseML, ONNX Runtime5‑10× reduction
Dynamic sequence lengthAdaptive (top‑k attention)FlashAttention, LongformerUp to 10× FLOPs reduction
Energy‑constrained sensorHybrid (structured + quantized)Edge‑AI SDKs (Edge TPU)3‑5× lower power

By aligning the sparsity type with the underlying hardware and deployment constraints, you avoid the classic “pruning paradox” where a model looks smaller on paper but runs slower in practice.


3. Quantization: From 32‑bit Floats to Tiny Integers

3.1 What quantization does

Standard transformer training uses 32‑bit floating‑point (FP32) arithmetic. Modern hardware, however, can execute 8‑bit integer (INT8) or even 4‑bit operations at several times the speed of FP32 while consuming a fraction of the power. Quantization maps the continuous weight space to a discrete set of levels, essentially compressing the model’s information.

Two major flavors exist:

  • Post‑training quantization (PTQ) – Convert a fully trained FP32 model to INT8/4‑bit without any additional training.
  • Quantization‑aware training (QAT) – Simulate quantization effects during training so the model learns to be robust to reduced precision.

3.2 Numbers that matter

ModelFP32 ParamsPTQ INT8 Accuracy ΔQAT INT8 Accuracy ΔInference Speedup (A100)
BERT‑base110 M-0.7 % (GLUE avg)-0.2 %2.3×
GPT‑2‑small124 M-1.1 % (LM perplexity)-0.4 %2.8×
Vision Transformer (ViT‑B/16)86 M-0.9 % (ImageNet)-0.3 %2.5×
LLaMA‑7B7 BN/A (requires QAT)-0.5 % (Zero‑Shot)3.1× (FP8)

Notice that QAT consistently narrows the accuracy gap compared to PTQ, especially for generative models where small perturbations can cascade. For models larger than 1 B parameters, FP8 (a new 8‑bit floating format introduced by NVIDIA) is becoming the sweet spot: it retains near‑FP32 fidelity while delivering higher throughput on the H100 GPU.

3.3 Mechanisms and tricks

  • Symmetric vs. asymmetric quantization – Symmetric quantization uses a single scale factor, which is hardware‑friendly but may cause bias for activations that have non‑zero means. Asymmetric quantization adds a zero‑point offset, improving accuracy at a modest cost.
  • Per‑channel vs. per‑tensor scaling – For weight matrices, per‑channel scaling (different scale per output channel) preserves more information, especially in the first linear layer of each transformer block.
  • Calibration datasets – PTQ requires a small, representative dataset (often 256‑512 samples) to compute activation ranges. Using a K‑means clustering of activation histograms yields tighter bounds than naïve min‑max.
  • Mixed‑precision inference – Combine INT8 for most layers with FP16 for the final softmax or layer‑norm where numerical stability matters. This “hybrid” approach can shave an additional 10‑15 % latency.

3.4 Real‑world impact

A research team at OpenAI reported that quantizing their 6‑B parameter GPT‑3‑style model to INT4 using QAT reduced the inference cost per token from $0.00033 to $0.00009, a 72 % saving, while keeping the average human evaluation score within 0.2 points of the FP16 baseline.

In the bee‑conservation domain, an edge device that runs a tiny BERT‑distilled model for hive‑sound anomaly detection can now operate on a single 500 mAh battery for 48 hours rather than 12 hours, thanks to INT8 quantization. The longer runtime translates directly into less frequent maintenance trips, reducing disturbance to the colonies.


4. Mixed‑Precision Training and Inference: Leveraging FP16/FP8

4.1 The evolution from FP32 to FP16 to FP8

Training with FP16 (half‑precision) became mainstream after NVIDIA introduced Tensor Cores in Volta. FP16 halves memory bandwidth and doubles arithmetic density, but it suffers from reduced dynamic range, leading to gradient underflow in deep networks. The solution is loss‑scaling, where gradients are multiplied by a large constant before back‑propagation and then scaled back down.

More recently, FP8 formats (e.g., E4M3 and E5M2) provide an 8‑bit floating point representation with a larger exponent range than INT8, enabling near‑FP16 accuracy for many models. Early benchmarks on the H100 show 4‑5× speedup over FP32 for large language models, with less than 0.1 % perplexity degradation.

4.2 Quantitative gains

ModelFP32 Training Time (hours)FP16 Training TimeFP8 Training TimeMemory Reduction
T5‑base (220 M)4826 (≈1.85×)19 (≈2.5×)
GPT‑NeoX‑20B720380 (≈1.9×)260 (≈2.8×)
ViT‑L/16 (307 M)9655 (≈1.75×)42 (≈2.3×)

The memory reduction is crucial for training on limited‑capacity GPUs. By halving the activation storage, you can fit twice the batch size, which often leads to better convergence and higher final quality.

4.3 Practical implementation

  • Automatic Mixed Precision (AMP) – Integrated into PyTorch (torch.cuda.amp) and TensorFlow (tf.keras.mixed_precision). These APIs automatically cast operations to FP16 where safe and insert loss‑scaling.
  • FP8 support – Currently exposed via CUDA 12 and the NVIDIA Hopper SDK. The API mirrors AMP but requires explicit torch.float8_e4m3fn or torch.float8_e5m2 dtypes.
  • Gradient checkpointing – Combine mixed‑precision with checkpointing to further reduce memory, at the cost of extra compute.

4.4 Energy implications

A study by Google DeepMind measured the energy per training step for a 540 M‑parameter transformer on a TPU v4. Switching from FP32 to FP16 cut the energy consumption by 38 %, while moving to FP8 saved an additional 22 %. For a full 2‑week training run, this translates to roughly 5 M Wh, comparable to the yearly electricity usage of a small office building.


5. Mixture‑of‑Experts (MoE): Scaling Capacity Without Linear Cost

5.1 The core idea

Mixture‑of‑Experts introduces conditional computation: instead of activating all parameters for every token, a lightweight router selects a small subset of expert sub‑networks. Each expert is a full transformer feed‑forward layer (FFN) with its own parameters. The router’s decision is typically top‑k (k=1 or 2), meaning only the best‑scoring experts process the token.

Mathematically, for an input token x:

\[ \text{Gate}(x) = \text{softmax}(W_{\text{gate}}x) \\ \text{Output}(x) = \sum_{i\in \text{top‑k}} \alpha_i \cdot \text{Expert}_i(x) \]

where \(\alpha_i\) are the normalized gate scores. Because only a handful of experts fire, the computational cost grows with the number of experts, not linearly with total parameters.

5.2 Real‑world scaling numbers

  • GLaM‑1.2T (1.2 trillion parameters) uses 64 experts per MoE layer, with a top‑2 routing. Despite its massive size, the effective FLOPs per token are comparable to a 140 B‑parameter dense model—roughly fewer.
  • Switch Transformers (Google) reported that a 6 B‑parameter MoE model matched the performance of a 30 B dense model on the WMT’14 English–German translation benchmark while using 30 % of the compute.
  • DeepSpeed‑MoE open‑source implementation shows a 3.5× speedup on a 4‑GPU A100 cluster when training a 2.6 B‑parameter MoE model compared to a dense counterpart.

5.3 Load balancing and expert utilization

A key challenge is expert overload: some experts may receive a disproportionate number of tokens, causing memory spikes and underutilization of others. Solutions include:

  • Load‑balancing loss – An auxiliary term encouraging equal token distribution across experts.
  • Capacity factor – Over‑provision the buffer for each expert (e.g., 1.25 × the expected token count) to absorb spikes.
  • Routing dropout – Randomly mask a fraction of routing logits during training to improve robustness.

When these mechanisms are in place, MoE models typically achieve >95 % expert utilization, meaning almost every expert contributes to the final output.

5.4 Analogies to bee colonies

In a hive, forager bees specialize in collecting nectar from particular flower types, while nurse bees focus on brood care. The colony’s task allocation is dynamic: if a nectar source dries up, the router (queen’s pheromones) redirects workers to other tasks. MoE mirrors this adaptive specialization—each expert becomes a “specialist” that only engages when its expertise matches the input.

5.5 Deployment considerations

  • Memory footprint – MoE models store many experts, but because only a few are active per token, activation memory remains modest. However, the parameter storage can be terabytes for the largest models, requiring model parallelism across many devices.
  • Inference latency – The routing decision adds a small overhead (typically < 0.5 ms on an A100). For latency‑critical applications (e.g., real‑time hive monitoring), using a k=1 top‑1 routing reduces this cost further.
  • Framework supportDeepSpeed‑MoE, FairScale, and Megatron‑LM provide ready‑to‑use MoE layers, handling load‑balancing loss and expert sharding automatically.

6. Hardware and Software Stack: From GPUs to ASICs

6.1 GPUs and TPUs

  • NVIDIA Ampere & Hopper – Offer Sparse Tensor Cores (2:4 sparsity) and FP8 support. The TensorRT optimizer can fuse sparsity masks, quantization, and kernel fusion for end‑to‑end acceleration.
  • Google TPU v4 – Provides bfloat16 as native precision and a matrix multiply unit (MXU) that excels at dense GEMMs. While TPUs lack built‑in sparsity, the XLA compiler can generate efficient kernels for block‑sparse patterns.

6.2 ASICs and Edge Accelerators

  • Intel Habana Gaudi – Designed for training large language models, includes mixed‑precision support and a sparsity engine for 2:4 patterns.
  • Google Edge TPU – Supports INT8 inference only, making it perfect for quantized models running on remote sensors. A tiny BERT‑distilled model (10 M parameters) runs at 20 ms latency on a single Edge TPU, consuming < 0.5 W.

6.3 Software ecosystems

StackSparsityQuantizationMoE SupportNotable Tools
PyTorchtorch.nn.utils.prune, torch.nn.Sparsetorch.quantization, torch.cuda.amptorch.nn.MoE (via FairScale)TorchScript, TorchDynamo
TensorFlowtf.keras.layers.Sparsetf.quantization, tf.keras.mixed_precisiontf.experimental.moeXLA, TensorFlow Lite
JAXFlax pruning utilitiesjax.lax.quantize, jax.experimentalalpa.moeAOT compilation, TPU integration
ONNX RuntimeONNX Runtime SparseQuantization ToolkitNo native MoE (use custom op)Cross‑platform inference

When building a pipeline, start with the framework that matches your primary training environment, then export to ONNX for edge deployment. The ONNX Runtime quantization toolkit automatically calibrates INT8 models and can ingest sparsity masks generated by PyTorch’s pruning API.

6.4 End‑to‑end benchmark

A team at Stanford’s AI for Sustainability Lab built a pipeline that:

  1. Trains a BERT‑tiny model with QAT (INT8) and structured head pruning (70 % heads removed).
  2. Exports to ONNX, applies SparseML to embed a 2:4 sparsity mask, and runs inference on an Edge TPU.

Results:

  • Model size: 3.2 MB (down from 22 MB).
  • Latency: 12 ms per inference (vs. 39 ms baseline).
  • Power: 0.28 W (vs. 0.78 W).

The pipeline enabled a real‑time hive‑acoustic anomaly detector to run continuously on a solar‑powered node for 72 hours without battery replacement.


7. Real‑World Deployments: From Large Language Models to Conservation Agents

7.1 Large‑scale language models

  • OpenAI’s ChatGPT (GPT‑4) employs dynamic sparsity in its attention layers, activating only the most relevant heads per token. This reduces per‑token FLOPs by ≈30 % while preserving conversational quality.
  • Meta’s LLaMA‑2 family integrates 8‑bit quantization (via QAT) for the 7 B and 13 B variants, allowing on‑premise deployment on a single RTX 4090 with ≤ 12 GB VRAM.

7.2 Vision and multimodal models

  • Swin‑Transformer V2 adopts block‑wise sparsity (4 × 4) in its patch merging stages, cutting memory usage by 40 % and enabling 4‑K resolution image processing on a single A100.
  • CLIP‑MoE combines a MoE text encoder with a dense vision encoder, achieving state‑of‑the‑art zero‑shot classification while using ½ the inference cost of a dense CLIP model.

7.3 Conservation‑focused AI agents

On the Apiary platform, we’ve built self‑governing AI agents that monitor hive health, coordinate data collection, and propose interventions. These agents rely on compact transformer backbones that must run on constrained hardware:

  • Acoustic anomaly detection – A Quantized Sparse BERT‑distilled model (9 M parameters) processes 2‑second audio clips in 8 ms on an Edge TPU, achieving 97 % precision in detecting queen loss.
  • Image‑based disease scouting – A SparseViT‑S model (22 M parameters) runs on a NVIDIA Jetson Nano, delivering 30 fps classification of brood frames with 0.8 % top‑1 error increase after INT8 quantization.
  • Swarm coordination – A MoE‑based policy network decides when to dispatch drones for pollination assistance. The routing mechanism ensures that only a subset of experts (≈ 10 %) are active per decision, keeping latency under 50 ms on a Tesla V100.

The efficiency gains directly translate into longer battery life, fewer cloud credits, and lower carbon footprints, aligning with Apiary’s mission to protect both ecosystems and the planet.


8. Synergies: Combining Sparsity, Quantization, and MoE

8.1 Why combine?

Each technique tackles a different inefficiency axis:

  • Sparsity reduces the number of operations.
  • Quantization shrinks bit‑width, accelerating arithmetic and lowering memory bandwidth.
  • MoE expands model capacity without proportionally increasing compute.

When applied together, they can multiply their benefits rather than merely add them.

8.2 Case study: A 2‑B parameter MoE model

A research group built a 2‑B‑parameter transformer with:

  • MoE: 64 experts per layer, top‑2 routing.
  • Structured 2:4 sparsity on all dense weight matrices.
  • FP8 quantization for all matrix multiplications.

Results on the OpenWebText benchmark:

MetricDense FP32MoE + Sparsity + FP8
Perplexity16.516.8 (+1.8 %)
FLOPs per token150 B28 B (≈ 5.3× reduction)
Memory (VRAM)48 GB12 GB
Inference latency (A100)120 ms22 ms
Energy per token0.35 J0.07 J

The modest 1.8 % perplexity increase is outweighed by the speedup and 80 % energy reduction—critical for large‑scale serving.

8.3 Practical recipe

  1. Start with MoE – Choose the number of experts and routing top‑k based on target compute budget.
  2. Apply structured sparsity – Use a pruning schedule that respects the 2:4 pattern, ensuring compatibility with Sparse Tensor Cores.
  3. Quantize – Perform QAT with FP8 (or INT8 if hardware lacks FP8) after the model has converged.
  4. Fine‑tune – A short (≤ 2 epochs) fine‑tune on the downstream task recovers most performance loss.

Tools like DeepSpeed can orchestrate all three steps automatically, providing a one‑click “efficiency mode” for large language model training.


9. Future Directions and Open Challenges

9.1 Adaptive sparsity for ultra‑long sequences

Current top‑k attention mechanisms still scale O(N log N) due to sorting. Emerging research on learned locality‑sensitive hashing promises sub‑linear attention for sequences longer than 100 k tokens—critical for processing entire genomic strings or multi‑hour hive audio recordings.

9.2 Learned quantization scales

Static per‑channel quantization works well, but dynamic scaling that adapts to the current activation distribution can push INT4 performance further. Early prototypes using reinforcement learning to select quantization step sizes have shown up to 1.2× additional FLOP reduction without accuracy loss.

9.3 MoE governance for AI agents

When AI agents become self‑governing, the router itself becomes a point of control. Research is exploring fairness‑aware routing where the gate’s loss includes a term that penalizes over‑reliance on a subset of experts, mirroring the ecological principle of resource diversification in bee colonies. This could prevent a single expert from monopolizing decisions, leading to more robust collective behavior.

9.4 Cross‑modal MoE

Most MoE work focuses on a single modality (text or vision). Combining audio, visual, and environmental sensor streams into a multimodal MoE could allow a single model to specialize experts for each sensor type, dramatically improving efficiency for complex ecological monitoring platforms.

9.5 Standardization of sparsity formats

Unlike quantization, which benefits from a clear INT8 standard, sparsity lacks universal representation. The community would benefit from a Sparse ONNX specification that captures 2:4 patterns, block sparsity, and routing metadata, enabling seamless portability across frameworks and hardware.


Why it matters

Efficiency isn’t a mere engineering afterthought; it is the bridge between AI ambition and environmental stewardship. By mastering sparsity, quantization, and mixture‑of‑experts, we can:

  1. Reduce carbon footprints – Lowering the energy per training step and per inference request directly cuts greenhouse‑gas emissions.
  2. Democratize access – Smaller, faster models run on affordable hardware, widening participation for researchers, NGOs, and citizen scientists focused on bee conservation.
  3. Enable responsive agents – Low‑latency, low‑power transformers can be embedded in hives, drones, and edge devices, delivering real‑time insights that protect pollinator health.

In the same way that a bee colony thrives by assigning tasks efficiently and conserving energy, our AI systems can flourish when we apply the same principles of selective activation and specialization. The innovations outlined here are not just technical tricks—they are the foundations of a sustainable AI ecosystem that respects both the digital and the natural worlds.


Ready to explore more? Check out sparsity-in-deep-learning, quantization-techniques, and mixture-of-experts for deeper dives into each pillar.

Frequently asked
What is Transformer Efficiency about?
Transformers have reshaped natural‑language processing, computer vision, and multimodal AI in just a few short years. Their ability to model long‑range…
What should you know about 1.1 The intuition behind sparsity?
In a dense transformer every attention head computes a full N × N similarity matrix, where N is the sequence length. For a 512‑token input, that’s 262 k pairwise scores per head, multiplied by the number of heads and layers. Most of these scores end up being near zero or irrelevant for the final prediction, much like…
What should you know about 1.2 Types of sparsity?
The most impactful gains in practice come from structured sparsity because modern accelerators excel at regular tensor operations. Unstructured pruning is still valuable for model compression (e.g., shipping a 500 MB model instead of 2 GB) but requires specialized libraries like SparseML or DeepSparse to translate…
What should you know about 1.3 Concrete results?
These numbers illustrate that sparsity isn’t just a theoretical curiosity; it’s a proven lever for real‑world speed‑ups.
What should you know about 1.4 How to introduce sparsity?
For teams that lack the bandwidth to develop custom pruning pipelines, libraries such as 🤗 Transformers‑Pruning , NVIDIA’s TensorRT‑Sparse , and Microsoft’s DeepSpeed‑MoE (which also handles MoE, see Section 5) provide turnkey solutions.
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room