LLM之Colossal-LLaMA-2:源码解读(init_tokenizer.py文件)实现基于源词表的扩展、(init_model.py文件)实现过计算均值扩展模型、(prepare_pretr

LLM之Colossal-LLaMA-2:源码解读(init_tokenizer.py文件)实现基于jsonl文件中读取新词列表(新中文词汇)→for循环去重实现词表的扩展(中文标记的新词汇)→保存新的分词模型、(init_model.py文件)实现过计算均值来扩展模型的嵌入层以适应新的词汇表,然后保存扩展后的模型、(prepare_pretrain_dataset.py文件)将原始数据集进行处理和切片并保存为JSONL格式和 Arrow格式

目录

一、源码解读(init_tokenizer.py文件)实现基于源词表的扩展(中文标记的新词汇)进而实现持续预训练—定义日志记录器→解析命令行参数→从jsonl文件中读取新词列表→词表的扩展(for循环遍历+if检查新词是否已存在)

# 0、定义日志记录器:

# 1、解析命令行参数:包括源分词器目录、目标分词器目录以及包含要扩展的新词汇的文件路径

# 2、从jsonl文件中读取需要添加的新词列表

# 3、调用expand_vocab_tokenizer函数完成词表的扩展

# (1)、先if检查目标分词器目录是否已存在,如果存在则抛出异常

# (2)、从源分词器目录中加载预训练的分词器 source_tokenizer

# (3)、获取源分词器的SentencePiece模型 source_sp_processor

# (4)、创建一个空的SentencePiece模型 source_spm,然后遍历 new_tokens,将每个新词汇添加到模型中

# (5)、for循环遍历,检查新词是否已存在,不存在则添加到模型中

# (6)、最后,保存扩展后的新词表模型文件tokenizer.model

# (7)、创建一个新的LLAMA分词器 target_tokenizer,将其保存到目标分词器目录

实现代码

二、LLM之Colossal-LLaMA-2:源码解读(init_model.py文件)通过计算均值来扩展模型的嵌入层以适应新的词汇表,然后保存扩展后的模型—定义日志记录器→解析命令行参数→加载两个分词器并部分处理→设置设备→初始化源模型→获取源模型的输入和输出嵌入层→词汇表扩展→模型的词汇表调整和保存

# 0、定义日志记录器:通过get_dist_logger()函数获取一个日志记录器,后续代码将使用该记录器来输出日志信息

# 1、解析命令行参数:包括源模型-分词器的路径、目标分词器路径和目标模型路径。

# 2、加载两个分词器(源分词器+目标分词器),并对它们进行一些设置,如去除BOS和EOS标记,以及处理PAD标记为unk标记。

# (1)、加载源分词器source_tokenizer并去除BOS(Beginning of Sentence)和EOS(End of Sentence)标记,以及处理PAD标记为unk标记。

# (2)、加载目标分词器target_tokenizer并禁用/去除BOS和EOS标记,以及处理PAD标记为unk标记。

# (3)、确保目标词汇表的大小>源词汇表的大小,以确保可以进行词汇表扩展。

# 3、设置设备阶段:创建GPU和CPU设备,用于模型操作。

# 4、初始化源模型:加载源模型+设置为评估模式+移动到GPU设备

# 5、获取源模型的输入和输出嵌入层,并确保它们的类型和形状正确。

# (1)、获取源模型的输入嵌入层,包含了模型的词汇表嵌入

# (2)、获取源模型的输出嵌入层,处理过程同上

# 6、词汇表扩展:计算均值并扩展嵌入层

# (1)、将源模型中的输入嵌入层和输出嵌入层的权重转换为NumPy数组:

# (2)、使用循环遍历目标词汇表中的每个词汇(从源词汇表之后的索引开始),计算每个目标词汇对应的源词汇的均值嵌入

# (3)、在循环中,if判断每处理500个目标词汇时输出一次处理进度信息,以便了解代码的执行进展。

# (4)、对于每个目标词汇,获取目标词汇对应的源模型的输入令牌的 ID。

# (5)、将目标令牌的 ID 移动到 GPU 设备上,以便后续的计算在GPU上执行

# (6)、将均值嵌入添加到输入嵌入层和输出嵌入层中,以扩展模型的词汇表。

# (7)、将均值依次添加到 input_embeddings 和 output_embeddings 中,以扩展模型的嵌入

# (8)、最后,将源模型移回 CPU 设备,并确保它仍然是 LlamaForCausalLM 类型

# 7、模型的词汇表调整和保存

# (1)、调整源模型的词汇表大小,以匹配扩展后的词汇表大小

# (2)、赋值到源模型的embed_tokens标记嵌入层和lm_head语言模型头的权重

# (3)、将源模型的数据类型转换为半精度浮点数表示,以减少内存使用。

# (4)、扩展后的源模型保存到指定的目标模型路径中,以便后续的使用和部署。

实现代码

三、LLM之Colossal-LLaMA-2:源码解读(prepare_pretrain_dataset.py文件)将原始数据集进行处理和切片并保存为JSONL格式和 Arrow格式—定义日志记录器→解析命令行参数→数据准备→数据处理与保存

# 0、定义日志记录器:通过get_dist_logger()函数获取一个日志记录器,后续代码将使用该记录器来输出日志信息

# 1、解析命令行参数:包括数据输入目录、分词器目录、数据缓存目录、输出JSONL数据目录、输出Arrow数据目录、最大序列长度和分割数据集的数量。

# 2、数据准备

# (1)、检查是否设置了过多的分割数据集的数量

# (2)、检查数据缓存目录、输出目录是否已存在,如果存在则抛出异常,否则创建相应的目录。

# (3)、准备所有输入数据集的路径:构建输入数据路径列表,从多个输入数据目录中收集所有以 .jsonl 结尾的数据文件

# 3、数据处理与保存

# (1)、准备数据拆分方式,将数据拆分成多个子数据集,用于后续的处理。

# (2)、加载LlamaTokenizer分词器,该分词器用于处理文本数据

# (3)、加载输入数据集:该函数从 JSONL 数据文件中加载数据,并根据拆分方式进行数据拆分,同时启用多进程处理以提高效率。

# (4)、对每个数据集进行处理,包括分词、排序、移除不需要的列等。

# (5)、对数据进行切片,将长序列切分成多个小的序列,以满足最大序列长度的限制。这是为了适应模型的输入要求。

# (6)、保存每个分割后的数据集为 JSONL 格式,将处理后的数据保存为 JSONL 格式,每个序列数据点写入一个 JSON 行。

# (7)、统计处理数据的信息,包括数据大小、切片后的数据大小和压缩率等信息

# (8)、保存每个分割后的数据集为 Arrow格式:加载保存的JSONL数据,然后将其保存为Arrow格式,以提高数据的读取效率

实现代码


你可能感兴趣的:(CaseCode,NLP/LLMs,精选(人工智能)-中级,Colossal,LLaMA-2,自然语言处理)