name: borzoi
description: >
Predict genome-wide functional tracks (RNA-seq, CAGE, DNase, ChIP) from DNA
sequence with Borzoi. Use this skill when:
(1) Scoring the regulatory effect of a variant on expression/accessibility,
(2) Generating predicted coverage tracks for a locus,
(3) Prioritising non-coding variants by predicted track delta.
license: Apache-2.0
origin: openai4s
category: biomodels
requirements: [gpu]
capabilities:
network:
mode: raw_required
domains: []
metadata:
# SKILL.md loads johahi/borzoi-replicate-0 — a PyTorch port of Calico's
# Borzoi ("ported weights (with permission)"). The HuggingFace model card
# for that exact artifact states License: cc-by-4.0. Calico's CODE repo is
# Apache-2.0, but the weights the skill downloads carry CC-BY-4.0. The model
# card is where the license is declared (info_url — not a ToU page).
# verified 2026-06-30
third_party:
- kind: weights
name: Borzoi (PyTorch port)
provider: Calico Life Sciences
license: CC-BY-4.0
info_url: https://huggingface.co/johahi/borzoi-replicate-0
| Requirement | Minimum | Recommended |
|---|---|---|
| Python | 3.10+ | 3.11 |
| CUDA | 12.1+ | 12.4+ |
| GPU VRAM | 16 GB | 24 GB+ |
from borzoi_pytorch import Borzoi
model = Borzoi.from_pretrained("johahi/borzoi-replicate-0").cuda().eval()
# input: (batch, 4, 524288) one-hot DNA → output: (batch, tracks, 6144) bins
Borzoi consumes ~524 kb one-hot windows and emits binned predictions across
7,611 human tracks (the separate 2,608-track mouse head is off by default;
enable via enable_mouse_head=True and select with
forward(..., is_human=False)). For variant scoring, run ref/alt windows
centred on the variant and compare per-track output.
(B, T, L) tensor — T tracks × L 32-bp bins. Track metadata (assay,
biosample) is in borzoi_pytorch.pytorch_borzoi_model.TRACKS_DF (or model.tracks_df when using the AnnotatedBorzoi subclass) — the base Borzoi model has no targets attribute.
Needs ≥24 GB VRAM and either pre-cached HF weights or egress to
huggingface.co. Read compute_details({provider, mode:'read'}) for an
environment with borzoi-pytorch, then:
c = host.compute.create(provider)
job = c.submit_job(
intent="Borzoi track prediction for 1 locus — 1×GPU, ~2 min",
inputs=[{"src": "borzoi_run.py", "dst_filename": "borzoi_run.py"}],
command="python3 borzoi_run.py", # env selection is host-specific — see compute_details for your provider
outputs=["tracks.npz"],
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.
If the provider exposes a weight-cache mount, point HF_HOME at it inside
borzoi_run.py (path is in compute_details).
| Symptom | Cause | Fix |
|---|---|---|
module has no __version__ |
Package exposes no attr | Use importlib.metadata.version("borzoi-pytorch") |
| Shape mismatch on input | Wrong window length | Pad/crop to 524288 bp (fixed; not exposed as a model attribute) |
Next: combine track deltas with evo2 likelihood deltas for a
two-axis variant prioritisation.