File size: 5,793 Bytes
9c24f8d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# 中文微型Llama2基础模型

[English](./readme_en.md) [简体中文](./readme.md)

这是一个参数量58M左右的超微型小模型,采用Llama2架构,这里上传的版本是预训练版本,尚未进行SFT。近期将会推出SFT后的聊天版本。

这个超微型模型开发的目标是:

1. 演练从0开始预训练一个基础大语言模型的全过程
2. 为开发大参数模型提供了一个可快速部署的环境,毕竟加载大模型非常耗时,不利于快速的迭代开发和调试
3. 可以在消费级显卡上快速的调优参数,重现各种论文中的优化算法。

## 训练数据:

收集了429本中文网络玄幻小说,整理为txt纯文本,除掉字符数少于10的行和超过4096字符的行,作为预训练的基础数据。

整理后的txt文件尺寸是3.3G,包含868M中文字符,18M行

## 中文分词器:

模型的分词器(tokenizer)也是重新训练的,没有使用现有的分词器。

训练参数:

1. 最长行(Max Sentence Length): 4096
2. 词汇量(Vocab Size): 65534
3. 正则化规则(Normalization Rule): nfkc
4. 覆盖率(Character coverage): 0.99

和标准的Llama2分词器比较如下:

|                                                              | Llama2                                                       | Baby Llama2                                                  |
| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
| tokens                                                       | 32000                                                        | 65534                                                        |
| model_max_length                                             | 4096                                                         | 4096                                                         |
| 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。             | :['▁', '白', '日', '<0xE4>', '<0xBE>', '<0x9D>',  '山', '<0xE5>', '<0xB0>', '<0xBD>', ',', '黄', '河', '入', '海',  '流', '。', '<0xE6>', '<0xAC>', '<0xB2>', '<0xE7>',  '<0xA9>', '<0xB7>', '千', '里', '目', ',', '更', '上', '一',  '<0xE5>', '<0xB1>', '<0x82>', '<0xE6>',  '<0xA5>', '<0xBC>', '。'] | ['▁白', '日', '依山', '尽', ',', '黄河', '入海', '流', '。', '欲', '穷', '千里',  '目', ',', '更', '上一层', '楼', '。'] |
|                                                              | [1, 29871, 30868, 30325, 231,  193, 160, 30329, 232, 179, 192, 30214, 31491, 30828, 30752, 30581, 31151,  30267, 233, 175, 181, 234, 172, 186, 31159, 30755, 30895, 30214, 31100,  30429, 30287, 232, 180, 133, 233, 168, 191, 30267] | [65534, 1764, 63106, 62484,  63203, 62793, 14729, 29082, 63130, 62795, 63920, 64266, 3271, 63038, 62793,  63007, 17116, 63636, 62795] |
| The  primary use of LLaMA is research on large language models, including BERT,  XLNet, and RoBERTa. | :['▁The', '▁primary',  '▁use', '▁of', '▁L', 'La', 'MA', '▁is', '▁research',  '▁on', '▁large', '▁language', '▁models', ',', '▁including', '▁B', 'ERT', ',', '▁X', 'L', 'Net', ',', '▁and', '▁Ro',  'BER', 'T', 'a', '.'] | :['▁T', 'h', 'e', '▁p', 'ri', 'm', 'ar', 'y', '▁', 'u', 'se', '▁o', 'f', '▁',  '<0x4C>', '<0x4C>', 'a', 'M', 'A', '▁i', 's', '▁',  're', 'se', 'ar', 'ch', '▁o', 'n', '▁',  'l', 'ar', 'g', 'e', '▁',  'l', 'ang', 'ua', 'g', 'e', '▁m', 'od', 'e', 'ls', ',', '▁', 'in', 'c', 'lu', 'd', 'i', 'ng', '▁', '<0x42>', '<0x45>', '<0x52>', 'T', ',', '▁', 'X', '<0x4C>',  '<0x4E>', 'e', 't', ',', '▁', 'an', 'd', '▁', '<0x52>', 'o', '<0x42>', '<0x45>',  '<0x52>', 'T', 'a', '.'] |
|                                                              | [1, 450, 7601, 671, 310, 365,  5661, 1529, 338, 5925, 373, 2919, 4086, 4733, 29892, 3704, 350, 20161, 29892,  1060, 29931, 6779, 29892, 322, 1528, 13635, 29911, 29874, 29889] | [65534, 14962, 63590, 64211,  27052, 16426, 63475, 13594, 64158, 62797, 63569, 11279, 13719, 65368, 62797,  81, 81, 63518, 64918, 64752, 24145, 63338, 62797, 44186, 11279, 13594, 9251,  13719, 63541, 62797, 64399, 13594, 64101, 64211, 62797, 64399, 37035, 36500,  64101, 64211, 2939, 11320, 64211, 53670, 62793, 62797, 18944, 63603, 14575,  64096, 63484, 1171, 62797, 71, 74, 87, 64760, 62793, 62797, 65257, 81, 83,  64211, 63073, 62793, 62797, 6604, 64096, 62797, 87, 63143, 71, 74, 87, 64760,  63518, 62801] |

Llama2分词器是32000个token,针对英文字符进行了优化;而Baby LLama2是65534个token,只包括了中文。

可以看到针对中文文本和英文文本的向量化比较上,Baby Llama2中文向量化优于标准Llama2,而英文向量化弱于Llama2。

## 全量训练语料处理

全量训练前,先对语料进行向量化处理。用刚刚训练的分词器(tokenzier)逐行读取网络小说的txt文件,每一行都做向量化,并在行尾增加eos_token_id做区分。然后将所有处理好的二进制数据以二维np.uint16数组的形式存储到磁盘上,数据维度为[-1: max_sentence_length]

## 预训练

在单卡3090机器上进行预训练,模型model采用了llama2的架构,训练参数如下:

1. max_seq_len = 512
2. dim = 512
3. n_headers = 8
4. n_layers = 8
5. n_kv_headers = 8

## 演示

[Huggingface Space For Baby Llama2](https://huggingface.co/spaces/wangqi777/wangqi777-chinese-baby-llama2)

## [TODO]

1. 模型源代码将于整理后开放到github上
2. 增加SFT微调,使其能够进行对话

## 鸣谢

[llama2.c](https://github.com/karpathy/llama2.c)

[baby-llama2-chinese](baby-llama2-chinese](https://github.com/DLLXW/baby-llama2-chinese)