该存储库包括“ DNABERT:来自Transformers Model的DNABERT:基因组DNA语言”的预训练的双向编码器的实现。如果您使用型号或代码,请引用我们的论文。存储库仍在积极开发中,因此,如果遇到任何问题,请友好地报告。
在此软件包中,我们提供了资源,包括:DNABERT模型的源代码,使用示例,预训练模型,微调模型和可吸引工具。该软件包仍在开发中,因为将逐渐包含更多功能。 DNABERT的培训包括通用预培训和特定于任务的微调。作为我们项目的贡献,我们在此存储库中发布了预培训的模型。我们将密码从拥抱面扩展到了DNA场景。
DNABERT的第二代名为DNABERT-2,可在https://github.com/zhihan1996/dnabert_2上公开获得。 DNABERT-2对多种物种基因组进行了训练,并且比第一代更高效,功能更强大且易于使用。我们还提供了新软件包中更简单的DNABERT使用情况。包含的全面基准基因组理解评估(GUE)
如果您在研究中使用了DNABERT,请引用以下出版物:
@article{ji2021dnabert,
author = {Ji, Yanrong and Zhou, Zhihan and Liu, Han and Davuluri, Ramana V},
title = "{DNABERT: pre-trained Bidirectional Encoder Representations from Transformers model for DNA-language in genome}",
journal = {Bioinformatics},
volume = {37},
number = {15},
pages = {2112-2120},
year = {2021},
month = {02},
issn = {1367-4803},
doi = {10.1093/bioinformatics/btab083},
url = {https://doi.org/10.1093/bioinformatics/btab083},
eprint = {https://academic.oup.com/bioinformatics/article-pdf/37/15/2112/50578892/btab083.pdf},
}
@misc{zhou2023dnabert2,
title={DNABERT-2: Efficient Foundation Model and Benchmark For Multi-Species Genome},
author={Zhihan Zhou and Yanrong Ji and Weijian Li and Pratik Dutta and Ramana Davuluri and Han Liu},
year={2023},
eprint={2306.15006},
archivePrefix={arXiv},
primaryClass={q-bio.GN}
}
我们建议您使用Anaconda构建一个虚拟环境。另外,请确保您至少有一个具有Linux X86_64驱动程序版本> = 410.48的NVIDIA GPU(与CUDA 10.0兼容)。我们在8个NVIDIA GEFORCE RTX 2080 Ti上应用了分布式培训,具有11 GB图形存储器,批次大小与之相对应。如果您将GPU与其他规格和内存大小一起使用,请考虑相应地调整批次尺寸。
conda create -n dnabert python=3.6
conda activate dnabert
(必需的)
conda install pytorch torchvision cudatoolkit=10.0 -c pytorch
git clone https://github.com/jerryji1993/DNABERT
cd DNABERT
python3 -m pip install --editable .
cd examples
python3 -m pip install -r requirements.txt
(可选,安装APEX进行FP16培训)
通过cd PATH_NAME更改为所需目录
git clone https://github.com/NVIDIA/apex
cd apex
pip install -v --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./
请在/example/sample_data/pre中查看模板数据。如果您试图用自己的数据预先培训DNABERT,请将数据处理与其相同的格式。请注意,这些序列是以kmer格式的,因此您需要将序列转换为其中。我们还为此转换提供了一个自motif/motif_utils.py函数seq2kmer 。
在下面的示例中,我们将DNABERT与kmer = 6一起使用。
cd examples
export KMER=6
export TRAIN_FILE=sample_data/pre/6_3k.txt
export TEST_FILE=sample_data/pre/6_3k.txt
export SOURCE=PATH_TO_DNABERT_REPO
export OUTPUT_PATH=output$KMER
python run_pretrain.py
--output_dir $OUTPUT_PATH
--model_type=dna
--tokenizer_name=dna$KMER
--config_name=$SOURCE/src/transformers/dnabert-config/bert-config-$KMER/config.json
--do_train
--train_data_file=$TRAIN_FILE
--do_eval
--eval_data_file=$TEST_FILE
--mlm
--gradient_accumulation_steps 25
--per_gpu_train_batch_size 10
--per_gpu_eval_batch_size 6
--save_steps 500
--save_total_limit 20
--max_steps 200000
--evaluate_during_training
--logging_steps 500
--line_by_line
--learning_rate 4e-4
--block_size 512
--adam_epsilon 1e-6
--weight_decay 0.01
--beta1 0.9
--beta2 0.98
--mlm_probability 0.025
--warmup_steps 10000
--overwrite_output_dir
--n_process 24
添加-FP16标签如果要完善混合精度。 (您必须先从源安装“ Apex”)。
请在/example/sample_data/ft/中查看模板数据。如果您试图用自己的数据对DNABERT进行微调,请将数据处理与其相同的格式。请注意,这些序列是以kmer格式的,因此您需要将序列转换为其中。我们还为此转换提供了一个自motif/motif_utils.py函数seq2kmer 。
DNABERT3
DNABERT4
dnabert5
DNABERT6
将预训练的模型下载到目录中。 (如果您想复制以下示例,请下载DNABERT 6)。然后通过运行解压缩包:
unzip 6-new-12w-0.zip
我们还提供了一个具有KMER=6的模型,该模型在样本数据集上进行了微调,以进行预测/swulization/motif_analysis。如果您使用微调模型而不是通过自我微调模型,请下载微调并将其放在examples/ft/6下。
微调模型
在下面的示例中,我们将DNABERT与kmer = 6一起使用。我们使用prom-core ,一个2级分类任务为例。
cd examples
export KMER=6
export MODEL_PATH=PATH_TO_THE_PRETRAINED_MODEL
export DATA_PATH=sample_data/ft/$KMER
export OUTPUT_PATH=./ft/$KMER
python run_finetune.py
--model_type dna
--tokenizer_name=dna$KMER
--model_name_or_path $MODEL_PATH
--task_name dnaprom
--do_train
--do_eval
--data_dir $DATA_PATH
--max_seq_length 100
--per_gpu_eval_batch_size=32
--per_gpu_train_batch_size=32
--learning_rate 2e-4
--num_train_epochs 5.0
--output_dir $OUTPUT_PATH
--evaluate_during_training
--logging_steps 100
--save_steps 4000
--warmup_percent 0.1
--hidden_dropout_prob 0.1
--overwrite_output
--weight_decay 0.01
--n_process 8
添加-FP16标签如果要完善混合精度。 (您必须先从源安装“ Apex”)。
我们还提供了一个具有KMER=6的模型,该模型在样本数据集上进行了微调,以进行预测/swulization/motif_analysis。如果您使用微调模型而不是通过自我微调模型,请下载微调并将其放在examples/ft/6下。
微调模型
微调模型后,我们可以通过运行来获得预测
export KMER=6
export MODEL_PATH=./ft/$KMER
export DATA_PATH=sample_data/ft/$KMER
export PREDICTION_PATH=./result/$KMER
python run_finetune.py
--model_type dna
--tokenizer_name=dna$KMER
--model_name_or_path $MODEL_PATH
--task_name dnaprom
--do_predict
--data_dir $DATA_PATH
--max_seq_length 75
--per_gpu_pred_batch_size=128
--output_dir $MODEL_PATH
--predict_dir $PREDICTION_PATH
--n_process 48
使用上述命令,将从MODEL_PATH加载微调的DNABERT模型,并在保存在DATA_PATH中的dev.tsv文件上进行预测,并在PREDICTION_PATH上保存预测结果。
添加-FP16标签如果要完善混合精度。 (您必须先从源安装“ Apex”)。
DNABERT的Visualiazation由2个步骤组成。计算注意力评分和情节。
仅使用一个模型计算(例如,DNABERT6)
export KMER=6
export MODEL_PATH=./ft/$KMER
export DATA_PATH=sample_data/ft/$KMER
export PREDICTION_PATH=./result/$KMER
python run_finetune.py
--model_type dna
--tokenizer_name=dna$KMER
--model_name_or_path $MODEL_PATH
--task_name dnaprom
--do_visualize
--visualize_data_dir $DATA_PATH
--visualize_models $KMER
--data_dir $DATA_PATH
--max_seq_length 81
--per_gpu_pred_batch_size=16
--output_dir $MODEL_PATH
--predict_dir $PREDICTION_PATH
--n_process 96
使用上述命令,将从MODEL_PATH加载微调的DNABERT模型,并计算出保存在DATA_PATH中的dev.tsv文件上的注意力分数,并将结果保存在PREDICTION_PATH 。
添加-FP16标签如果要完善混合精度。 (您必须先从源安装“ Apex”)。
#### 5.2绘图工具
一旦产生了注意力分数,我们就可以进一步使用motif/find_motifs.py进行主题分析:
cd ../motif
export KMER=6
export DATA_PATH=../examples/sample_data/ft/$KMER
export PREDICTION_PATH=../examples/result/$KMER
export MOTIF_PATH=./result/$KMER
python find_motifs.py
--data_dir $DATA_PATH
--predict_dir $PREDICTION_PATH
--window_size 24
--min_len 5
--pval_cutoff 0.005
--min_n_motif 3
--align_all_ties
--save_file_dir $MOTIF_PATH
--verbose
该脚本将在MOTIF_PATH下为每个主题生成.txt文件和Weblogo .png文件。
要执行基因组变体分析(例如SNP),我们首先需要确保生成序列的预测。然后,创建一个文件(在SNP/example_mut_file.txt中的模板)指定dev.tsv中的序列以及我们需要执行突变的启动和最终索引。第一列表示要突变的dev.tsv中的序列索引。第二和第三列是开始和结束索引,而第四列是突变的目标(可以是替代,插入,删除等)。
创建了这样的文件后,我们可以对序列执行突变:
cd ../SNP
python mutate_seqs.py ./../examples/sample_data/ft/6/dev.tsv ./examples/ --mut_file ./example_mut_file.txt --k 6
另外,我们可以选择将--mut_file参数空白保留,在该程序中,该程序将尝试将所有碱基替换为所有序列的四个可能的核苷酸('a''','t','c'或'g')。这对于绘制纸张中包含的突变热图很有用。请注意,如果dev.tsv包含大量序列或输入序列很长,这将是慢的,因为该命令将尝试在其所有可能位置执行突变。
cd ../SNP
python mutate_seqs.py ./../examples/sample_data/ft/6/dev.tsv ./examples/ --k 6
之后,我们可以再次预测生成的序列。注意:如果您在mut_file.txt中有插入/删除,请考虑更改我们进行预测时使用的max_seq_length 。
export KMER=6
export MODEL_PATH=../examples/ft/$KMER
export DATA_PATH=examples
export PREDICTION_PATH=examples
python ../examples/run_finetune.py
--model_type dna
--tokenizer_name=dna$KMER
--model_name_or_path $MODEL_PATH
--task_name dnaprom
--do_predict
--data_dir $DATA_PATH
--max_seq_length 75
--per_gpu_pred_batch_size=128
--output_dir $MODEL_PATH
--predict_dir $PREDICTION_PATH
--n_process 48
这将再次在$PREDICTION_PATH下创建pred_results.npy文件。一旦拥有以上所有内容,我们就可以通过以下方式计算这些突变的效果:
python SNP.py
--orig_seq_file ../examples/sample_data/ft/6/dev.tsv
--orig_pred_file ../examples/result/6/pred_results.npy
--mut_seq_file examples/dev.tsv
--mut_pred_file examples/pred_results.npy
--save_file_dir examples
这将保存dev.tsv mutations.tsv save_file_dir
请确保您满足DNABERT的所有系统要求,并设置一个Conda环境。我们最近成功地测试了Amazon EC2深度学习AMI(Ubuntu 18.04)的管道。作为选择,您可以将系统/环境设置与此AMI进行比较。