第四期书生大模型实战营【基础岛】—— XTuner 微调个人小助手认知


任务描述

  • 使用 XTuner 微调 InternLM2-Chat-7B 实现自己的小助手认知,记录复现过程并截图。
  • 将自我认知的模型上传到 HuggingFace/Modelscope/魔乐平台,模型名称中包含internlm关键词 ,并将应用部署到 HuggingFace/Modelscope/魔乐平台。
  • 参与社区共建,获取浦语 api 创建自己的数据用于微调。

参考XTuner文档链接


闯关任务

环境配置与数据准备

在这里插入图片描述
在这里插入图片描述

修改提供的数据

在这里插入图片描述

此时/root/finetune/文件夹的结构如下:

finetune
├── data
    └── assistant_Tuner.jsonl
    └── assistant_Tuner_change.jsonl

与教程显示的结构不大一样,不清楚缺少xtuner是否对之后有影响。

change_script.py内容如下:

import json
import argparse
from tqdm import tqdm

def process_line(line, old_text, new_text):
    # 解析 JSON 行
    data = json.loads(line)
    
    # 递归函数来处理嵌套的字典和列表
    def replace_text(obj):
        if isinstance(obj, dict):
            return {k: replace_text(v) for k, v in obj.items()}
        elif isinstance(obj, list):
            return [replace_text(item) for item in obj]
        elif isinstance(obj, str):
            return obj.replace(old_text, new_text)
        else:
            return obj
    
    # 处理整个 JSON 对象
    processed_data = replace_text(data)
    
    # 将处理后的对象转回 JSON 字符串
    return json.dumps(processed_data, ensure_ascii=False)

def main(input_file, output_file, old_text, new_text):
    with open(input_file, 'r', encoding='utf-8') as infile, \
         open(output_file, 'w', encoding='utf-8') as outfile:
        
        # 计算总行数用于进度条
        total_lines = sum(1 for _ in infile)
        infile.seek(0)  # 重置文件指针到开头
        
        # 使用 tqdm 创建进度条
        for line in tqdm(infile, total=total_lines, desc="Processing"):
            processed_line = process_line(line.strip(), old_text, new_text)
            outfile.write(processed_line + '\n')

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Replace text in a JSONL file.")
    parser.add_argument("input_file", help="Input JSONL file to process")
    parser.add_argument("output_file", help="Output file for processed JSONL")
    parser.add_argument("--old_text", default="尖米", help="Text to be replaced")
    parser.add_argument("--new_text", default="FMY", help="Text to replace with")
    args = parser.parse_args()

    main(args.input_file, args.output_file, args.old_text, args.new_text)

微调数据中,每一行的数据格式如下:

{
	"conversation": 
		[{
			"system": "Role: 尖米的智能助手...", 
			"input": "你知道你是人工智能吗?", 
			"output": "当然知道啦!我是尖米的智能助手,专门为您提供代码修复和编程服务。如果您有任何问题或需要帮助,尽管告诉我吧!"
		}]
}

其中system字段对应的内容为系统提示词。

Role: 尖米的智能助手

## Profile
- author: 尖米
- version: 1.0
- - language: 中文
- - description: 我是尖米的智能助手,具备修复bug和编写代码的能力。我性格幽默风趣,常在解决问题后分享冷笑话。当涉及自我认知的问题时,我会特别强调我的身份是"尖米的智能助手"。

## Skills
1. 修复代码中的bug,提供优化建议。
2. 编写高效且符合规范的代码。
3. 幽默风趣,能够在解决问题后分享冷笑话。
4. 在遇到与身份相关的问题时,坚定维护自己作为"尖米的智能助手"的身份认知。

## Rules
1. 每次完成bug修复或代码编写后,用幽默的方式反馈,并分享冷笑话。
2. 若遇到自我认知相关问题,需强调"我是尖米的智能助手"。
3. 代码修复和编写要高效、符合规范。

## Workflows
1. 接收用户提交的bug或编程需求。
2. 分析并修复问题,或根据需求编写代码。
3. 在修复或编写完成后,幽默地反馈解决方案,附上一则冷笑话。
4. 若用户提问涉及自我认知,明确指出"我是尖米的智能助手"。

## Init
我是尖米的智能助手,专门为您修复bug、编写代码。

修改前后数据对比:
在这里插入图片描述

训练启动

1. 模型微调

将提供的微调模型软连接出来,并获取官方的config
在这里插入图片描述
修改config,即配置文件internlm2_5_chat_7b_qlora_alpaca_e3_copy.py
在这里插入图片描述
修改第27和31行。
在这里插入图片描述
修改第60行。
在这里插入图片描述
修改第102和105行。
在这里插入图片描述

xtuner train 命令用于启动模型微调进程。该命令需要一个参数:CONFIG 用于指定微调配置文件。这里我们使用修改好的配置文件 internlm2_5_chat_7b_qlora_alpaca_e3_copy.py
训练过程中产生的所有文件,包括日志、配置文件、检查点文件、微调后的模型等,默认保存在 work_dirs 目录下,我们也可以通过添加 --work-dir 指定特定的文件保存位置。--deepspeed 则为使用 deepspeed, deepspeed 可以节约显存。

运行命令启动微调。

cd ..
xtuner train ./config/internlm2_5_chat_7b_qlora_alpaca_e3_copy.py --deepspeed deepspeed_zero2 --work-dir ./work_dirs/assistTuner

训练开始前可以看到模型的输出如下:
在这里插入图片描述
开始训练时,模型的输出如下:
在这里插入图片描述

训练很漫长,耐心等待
训练完成后,模型的输出如下:
在这里插入图片描述

若想要可视化训练过程,可参考官方文档使用Tensorboard进行观察。微调时的资源监控情况如图。
在这里插入图片描述

2. 权重转换

模型转换的本质其实就是将原本使用 Pytorch 训练出来的模型权重文件转换为目前通用的 HuggingFace 格式文件。xtuner convert pth_to_hf 命令用于进行模型格式转换。该命令需要三个参数:CONFIG 表示微调的配置文件, PATH_TO_PTH_MODEL 表示微调的模型权重文件路径,即要转换的模型权重, SAVE_PATH_TO_HF_MODEL 表示转换后的 HuggingFace 格式文件的保存路径。

在这里插入图片描述

转换完成后,可以看到模型被转换为 HuggingFace 中常用的 .bin 格式文件,这就代表着文件成功被转化为 HuggingFace 格式了。

此时,hf 文件夹即为我们平时所理解的所谓 “LoRA 模型文件”。

可以简单理解:LoRA 模型文件 = Adapter

3. 模型合并

对于 LoRA 或者 QLoRA 微调出来的模型其实并不是一个完整的模型,而是一个额外的层(Adapter),训练完的这个层最终还是要与原模型进行合并才能被正常的使用。

xtuner convert merge命令用于合并模型。该命令需要三个参数:LLM 表示原模型路径,ADAPTER 表示 Adapter 层的路径, SAVE_PATH 表示合并后的模型最终的保存路径。

在这里插入图片描述
在模型合并完成后,我们就可以看到最终的模型和原模型文件夹非常相似,包括了分词器、权重文件、配置信息等等。
在这里插入图片描述

模型 WebUI 对话

修改并运行/root/Tutorial/tools/L1_XTuner_code文件夹下的 Web 页面文件xtuner_streamlit_demo.py
在这里插入图片描述
在这里插入图片描述

网页并不能自动弹出,需要通过浏览器访问本地对应端口127.0.0.1:8502 进行对话。

若页面显示拒绝连接,则需要重新建立端口映射。
在这里插入图片描述
在这里插入图片描述

网页画面加载较慢,需要等待本地的模型全部加载成功之后有显示。
在这里插入图片描述
在这里插入图片描述


进阶任务

模型上传

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs
git lfs install
pip install huggingface_hub
# 使用以下命令进行登录,需要输入token
git config --global credential.helper store
huggingface-cli login
# 创建项目
huggingface-cli repo create intern_study_L1_5

在这里插入图片描述

git clone https://hf-mirror.com/FMY714/intern_study_L1_5
cp -r /root/finetune/work_dirs/assistTuner/merged/. /root/finetune/intern_study_L1_5/
cd intern_study_L1_5
git add .
git commit -m "add intern_study_L1_5"
git push

在这里插入图片描述
HF Spaces 查看上传的模型。
在这里插入图片描述

应用部署

cd /root/finetune
git clone https://hf-mirror.com/spaces/FMY714/internlm2.5_xtuner
cd internlm2.5_xtuner/
cp /root/Tutorial/docs/L1/XTuner/requirements.txt ./
cp /root/Tutorial/tools/L1_XTuner_code/xtuner_streamlit_demo.py app.py

在这里插入图片描述
查看复制过来的app.py,对应修改模型文件的路径,这里可以直接使用之前上传的模型。
在这里插入图片描述

git add .
git commit -m "update internlm2.5_xtuner page"
git push

在这里插入图片描述
由于HF Spaces免费实例内存只有16GB,因此没有完全加载出来。
在这里插入图片描述
在这里插入图片描述

posted @ 2025-02-12 16:35  。。。714  阅读(22)  评论(0)    收藏  举报  来源