模型概述
模型特點
模型能力
使用案例
🚀 CSMPT7b 大型捷克語模型
CSMPT7b 是一個大型捷克語模型,它基於英文 MPT7b 模型,使用 2720 億訓練令牌進行持續預訓練。該模型使用捷克語分詞器,在約 670 億令牌的 大型捷克語語料庫 上進行預訓練,分詞器通過詞彙交換方法獲得(詳見下文)。訓練工作在 Karolina 集群上完成。
✨ 主要特性
- 知識遷移:通過詞彙交換方法,將英文模型的知識遷移到捷克語模型,實現跨語言的知識複用。
- 多語料庫訓練:在三個語料庫上進行訓練,並在訓練過程中進行熱交換,以提高模型的泛化能力。
- 持續預訓練:在大規模的捷克語語料上進行持續預訓練,提升模型對捷克語的理解和生成能力。
📦 安裝指南
環境設置
pip install transformers==4.37.2 torch==2.1.2 einops==0.7.0
# 確保安裝正確的 flash-attn,我們使用的是使用 CUDA 12.1 編譯的 torch,無 ABI,Python 3.9,Linux x86_64 架構
pip install https://github.com/Dao-AILab/flash-attention/releases/download/v2.5.3/flash_attn-2.5.3+cu122torch2.1cxx11abiFALSE-cp39-cp39-linux_x86_64.whl
💻 使用示例
基礎用法
import torch
import transformers
from transformers import pipeline
name = 'BUT-FIT/csmpt7b'
config = transformers.AutoConfig.from_pretrained(name, trust_remote_code=True)
config.init_device = 'cuda:0' # 為了在 GPU 上快速初始化!
model = transformers.AutoModelForCausalLM.from_pretrained(
name,
config=config,
torch_dtype=torch.bfloat16, # 以 bfloat16 格式加載模型權重
trust_remote_code=True
)
tokenizer = transformers.AutoTokenizer.from_pretrained(name, trust_remote_code=True)
pipe = pipeline('text-generation', model=model, tokenizer=tokenizer, device='cuda:0')
with torch.autocast('cuda', dtype=torch.bfloat16):
print(
pipe('Nejznámějším českým spisovatelem ',
max_new_tokens=100,
top_p=0.95,
repetition_penalty=1.0,
do_sample=True,
use_cache=True))
📚 詳細文檔
BUT LM 模型列表
最新更新
- 2024 年 10 月 1 日:發佈 BenCzechMark,這是首個用於公平比較開放權重模型的捷克語評估套件。
- 2024 年 4 月 18 日:在 czechllm.fit.vutbr.cz/csmpt7b/checkpoints/ 發佈所有訓練檢查點(採用 MosaicML 格式並使用 ZPAQ 打包)。
- 2024 年 5 月 6 日:發佈手動標註的小型 成人內容數據集,並使用基於該數據集訓練的分類器對語料庫進行過濾。
評估
在 CS-HellaSwag(自動翻譯的 HellaSwag 基準測試)上進行開發評估。
模型 | CS-HellaSwag 準確率 |
---|---|
mistral7b | 0.4992 |
csmpt@130k steps [已發佈] | 0.5004 |
csmpt@100k steps | 0.4959 |
csmpt@75k steps | 0.4895 |
csmpt@50k steps | 0.4755 |
csmpt@26,5k steps | 0.4524 |
在 CS-Hellaswag 上進行訓練過程中的驗證,在 100k 步之後,即使有改進也非常不穩定。與 mistral7b 相比,改進並不顯著。
損失
在訓練過程中遇到了損失峰值。由於模型總能恢復,並且訓練 70 億參數模型的預算非常有限,因此繼續進行訓練。在之前的消融實驗中也觀察到了這種損失峰值。在這些消融實驗(使用 GPT-2 小模型)中發現:
- (a) 受學習率影響,學習率越低,損失峰值出現越少;學習率越高,損失峰值開始出現;學習率過高時,訓練可能在損失峰值處發散。
- (b) 在初步消融實驗中,僅在持續預訓練的模型中出現。雖然不知道其出現的原因,但推測可能與 Adam 在更新向量時域相關性中的不穩定性 理論有關。然而,此前僅在更大的模型(大於 650 億參數)中觀察到這種不穩定性。
語料庫
模型在三個語料庫上進行訓練,這些語料庫在訓練過程中進行熱交換。它們是在訓練過程中收集和過濾的。
- 語料庫 #1 與用於 捷克語 GPT-2 訓練的語料庫相同(15,621,685,248 個令牌)。
- 語料庫 #2 包含 67,981,934,592 個令牌,主要來自 HPLT 和 CulturaX 語料庫。
- 語料庫 #3(包含 66,035,515,392 個令牌)是語料庫 #2 經過線性分類器過濾掉不適當內容後的結果。
訓練方法
詞彙交換
為了將英文模型的知識遷移到捷克語模型,開發了一種簡單的方法:(i) 對齊兩個詞彙表中的多個令牌;(ii) 將嵌入從原始語言複製到新語言。
超參數
未提及的超參數與 MPT 保持一致。
屬性 | 詳情 |
---|---|
訓練軟件包 | llm-foundry(進行了一些小的修補,例如允許通過文件進行 DDP 同步) |
數據集類型 | Concat(模型輸入的序列在 $max_seq_len 內進行拼接,由 EOS 令牌分隔) |
分詞器大小 | 64k(與 捷克語 GPT-2 相同) |
最大序列長度 | 2048 |
批量大小 | 1024 |
學習率 | 1.0e-4 |
優化器 | LionW |
優化器貝塔值 | 0.9/0.95 |
優化器權重衰減 | 0 |
優化器 epsilon 值 | 1.0e-08 |
梯度裁剪最大範數 | 1.0 |
注意力實現方式 | flash2(在最初約 60k 步使用 Triton flash-attn 1 實現) |
位置編碼 | alibi |
FSDP | FULL_SHARD(在 llm-foundry 中混合分片實現存在問題) |
精度 | bf16 |
調度器 | cosine |
調度器預熱步數 | 100 步 |
調度器總步數 | 170,000 |
調度器衰減係數 | 0.1(最後一步的學習率為 0.1 * 原始學習率) |
🔧 技術細節
詞彙交換方法
通過對齊英文和捷克語詞彙表中的部分令牌,並複製嵌入,實現知識從英文模型到捷克語模型的遷移。在 TinyLLAMA 上的實驗表明,該方法在測試困惑度上優於從頭開始訓練。對於 CSMPT7B 模型,在至少前 10K 步中,從英文到捷克語的微調比從頭訓練更有益,且訓練似乎更穩定。
訓練數據
我們發佈了大部分(95.79%)的訓練數據語料庫,即 BUT-Large Czech Collection。
發佈計劃
階段 | 描述 | 日期 |
---|---|---|
1 | “最佳”模型 + 訓練數據 | 2024 年 3 月 13 日 |
2 | 所有檢查點 + 訓練代碼(檢查點已發佈,代碼不會發布,使用的 LLM foundry 版本已過時) | 2024 年 4 月 10 日 |
3 | Benczechmark:用於少樣本大語言模型評估的捷克語數據集集合(如果想貢獻,請聯繫!) | 2024 年 10 月 1 日 |
4 | 預印本發佈 | 2024 年 12 月 23 日 預印本可用 |
聯繫我們
如有進一步問題,請發送電子郵件至 martin.fajcik@vut.cz
。
📄 許可證
本項目採用 Apache-2.0 許可證。
免責聲明
這是一個概率模型,可能會輸出隨機信息。作者不對模型輸出負責,使用風險自負。
致謝
本工作得到了捷克共和國文化部 NAKI III 計劃項目 semANT --- “Sémantický průzkumník textového kulturního dědictví”(資助編號:DH23P03OVV060
)以及捷克共和國教育、青年和體育部通過 e-INFRA CZ(編號:90254
)的支持。
引用
@article{benczechmark,
author = {Martin Fajčík, Martin Dočekal, Jan Doležal, Karel Beneš, Michal Hradiš},
title = {BenCzechMark: Machine Language Understanding Benchmark for Czech Language},
journal = {arXiv preprint arXiv:insert-arxiv-number-here},
year = {2024},
eprint = {insert-arxiv-number-here},
archivePrefix = {arXiv},
primaryClass = {cs.CL},
}



