Skip to content

v0.6.6

Choose a tag to compare

@github-actions github-actions released this 22 Aug 18:44
· 893 commits to main since this release
e638834

[0.6.6] - 2026-08-22

Added

  • tt-bio weights lists every weight artifact with its status, on-disk size and resolved
    path; --download [MODEL...] prefetches, --prune reclaims superseded Hugging Face
    revisions and staging leftovers after printing the bytes and asking. TT_BIO_CACHE moves
    both halves of the cache (~/.boltz and the Hugging Face hub cache) in one setting, and
    every artifact takes a TT_BIO_<ARTIFACT> override; the older PROTENIX_CKPT, OF3_CKPT,
    RF3_CKPT and OPENDDE_CKPT still work. See docs/weights.md.

  • tt-bio predict --model rf3 folds with RoseTTAFold3 (AlphaFold3-family: MSA module,
    template embedder, 48-block Pairformer, atom diffusion, confidence head), on device.
    Proteins, RNA, DNA and ligands, plus non-canonical residues, covalent modifications and
    cyclic chains; MSA on by default through the same stage every other model uses. Writes
    an mmCIF/PDB with pLDDT in the B-factor column and an AlphaFold3-style
    <name>_summary_confidences.json (pTM, ipTM, chain-pair PAE/PDE, ranking score), and
    --diffusion_samples N ranks N samples by that score. Weights download from the
    Institute for Protein Design on first use, or set RF3_CKPT.

  • --partial_t N --partial_structure FILE (rf3): start the diffusion rollout part-way down
    the noise schedule so it refines an existing structure instead of building from scratch.
    N is a schedule index, 0 for a normal fold and higher to stay closer to the input.

  • --early_stop_plddt X (rf3): after the first trunk recycle, score mean pLDDT with the
    confidence head and abandon the target if it is below X. No structure is written and the
    entry in results.json carries early_stopped: true with the measured pLDDT, so a
    screening run can tell an abandoned target from a failed one.

  • tests/test_rf3_featurizer.py: RF3 host-featurizer parity over ten capability classes
    from committed captures, with no device and no rc-foundry install.

  • Both release gates honour a card grant. TT_VISIBLE_DEVICES is the set of cards a run may
    open: ask --workers for a card outside it and full_parity_gate.py refuses in preflight
    instead of taking a card another job on the box holds, and a leg needing more cards than the
    grant is skipped as SKIPPED-CARD-GRANT and listed under COVERAGE REDUCED so a narrowed
    gate cannot read as a green full one. Leaving the variable unset means the whole box and is
    the unchanged path a release run takes. Both gates also refuse to start when the 1-min
    loadavg is above 1.5x nproc (--load-ceiling, 0 disables).

Fixed

  • A weight download killed mid-flight no longer poisons the cache. Re-downloads were gated on
    the destination merely existing, so a truncated multi-GB file was treated as present and
    reused forever, failing later with PytorchStreamReader ... failed finding central directory. Downloads now stage next to their destination, verify against the source's byte
    count and archive structure, and only then rename into place; archives are unpacked into a
    staging directory and a source archive that gets discarded after extraction is deleted only
    once the output verifies. Affected Boltz-2, Protenix-v2, the RF3 and RFD3 checkpoints, the
    CCD molecule library and the RFD3 weight split, where a partial extraction next to a deleted
    checkpoint was unrecoverable. Existing caches are adopted, not re-fetched.

  • A device open now leases every card it holds, not just the one it computes on. ttnn brings up
    every card TT_VISIBLE_DEVICES makes visible, so an unpinned run on a four-card box held all
    four chips while leasing one, and the next job on that host was told three of them were free.
    It then either blocked on a lock or collided at the fd level. All of them are leased now, so
    such a run fails immediately, naming the card and the process holding it, instead of quietly
    sharing a chip. Pin TT_VISIBLE_DEVICES to the card you want and nothing changes, which is
    what the worker pool, the multi-card fan-out and every gate leg already do.

  • TT_BIO_LOGICAL_DEVICE_ID past the end of TT_VISIBLE_DEVICES fails now, naming both values,
    instead of silently using the first visible card and leasing one the run never opens.

  • Boltz-2 folds inputs that pad to 704 tokens again. 640 aa plus a 20-heavy-atom ligand, and
    641 to 704 aa on its own, both died about 6 s in on an on-device memory clash. Every size that
    folded before folds bit-identically, and the protein-plus-ligand ladder now passes at every
    64-aa rung from 256 to 1024 aa. See docs/part-l1-budgets.md.

  • The parity gate's delegated legs (boltzgen, opendde-abag, capacity) run in the gate's own
    process and shell out from there, so they inherited an environment with no device restriction:
    boltzgen designed on card 0 whatever --workers said, and any fan-out from a delegated leg
    would have taken every card on the box. They are pinned now, and the pin is restored afterwards
    so one leg cannot leak it into the next.

  • The l1-budget release-gate arm crashed before folding anything (L1_BUDGET_PARTS rows
    unpacked as 4-tuples after a DRAM field made them 5), and that arm's own tests were dead for
    the identical reason, so the arm had neither a working leg nor working tests. Also fixed three
    gate tests whose verdict depended on the host's loadavg instead of the logic under test.

  • A partial ~/of3_ref_out.pkl skips the OpenFold3 device tests that need the keys it
    lacks instead of failing them. The tests guarded on the golden's existence while
    depending on its contents, so on a host with a partial capture 11 of them died on
    KeyError and read as a regression in whatever branch was checked out.

  • Histidine's ND1 carried no formal charge in the Protenix-v2 and OpenDDE featurizer. The
    PDB chemical component dictionary's ideal histidine is the protonated imidazolium, so ND1
    is +1, and the reference implementations read the CCD straight through. tt-bio did not, so
    any protein with a histidine in it, which is nearly every real target, folded from
    slightly the wrong input. Numbers move: on ubiquitin (76 residues, one histidine) the top
    structure shifts 0.07-0.38 A depending on seed and plDDT by about 0.0003, and the parity
    leg's all-atom RMSD against the official ByteDance Protenix reference improves from
    1.790 A to 1.774 A. Larger targets carry proportionally more histidines. Re-run any
    Protenix-v2 or OpenDDE prediction you need to compare against a new one. Boltz-2,
    ESMFold2, OpenFold3, BoltzGen and RFD3 use different featurizers and are unaffected.

    The charge table is now taken from the CCD over all 20 standard residues rather than from
    a golden feature dump: ARG NH2, LYS NZ and HIS ND1 are the only charged atoms, and nothing
    else was missing.

  • The live progress view reports real progress for --model rf3. It announced the trunk phase
    once with no iteration count and never announced diffusion at all, so the bar sat empty and a
    normal rollout looked like a stall. rf3 now ticks per trunk recycle and per diffusion step like
    every other model. Reporting only: no prediction moves.

Changed

  • Protenix-v2, OpenDDE and OpenDDE-abag fold more accurately, and slightly faster (+8.6%, +3.6%,
    +4.3%). Their Pairformer softmax was losing about 2% of each row's normalisation; it is exact
    now. Four parity legs improved on their committed envelopes and none regressed, so predictions
    move a little: re-run anything you need to compare against a new result. ESMFold2 and OpenFold3
    are unchanged, their sites not having been measured yet. Each site is separately switchable
    with TT_BIO_ACCURATE_SOFTMAX_AB, a comma-separated list of <model>.<site> tokens where a
    bare token forces the exact chain on and a - prefix forces it off; all and -all cover
    every site that has no token of its own, so TT_BIO_ACCURATE_SOFTMAX_AB=-all puts all five
    sites that ship on (protenix.trunk, protenix.confidence, opendde.trunk,
    opendde.confidence, opendde.refiner) back on the old softmax. RoseTTAFold3 is not on this
    switch; its site is exact unconditionally.
    See docs/implementation-parity.md.

Performance

  • RoseTTAFold3 folds 1024 aa 1.264x faster (52.468 -> 41.508 s per trunk recycle), and the
    768 -> 1024 aa scaling exponent drops from 3.63 to 2.82. Bit-exact, so no prediction moves.
    Boltz-2, Protenix-v2 and OpenDDE reach the same code only behind BOLTZ2_FP32_SOFTMAX, which
    is off by default, so they are unchanged. See docs/size-generality.md.

Gates and documentation

  • The performance page publishes two readings per row, whole fold and device only, and says what
    the NVIDIA cells actually time. Four H200 cells (Boltz-2, OpenFold3, Protenix-v2, OpenDDE)
    leave 0.24 to 6.31 s of featurisation and structure writing outside their timer, which made
    those ratios larger than a like-for-like comparison. The two readings agree within 0.2x on five
    of six rows; RoseTTAFold3 reads 3.556x whole fold and 9.388x device only, because half of that
    fold is host featurisation that runs on both sides. No published cell moved. See
    site/data/perf-512aa.json.
  • tt-bio predict --model rf3 runs from a plain pip install tt-bio. Four packages it imports
    at module load were undeclared, so it exited on ModuleNotFoundError before opening a card.
    RoseTTAFold3 now has a UX-gate leg and a perf-gate entry, which is what found it.
  • A parity-gate workdir records the code it scored, and the gate refuses to resume one built from
    a different tree. The per-leg resume cache is keyed on the leg id alone, so a second release
    gate on the same machine used to replay the previous release's verdicts as its own.
  • packaging_smoke.py --fold installs the wheel with --force-reinstall, so the guard cannot
    inherit a same-version tt_bio from the parent interpreter and silently test nothing.

Known issues

  • TT_PROTENIX_CONF_DEVICE=1, which keeps Protenix-v2's confidence head on the card, returns
    PAE and PDE that track the default path to 0.981 and 0.990 correlation, below the 0.99 a
    device path here has to clear; pLDDT is clean at 0.994. The flag ships off and the predicted
    structure never depends on it, so leave it off if you read PAE or PDE. 0.6.5 returns the same
    numbers: a pre-existing gap now measured, not a new one.