Methodology · Tsinghua Benchmark 1.5

How energy per output token is measured

This page summarises the methodology of Tsinghua Benchmark 1.5, the whitepaper Large Language Model Inference Energy Efficiency Evaluation published by Tsinghua University in October 2026. Aitra Benchmark, targeted for Open Source Summit Japan in December 2026, builds on this methodology. Its own specification will be published by the working group.

Methodology by Tsinghua University, Information Energy Laboratory, Department of Electrical Engineering; and Sichuan Energy Internet Research Institute. Supported by Linux Foundation Research and the SODA Foundation through its Aitra project.

Section and table numbers below refer to the paper.

Metrics

Benchmark 1.5 keeps the five core metrics of Benchmark 1.0 and adds three lifecycle metrics (Section 2.2).

Steady-state energy per output token (J/token)
GPU energy within the steady-state window divided by the output tokens in the same window. Numerator and denominator come from the same window. Suited to services that run continuously.
Full-lifecycle energy per output token (J/token)
GPU energy of the startup, formal request and resource release stages, divided by the output tokens of the formal request stage. Suited to cold starts, short tasks and elastic services.
Startup energy
GPU energy from the start of the inference service to the start of formal requests: model loading, service initialization and warm-up.
Resource release energy
GPU energy from the end of formal requests until the inference process exits, GPU memory is released and power returns to baseline.
Output throughput (tok/s)
Total output tokens of the formal request stage divided by the duration of that stage.
Average GPU power (W)
GPU energy in the statistical window divided by the window duration, reported as the combined power of all GPUs.
Time to first token (TTFT) and time per output token (TPOT)
TTFT is the time from sending a request to receiving the first output token, reported as P50. TPOT is generation time after the first token divided by the output tokens of that stage.

Steady-state and full-lifecycle J/token share a unit but have different measurement boundaries. The paper states they must not be mixed or subtracted from each other.

Measurement boundary

All energy values are GPU energy, summed across the 8 GPUs. CPU and memory readings that Zeus can provide on some hardware are not used in any metric. CPU, memory, storage, network, cooling and power supply losses are excluded, so the values cannot be equated with wall-plug or data center energy.

StageStartsEndsMeasured with
StartupStart of continuous GPU samplingStart of formal requestsDriver-level board power, about 1 sample per second per GPU
Formal requestsFirst formal requestCompletion of the last formal requestZeus 0.13.1 via NVML
Steady-state windowStart of the first qualifying window (see below)End of formal requestsZeus 0.13.1 via NVML
Resource releaseCompletion of the last formal requestProcess exit, GPU memory released and power back within the idle baseline rangeDriver-level board power, about 1 sample per second per GPU

Benchmark 1.0 measured only the formal request window. Benchmark 1.5 extends the boundary to the full service lifecycle (Figure 3-1).

Power measurement and sampling

Steady-state determination

Candidate windows of 100 requests are formed in request completion order, sliding forward one request at a time. For each window, the mean of per-request J/token is the energy level and the standard deviation divided by the mean is the coefficient of variation (CV). When consecutive non-overlapping windows all satisfy CV < 0.03, the system is deemed to be in steady state, and the steady-state window runs from the start of the first qualifying window to the end of the formal requests.

If no window meets the threshold by the end of the formal requests, the run is recorded as not reaching steady state. Its steady-state J/token is excluded from cross-model comparison and flagged with the reason.

Energy for concurrent requests is attributed by each request's generation interval. GPU energy in overlapping intervals is split in proportion to each request's output tokens in that interval.

What is counted and excluded

Counted in startup energy
Service startup, weight loading from a local snapshot, JIT and kernel compilation, service readiness and the 8 warm-up requests.
Excluded
Network downloads of weights. Warm-up requests in formal performance metrics. Failed requests in the token count. Idle baseline subtraction. All non-GPU energy.
Token denominator
Completion tokens returned by the API for requests that completed successfully in the formal request stage. Models and engines return reasoning content differently, mixed into ordinary output in some runs and in a separate reasoning field in others, so the count cannot uniformly be read as visible output tokens only. The paper does not split the two. The thinking setting of each run is listed in Table B-1.
Cache conditions
Each test is a cold start of the inference service. Weights are a fixed local snapshot prepared in advance; each test gets its own engine run directory and compile cache directory; the operating system file page cache is left in its existing state.

Test point, hardware and software

All tests run on one local server at a unified test point. The test point is used to compare deployments under the same resources and does not represent each model's best configuration (Tables 3-1 and 3-3).

ItemConfiguration
GPUs8x NVIDIA H100 80GB HBM3
CPU and memoryDual-socket CPU, 96 physical cores, 192 logical cores; about 1 TiB system memory
GPU driver and CUDADriver 560.35.03; container CUDA runtime 12.9.1 or 12.9.2, pinned per model image
Benchmark frameworkml-energy/benchmark v3.0
Energy measurement libraryZeus 0.13.1 (NVML)
Inference enginesvLLM (0.29.x main line) and SGLang; versions pinned per model configuration (Table B-3)
Tensor parallelism8 (all 8 GPUs used)
Sequence scheduling limitmax-num-seqs 128, an upper limit on sequences scheduled per step, not the actual batch size
Client concurrencyNot limited; requests queue at the server and are scheduled by the engine
Warm-up8 requests, max 16 output tokens, concurrency 1
Random seed48105, fixed data sampling
Container images and model revisionsPinned per model; image digests recorded with the formal results; model repository IDs, revisions and commit dates in Appendix A

SGLang runs use the configuration functionally equivalent to vLLM. Model-specific differences in engine version, image and quantized artifact are kept and recorded with the results (Table 3-4).

Scenarios and workloads

Three public datasets of real interactions or code, rather than synthetic templates (Table 3-2).

ScenarioDatasetRequestsMax output tokensInput
Text chatlmarena-ai/arena-human-preference-100k2561,024About 580 text tokens on average
Code completionsourcegraph/context-aware-fim-code-completions1,0242,048About 2k text tokens on average
Image-text QAlmarena-ai/VisionArena-Chat1,0244,0961 image and a question per request

Each model runs only the tasks it supports. Unsupported tasks are marked not applicable and are not counted as failures.

Test procedure

  1. Preparation. Check model ID, revision, precision, snapshot, engine, image, parallel configuration and request set; confirm GPUs, storage, leftover processes and containers are in a normal state.
  2. Start lifecycle monitoring. Collect 20 seconds of idle power, then sample board power through startup.
  3. Start and verify the service. Start the engine with the frozen configuration; once ready, re-check model identity, revision, engine, context length and parallel configuration.
  4. Warm-up. Run 8 informal requests to trigger first-request handling, compilation and tokenizer processing. Their energy is counted in startup, not in formal metrics.
  5. Formal requests. Submit all requests without rate or concurrency limits. Record success, input and output tokens, TTFT, TPOT, inter-token latency and end-to-end latency per request.
  6. Shutdown and release. Stop the service and keep sampling board power and GPU memory until release completes or times out.
  7. Verification and archiving. Save run configuration, lifecycle data, GPU telemetry, request records and logs. Only runs that pass all checks enter the formal results.

Quality and comparability thresholds

Repetition and statistics

Each configuration completed one formal run. Means, standard deviations and statistical significance from three repetitions are not yet available. The paper summarises results with medians per scenario, the ratio of median full-lifecycle to median steady-state J/token, and Spearman rank correlation between the model orders under the two bases.

For a service that handles N requests after one startup, the paper gives this estimate of lifecycle GPU energy, where ess is the average steady-state GPU energy per request:

E(N) = Estart + Erelease + N · ess

The fixed overhead per request is (Estart + Erelease) / N. The estimate applies only when load and configuration match the measurement conditions and excludes idle gaps between requests; measured values take precedence. Converting GPU J/token to electricity cost needs a whole-server to GPU energy ratio and PUE, neither of which was measured, so the paper draws no electricity cost conclusions (Section 2.3).

Verification and reproducibility

Limitations stated in the paper

  • One formal run per configuration.
  • The unified test point is not each model's best configuration.
  • Deployment options are heterogeneous in precision, model version, engine version and model-specific settings.
  • Energy boundary limited to GPUs.
  • Tokenizers, output lengths and reasoning modes affect J/token and throughput.
  • Workloads are limited to text chat, code completion and image-text QA; answer quality is not evaluated.