模型简介
模型特点
模型能力
使用案例
🚀 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},
}



