EVO Models
In [2]:
Copied!
from dnallm import load_config
from dnallm import load_model_and_tokenizer, DNAInference
from dnallm import load_config
from dnallm import load_model_and_tokenizer, DNAInference
In [3]:
Copied!
# Load configurations
configs = load_config("./inference_evo_config.yaml")
# Load configurations
configs = load_config("./inference_evo_config.yaml")
EVO2¶
In [4]:
Copied!
## Make sure you have installed the dependencies for Evo2 model
## (Install flash_attn and transformer-engine require compile, which may take a while)
# !uv pip install "flash_attn<=2.7.4.post1" --no-build-isolation --no-cache-dir
# !uv pip install "transformer-engine[pytorch]==2.3.0" --no-build-isolation --no-cache-dir
# !uv pip install evo2==0.3.0
## Make sure you have installed the dependencies for Evo2 model
## (Install flash_attn and transformer-engine require compile, which may take a while)
# !uv pip install "flash_attn<=2.7.4.post1" --no-build-isolation --no-cache-dir
# !uv pip install "transformer-engine[pytorch]==2.3.0" --no-build-isolation --no-cache-dir
# !uv pip install evo2==0.3.0
In [5]:
Copied!
model_name = "arcinstitute/evo2_1b_base"
model, tokenizer = load_model_and_tokenizer(model_name, task_config=configs['task'], source="huggingface")
model_name = "arcinstitute/evo2_1b_base"
model, tokenizer = load_model_and_tokenizer(model_name, task_config=configs['task'], source="huggingface")
15:15:35 - dnallm.utils.support - WARNING - Generation task does not require num_labels, but got 1. Setting to 0.
[03/24/26 15:15:39] INFO root - INFO - Could not find package transformer_engine_jax. Install __init__.py:58 transformer-engine using 'pip3 install transformer-engine[jax]==VERSION'
15:15:39 - dnallm.utils.support - WARNING - Current device compute capability is 8.0, which does not support FP8.
Fetching 4 files: 0%| | 0/4 [00:00<?, ?it/s]
README.md: 0.00B [00:00, ?B/s]
15:15:42 - dnallm.utils.support - INFO - Model files are stored in /home/liuguanqing/.cache/huggingface/hub/models--arcinstitute--evo2_1b_base/snapshots/2279e1df422c991037470302360edd40d0d2ea1e
Loading model from /home/liuguanqing/.cache/huggingface/hub/models--arcinstitute--evo2_1b_base/snapshots/2279e1df422c991037470302360edd40d0d2ea1e/evo2_1b_base.pt... Loading config from /home/liuguanqing/github/dnallm_dev/DNALLM/dnallm/configuration/evo/evo2-1b-8k-noFP8.yml...
INFO StripedHyena - INFO - Initializing StripedHyena with config: model.py:616 {'model_name': 'shc-evo2-1b-8k-2T-v2', 'vocab_size': 512, 'hidden_size': 1920, 'num_filters': 1920, 'attn_layer_idxs': [3, 10, 17, 24], 'hcl_layer_idxs': [2, 6, 9, 13, 16, 20, 23], 'hcm_layer_idxs': [1, 5, 8, 12, 15, 19, 22], 'hcs_layer_idxs': [0, 4, 7, 11, 14, 18, 21], 'hcm_filter_length': 128, 'hcl_filter_groups': 1920, 'hcm_filter_groups': 128, 'hcs_filter_groups': 128, 'hcs_filter_length': 7, 'num_layers': 25, 'short_filter_length': 3, 'num_attention_heads': 15, 'short_filter_bias': False, 'mlp_init_method': 'torch.nn.init.zeros_', 'mlp_output_init_method': 'torch.nn.init.zeros_', 'eps': 1e-06, 'state_size': 16, 'rotary_emb_base': 10000, 'make_vocab_size_divisible_by': 8, 'inner_size_multiple_of': 16, 'inner_mlp_size': 5120, 'log_intermediate_values': False, 'proj_groups': 1, 'hyena_filter_groups': 1, 'column_split_hyena': False, 'column_split': True, 'interleave': True, 'evo2_style_activations': True, 'model_parallel_size': 1, 'pipe_parallel_size': 1, 'tie_embeddings': True, 'mha_out_proj_bias': True, 'hyena_out_proj_bias': True, 'hyena_flip_x1x2': False, 'qkv_proj_bias': False, 'use_fp8_input_projections': False, 'max_seqlen': 8192, 'max_batch_size': 1, 'final_norm': True, 'use_flash_attn': True, 'use_flash_rmsnorm': False, 'use_flash_depthwise': False, 'use_flashfft': False, 'use_laughing_hyena': False, 'inference_mode': True, 'tokenizer_type': 'CharLevelTokenizer', 'prefill_style': 'fft', 'mlp_activation': 'gelu', 'print_activations': False}
0%| | 0/25 [00:00<?, ?it/s]
16%|█▌ | 4/25 [00:00<00:00, 32.80it/s]
88%|████████▊ | 22/25 [00:00<00:00, 111.80it/s]
100%|██████████| 25/25 [00:00<00:00, 105.07it/s]
Extra keys in state_dict: {'blocks.24.mixer.dense._extra_state', 'blocks.10.mixer.dense._extra_state', 'blocks.3.mixer.dense._extra_state', 'blocks.17.mixer.dense._extra_state', 'unembed.weight'}
In [6]:
Copied!
# Create inference engine
inference_engine = DNAInference(
model=model,
tokenizer=tokenizer,
config=configs
)
# Create inference engine
inference_engine = DNAInference(
model=model,
tokenizer=tokenizer,
config=configs
)
In [7]:
Copied!
output = inference_engine.generate(["@", "ATG"])
output = inference_engine.generate(["@", "ATG"])
WARNING: Batched generation is turned off.
Initializing inference params with max_seqlen=401
/home/liuguanqing/github/dnallm_dev/DNALLM/.venv/lib/python3.12/site-packages/vortex/model/engine.py:559: UserWarning: Casting complex values to real discards the imaginary part (Triggered internally at /pytorch/aten/src/ATen/native/Copy.cpp:308.) inference_params.state_dict[layer_idx] = state[..., L - 1].to(dtype=state_dtype)
Initializing inference params with max_seqlen=403 Prompt: "@", Output: "GCGCTCCTATTGTGTCGAACATTCAGAGAATTCTTCGAGTTAGAGTCAGAGTCAAATTTCTCAAAAGCATATGTTATTTACAAGTGGCACGTCCTATCAATAGCGCATAGTGAAGTACACGGCCGTGGCGACCCCCCGCTTGACCTTATATTTTTCAGAATTGGAATATATATATTATATCTGGGCCTAACTTGTTGGACCTTTTATTCATAGGATCGGGCCAGAACTCGGCGGTTAAGGCTCTTCGAAACATTAGACTCGCAAATGTCAGTCGTCCGGAAGGCATTTTATAGTGCCACGACAGCTGACAGAGCGCCTGGAATCGTCACACACTAACTGAAGTATAGTACACATATTAAACCTAATGTATGGTAGGAAGTCCGTTTCACCAAACAAATTT", Score: -1.3790439367294312 Prompt: "ATG", Output: "GATGGCTGCCGAAAATCACTTAGCATCCTGCAATTTCCAACTCGGCCCAAGCCAAATCAAATACTTCTTTAAAAACAATTGCGTTTGATCCTTTCATTTTACCAAACCAGGATATTATCAGTGATCCCTATGTTATTAGTTTTAAAATTGTAGAGAGTGGTTTATAACAATAATTGTGCACAATTTGGCAGTCACTACGGGTCTATCACTGATTTCACGTGTCAGCACAGTGAAGACGTACCAGCCGTGAAGCATCCACTAGTAAAAGTAAATGTGACATTCTTTGAGTAATGCACCAAGATGTGTAAGAAGTTCTTCTCTTGCGCAATGAGGTAGCTTCAGTCCTGTACATGGTTATTAGCAGCCACGTATCGTCATCAGTACAACCACAATCCAAATT", Score: -1.3493103981018066
In [8]:
Copied!
for seq in output:
print(f"Input Sequence: {seq['Prompt']}")
print(f"Generated Sequence: {seq['Output']}")
print(f"Score: {seq['Score']}")
print()
for seq in output:
print(f"Input Sequence: {seq['Prompt']}")
print(f"Generated Sequence: {seq['Output']}")
print(f"Score: {seq['Score']}")
print()
Input Sequence: @ Generated Sequence: GCGCTCCTATTGTGTCGAACATTCAGAGAATTCTTCGAGTTAGAGTCAGAGTCAAATTTCTCAAAAGCATATGTTATTTACAAGTGGCACGTCCTATCAATAGCGCATAGTGAAGTACACGGCCGTGGCGACCCCCCGCTTGACCTTATATTTTTCAGAATTGGAATATATATATTATATCTGGGCCTAACTTGTTGGACCTTTTATTCATAGGATCGGGCCAGAACTCGGCGGTTAAGGCTCTTCGAAACATTAGACTCGCAAATGTCAGTCGTCCGGAAGGCATTTTATAGTGCCACGACAGCTGACAGAGCGCCTGGAATCGTCACACACTAACTGAAGTATAGTACACATATTAAACCTAATGTATGGTAGGAAGTCCGTTTCACCAAACAAATTT Score: -1.3790439367294312 Input Sequence: ATG Generated Sequence: GATGGCTGCCGAAAATCACTTAGCATCCTGCAATTTCCAACTCGGCCCAAGCCAAATCAAATACTTCTTTAAAAACAATTGCGTTTGATCCTTTCATTTTACCAAACCAGGATATTATCAGTGATCCCTATGTTATTAGTTTTAAAATTGTAGAGAGTGGTTTATAACAATAATTGTGCACAATTTGGCAGTCACTACGGGTCTATCACTGATTTCACGTGTCAGCACAGTGAAGACGTACCAGCCGTGAAGCATCCACTAGTAAAAGTAAATGTGACATTCTTTGAGTAATGCACCAAGATGTGTAAGAAGTTCTTCTCTTGCGCAATGAGGTAGCTTCAGTCCTGTACATGGTTATTAGCAGCCACGTATCGTCATCAGTACAACCACAATCCAAATT Score: -1.3493103981018066
In [9]:
Copied!
scores = inference_engine.scoring(["ATCCGCATG", "ATGCGCATG"])
for res in scores:
print(f"Input Sequence: {res['Input']}")
print(f"Score: {res['Score']}")
print()
scores = inference_engine.scoring(["ATCCGCATG", "ATGCGCATG"])
for res in scores:
print(f"Input Sequence: {res['Input']}")
print(f"Score: {res['Score']}")
print()
100%|██████████| 2/2 [00:00<00:00, 46.22it/s]
Input Sequence: ATCCGCATG Score: -1.4130859375 Input Sequence: ATGCGCATG Score: -1.4072265625
EVO1¶
In [10]:
Copied!
## Make sure you have installed the dependencies for Evo-1 model
# !uv pip install "flash_attn<=2.7.4.post1" --no-build-isolation --no-cache-dir
# !uv pip install evo-model==0.4
## Make sure you have installed the dependencies for Evo-1 model
# !uv pip install "flash_attn<=2.7.4.post1" --no-build-isolation --no-cache-dir
# !uv pip install evo-model==0.4
In [11]:
Copied!
model_name = "togethercomputer/evo-1-131k-base"
model, tokenizer = load_model_and_tokenizer(model_name, task_config=configs['task'], source="huggingface")
model_name = "togethercomputer/evo-1-131k-base"
model, tokenizer = load_model_and_tokenizer(model_name, task_config=configs['task'], source="huggingface")
15:16:01 - dnallm.utils.support - WARNING - Generation task does not require num_labels, but got 1. Setting to 0.
Fetching 21 files: 0%| | 0/21 [00:00<?, ?it/s]
15:16:01 - dnallm.utils.support - INFO - Model files are stored in /home/liuguanqing/.cache/huggingface/hub/models--togethercomputer--evo-1-131k-base/snapshots/78c715ab81852e02ec3b1c7e795dc7250d8c7625
Loading checkpoint shards: 0%| | 0/3 [00:00<?, ?it/s]
In [12]:
Copied!
# Create inference engine
inference_engine = DNAInference(
model=model,
tokenizer=tokenizer,
config=configs
)
# Create inference engine
inference_engine = DNAInference(
model=model,
tokenizer=tokenizer,
config=configs
)
In [13]:
Copied!
output = inference_engine.generate(["@", "ACGT"])
output = inference_engine.generate(["@", "ACGT"])
Note: Prompts are of different lengths. Note: Will not do batched generation.
Prompt: "@", Output: "TGCGCCCCCAAAACTCAAAATAAAACGCTTCGCTTACTCAAAGAAGCCAAAAAGCTTGCTCCCGTCAAAGAAGAACGTGATACAAAAAGTAAAACCCCAATTGGGCCAACGTCGCATGTAACAGATGCCCAGCCCCGTGCAGACAAGCAAGGCAAACCAATACGGTTTCTGCTTTAATTTTTTACGTTTTTCTAACCTTGTTTTTACCAAAAAATGCTTTGCTCTTTCTCATTTTGTCGCTCATACACAGCATAGCAACATTGACTCCTGCTGCAGAAAAGTTTTCTTTCTTCATTCATTTTTGGTTTTTAACCACACTTTCACGTTTCAATATTGCTTATTTTTTACTAAATAAAACCACTCCTCTTTTTGTTAATTCTCCGTCTGTGGGCAGAAATGT", Score: -1.3733898401260376 Prompt: "ACGT", Output: "AAAACCAACAAGCTCAAAAAAGAAAAAAAGGCAAAAACAAAAAACAAAAACACAAACAGCAAAAAAAACACCCCGCTTCAACAAAAGCTCAACCGCTGCAAAAAAAAATACCCAAAACTCAATATTATGATTATCATGCGTAAAAATCACACCGCAAGTAACAACAAAAATAAATCCCGCTGACCCACAAATATACCTCACCAGCCTGTAACACCAGAAAAACATCAGGCTCAAAAAAATAAAACCAAAACTGAAAAAATAAAATAACAGCAGAAAAAAAAATAAAATCAAAGAACAAAAAAAGAAAAACACAAAAAACGTAGCGCAAAAAAAAATAAAAAAAATAACCGCCGGCGGCGGACAAATAACAATTGCCAGAACAGCACGCCGCAGCAGCACA", Score: -1.332802176475525
In [14]:
Copied!
for seq in output:
print(f"Input Sequence: {seq['Prompt']}")
print(f"Generated Sequence: {seq['Output']}")
print(f"Score: {seq['Score']}")
print()
for seq in output:
print(f"Input Sequence: {seq['Prompt']}")
print(f"Generated Sequence: {seq['Output']}")
print(f"Score: {seq['Score']}")
print()
Input Sequence: @ Generated Sequence: TGCGCCCCCAAAACTCAAAATAAAACGCTTCGCTTACTCAAAGAAGCCAAAAAGCTTGCTCCCGTCAAAGAAGAACGTGATACAAAAAGTAAAACCCCAATTGGGCCAACGTCGCATGTAACAGATGCCCAGCCCCGTGCAGACAAGCAAGGCAAACCAATACGGTTTCTGCTTTAATTTTTTACGTTTTTCTAACCTTGTTTTTACCAAAAAATGCTTTGCTCTTTCTCATTTTGTCGCTCATACACAGCATAGCAACATTGACTCCTGCTGCAGAAAAGTTTTCTTTCTTCATTCATTTTTGGTTTTTAACCACACTTTCACGTTTCAATATTGCTTATTTTTTACTAAATAAAACCACTCCTCTTTTTGTTAATTCTCCGTCTGTGGGCAGAAATGT Score: -1.3733898401260376 Input Sequence: ACGT Generated Sequence: AAAACCAACAAGCTCAAAAAAGAAAAAAAGGCAAAAACAAAAAACAAAAACACAAACAGCAAAAAAAACACCCCGCTTCAACAAAAGCTCAACCGCTGCAAAAAAAAATACCCAAAACTCAATATTATGATTATCATGCGTAAAAATCACACCGCAAGTAACAACAAAAATAAATCCCGCTGACCCACAAATATACCTCACCAGCCTGTAACACCAGAAAAACATCAGGCTCAAAAAAATAAAACCAAAACTGAAAAAATAAAATAACAGCAGAAAAAAAAATAAAATCAAAGAACAAAAAAAGAAAAACACAAAAAACGTAGCGCAAAAAAAAATAAAAAAAATAACCGCCGGCGGCGGACAAATAACAATTGCCAGAACAGCACGCCGCAGCAGCACA Score: -1.332802176475525
In [15]:
Copied!
scores = inference_engine.scoring(["ATCCGCATG", "ATGCGCATG"])
for res in scores:
print(f"Input Sequence: {res['Input']}")
print(f"Score: {res['Score']}")
print()
scores = inference_engine.scoring(["ATCCGCATG", "ATGCGCATG"])
for res in scores:
print(f"Input Sequence: {res['Input']}")
print(f"Score: {res['Score']}")
print()
Input Sequence: ATCCGCATG Score: -3.7654080390930176 Input Sequence: ATGCGCATG Score: -3.502007484436035
In [ ]:
Copied!