Skip to navigation

Performance in RFD4-Proteina NIM

View as Markdown

Execution Backends

The RFD4-Proteina NIM can run three execution backends, selected per deployment (refer to Configuration Alternatives):

  • oss_eager: the upstream reference network, uncompiled.
  • oss_torch_compile: the same network under torch.compile.
  • bioir: an NVIDIA-accelerated trunk built on the BioNeMo Inference Runtime, with its own fused kernels and CUDA-graph capture.

Every response reports which backend actually ran it in model.execution_backend, alongside runtime.cuda_graphs and runtime.cuda_graph_cache, which describe what the loaded runtime currently holds. Results are comparable in kind across backends but not bit-identical, since compilation and BioIR’s own kernels both change floating-point numerics.

Benchmark Configuration

The table in this section comes from a single release-candidate sweep of the synthetic latency suite, 1.0.0-rc.20261012093607, measured 2026-10-12.

ParameterSetting
Taskgeneration
Inputsynthetic poly-glycine backbone, annotated_cif
sampling.recycle_strategythinking_medium — the checkpoint default, 60 steps over 185 trunk passes
sampling.num_replicates, sampling.batch_size1, 2, and 4, swept at every token bucket
output.structure_formatnone
Token buckets128, 160, 192, 224, 256, 288, 320, 352, 384, 448, 512, 640, 768, 896, 1024
Runs per shape3, of which the cold first run is discarded and the warm median reported
Backendsoss_eager, oss_torch_compile, bioir

Design time is the client’s end-to-end wall clock around one HTTP request. It therefore covers input parsing, sampling, metrics, and response encoding, not only the trunk forward passes. Because the cold run is excluded, these are steady-state figures; refer to Cold-Start Behavior for what the first request into a bucket costs instead.

Replicates are batched into one forward pass, so a batch-n request is a single request returning n designs. Divide by the batch size for a per-design cost. Refer to Replicates and Batching.

Five GPUs sweep batch 1 only — GB10, both 40 GB A100s, L40S, and RTX 6000 Ada Generation — so their tabs carry 15 rows rather than 45, and each one says so.

Performance Across Execution Backends

All three execution backends over the full sweep, at every token bucket and every batch size that GPU was swept at. Select a GPU to switch the table; the two rightmost columns are bioir’s speedup over each OSS baseline, where higher means bioir is faster. A dash marks a shape that did not complete.

TokensBatchoss_eager (s)oss_torch_compile (s)bioir (s)eager÷bioircompile÷bioir
12816.823.121.175.83x2.67x
12827.043.351.444.88x2.33x
12848.253.932.443.39x1.61x
16016.853.261.235.56x2.65x
16027.093.512.003.54x1.75x
16048.874.743.342.66x1.42x
19216.873.351.494.60x2.24x
19228.713.752.393.64x1.57x
19249.145.624.122.22x1.36x
22416.933.401.654.19x2.06x
224211.104.512.764.02x1.63x
224410.696.865.022.13x1.37x
25618.053.881.914.22x2.03x
25628.674.793.282.64x1.46x
256413.188.366.092.16x1.37x
28818.203.962.283.60x1.74x
28828.905.703.992.23x1.43x
288416.0010.177.552.12x1.35x
32018.244.022.633.14x1.53x
320210.326.504.732.18x1.37x
320419.1311.878.902.15x1.33x
35218.304.492.942.82x1.53x
352212.007.575.362.24x1.41x
352422.5713.8810.402.17x1.34x
38418.534.743.302.59x1.44x
384213.818.476.182.24x1.37x
384426.2916.1511.852.22x1.36x
44819.755.934.212.32x1.41x
448218.0310.977.952.27x1.38x
448434.6421.4815.612.22x1.38x
512112.027.295.172.32x1.41x
512222.7913.629.982.28x1.36x
512444.2026.4619.322.29x1.37x
640117.6910.567.792.27x1.36x
640234.3820.3215.002.29x1.35x
640467.2239.8629.352.29x1.36x
768124.6514.5810.682.31x1.37x
768248.1628.4420.572.34x1.38x
768495.1955.9340.692.34x1.37x
896132.8219.4514.362.29x1.35x
896265.1238.3028.102.32x1.36x
8964128.9075.5956.002.30x1.35x
1024142.0524.7417.892.35x1.38x
1024283.4549.1235.312.36x1.39x
10244166.6897.1769.982.38x1.39x

Three things the grid shows.

Design time is super-linear in token count, because the pair track is quadratic: on H100 80GB HBM3 with bioir at batch 1, an eightfold rise in tokens, 128 to 1024, costs 15.3x the time. The spread between GPUs widens with it. At 128 tokens the datacenter parts are about 2.3x apart; at 1024 they fall into bands — 11.6 to 13.9 s on the Blackwell datacenter parts, 16.9 to 27.0 s on Hopper, 51.3 to 64.8 s on Ampere, and 76.1 to 97.9 s on the Ada-generation parts. GPU choice therefore matters far more for long designs than for short ones. The GB10 (DGX Spark) sits well outside those bands at 833.9 s, which is what a desktop part costs on the longest design this suite sends.

Batching is close to free at short lengths and close to linear at long ones. On H100 at 128 tokens, oss_eager returns four designs in 8.25 s against 6.82 s for one — 1.21x the time for 4x the output. bioir starts from a far lower per-request floor and so saturates sooner, at 2.08x. By 1024 tokens the GPU is saturated either way and batch 4 costs about 3.9x on both. A deployment serving short designs should batch; one serving long designs gains throughput from batching but little latency.

bioir leads on most parts, by a margin that narrows with both length and batch. On H100 it is 5.83x over oss_eager and 2.67x over oss_torch_compile at 128 tokens and batch 1, 3.39x and 1.61x at the same length and batch 4, and settles near 2.3x and 1.38x from 512 tokens upward regardless of batch. The short-length, batch-1 figures are the most flattering ones and should not be quoted as the general case.

Accuracy Across Execution Backends

The eval suite’s structural-quality metrics, on one H100 80GB HBM3, from the same release candidate as the performance table above. Each backend ran the same 87 conditioned designs. n is how many of those 87 the metric is defined on.

MetricBetternoss_eageross_torch_compilebioir
success_ratehigher871.0001.0001.000
clash_frac meanlower870.01340.01050.0106
clash_frac maxlower870.9170.8330.917
bond_length_unreasonable meanlower870.000230.000250.00031
bond_length_unreasonable maxlower870.00820.01080.0041
sequence_adherence meanhigher571.0001.0000.994
ss_conditioning_accuracy meanhigher10.6630.8070.659

Every design completed on every backend, and the structural-quality means sit within a few thousandths of one another. Results are comparable in kind across backends but not bit-identical — compilation and BioIR’s own kernels both change floating-point numerics — so small differences between the three columns are expected and none of the gaps here is larger than that.

These are means over a small evaluation set, not a published accuracy benchmark, and two rows are weaker than the rest. sequence_adherence is defined on 57 of the 87 designs, and ss_conditioning_accuracy on exactly one — the spread from 0.659 to 0.807 in that last row is a single design and carries no information about backend quality. Do not select a backend on these numbers.

Cold-Start Behavior

The NIM reports ready as soon as its weights are loaded; it does not pre-warm every token-count bucket the oss_torch_compile backend compiles for. This means the first request against a given token bucket after startup pays a Triton JIT compilation cost, once per bucket per container start, and later requests against the same (or a smaller, same-bucket) size run at steady-state speed. This is a deliberate trade: a NIM that is servable in well under a minute, with the compile cost spread across a handful of early requests, versus one that is uniformly fast but takes several minutes to report ready.

Measured on one H100, thinking_medium (the checkpoint’s default recycle strategy), one design:

TokensBucketCold (first request in bucket)Steady statePenalty
10012830.3 s3.1 s9.8x
15016022.2 s3.6 s6.2x
25025621.9 s4.4 s5.0x
65076854.9 s28.4 s1.9x
694768 (already warm from 650)28.5 s28.4 s1.0x

Two things follow from this table. First, the penalty is per bucket, not “the first request ever”: a deployment serving a wide range of input sizes pays this cost once per distinct bucket its clients exercise, scattered across whichever requests happen to land first. Second, after a bucket is warm, a smaller request that rounds up into that same bucket (694 tokens padding to the 768 bucket already warmed by a 650-token request) pays nothing extra.

If a deployment or a demo needs a specific input size to respond quickly from the first request, send one request of that size to warm its bucket before the size matters.

Memory Footprint

This NIM ships with no refolding oracle built in (refer to Oracles), so the design model’s own memory footprint is what a deployment plans capacity around. That footprint grows with the square of the token count and with the batch size, and sampling.batch_size defaults to sampling.num_replicates: a multi-replicate request is a single large forward pass unless it says otherwise. Refer to Replicates and Batching. A mounted oracle that calls out to an independently hosted structure-prediction NIM (the reference implementations this NIM ships against OpenFold3 and Boltz-2 both work this way) adds no GPU memory cost of its own here, since the model it calls lives entirely in that other service.