Views
No views yet
text-embedding-3-large) into a shared 512-dimensional space.| Property | Value |
|---|---|
| Architecture | Dual-tower (CLIP-style) |
| Sequence encoder | Linear projection → Transformer encoder → mean pooling → 512-d |
| Text encoder | Linear projection → MLP → 512-d |
| Input sequence dim | 3072 (AlphaGenome embeddings_128bp) |
| Input text dim | 3072 (OpenAI text-embedding-3-large) |
| Output dim | 512 (L2-normalized) |
| Parameters | 58.8M |
DNA sequence "ATCG..."
→ AlphaGenome (embeddings_128bp)
→ per-gene tokens (L, 3072)
→ L2-normalize each token ← important preprocessing step
→ GenomeClip sequence encoder
→ (512,) L2-normalized embedding
↕ cosine similarity
Gene description "This gene encodes..."
→ OpenAI text-embedding-3-large
→ (3072,) vector
→ GenomeClip text encoder
→ (512,) L2-normalized embedding1import torch
2from transformers import AutoModel
3
4model = AutoModel.from_pretrained(
5 "your-username/GenomeClip-v1",
6 trust_remote_code=True,
7)
8model.eval()
9
10# Encode DNA sequence embeddings (from AlphaGenome)
11# seq_emb: (batch, num_tokens, 3072) — L2-normalized per token
12# seq_lengths: (batch,) — number of valid tokens per sample
13seq_emb = torch.randn(2, 50, 3072)
14seq_emb = torch.nn.functional.normalize(seq_emb, dim=-1) # L2-norm each token
15seq_lengths = torch.tensor([50, 35])
16
17with torch.no_grad():
18 seq_repr = model.encode_sequence(seq_emb, seq_lengths) # (2, 512)
19
20# Encode text embeddings (from OpenAI text-embedding-3-large)
21text_emb = torch.randn(2, 3072)
22
23with torch.no_grad():
24 text_repr = model.encode_text(text_emb) # (2, 512)
25
26# Cross-modal similarity
27similarity = seq_repr @ text_repr.t() # (2, 2) cosine similarity matrix
28print(similarity)embeddings_128bp (3072-dim per 128bp window)(batch, L, 3072) where L = ceil(gene_length_bp / 128)seq_emb = torch.nn.functional.normalize(seq_emb, dim=-1)(batch, 3072) (auto-expanded to L=1)text-embedding-3-large
applied to NCBI gene summaries (following the
GenePT methodology)(batch, 3072)(batch,) — number of valid (non-padding) tokens per sampleseq_repr = model.encode_sequence(seq_emb, seq_lengths) # (B, 512)text_repr = model.encode_text(text_emb) # (B, 512)1out = model(
2 seq_embeddings=seq_emb,
3 text_embeddings=text_emb,
4 seq_lengths=seq_lengths,
5)
6# out.seq_repr: (B, 512)
7# out.text_repr: (B, 512)
8# out.loss: scalar (symmetric InfoNCE)
9# out.logits: (B, B) similarity matrix1# Pre-compute all gene embeddings (do this once)
2all_seq_reprs = []
3for batch in seq_dataloader:
4 with torch.no_grad():
5 all_seq_reprs.append(model.encode_sequence(batch["seq"], batch["lengths"]))
6all_seq_reprs = torch.cat(all_seq_reprs) # (N_genes, 512)
7
8# Query: find genes matching a text description
9query_text_repr = model.encode_text(query_text_emb) # (1, 512)
10similarities = query_text_repr @ all_seq_reprs.t() # (1, N_genes)
11top_matches = similarities.argsort(descending=True)[0, :10]pip install alphagenome-research1# See https://huggingface.co/google/alphagenome-all-folds for full setup
2from alphagenome_research.model.one_hot_encoder import DNAOneHotEncoder
3
4encoder = DNAOneHotEncoder()
5one_hot = encoder.encode(dna_sequence) # (seq_len, 4)
6# ... run AlphaGenome model ...
7# Extract: result.embeddings_128bp → (L, 3072)1from openai import OpenAI
2
3client = OpenAI()
4response = client.embeddings.create(
5 input="BRCA1 DNA repair associated. This gene encodes a nuclear phosphoprotein...",
6 model="text-embedding-3-large",
7)
8text_emb = response.data[0].embedding # list of 3072 floats1@misc{genomeclip2025,
2 title={GenomeClip: Contrastive Alignment of DNA Sequence and Text Embeddings},
3 year={2025},
4}