中文微型Llama2基础模型
这是一个参数量115M左右的超微型小模型,采用Llama2架构,这里上传的版本是预训练版本,尚未进行SFT。近期将会推出SFT后的聊天版本。
这个超微型模型开发的目标是:
- 演练从0开始预训练一个基础大语言模型的全过程
- 为开发大参数模型提供了一个可快速部署的环境,毕竟加载大模型非常耗时,不利于快速的迭代开发和调试
- 可以在消费级显卡上快速的调优参数,重现各种论文中的优化算法。
训练数据:
收集了429本中文网络玄幻小说,整理为txt纯文本,除掉字符数少于10的行和超过4096字符的行,作为预训练的基础数据。
整理后的txt文件尺寸是3.3G,包含868M中文字符,18M行
中文分词器:
模型的分词器(tokenizer)也是重新训练的,没有使用现有的分词器。
训练参数:
- 最长行(Max Sentence Length): 2657
- 词汇量(Vocab Size): 32000
- 正则化规则(Normalization Rule): identity
- 覆盖率(Character coverage): 0.9995
和标准的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的架构,训练参数如下:
- max_seq_len = 1024
- dim = 768
- n_headers = 12
- n_layers = 12
- n_kv_headers = 12
演示
Huggingface Space For Baby Llama2
[TODO]
- 模型源代码将于整理后开放到github上
- 增加SFT微调,使其能够进行对话
鸣谢
- Downloads last month
- 69
This model does not have enough activity to be deployed to Inference API (serverless) yet. Increase its social
visibility and check back later, or deploy to Inference Endpoints (dedicated)
instead.