Ce référentiel comprend la mise en œuvre de «DNABert: Représentations de codeur bidirectionnelles pré-formées à partir du modèle Transformers pour la langue ADN dans le génome». Veuillez citer notre article si vous utilisez les modèles ou les codes. Le repo est toujours activement en cours d'élaboration, alors veuillez signaler s'il y a un problème rencontré.
Dans ce package, nous fournissons des ressources, notamment: les codes source du modèle DNABERT, les exemples d'utilisation, les modèles pré-formés, les modèles affinés et l'outil de visulisation. Ce package est toujours en cours de développement, car davantage de fonctionnalités seront incluses progressivement. La formation de DNABERT se compose d'une pré-formation à usage général et d'un réglage fin spécifique à la tâche. En tant que contribution de notre projet, nous avons publié les modèles pré-formés dans ce référentiel. Nous avons étendu les codes de HuggingFace et les avons adaptés au scénario d'ADN.
La deuxième génération de Dnabert, nommée DNABert-2, est disponible au public sur https://github.com/zhihan1996/dnabert_2. DNABERT-2 est formé sur les génomes multi-espèces et est plus efficace, puissant et facile à utiliser que sa première génération. Nous fournissons également une utilisation plus simple de Dnabert dans le nouveau package. Une évaluation complète de la compréhension du génome de référence (GUE), qui contient
Si vous avez utilisé DNABERT dans vos recherches, veuillez citer les publications suivantes:
@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}
}
Nous vous recommandons de créer un environnement virtuel Python avec Anaconda. Assurez-vous également que vous disposez d'au moins un GPU NVIDIA avec Linux X86_64 Version du pilote> = 410.48 (compatible avec CUDA 10.0). Nous avons appliqué une formation distribuée sur 8 Nvidia GeForce RTX 2080 Ti avec une mémoire graphique de 11 Go, et la taille du lot lui correspond. Si vous utilisez GPU avec d'autres spécifications et tailles de mémoire, envisagez d'ajuster la taille de votre lot en conséquence.
conda create -n dnabert python=3.6
conda activate dnabert
(Requis)
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
(Facultatif, installer Apex pour la formation FP16)
passer à un répertoire souhaité par 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" ./
Veuillez consulter les données du modèle à /example/sample_data/pre . Si vous essayez de pré-entraîner DNABERT avec vos propres données, veuillez traiter vos données dans le même format que. Notez que les séquences sont au format KMER, vous devrez donc convertir vos séquences en cela. Nous fournissons également une fonction personnalisée seq2kmer dans motif/motif_utils.py pour cette conversion.
Dans l'exemple suivant, nous utilisons dnabert avec kmer = 6 comme exemple.
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
Ajouter - FP16 TAG si vous souhaitez perfrom une précision mixte. (Vous devez d'abord installer le «sommet» de la source).
Veuillez consulter les données du modèle à /example/sample_data/ft/ . Si vous essayez d'adapter DNABERT avec vos propres données, veuillez traiter vos données dans le même format que. Notez que les séquences sont au format KMER, vous devrez donc convertir vos séquences en cela. Nous fournissons également une fonction personnalisée seq2kmer dans motif/motif_utils.py pour cette conversion.
Dnabert3
Dnabert4
Dnabert5
Dnabert6
Téléchargez le modèle pré-formé dans un répertoire. (Si vous souhaitez reproduire les exemples suivants, veuillez télécharger DNABERT 6). Ensuite, dézippez le package en fonctionnant:
unzip 6-new-12w-0.zip
Nous fournissons également un modèle avec KMER=6 qui est affiné sur l'ensemble de données d'échantillon pour la prédiction / visulisation / Motif_analysis. Si vous utilisez le modèle affiné au lieu de régler un modèle par vous-même, veuillez télécharger le réglage fin et le mettre sous examples/ft/6 .
Modèle de réglage fin
Dans l'exemple suivant, nous utilisons dnabert avec kmer = 6 comme exemple. Nous utilisons prom-core , une tâche de classification à 2 classes comme exemple.
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
Ajouter - FP16 TAG si vous souhaitez perfrom une précision mixte. (Vous devez d'abord installer le «sommet» de la source).
Nous fournissons également un modèle avec KMER=6 qui est affiné sur l'ensemble de données d'échantillon pour la prédiction / visulisation / Motif_analysis. Si vous utilisez le modèle affiné au lieu de régler un modèle par vous-même, veuillez télécharger le réglage fin et le mettre sous examples/ft/6 .
Modèle de réglage fin
Une fois que le modèle est affiné, nous pouvons obtenir des prédictions en fonctionnant
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
Avec la commande ci-dessus, le modèle DNABERT affiné sera chargé à partir de MODEL_PATH , et fait la prédiction sur le fichier dev.tsv qui a enregistré dans DATA_PATH et enregistrer le résultat de prédiction sur PREDICTION_PATH .
Ajouter - FP16 TAG si vous souhaitez perfrom une précision mixte. (Vous devez d'abord installer le «sommet» de la source).
La visuapation de Dnabert se compose de 2 étapes. Calcualater les scores d'attention et le tracé.
calculer avec un seul modèle (par exemple, 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
Avec la commande ci-dessus, le modèle DNABERT affiné sera chargé à partir de MODEL_PATH et calcule les scores d'attention sur le fichier dev.tsv qui enregistré dans DATA_PATH et enregistrez le résultat sur PREDICTION_PATH .
Ajouter - FP16 TAG si vous souhaitez perfrom une précision mixte. (Vous devez d'abord installer le «sommet» de la source).
#### 5.2 outil de traçage
Une fois les scores d'attention générés, nous pouvons continuer à effectuer une analyse du motif à l'aide 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
Le script générera un fichier .txt et un fichier weblogo .png pour chaque motif sous MOTIF_PATH .
Pour effectuer une analyse des variantes génomiques (par exemple SNP), nous devons d'abord nous assurer que les prédictions des séquences ont été générées. Ensuite, créez un fichier (modèle dans SNP/example_mut_file.txt ) spécifiant pour quelles séquences dans les indices dev.tsv et de début et de fin où nous devons effectuer la mutation. La première colonne indique que l'indice de séquence dans dev.tsv est muté. Les deuxième et troisième colonnes sont les indices de début et de fin tandis que la quatrième colonne est la cible de la mutation (peut être la substitution, l'insertion, la suppression, etc.)
Une fois un tel fichier créé, nous pouvons effectuer une mutation sur les séquences:
cd ../SNP
python mutate_seqs.py ./../examples/sample_data/ft/6/dev.tsv ./examples/ --mut_file ./example_mut_file.txt --k 6
Alternativement, nous pouvons choisir de quitter l'argument --mut_file vide, où le programme essaierait d'effectuer une substitution de toutes les bases aux quatre nucléotides possibles ('A', 'T', 'C' ou 'G') pour toutes les séquences. Cela serait utile pour tracer une carte thermique de mutation comme inclus dans le papier. Notez que cela serait lent si le dev.tsv contient beaucoup de séquences ou si les séquences d'entrée sont très longues, car la commande essaierait d'effectuer une mutation sur tous les emplacements possibles .
cd ../SNP
python mutate_seqs.py ./../examples/sample_data/ft/6/dev.tsv ./examples/ --k 6
Après cela, nous pouvons à nouveau prédire sur les séquences générées. Remarque: Si vous avez des insertions / délétions dans votre mut_file.txt , envisagez de modifier le max_seq_length que nous utilisons lors des prédictions.
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
Cela créera à nouveau un fichier pred_results.npy sous le $PREDICTION_PATH . Une fois que nous avons tout ce qui précède, nous pouvons calculer l'effet de ces mutations en:
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
Cela sauverait un fichier mutations.tsv sous save_file_dir , qui contient l'index de la séquence d'origine (dans dev.tsv ), la séquence et les prédictions d'origine, la séquence et les prédictions mutées, ainsi que le rapport de score de différence et les cotes de journal du changement dans tous les cas.
Veuillez vous assurer que vous avez satisfait à toutes les exigences du système pour DNABERT et que vous avez un environnement Conda correctement configuré. Nous avons récemment testé notre pipeline sur Amazon EC2 Deep Learning Ami (Ubuntu 18.04). En option, vous pouvez comparer votre configuration système / environnement avec cette AMI.