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, AutoModelForTokenClass 準備編號q = "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] 和a [ SEP] token將被加到seqinput_ids的開頭和結尾= torch.as_tensor(input_ids) # 將python列表轉換為Tensorinput_ids = input_ids.unsqueeze(0) # 添加batch維度,形狀:(batch_size,equence_length) #使用huggerface官方使用SpliceBERT 的API# 取得核苷酸嵌入(隱藏狀態) model = AutoModel.from_pretrained(SPLICEBERT_PATH) # 載入模型last_hidden_state = model(input_ids).last_hidden_state #state # 從最後一層取得隱藏狀態hiddens_states = model(input_ids, output_hidden_states=True).hidden_states # 隱藏來自嵌入層(nn.Embedding) 和6 個轉換器編碼器層的狀態# 在掩碼語言建模中獲取核苷酸類型logits model = AutoModelForMaskedLM.from_pretrained(SPLICEBERT_PATH) # 載入模型logits = model(input_ids).logits # shape: (batch_size,equence_length, vocab_size)) 微調1Class#DV. ATH, num_labels= 3) # 假設類別數為3,形狀:(batch_size,equence_length, num_labels)# 微調SpliceBERT 用於序列分類任務model = AutoModelForSequenceClassification.from_pretrained(SPLICEBERT_PATH , num_labels=3) # 形狀類別數為equence_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 Transformers importBERT_PATH)))portfERT_PATH)))) portimformers importBERT_PATH))))portfrom Transformers importBERT_PATH)))portfrom Transformers importBERT_PATH)))portfrom Transformers importBERT_PATH)))portfrom Transformers importBERT_PATH)))portfrom Transformers ” AutoTokenizerfrom splicebert_model import BertModel, BertForMaskedLM, BertForTokenClassification# 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] 和a [ SEP] token 將加入到seq 的開頭和結尾input_ids = torch.as_tensor(input_ids) # 將python 列表轉換為Tensorinput_ids = input_ids.unsqueeze(0) # 新增維度,形狀: (batch_sizee) # 或使用自訂BertModel with FlashAttention# 取得核苷酸嵌入(隱藏狀態) model = BertModel.from_pretrained(SPLICEBERT_PATH) # 使用autocast() 載入模型: last_hidden_state = model(input_ids).last_hidden_last_hidden_state #最後一層取得隱藏狀態hiddens_states = model(input_ids, output_hidden_states=True ).hidden_states # 來自嵌入層(nn.Embedding) 和6 個轉換器編碼器層的隱藏狀態# 在掩碼語言建模中取得核苷酸類型logits model = BertForMaskedLM.from_pretrained(SPLICEBERT_PATH) # 使用autocast() 載入模型: logits = model(input_ids) .logits # shape: (batch_size, sequence_length, vocabdsizes) 分類任務分類的任務分類。 autocast(): model = BertForTokenClassification.from_pretrained(SPLICEBERT_PATH, num_labels=3) # 假設類別數為3,shape: (batch_size,equence_length, num_labels)# 針對序列分類任務微調Squence 是ATH , num_labels=3) # 假設類別數為3,shape: (batch_size,equence_length,num_labels)
配置環境。
我們在 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}, 期刊 = {生物資訊簡報} }