SpliceBERT(手稿、预印本)是一种主要的 RNA 序列语言模型,在超过 200 万条脊椎动物 RNA 序列上进行了预训练。它可用于研究RNA剪接和其他与RNA序列相关的生物学问题。
有关 SpliceBERT 的其他基准和应用(例如,在 SpliceAI 和 DeepSTARR 数据集上),请参阅 SpliceBERT 分析。
数据可用性
如何使用SpliceBERT?
重现分析
接触
引文
模型权重和分析数据可在 zenodo:7995778 获取。
SpliceBERT 是通过 PyTorch 中的 Huggingface transformers
和 FlashAttention 实现的。用户应安装 pytorch、transformers 和 FlashAttention(可选)来加载 SpliceBERT 模型。
安装 PyTorch:https://pytorch.org/get-started/locally/
安装 Huggingface 变压器:https://huggingface.co/docs/transformers/installation
安装FlashAttention(可选):https://github.com/Dao-AILab/flash-attention
通过官方API,SpliceBERT可以轻松用于一系列下游任务。更多详情请参阅官方指南。
下载 SpliceBERT
SpliceBERT的权重可以从zenodo下载:https://zenodo.org/record/7995778/files/models.tar.gz?download=1
系统要求
我们建议在具有至少 4GB 内存的 NVIDIA GPU 的 Linux 系统上运行 SpliceBERT。 (仅使用 CPU 运行我们的模型是可能的,但速度会非常慢。)
示例
我们在以下代码块的第一部分中提供了一个演示脚本,展示如何通过 Huggingface 转换器的官方 API 使用 SpliceBERT。
用户还可以通过将官方 API 替换为自定义 API 来将 SpliceBERT 与 FlashAttention 结合使用,如以下代码块的第二部分所示。请注意,flash-attention需要启用自动混合精度(amp)模式,目前不支持attention_mask
通过 Huggingface 转换器的官方 API 使用 SpliceBERT:
SPLICEBERT_PATH = "/path/to/SpliceBERT/models/model_folder" # 设置预训练 SpliceBERT 文件夹的路径 import torchfrom Transformers import AutoTokenizer, AutoModel, AutoModelForMaskedLM, AutoModelForTokenClassification# load tokenizertokenizer = AutoTokenizer.from_pretrained(SPLICEBERT_PATH)# 准备输入序列eq =“ACGUACGuacguaCGu”##警告:这只是一个演示。 SpliceBERT 可能不适用于短于 64nt 的序列,因为它是在 lengthseq = ' '.join(list(seq.upper().replace("U", "T"))) 中的 64-1024nt 序列上进行训练的 # U - > T 并添加whitespaceinput_ids = tokenizer.encode(seq) # N -> 5, A -> 6, C -> 7, G -> 8, T(U) -> 9. 注意:[CLS] 和 [SEP] 标记将添加到 seqinput_ids = torch.as_tensor(input_ids) # 将 python 列表转换为 Tensorinput_ids = input_ids.unsqueeze(0 ) # 添加批次维度、形状:(batch_size, sequence_length)# 使用huggerface的官方API来使用SpliceBERT# 获取核苷酸嵌入(hidden states)model = AutoModel.from_pretrained(SPLICEBERT_PATH) # 加载模型last_hidden_state = model(input_ids).last_hidden_state # 从最后一层获取隐藏状态hiddens_states = model(input_ids, output_hidden_states=True).hidden_states # 来自嵌入层的隐藏状态 (nn.嵌入)和 6 个转换器编码器层# 以掩码语言获取核苷酸类型 logits modelingmodel = AutoModelForMaskedLM.from_pretrained(SPLICEBERT_PATH) # 加载 modellogits = model(input_ids).logits # shape: (batch_size,equence_length, vocab_size)# 微调 SpliceBERT 以进行标记分类任务 model = AutoModelForTokenClassification.from_pretrained(SPLICEBERT_PATH, num_labels=3) # 假设类别数量为3,形状: (batch_size,equence_length,num_labels)#针对序列分类任务微调SpliceBERTmodel = AutoModelForSequenceClassification.from_pretrained(SPLICEBERT_PATH,num_labels=3)#假设类别数为3,形状:(batch_size,sequence_length,num_labels)
或者将SpliceBERT与FlashAttention结合使用,将官方API替换为自定义API(目前flash-attention不支持attention_mask。因此,每个batch中的序列长度应该相同)
SPLICEBERT_PATH = "/path/to/SpliceBERT/models/model_folder" # 设置预训练的 SpliceBERT 文件夹路径 import torchimport syssys.path.append(os.path.dirname(os.path.abspath(SPICEBERT_PATH)))from变压器导入 AutoTokenizerfrom splicebert_model 导入 BertModel、BertForMaskedLM、BertForTokenClassification# 加载tokenizertokenizer = AutoTokenizer.from_pretrained(SPLICEBERT_PATH)# 准备输入序列eq = "ACGUACGuacguaCGu" ## 警告:这只是一个演示。 SpliceBERT 可能不适用于短于 64nt 的序列,因为它是在 lengthseq = ' '.join(list(seq.upper().replace("U", "T"))) 中的 64-1024nt 序列上进行训练的 # U - > T 并添加whitespaceinput_ids = tokenizer.encode(seq) # N -> 5, A -> 6, C -> 7, G -> 8, T(U) -> 9. 注意:[CLS] 和 [SEP] 标记将添加到 seqinput_ids = torch.as_tensor(input_ids) # 将 python 列表转换为 Tensorinput_ids = input_ids.unsqueeze(0 ) # 添加批次维度、形状:(batch_size,equence_length)# 或者使用自定义 BertModel 和 FlashAttention# 获取核苷酸嵌入(隐藏状态)模型= BertModel.from_pretrained(SPLICEBERT_PATH) # 使用 autocast() 加载模型: last_hidden_state = model(input_ids).last_hidden_state # 从最后一层获取隐藏状态 hides_states = model(input_ids, output_hidden_states=True).hidden_states # 来自嵌入层的隐藏状态 (nn .Embedding) 和 6 个转换器编码器层# 以掩码语言获取核苷酸类型 logits modelingmodel = BertForMaskedLM.from_pretrained(SPLICEBERT_PATH) # 使用 autocast() 加载模型: logits = model(input_ids).logits # shape: (batch_size,equence_length, vocab_size)# 微调用于标记分类任务的 SpliceBERTwith autocast(): model = BertForTokenClassification.from_pretrained( SPLICEBERT_PATH, num_labels=3) # 假设类号为 3,形状:(batch_size,sequence_length,num_labels)# 微调序列分类任务的 SpliceBERTwith autocast(): model = BertForSequenceClassification.from_pretrained(SPLICEBERT_PATH,num_labels=3) # 假设类号为 3,形状:(batch_size,序列长度、标签数)
配置环境。
我们在 Linux 系统 (Ubuntu 20.04.3 LTS) 上使用 python 3.9.7 在 conda 环境中运行脚本。所需的包是:
注:版本号仅用于说明我们研究中使用的软件版本。大多数情况下,用户不需要保证版本与我们严格一致即可运行代码
bedtools (2.30.0)
MaxEntScan (2004)
gtfToGenePred (v377)
Python (3.9.7)
transformers (4.24.0)
pytorch (1.12.1)
h5py (3.2.1)
numpy (1.23.3)
scipy (1.8.0)
scikit-learn (1.1.1)
scanpy (1.8.2)
matplotlib (3.5.1)
seaborn (0.11.2)
tqdm (4.64.0)
pyBigWig (0.3.18)
cython (0.29.28)
Python 包:
命令行工具(可选):
克隆此存储库,下载数据和设置脚本。
git clone [email protected]:biomed-AI/SpliceBERT.gitcd SpliceBERT bash download.sh # 下载模型权重和数据,或者从 [zenodo](https://doi.org/10.5281/zenodo.7995778)cd Examples 手动下载 bash setup.sh # 编译selene utils,需要cython
(可选)从 Google Drive 下载第 1-4 部分的预先计算结果,并将其解压到examples
文件夹中。
# 用户需要手动下载`pre-compulated_results.tar.gz`并将其放在`./examples`文件夹中并运行以下命令解压它tar -zxvf pre-compulated_results.tar.gz
如果预先计算的结果已下载并正确解压,用户可以跳过第1-4节的jupyter笔记本中运行pipeline.sh
。
运行 jupyter 笔记本(第 1-4 节)或 bash 脚本pipeline.sh
(第 5-6 节):
进化保守分析(相关图1)
核苷酸嵌入分析(相关图2)
注意力权重分析(相关图3)
变异效应分析(相关图4)
分支点预测(与图5相关)
剪接位点预测(相关图6)
对于与脚本相关的问题,请在 https://github.com/biomed-AI/SpliceBERT/issues 创建问题。
如有任何其他问题,请随时联系 chenkenbio {at} gmail.com。
@文章{陈2023.01.31.526427, 作者 = {陈、肯和周、岳和丁、茂林和王、余和任、志祥和杨、岳东}, title = {对来自 72 种脊椎动物的数百万个初级 RNA 序列进行自我监督学习改进了基于序列的 RNA 剪接预测}, 年 = {2024}, doi = {10.1093/bib/bbae163}, 出版商={牛津大学出版社}, 网址 = {https://doi.org/10.1093/bib/bbae163}, 期刊 = {生物信息学简报} }