Safetensors
Chinese
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