Evo 2 — DNA Language Model

SkillAI & models

Score, embed, and generate DNA sequences with Evo 2, a long-context genomic foundation model. Use this skill when: (1) Computing per-nucleotide or per-sequence likelihoods for variant effect scoring, (2) Embedding genomic windows for downstream classification, (3) Generating DNA conditioned on a prefix, (4) Scoring regulatory or coding regions across species.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the Evo 2 — DNA Language Model skill

What this skill tells your AI

The instructions your AI receives, as published by pku-yuangroup/openai4s in skills/evo2/SKILL.md and read by ahel’s review.

Prerequisites

RequirementMinimumRecommended
Python3.113.12 (<3.13)
CUDA12.1+12.4+
GPU VRAM24 GB (7B bf16)80 GB (40B)
RAM32 GB128 GB

How to run

Installation

pip install evo2
# Weights pulled from Hugging Face on first model load.

Loading and scoring

from evo2 import Evo2

model = Evo2("evo2_7b")        # or "evo2_40b" — see model table
seqs = ["ATCG" * 50, "GGGCTTAA" * 25]
ll = model.score_sequences(seqs)   # → list[float], mean per-token log-likelihood
print(ll)

Generation

out = model.generate(
    prompt_seqs=["ATGAAAGCT"],
    n_tokens=256,
    temperature=0.7,
)
print(out.sequences[0])

Models

NameParamsContextVRAM (bf16)Notes
evo2_7b7 B1 M nt~22 GBDefault; fits on a single 24 GB+ GPU
evo2_40b40 B1 M nt~78 GBH100 80 GB or multi-GPU
evo2_1b_base1 B8 K nt~6 GBFP8 path requires sm_89+ (H100)

Output format

score_sequences returns a list[float] (or np.ndarray) of mean log-likelihoods, one per input sequence. More negative ⇒ less likely under the model. For variant effect, compute Δll = ll_alt - ll_ref over a fixed window.

generate returns a GenerationOutput with .sequences (list[str]), .logits (list[Tensor]), and .logprobs_mean (list[float]) — always populated, no flag required.

Decision tree

Need a DNA model?
│
├─ Per-base/per-sequence likelihood, generation → Evo 2 ✓
├─ Predict experimental tracks (expression, accessibility) → borzoi
└─ Protein, not DNA → fair-esm2 / esmfold2

Remote compute

7B/40B inference is GPU-bound (≥24 GB / 80 GB VRAM). Read compute_details({provider, mode:'read'}) for an environment with evo2 + flash-attn and a pre-cached HF weight mount, then submit:

c = host.compute.create(provider)
job = c.submit_job(
    intent="Evo2-7B score 200bp variant window — 1×GPU, ~2 min",
    inputs=[{"src": "score_evo2.py", "dst_filename": "score_evo2.py"}],
    command="python3 score_evo2.py",   # env selection is host-specific — see compute_details for your provider
    outputs=["scores.json"],
    timeout_seconds=1800,
)
print(job.job_id)   # cell ends here — kernel never blocks on compute

Then poll from a later cell. .result() is one non-blocking probe of the remote and is what harvests the outputs once the job is terminal — nothing runs in the background, so a job you never poll is never harvested. While the job is still running it returns {"status": "running", …}; end the cell and call it again later:

r = c.attach_job(job_id).result()   # {status, exit_code, output_files,
                                    #  featured_files, remote_workdir, …}
if r["status"] == "succeeded":
    for path in r["featured_files"]:      # paths under hpc/<job_id>/
        host.save_artifact(path)
    c.close()
# `unknown` is not a finished job — poll again rather than closing over it.

See the remote-compute-ssh / remote-compute-nvidia skill for the orchestration details.

Inside score_evo2.py, point HF_HOME at the provider's weight-cache mount (path is in compute_details) and set HF_HUB_OFFLINE=1 so the loader doesn't try to write refs/ into a read-only mount. Weight footprint: ~15 GB (7B), ~80 GB (40B).

Typical performance

Task7B on H100Notes
Model load (cached)~5-7 minFirst call hydrates weights
score_sequences, 200×200bp~10-20 sAfter load
generate, 1×512 nt~15 s

Troubleshooting

SymptomCauseFix
Transformer Engine not installedNo FP8 — falls back to bf16Informational only on non-H100; ignore
OOM on load40B on <80 GB GPUUse evo2_7b or shard with device_map
HF tries to write refs/mainHF_HOME points at RO mountSet HF_HUB_OFFLINE=1
dtype mismatch in score_sequencesPassing tensors not stringsPass list[str]; the API tokenises for you

Next: pair with borzoi to predict track-level effects of the same variants.

Signals

GitHub stars
404
Forks
48
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
evo2-pku-yuangroup
Source
github.com/pku-yuangroup/openai4s