提示词工程实践(三)——NOTEBOOK微调训练 #123

Open
opened 2024-09-25 16:14:59 +08:00 by 12390900721cs · 0 comments

本次实验主要是针对之前codellama对于数据库相关问题回答不够好的问题,使用与sql数据库相关的数据集来对模型进行微调。本次实验使用的是二机八卡,下面详细写出我在本次试验的步骤。

数据集准备

本次使用的数据集来自sql-create-context。这是一个专门为文本到 SQL 任务设计的数据集,主要用于训练大语言模型(LLMs)。它包含了 78,577 条数据,每条数据包括一个自然语言查询、一条 SQL CREATE TABLE 语句和相应的 SQL 查询。其设计目的是通过提供 CREATE TABLE 语句作为上下文,帮助模型在生成 SQL 查询时避免常见的列名或表名的“幻觉”问题。

该数据集结合了 WikiSQL 和 Spider 数据集,利用 SQLGlot 工具推断出列的数据类型,并生成相应的 CREATE TABLE 语句。这种方法不仅减少了内存占用,还保护了敏感数据的隐私,是构建文本到 SQL 模型的良好资源。

微调训练

首先启动两个notebook:

分别打开两个任务后,使用ifconfig查看其中一台主机的ip地址,然后将其作为master节点。然后在两台主机分别使用命令启动训练。

node1:

NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.59.115 NODE_RANK=0 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-workdir --deepspeed deepspeed_zero3_offload

node2:

NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.59.115 NODE_RANK=1 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-workdir --deepspeed deepspeed_zero3_offload

分布式训练参数:

这段命令是在使用多节点分布式训练模型。NPROC_PER_NODE指的是每个节点使用4个GPU;NNODES指的是有两个节点参与训练; ADDR指的是主节点的IP地址,用于分布式训练的节点通信;PORT指的是节点之间的通信的端口号;NODE_RANK用于区分分布式系统中的不同节点。

xtuner命令:

  • xtuner train llama2_7b_chat_qlora_sql_e3_copy.py: 调用 xtuner 进行模型训练,具体的训练脚本是 llama2_7b_chat_qlora_sql_e3_copy.py
  • --work-dir /code/xtuner-workdir: 指定工作目录,用于保存模型权重、训练日志等。
  • --deepspeed deepspeed_zero3_offload: 使用 DeepSpeed 的 Zero-3 优化器,并且开启 Offload 功能,将部分模型参数或者优化器状态卸载到 CPU上,以节省 GPU 显存。

llama2_7b_chat_qlora_sql_e3_copy.py:

该脚本可以利用xtuner list-cfg来查看,并使用有关copy命令拷贝到当前目录,以方便修改和使用。

该脚本中规定了模型和数据集的位置,此外,还针对模型的训练配置进行了一系列的设置,如数据集加载、优化器、batch_size、学习率、模型和分词器,以及LoRA微调的配置等等。我们在使用中有时候需要根据当前的实际情况来更改其中的配置。

运行过程

如图显示了模型一开始运行的部分,红色区域是训练的迭代轮数。

此时可另开一个终端,利用rocm-smi来观察当前资源利用状况:

运行结束时会出现如下输出:

格式转换

运行完成后,目录下多出了如下文件:

这是储存在训练过程中生成的模型检查点文件。.pth文件是pytorch中模型的格式,其中常包括有:

  • 模型权重:模型的参数值(权重和偏置),这是训练过程中每一层网络中学习到的数值。
  • 优化器状态:在训练过程中,优化器(如 AdamW)的状态信息,包括动量、学习率、梯度等。这些信息对于恢复训练进度至关重要,尤其是当你需要从中断点继续训练时。
  • 训练超参数:可能还包含一些与训练相关的元数据,比如当前的 epoch、迭代次数以及学习率调度器的状态等。

这些是微调过程中最重要的数据。包括了针对相关数据集所需要的对预训练模型的更改。

随后,将这些数据转换为hugging face格式:

xtuner convert pth_to_hf /code/llama2_7b_chat_qlora_sql_e3_copy.py /code/xtuner-workdir/iter_500.pth/ /code/iter_500_hf/

这个操作主要是为了方便在 Hugging Face 环境中使用 PyTorch 训练好的模型。其中/code/llama2_7b_chat_qlora_sql_e3_copy.py 是一个关键的配置文件,它定义了模型的架构、微调策略以及相关参数。在模型转换过程中,它的作用包括:

  1. 模型定义:该文件内包含了对模型(如 LLaMA2)结构的定义,比如加载预训练模型、是否使用 LoRA 技术等。转换工具在进行模型权重转换时,会参考这个配置文件中定义的架构,以确保在 Hugging Face 格式中保留相同的模型结构。
  2. LoRA 配置:如果你在模型训练过程中使用了 LoRA 或 QLoRA 技术来减少参数数量或进行高效微调,这个配置文件中也会包含相关的低秩矩阵配置。转换时需要这些配置来正确转换 LoRA 权重。
  3. 其他相关超参数:文件中可能还包含数据处理、优化器配置、训练时的参数等内容。这些信息在转换过程中可以确保 Hugging Face 格式的模型能与原训练时的行为一致。

简单来说,/code/llama2_7b_chat_qlora_sql_e3_copy.py 这个文件为模型转换提供了结构和超参数的信息,使得转换后的 Hugging Face 模型能够保持与原始 .pth 模型相同的架构和功能。

转换后的模型如图:

模型测试

使用python final_test.py命令进行测试:

可以看到对比了微调前后的模型,微调后的模型取得了争取的答案,说明了微调的有效性。

本次实验主要是针对之前codellama对于数据库相关问题回答不够好的问题,使用与sql数据库相关的数据集来对模型进行微调。本次实验使用的是二机八卡,下面详细写出我在本次试验的步骤。 ## 数据集准备 本次使用的数据集来自[sql-create-context](https://huggingface.co/datasets/b-mc2/sql-create-context)。这是一个专门为文本到 SQL 任务设计的数据集,主要用于训练大语言模型(LLMs)。它包含了 78,577 条数据,每条数据包括一个自然语言查询、一条 SQL `CREATE TABLE` 语句和相应的 SQL 查询。其设计目的是通过提供 `CREATE TABLE` 语句作为上下文,帮助模型在生成 SQL 查询时避免常见的列名或表名的“幻觉”问题。 该数据集结合了 WikiSQL 和 Spider 数据集,利用 `SQLGlot` 工具推断出列的数据类型,并生成相应的 `CREATE TABLE` 语句。这种方法不仅减少了内存占用,还保护了敏感数据的隐私,是构建文本到 SQL 模型的良好资源。 ## 微调训练 首先启动两个notebook: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727072601825-964b7cfe-0aec-4be8-85de-cad2fd6baf19.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727072618260-83f93410-6b7a-40c1-96a8-78b265fc4c49.png) 分别打开两个任务后,使用ifconfig查看其中一台主机的ip地址,然后将其作为master节点。然后在两台主机分别使用命令启动训练。 node1: NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.59.115 NODE_RANK=0 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-workdir --deepspeed deepspeed_zero3_offload ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727072723070-e82d42a9-f8e0-48ca-a9b0-0640ad6c0668.png) node2: NPROC_PER_NODE=4 NNODES=2 PORT=12345 ADDR=10.244.59.115 NODE_RANK=1 xtuner train llama2_7b_chat_qlora_sql_e3_copy.py --work-dir /code/xtuner-workdir --deepspeed deepspeed_zero3_offload ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727072733943-997e6f50-4054-45a5-8e10-644f4269d459.png) 分布式训练参数: 这段命令是在使用多节点分布式训练模型。NPROC_PER_NODE指的是每个节点使用4个GPU;NNODES指的是有两个节点参与训练; ADDR指的是主节点的IP地址,用于分布式训练的节点通信;PORT指的是节点之间的通信的端口号;NODE_RANK用于区分分布式系统中的不同节点。 xtuner命令: + **xtuner train llama2_7b_chat_qlora_sql_e3_copy.py**: 调用 xtuner 进行模型训练,具体的训练脚本是 `llama2_7b_chat_qlora_sql_e3_copy.py`。 + **--work-dir /code/xtuner-workdir**: 指定工作目录,用于保存模型权重、训练日志等。 + **--deepspeed deepspeed_zero3_offload**: 使用 DeepSpeed 的 `Zero-3` 优化器,并且开启 Offload 功能,将部分模型参数或者优化器状态卸载到 CPU上,以节省 GPU 显存。 llama2_7b_chat_qlora_sql_e3_copy.py: 该脚本可以利用xtuner list-cfg来查看,并使用有关copy命令拷贝到当前目录,以方便修改和使用。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727075097469-27bdac69-43e0-40de-a1a7-571bcca7ba0c.png)![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727075185048-060db9c9-5ac1-48a3-96b7-9a71290e9b6b.png) 该脚本中规定了模型和数据集的位置,此外,还针对模型的训练配置进行了一系列的设置,如数据集加载、优化器、batch_size、学习率、模型和分词器,以及LoRA微调的配置等等。我们在使用中有时候需要根据当前的实际情况来更改其中的配置。 ## 运行过程 如图显示了模型一开始运行的部分,红色区域是训练的迭代轮数。 ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727075711381-2133a752-23e9-4c7d-a278-af855abd7540.png) 此时可另开一个终端,利用rocm-smi来观察当前资源利用状况: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727075749778-6f658687-04b8-409a-88a9-93dd78a12386.png) 运行结束时会出现如下输出: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727075779765-028fa6ac-3847-44b0-81c8-e0f47e813a1d.png) ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727075782756-f7c1e51f-ccfd-4271-9ed4-98e00e151f78.png) ## 格式转换 运行完成后,目录下多出了如下文件: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727076051936-97452fe4-dc8a-4ef1-8be0-4c78104fbb9e.png) 这是储存在训练过程中生成的模型检查点文件。.pth文件是pytorch中模型的格式,其中常包括有: + **模型权重**:模型的参数值(权重和偏置),这是训练过程中每一层网络中学习到的数值。 + **优化器状态**:在训练过程中,优化器(如 AdamW)的状态信息,包括动量、学习率、梯度等。这些信息对于恢复训练进度至关重要,尤其是当你需要从中断点继续训练时。 + **训练超参数**:可能还包含一些与训练相关的元数据,比如当前的 epoch、迭代次数以及学习率调度器的状态等。 这些是微调过程中最重要的数据。包括了针对相关数据集所需要的对预训练模型的更改。 随后,将这些数据转换为hugging face格式: xtuner convert pth_to_hf /code/llama2_7b_chat_qlora_sql_e3_copy.py /code/xtuner-workdir/iter_500.pth/ /code/iter_500_hf/ 这个操作主要是为了方便在 Hugging Face 环境中使用 PyTorch 训练好的模型。其中`/code/llama2_7b_chat_qlora_sql_e3_copy.py` 是一个关键的配置文件,它定义了模型的架构、微调策略以及相关参数。在模型转换过程中,它的作用包括: 1. **模型定义**:该文件内包含了对模型(如 LLaMA2)结构的定义,比如加载预训练模型、是否使用 LoRA 技术等。转换工具在进行模型权重转换时,会参考这个配置文件中定义的架构,以确保在 Hugging Face 格式中保留相同的模型结构。 2. **LoRA 配置**:如果你在模型训练过程中使用了 LoRA 或 QLoRA 技术来减少参数数量或进行高效微调,这个配置文件中也会包含相关的低秩矩阵配置。转换时需要这些配置来正确转换 LoRA 权重。 3. **其他相关超参数**:文件中可能还包含数据处理、优化器配置、训练时的参数等内容。这些信息在转换过程中可以确保 Hugging Face 格式的模型能与原训练时的行为一致。 简单来说,`/code/llama2_7b_chat_qlora_sql_e3_copy.py` 这个文件为模型转换提供了结构和超参数的信息,使得转换后的 Hugging Face 模型能够保持与原始 `.pth` 模型相同的架构和功能。 转换后的模型如图: ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727076786260-99e8b2aa-c25a-4d25-b1ec-da12ff856a88.png) ## 模型测试 <font style="color:#000000;">使用python final_test.py命令进行测试:</font> ![](https://cdn.nlark.com/yuque/0/2024/png/48516026/1727076829889-bf25d8f5-47dd-495f-ab28-8647cb3fb016.png) 可以看到对比了微调前后的模型,微调后的模型取得了争取的答案,说明了微调的有效性。
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: HswOAuth/llm_course#123
No description provided.