scGPT — Single-Cell Foundation Model
SkillAI & modelsEmbed and annotate single-cell expression data with scGPT, a foundation model for single-cell biology. Use this skill when: (1) Producing cell embeddings from an AnnData for clustering/integration, (2) Zero-shot or fine-tuned cell-type annotation, (3) Gene-level representation for perturbation/GRN tasks.
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the scGPT — Single-Cell Foundation Model skill
What this skill tells your AI
The instructions your AI receives, as published by pku-yuangroup/openai4s in skills/scgpt/SKILL.md and read by ahel’s review.
Prerequisites
| Requirement | Minimum | Recommended |
|---|---|---|
| Python | 3.10+ | 3.11 |
| CUDA | 12.1+ | 12.4+ |
| GPU VRAM | 16 GB | 24 GB+ |
How to run
Loading the vocabulary and checkpoint
scGPT checkpoints are raw directories (args.json, best_model.pt,
vocab.json) — not Hugging Face hub repos. Point at the directory, not an HF
repo id.
from scgpt.tokenizer.gene_tokenizer import GeneVocab
gv = GeneVocab.from_file("/path/to/scgpt-human/vocab.json")
print(len(gv)) # 60697 for the released human checkpoint
Embedding an AnnData
import anndata as ad
from scgpt.tasks import embed_data
adata = ad.read_h5ad("dataset.h5ad") # var must contain a gene-name column
emb = embed_data(
adata,
model_dir="/path/to/scgpt-human",
gene_col="feature_name",
use_fast_transformer=False, # see Gotchas
)
# emb is an AnnData with .obsm["X_scGPT"]
Output format
embed_data returns an AnnData whose .obsm["X_scGPT"] is the per-cell
embedding (n_cells × emb_dim, 512 by default). Downstream: feed to
scanpy.pp.neighbors / scanpy.tl.umap.
Remote compute
Needs ≥24 GB VRAM and the released human checkpoint (~200 MB:
args.json, best_model.pt, vocab.json). Read
compute_details({provider, mode:'read'}) for an environment with scgpt
and a pre-cached checkpoint directory, then:
c = host.compute.create(provider)
job = c.submit_job(
intent="scGPT embed 50k cells — 1×GPU, ~5 min",
inputs=[
{"src": "dataset.h5ad", "dst_filename": "dataset.h5ad"},
{"src": "embed.py", "dst_filename": "embed.py"},
],
command="python3 embed.py",
environment=..., # env name from compute_details
outputs=["embedded.h5ad"],
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. Bind the compute handle separately when you poll from a
fresh kernel — .close() lives on the handle, not on the job object:
h = host.compute.create(provider)
res = h.attach_job(job_id).result() # {status, exit_code, output_files,
# featured_files, remote_workdir, …}
if res["status"] == "succeeded":
for path in res["featured_files"]: # paths under hpc/<job_id>/
host.save_artifact(path)
h.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.
In embed.py, pass model_dir= the checkpoint path from compute_details.
If flash-attn is unavailable in that environment, set
use_fast_transformer=False.
Gotchas
use_fast_transformerdefault isTruebut resolves to a FlashAttention path that may not import in every env. Passuse_fast_transformer=Falseunless you've confirmedflash_attnloads cleanly.- The package historically depended on
torchtext.vocab.Vocab; in environments without torchtext a pure-Python shim providesVocab— functionally identical forGeneVocab, but if you hitAttributeError: 'Vocab' object has no attribute …, you're on a stale shim. - Gene names must match the vocab; unmatched genes are dropped. Set
gene_colto the column inadata.varthat holds symbols.
Troubleshooting
| Symptom | Fix |
|---|---|
flash_attn is not installed warning at import | Harmless; pass use_fast_transformer=False |
'Vocab' object has no attribute 'vocab' | Env has an old torchtext shim — update the env |
| Nearly all genes dropped | Wrong gene_col; check adata.var.columns |
| "scgpt not in manifest" / env-detection misses scGPT | The baked env manifest lists the distribution as scGPT (and flash_attn), pip's canonical casing — normalize manifest keys before lookup: name.lower().replace('-', '_') |
Next: cluster/annotate the embedding with the scanpy library
(sc.pp.neighbors → sc.tl.leiden / sc.tl.umap), or compare to an
scvi-tools latent space on the same data.
Signals
- GitHub stars
- 404
- Forks
- 48
- Last commit
- Sep 2026
Advanced
- Catalog kind
- skill
- Gateway key
scgpt-pku-yuangroup- Source
- github.com/pku-yuangroup/openai4s