File size: 5,071 Bytes
78ce20c e41bfac 78ce20c ed4c3d9 78ce20c 96c9eeb f5c7b44 cd767ee ec0bc75 cd767ee 96c9eeb cd767ee 96c9eeb 4fb1877 96c9eeb 4fb1877 96c9eeb cd767ee 96c9eeb cd767ee 96c9eeb ec9fef8 96c9eeb ec9fef8 96c9eeb cd767ee 96c9eeb cd767ee 96c9eeb cd767ee 96c9eeb cd767ee ec9fef8 96c9eeb ec9fef8 96c9eeb ec9fef8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
---
datasets:
- BelleGroup/train_3.5M_CN
- YeungNLP/moss-003-sft-data
language:
- zh
license: apache-2.0
---
## KHAOSZ
这是一个支持中文和英文双语言的Transfomer模型,包含模型设置和训练流程, 通过加载`params/config.json` 中的设定的参数完成训练, 使用`train.py`解析命令行参数,包括数据集根目录、训练轮数、批处理大小、保存检查点的间隔轮数以及检查点保存目录。
代码部分在:https://github.com/ViperEkura/KHAOSZ/tree/main
- **📊设备选择**:当前代码默认使用CUDA进行训练
- **🌐性能优化**:代码中设置了`dtype=torch.bfloat16`来启用训练,这有助于提高训练速度和降低显存消耗,但需确保硬件支持此特性。
- **🤖语言支持**:该模型目前支持在中文和英文数据集上训练, 在训练分词器时没有加入其他语言的文本,BBPE分词器不会存在OOV问题,但是对别的语言支持比较差
## 📌如何训练
要训练这个Transformer模型,您可以按照以下步骤进行操作:
(1). 准备数据集:
确保您的数据集位于一个指定的根目录下。数据集应包含用于训练的文本文件,这些文件可以是中文、英文或两者混合。
数据文件的格式应与模型的输入要求一致,最好是经过tokenizer处理过后的token_id, 为了节省内存占用采用torch.Tensor 存储id,(如果使用python的list, 在读取训练数据的时候内存占用大概是原来的两倍以上,因为python似乎是默认采用64位数精度存储的数据, 但是实际上int32足够)
(2).安装依赖:
确保您已经安装了所有必要的Python库:
```bash
conda env create -f environment.yml --name env_name
```
(3).运行训练脚本:
使用以下命令运行训练脚本,并根据需要调整参数:
```bash
python train.py \
--train_type=train_type[seq, sft, dpo] \
--data_root_path=/path/to/dataset \
--n_epoch=5 \
--batch_size=8 \
--max_lr=2e-4 \
--n_iter_ckpt=10000 \
--ckpt_dir checkpoints
```
--train_type: 指定训练的类型,可选值有seq, sft, dpo
--data_root_path:指定数据集的根目录路径。
--n_epoch:指定训练的总轮数。
--batch_size:指定每个批次的样本数量。
--n_iter_step: 多少batch迭代一步
--max_lr: 指定过程中最大的学习率(学习率采用的是预热 + 余弦衰减)
--n_iter_ckpt:指定每多少迭代次数保存一次检查点。
--ckpt_dir:指定保存检查点的目录。
--resume_train: 是否从检查点恢复训练
--resume_dir: 恢复训练的checkpoint路径
训练过程中,您可以在终端中查看训练日志(train_log.txt),了解训练进度、损失值等信息。
检查点文件会保存在指定的检查点目录中,您可以使用这些检查点文件来恢复训练或进行评估。
## 👉如何使用
如果您想使用这个模型进行对话聊天, 请打开 chat.py 文件,并运行它。
或者, 您可以使用流式输出接口/对话生成接口完成对话
```python
from module import Khaosz
model = Khaosz("params")
model = model.to(device='cuda', dtype=torch.bfloat16)
histroy = []
while True:
query = input(">> ")
if query == "!exit":
break
response_size = 0
for response, histroy in model.stream_generate(
query=query,
history=histroy,
temperature=0.85,
top_p=0.95,
top_k=50
):
print(response[response_size:], end="")
response_size = len(response)
```
或者您可以使用非流式输出的方式完成对话
```python
from module import Khaosz
model = Khaosz("params")
model = model.to(device='cuda', dtype=torch.bfloat16)
histroy = []
while True:
query = input(">> ")
if query == "!exit":
break
response_size = 0
response = model.generate(
query=query,
history=histroy,
temperature=0.85,
top_p=0.95,
top_k=50
)
print(response)
```
## 📌其他问题
本模型基于20层的transformer,参数大致设置如`config.json`,参数大小为4亿(0.40b)
模型采用权重绑定, embedding层的权重和最后线性层的权重是共享的(比较小的模型都采用这种方式节省参数大小, 因为不采用权重绑定, embedding层假设有10000单词, 将会占用 10000 * 1024 = 102,400,000 参数, 也就是 0.1b 参数, 因为词表会占用太多的参数, 所以采用权重绑定是小模型的通用方法)
由于模型参数相对较少,在某些任务上可能会出现性能不足的情况,比如对复杂语言现象的理解能力可能不如更大规模的模型。此外,较小的模型也可能更容易过拟合训练数据,导致泛化能力较差。不过,这也意味着该模型可以在较低配置的硬件上运行,并且训练时间相对较短。
另外目前给定的权重仅仅完成了 preTrain + SFT (也就是说训练流程并非完整的), 之后在完成DPO/PPO 训练之后会更新权重和readme |