
BioEmu2
Sample, predict and propagate biomolecular structures with BioEmu2.
A crystal structure of adenylate kinase shows one conformation, but the enzyme spends its time opening and closing two lid domains around ATP. BioEmu2 is built for that gap. Given a molecular system, it draws many independent all-atom structures from the ensemble the model learned from PDB entries, AlphaFold Database models and Microsoft's molecular dynamics data. Sixteen samples of the 214-residue adenylate kinase take about three minutes on ProteinIQ.
BioEmu2 0.1.0rc0 from Microsoft Research AI for Science runs here with the bioemu2-preview checkpoint. It handles proteins, RNA, DNA, ligands, modified residues and covalent bonds in one system.
The webserver offers three tasks: equilibrium sampling, structure prediction and propagation of starting structures by a time lag. Each run returns BioEmu2's own XTC frames, mmCIF topology, per-frame physicality checks and the resolved system file.
BioEmu, the first version, samples single protein monomers only. Use BioEmu2 for complexes, ligands, nucleic acids, structure prediction or anything time-dependent.
BioEmu2 is a diffusion model with about 500 million parameters. A trunk reads the system as tokens (one per standard residue, one per heavy atom of a ligand or modified residue), together with the alignment and any contacts, and computes embeddings once per job. A denoiser then starts each sample from random atom coordinates and removes noise over 200 steps until an all-atom structure remains.
The same weights serve every task. Equilibrium sampling tells the model to produce structures like its molecular dynamics training data, while structure prediction asks for static structures like those in the PDB and AlphaFold Database and uses a step scale of 1.5 to sharpen toward one fold.
Propagation adds a starting structure and a lag time as conditions, so the denoiser draws where that structure is likely to be after the lag. Steering samplers apply potentials during denoising that penalize clashes and broken bonds or favour a property you define.
BioEmu2 is billed by measured runtime at 20 credits per minute, rounded up to a whole credit for each job. Submission reserves at least 20 credits and returns whatever the finished run does not use. The quote shown before submission is an estimate: about one minute to start, load the model and embed the system, plus 9.4 seconds per frame, or 21 seconds per frame with a steering sampler, at 200 denoising steps. A ColabFold alignment adds an estimated minute; for Trp-cage the whole job took 31 seconds of BioEmu2 time.
| Run | Estimate before submission |
|---|---|
| Equilibrium sampling, 1 sample | 24 credits |
| Equilibrium sampling, 8 samples (default) | 46 credits |
| Equilibrium sampling, 16 samples | 71 credits |
| Equilibrium sampling, 64 samples | 221 credits |
| Equilibrium sampling, 256 samples | 823 credits |
| Equilibrium sampling, 16 samples, 50 denoising steps | 33 credits |
Equilibrium sampling, 16 samples, edm_gd | 132 credits |
Structure prediction, 4 structures, edm_gd | 48 credits |
| Propagation, 8 endpoints | 46 credits |
The estimate does not yet account for system size, so a large complex runs longer than its quote and a small peptide shorter; the charge follows the actual runtime. On ProteinIQ, 16 equilibrium samples of adenylate kinase ran for 186 seconds, and 4 steered structures of myoglobin with heme took 135 seconds. Alignment depth has little effect: adenylate kinase with 16,866 aligned sequences and with its query alone took about the same time.
Build the system from molecule cards, as for Boltz-2: one card per protein, DNA, RNA, SMILES ligand or CCD ligand, each with a copy count. Chains are lettered in card order with copies expanded, and the label on each card shows its chain IDs. Contacts and covalent bonds refer to those IDs. For propagation, the cards are optional when the starting structure's mmCIF already describes the system.
| Input | Accepted formats | Limits and behavior |
|---|---|---|
| Protein | Sequence or one-record FASTA, .fasta or .fa file, or an RCSB chain | Up to 20 cards. Each card can carry residue modifications (position and CCD code) and its own A3M alignment. |
| DNA, RNA | Sequence or one-record FASTA | Up to 20 cards each. Each card can carry residue modifications (position and CCD code), such as 5CM or PSU. |
| Ligand | SMILES text, .smi or .smiles file, or a PubChem record | Up to 20 cards. |
| CCD ligand | One CCD code, such as HEM, ATP or MG | Up to 20 cards. |
| System file | BioEmu2 system YAML (entities:), Boltz input YAML (sequences:) or mmCIF (.cif) | Instead of cards, up to 50 MB. BioEmu2 YAML also covers branched entities such as glycans. Boltz files are converted with BioEmu2's own converter; mmCIF must carry entity metadata. |
| PDB ID | Four characters, such as 1AKE | Instead of cards. Loads biological assembly 1 from RCSB with all chains and non-water ligands. |
| MSA for a system file | .a3m files | Optional with a system file or PDB ID: one alignment per unique protein sequence, up to 50 files of 50 MB, matched to chains by their first record. Without them, Generate MSA retrieves alignments from ColabFold. |
| Steering potentials | .yaml or .yml, up to 1 MB | Optional, with a steering sampler. |
| Starting structure | .cif | Required for propagation. Every atom of the system must be present in system order, as in a BioEmu2 topology.cif. |
| Starting frames | .xtc, up to 50 MB | Optional for propagation. One start per frame. |
Alignments come from the public ColabFold server by default, through BioEmu2's own retrieval: one alignment per unique protein sequence, plus paired alignments for complexes of different proteins. To use your own instead, attach an A3M to every protein card; BioEmu2 takes all alignments from ColabFold or all from files, so attach one to every protein or to none. Turn off Generate MSA to keep sequences on ProteinIQ; proteins without an A3M then run in single-sequence mode, which the job reports as a warning. The cards become a BioEmu2 system YAML, kept as records/system-from-cards.yaml.
| Parameter | Type | Default | Description |
|---|---|---|---|
Task (mode) | enum | sample-equilibrium | sample-equilibrium, predict-structure or propagate. |
PDB ID (pdb_id) | string | optional | Four-character RCSB identifier; use instead of a system file. |
Generate MSA (generate_msa) | boolean | true | Retrieve alignments from ColabFold for proteins without an A3M. Off: those proteins run in single-sequence mode. |
Number of samples (num_samples) | integer | 8 | Structures to generate in equilibrium sampling and structure prediction. At least 1. |
Starts from the structure (num_endpoints) | integer | conditional | Propagation: how many times to repeat the starting structure. Leave blank when uploading starting frames. |
Lag time (ns) (lag_time_ns) | number | required for propagation | Positive time lag in nanoseconds. BioEmu2 recommends 1 to 1000 ns. |
Contacts (contacts) | string | optional | One contact per line, chain:residue,chain:residue|max_distance, for example A:96,C:FE|6.0. Use chain:atom for a ligand atom and chain:residue:atom for an atom in a modified residue. Distance 4 to 20 Å, default 6. Molecule cards only. |
Covalent bonds (bonds) | string | optional | One bond per line, chain:residue:atom,chain:residue:atom, for example A:3:SG,A:8:SG; chain:atom for a CCD ligand. Declare every disulfide. Molecule cards only. |
| Parameter | Type | Default | Description |
|---|---|---|---|
Sampler (sampler) | enum | edm | edm (unsteered), edm_gd (gradient guidance), edm_fk (Feynman-Kac resampling) or edm_fkc (Feynman-Kac corrector). |
Denoising steps (num_steps) | integer | optional | Overrides the sampler's 200 steps. |
Physicality checks (physicality_filter) | enum | high_quality | high_quality, high_quality_per_residue, no_violations or no_filter. |
Random seed (seed) | string | optional | Integer seed. Blank leaves runs unseeded. |
| Job name | string | optional | A label for the run. |
Precision (bf16-mixed), matmul precision (high) and batch size (all samples together) stay at BioEmu2's defaults. Multi-GPU context-parallel sampling for systems larger than one GPU is not available.
The three steering samplers start from BioEmu2's ten default physicality potentials, which penalize bond length and angle errors, van der Waals overlaps, chain clashes, ligand distance violations, wrong chirality and non-planar ligand bonds. An uploaded potentials file replaces that set. Each entry names a class with _target_ and passes its constructor arguments:
potentials:
- _target_: bioemu2.denoising.steering.potentials.BondLengthPotential
sigma_tolerance: 10.0
parameters: {guidance_weight: 0.05, resampling_weight: 0.1}Targets must be BioEmu2's potential classes (PoseBustersPotential, InterChainVDWOverlapPotential, IntraChainVDWOverlapPotential, PolymerLocalClashPotential, SymmetricChainCOMPotential, StereoBondPotential, ChiralAtomPotential, PlanarBondPotential, ContactPotential, TemplateReferencePotential, BondLengthPotential, BondAnglePotential) or its schedules (ExponentialInterpolation, PiecewiseStepFunction, LinearInterpolation). Other Hydra controls and ${...} interpolation are not accepted.
Structures loads the topology with every frame for playback. Files lists each download.
| Download | Contents |
|---|---|
native/samples.xtc | Every generated frame, including frames that fail physicality checks. Equilibrium sampling, structure prediction and propagation. |
native/topology.cif | The system's topology with frame 0 coordinates. For propagation, the first starting structure. |
native/physicality.json | One record per XTC frame: frame, status and reason. |
native/system.yaml | The resolved system, task mode and contacts, as BioEmu2 read them. |
input/ | The submitted files, unchanged. |
records/run.log | BioEmu2's log, with stage timings, physicality summaries and warnings. |
records/provenance.json | Settings, input hashes, source commit, checkpoint and dependency versions. |
records/request.json, converted-system.yaml | The resolved run request, and the converted Boltz input when one was used. |
records/colabfold-msa/ | When ColabFold supplied the alignments: BioEmu2's cache entries as returned, and unpaired_NN.a3m with each protein's unpaired alignment, which you can attach to the card to rerun without ColabFold. |
records/BIOEMU2-* | BioEmu2 licence, third-party notices and model card. |
Load samples.xtc with topology.cif in MDTraj, VMD, PyMOL or ChimeraX. Coordinates are in nanometres, as XTC stores them.
The frames in samples.xtc from equilibrium sampling and structure prediction are a bag of independent structures, not a time series. Frame 7 is not later than frame 6, and neighbouring frames are unrelated. Propagation endpoints are also independent: endpoint i is a structure one lag time after starting frame i, superposed on it. No task returns a time-ordered trajectory.
Structure prediction and equilibrium sampling answer different questions. Prediction uses a step scale of 1.5, which sharpens the distribution toward the most likely fold, so its frames should agree with each other. Equilibrium sampling uses 1.0 and is meant to spread across the conformations the model considers accessible. A tight equilibrium ensemble is a result, not a failure, and a spread-out prediction is a warning about the input.
Each record in physicality.json has a status of passed, rejected or not_checked, and for rejected frames the first failed check in reason. Checks cover protein chains only: ligands, RNA, DNA and single-residue chains are never checked, and a system with no protein chain reports not_checked. Rejected frames stay in the XTC, so filter by frame index when you need clean structures.
reason | high_quality threshold (count per frame) |
|---|---|
bad_bonds_backbone | more than 5 |
bad_bonds_sidechain | more than 10 residues |
within_residue_clashes | more than 5 |
valence_exceeded | more than 10 |
isolated_atoms | more than 1 |
same_chain_residue_clashes | more than 10 atom pairs |
cross_chain_residue_clashes | more than 5 atom pairs |
bad_bonds_sulfur, duplicate_atoms, atoms_mismatch, bonds_mismatch | any |
non_finite_atoms | any |
no_violations allows none of these, and high_quality_per_residue divides the counts by the number of protein residues (for example, more than 0.05 backbone bond errors per residue). A rejected frame most often means a clash or a broken bond, which a steering sampler such as edm_gd is designed to reduce. The run log and the job's warnings report how many frames failed.
On ProteinIQ, all 16 unsteered adenylate kinase samples, and all 4 edm_gd myoglobin structures with heme passed high_quality. Passing means plausible geometry, not a correct conformation: compare against known structures with RMSD or TM-score, and check geometry in detail with MolProbity.
How often a conformation appears in the samples is not a calibrated Boltzmann probability or a free energy, according to the BioEmu2 model card. Use the ensemble to see which states exist and how they differ, not to read off populations. Quality falls with shallow alignments, so orphan proteins, designed sequences and some viral proteins are less reliable, and a query-only A3M removes evolutionary information entirely. BioEmu2 does not predict binding affinity.
For propagation, BioEmu2 recommends lags from 1 to 1000 ns, the range the model mostly saw in training. Endpoints at longer lags look more and more like equilibrium samples, and beyond a few milliseconds the starting structure no longer matters. For physics-based dynamics of the same system, OpenMM and GROMACS run molecular dynamics simulations.
A seed fixes the random numbers sampling starts from, but GPU arithmetic is not bit-for-bit repeatable between runs. On ProteinIQ, repeated seeded runs with the steering samplers gave slightly different coordinates; edm_fkc varies even within one machine, because its guidance takes gradients through the denoiser.
v0.1.0rc0.