在Langboat Technology,我們專注於增強預訓練模型,使其更輕,以滿足實際的行業需求。基於檢索的方法(如 RETRO、REALM 和 RAG)對於實現這一目標至關重要。
此儲存庫是檢索增強語言模型的實驗性實作。目前僅支援GPT-Neo上的檢索擬合。
我們分叉了 Huggingface Transformers 和 lm-evaluation-harness 以添加檢索支援。索引部分實作為HTTP伺服器,以更好地解耦檢索和訓練。
大部分的模型實現是從 RETRO-pytorch 和 GPT-Neo 複製。我們使用transformers-cli
在GPT-Neo的基礎上新增一個名為Re_gptForCausalLM
的新模型,然後向其新增檢索部分。
我們使用 200G 檢索庫上傳了安裝在 EleutherAI/gpt-neo-125M 上的模型。
您可以像這樣初始化模型:
from transformers import Re_gptForCausalLM
model = Re_gptForCausalLM . from_pretrained ( 'Langboat/ReGPT-125M-200G' )
並像這樣評估模型:
python main.py
--model retrieval
--model_args pretrained=model_path
--device 0
--tasks wikitext,lambada,winogrande,mathqa,pubmedqa
--batch_size 1
我們使用句子轉換器的嵌入作為文字表示來計算相似度。您可以像這樣初始化 Sentence-BERT 模型:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer ( 'all-MiniLM-L12-v2' )
conda create -n mengzi-retrieval-fit python=3.7
conda activate mengzi-retrieval-fit
conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch-lts -c nvidia
git clone https://github.com/Langboat/mengzi-retrieval-lm.git
cd mengzi-retrieval-lm
git submodule update --init --recursive
pip install -r requirement.txt
cd transformers/
pip install -e .
cd ..
python -c " from sentence_transformers import SentenceTransformer; model = SentenceTransformer('all-MiniLM-L12-v2') "
使用IVF1024PQ48作為faiss索引工廠,我們將索引和資料庫上傳到huggingface模型中心,可以使用以下指令下載。
在download_index_db.py中,您可以指定要下載的索引和資料庫的數量。
python -u download_index_db.py --num 200
您可以從這裡手動下載擬合模型:https://huggingface.co/Langboat/ReGPT-125M-200G
索引伺服器基於FastAPI和Ray。透過Ray的Actor,計算密集型任務被非同步封裝,使我們只需一個FastAPI伺服器實例就可以有效率地利用CPU和GPU資源。您可以像這樣初始化索引伺服器:
cd index-server/
ray start --head
python -u api.py
--config config_IVF1024PQ48.json
--db_path ../db/models—Langboat—Pile-DB/snapshots/fd35bcce75db5c1b7385a28018029f7465b4e966
- 請記住,配置 IVF1024PQ48.json 分片計數必須與下載的索引數相符。可以在db_path下查看目前下載的索引號
- 此配置已在 A100-40G 上進行了測試,因此如果您有不同的 GPU,我們建議根據您的硬體進行調整。
- 部署索引伺服器後,需要修改 lm-evaluation-harness/config.json 和 train/config.json 中的 request_server 。
- 您可以減少config_IVF1024PQ48.json中的encoder_actor_count來減少所需的記憶體資源。
· db_path:huggingface 資料庫的下載位置。 「../db/models—Langboat—Pile-DB/snapshots/fd35bcce75db5c1b7385a28018029f7465b4e966」就是一個例子。
該命令將從 Huggingface 下載資料庫和索引資料。
更改設定檔 (config IVF1024PQ48) 中的索引資料夾以指向索引資料夾的路徑,並將資料庫資料夾的快照作為 db 路徑傳送至 api.py 腳本。
使用以下命令停止索引伺服器
ray stop
- 請記住,您需要在訓練、評估和推理期間保持索引伺服器啟用
使用train/train.py實現訓練;可以修改train/config.json來更改訓練參數。
您可以像這樣初始化訓練:
cd train
python -u train.py
- 由於索引伺服器需要使用記憶體資源,因此最好將索引伺服器和模型訓練部署在不同的GPU上
使用 train/inference.py 作為推理來確定文本的遺失及其困惑度。
cd train
python -u inference.py
--model_path Langboat/ReGPT-125M-200G
--file_name data/test_data.json
- data資料夾中的test_data.json和train_data.json是目前支援的檔案格式,您可以將您的資料修改為該格式。
使用 lm-evaluation-harness 作為評估方法
我們將 lm-evaluation-harness 的 seq_len 設定為 1025 作為模型比較的初始設置,因為我們模型訓練的 seq_len 是 1025。
cd lm-evaluation-harness
python setup.py install
python main.py
--model retrieval
--model_args pretrained=Langboat/ReGPT-125M-200G
--device 0
--tasks wikitext
--batch_size 1
· model_path:擬合模型路徑
python main.py
--model gpt2
--model_args pretrained=EleutherAI/gpt-neo-125M
--device 0
--tasks wikitext
--batch_size 1
評估結果如下
模型 | 維基文本 word_perplexity |
---|---|
EleutherAI/gpt-neo-125M | 35.8774 |
浪舟/ReGPT-125M-200G | 22.115 |
EleutherAI/gpt-neo-1.3B | 17.6979 |
浪舟/ReGPT-125M-400G | 14.1327 |
@software { mengzi-retrieval-lm-library ,
title = { {Mengzi-Retrieval-LM} } ,
author = { Wang, Yulong and Bo, Lin } ,
url = { https://github.com/Langboat/mengzi-retrieval-lm } ,
month = { 9 } ,
year = { 2022 } ,
version = { 0.0.1 } ,
}