Skip to content

FLoutione/Baby-Llama2-MindSpore

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Baby-Llama2-MindSpore

感谢来自Limzero & Ambrose & Guolin的开源贡献

📝介绍

本项目致力于构建一个小参数量的中文Llama2仓库。

包含:预训练、推理完整流程。

希望该开源项目可以帮助LLM初学者以最快速度入门!

📚项目愿景

  • 收集并汇总中文预训练语料,训练一个参数量500M-1B的Llama2-Chinese预训练模型,并在某个垂直领域可以表现不错
  • 构建包含预训练、推理完整流程的LLM代码仓库。

🌟Quick Start

# 1. 从“Baby-llama2-chinese Corpus”的百度网盘中下载分词处理后的预训练语料。(按需求下载-共634亿tokens,文件总大小为118G)
# 2. 将下载好的数据放到./data/目录下
# 3. 根据下载的语料,修改data_process.py中的data_path_list部分
# 4. 运行data_process.py,在./data/目录下生成pretrain_data.bin文件
python data_process.py
# 5. 根据自身算力,修改 pretrain.py文件中的模型参数调整模型大小(max_seq_len、dim、n_layers、n_heads),如果爆显存可以调整batch_size参数
# 6. 运行结束后,预训练模型会保存在out/pretrain文件夹中

# 7. 如果需要测试训练好的pretrain模型,可以运行eval_pretrain.py。(可以自定义问题)
python eval_pretrain.py

🤖预训练

一个好的预训练基座模型要具备续写的能力。

  1. 分词器(Tokenizer):LLM分词器的构建方式有两种:一种是自己构造词表并训练一个分词器custom tokenizers,另一种是选择开源模型训练好的分词器,例如ChatGLM2-6B,Llama2等。

    由于llama官方所提供的词表中,中文的部分只有700个,这也是llama中文能力聊胜于无的原因。因此,为了方便使用,本项目选择ChatGLM2-6B的分词器,该词表大小为64793,值得注意的是:这是一个很妙的数字,因为它刚好在uint16的表示范围(0~65535的无符号整数),每一个token只需要两个字节即可表示,当我们的语料较大时候,相比常用的int32可以节省一半的存储空间。

  2. 预训练语料(Corpus for pre-training ):从LLM技术革命以来,开源中文预训练语料越来越多。本项目本着拾人牙慧的精神,收集并处理了以下几个经典数据集:

    中文预训练语料 描述
    Wiki中文百科:wikipedia-cn-20230720-filtered 中文Wikipedia的数据
    BaiduBaiKe:百度网盘 提取码: bwvb 中文BaiduBaiKe的数据
    C4_zh:百度网盘 part1 提取码:zv4r;百度网盘 part2 提取码:sb83;百度网盘 part3 提取码:l89d C4是可用的最大语言数据集之一,收集了来自互联网上超过3.65亿个域的超过1560亿个token。C4_zh是其中的一部分
    WuDaoCorpora:智源研究院BAAI:WuDaoCorpora Text文本预训练数据集 中文悟道开源的200G数据
    shibing624/medical:shibing624/medical 源自shibing624的一部分医学领域的预训练数据

    同时,为了给大家节省数据预处理的时间,本项目开源了经过ChatGLM2-6B的分词器处理后的预训练语料,共计634亿Tokens的数据量,链接如下:Baby-llama2-chinese Corpus 提取码:6unr。将下载好的数据放到./data目录下即可。

    【考虑到作者所持有机子的局限性(4张3090),目前634亿Tokens的预训练语料+300M参数量的模型已经是本人预训练的极限-注:没有使用DeepSpeed、Megatron等分布式训练架构】

预训练语料预处理

  1. 数据清洗:大规模的高质量语料是训练大语言模型的关键“养料”。这些语料提供了世界性的知识体系,能够提升语言模型的理解能力和生成质量,同时也能够支持多样化的应用场景。事实上,高质量的文本对于大语言模型的训练和能力表现具有非常重要的影响。

  2. 分词器处理数据:数据预处理采取GPT的通用做法,对语料进行提前分词,对一个样本做完分词后在末尾加上一个结束符号<eos>,与下一个样本区分开。然后将所有的训练语料拼接成一个数组(np.uint16)以.bin二进制格式存储到磁盘上。如果语料过大,避免内存溢出,可以选择mmap格式。

    #脚本里面每一个函数对应一个语料库的预处理,搭建新加语料可以自行扩展。
    python data_process.py
    #运行结束后,会在./data目录下产生pretrain_data.bin文件

预训练

#考虑到预训练的运行时间非常久,需要采用程序后台运行的措施,本项目提供一种常用的程序后台运行的操作:
nohup python pretrain.py > out.log &

About

基于MindSpore框架构建的一个小Llama2的应用

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages