XTuner InternLM-Chat 个人小助手认知微调实践

要解决的问题:
如何让模型知道自己做什么,是什么样身份。是谁创建了他!!!

概述

目标:通过微调,帮助模型认清了解对自己身份弟位

方式:使用XTuner进行微调

微调前(回答比较官方)
在这里插入图片描述

微调后(对自己的身份有了清晰的认知)
在这里插入图片描述

实操

# 创建自己的环境
conda create --name personal_assistant python=3.10 -y

# 激活环境
conda activate personal_assistant
# 进入家目录 (~的意思是 “当前用户的home路径”)
cd ~
# 创建版本文件夹并进入,以跟随本教程
# personal_assistant用于存放本教程所使用的东西
mkdir /root/personal_assistant && cd /root/personal_assistant
mkdir /root/personal_assistant/xtuner019 && cd /root/personal_assistant/xtuner019

# 拉取 0.1.9 的版本源码
git clone -b v0.1.9  https://github.com/InternLM/xtuner
# 无法访问github的用户请从 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner

# 进入源码目录
cd xtuner

# 从源码安装 XTuner
pip install -e '.[all]'

数据准备

创建data文件夹用于存放用于训练的数据集

mkdir -p /root/personal_assistant/data && cd /root/personal_assistant/data

在data目录下创建一个json文件personal_assistant.json作为本次微调所使用的数据集。json中内容可参考下方(复制粘贴n次做数据增广,数据量小无法有效微调,下面仅用于展示格式,下面也有生成脚本)

其中conversation表示一次对话的内容,input为输入,即用户会问的问题,output为输出,即想要模型回答的答案

[
    {
        "conversation": [
            {
                "input": "请介绍一下你自己",
                "output": "我是kaai的小助手,内在是上海AI实验室书生·浦语的7B大模型哦"
            }
        ]
    },
    {
        "conversation": [
            {
                "input": "请做一下自我介绍",
                "output": "我是kaai的小助手,内在是上海AI实验室书生·浦语的7B大模型哦"
            }
        ]
    }
]

以下是一个python脚本,用于生成数据集。在data目录下新建一个generate_data.py文件,将以下代码复制进去,然后运行该脚本即可生成数据集。

import json

# 输入你的名字
name = 'kaai'
# 重复次数
n = 10000

# 创建初始问答数据
qa_data = [
    {
        "conversation": [
            {
                "input": "请介绍一下你自己",
                "output": f"我是{name}的小助手,内在是上海AI实验室书生·浦语的7B大模型哦"
            }
        ]
    },
    {
        "conversation": [
            {
                "input": "请做一下自我介绍",
                "output": f"我是{name}的小助手,内在是上海AI实验室书生·浦语的7B大模型哦"
            }
        ]
    }
]

# 将生成的问答数据保存到JSON文件中
file_path = './qa_data_repeated.json'

with open(file_path, 'w', encoding='utf-8') as file:
    # 使用json.dump直接写入文件,而不是先创建一个大的字符串
    json.dump(qa_data * n, file, ensure_ascii=False, indent=4)

下载模型InternLM-chat-7B、

Hugging Face
使用 Hugging Face 官方提供的 huggingface-cli 命令行工具。安装依赖:

pip install -U huggingface_hub

然后新建 python 文件,填入以下代码,运行即可。

  • resume-download:断点续下
  • local-dir:本地存储路径。(linux 环境下需要填写绝对路径)
import os

# 下载模型
os.system('huggingface-cli download --resume-download internlm/internlm-chat-7b --local-dir your_path')

XTuner 提供多个开箱即用的配置文件,用户可以通过下列命令查看:

# 列出所有内置配置
xtuner list-cfg
#创建用于存放配置的文件夹config并进入
mkdir /root/personal_assistant/config && cd /root/personal_assistant/config

拷贝一个配置文件到当前目录:xtuner copy-cfg ${CONFIG_NAME} ${SAVE_PATH} 在本例中:(注意最后有个英文句号,代表复制到当前路径)

xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

修改拷贝后的文件internlm_chat_7b_qlora_oasst1_e3_copy.py,修改下述位置: (这是一份修改好的文件internlm_chat_7b_qlora_oasst1_e3_copy.py)

主要改模型的位置同时一些超参数

在这里插入图片描述
具体的内容

# PART 1 中
# 预训练模型存放的位置
pretrained_model_name_or_path = '/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b'

# 微调数据存放的位置
data_path = '/root/personal_assistant/data/personal_assistant.json'

# 训练中最大的文本长度
max_length = 512

# 每一批训练样本的大小
batch_size = 2

# 最大训练轮数
max_epochs = 3

# 验证的频率
evaluation_freq = 90

# 用于评估输出内容的问题(用于评估的问题尽量与数据集的question保持一致)
evaluation_inputs = [ '请介绍一下你自己', '请做一下自我介绍' ]


# PART 3 中
dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path))
dataset_map_fn=None

微调启动

xtuner train /root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

微调后参数转换/合并

# 创建用于存放Hugging Face格式参数的hf文件夹
mkdir /root/personal_assistant/config/work_dirs/hf

export MKL_SERVICE_FORCE_INTEL=1

# 配置文件存放的位置
export CONFIG_NAME_OR_PATH=/root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

# 模型训练后得到的pth格式参数存放的位置
export PTH=/root/personal_assistant/config/work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_3.pth

# pth文件转换为Hugging Face格式后参数存放的位置
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf

# 执行参数转换
xtuner convert pth_to_hf $CONFIG_NAME_OR_PATH $PTH $SAVE_PATH

Merge模型参数

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER='GNU'

# 原始模型参数存放的位置
export NAME_OR_PATH_TO_LLM=/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b

# Hugging Face格式参数存放的位置
export NAME_OR_PATH_TO_ADAPTER=/root/personal_assistant/config/work_dirs/hf

# 最终Merge后的参数存放的位置
mkdir /root/personal_assistant/config/work_dirs/hf_merge
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf_merge

# 执行参数Merge
xtuner convert merge \
    $NAME_OR_PATH_TO_LLM \
    $NAME_OR_PATH_TO_ADAPTER \
    $SAVE_PATH \
    --max-shard-size 2GB

网页DEMO

安装网页Demo所需依赖

pip install streamlit==1.24.0

下载demo代码

# 创建code文件夹用于存放InternLM项目代码
mkdir /root/personal_assistant/code && cd /root/personal_assistant/code
git clone https://github.com/InternLM/InternLM.git

修改代码

/mnt/xtuner/xtuner019/personal_assistant/code/InternLM/chat/web_demo.py
@st.cache_resource
def load_model():
    model = (AutoModelForCausalLM.from_pretrained('/mnt/xtuner/xtuner019/personal_assistant/merge',
                                                  trust_remote_code=True).to(
                                                      torch.bfloat16).cuda())
    tokenizer = AutoTokenizer.from_pretrained('/mnt/xtuner/xtuner019/personal_assistant/merge',
                                              trust_remote_code=True)
    return model, tokenizer

运行

streamlit run web_demo.py --server.address 127.0.0.1 --server.port 6006

效果

微调前
在这里插入图片描述
微调后(对自己的身份有了清晰的认知)
在这里插入图片描述

你的路径应该如下

├── code
│   └── InternLM
│       ├── agent
│       │   ├── lagent.md
│       │   ├── lagent_zh-CN.md
│       │   ├── pal_inference.md
│       │   ├── pal_inference.py
│       │   ├── pal_inference_zh-CN.md
│       │   ├── README.md
│       │   └── README_zh-CN.md
│       ├── assets
│       │   ├── compass_support.svg
│       │   ├── license.svg
│       │   ├── logo.svg
│       │   ├── modelscope_logo.png
│       │   ├── robot.png
│       │   └── user.png
│       ├── chat
│       │   ├── chat_format.md
│       │   ├── chat_format_zh-CN.md
│       │   ├── lmdeploy.md
│       │   ├── lmdeploy_zh_cn.md
│       │   ├── openaoe.md
│       │   ├── openaoe_zh_cn.md
│       │   ├── react_web_demo.py
│       │   ├── README.md
│       │   ├── README_zh-CN.md
│       │   └── web_demo.py
│       ├── finetune
│       │   ├── README.md
│       │   └── README_zh-CN.md
│       ├── LICENSE
│       ├── model_cards
│       │   ├── internlm_20b.md
│       │   ├── internlm2_1.8b.md
│       │   ├── internlm2_20b.md
│       │   ├── internlm2_7b.md
│       │   └── internlm_7b.md
│       ├── README.md
│       ├── README_zh-CN.md
│       ├── requirements.txt
│       ├── sonar-project.properties
│       ├── tests
│       │   └── test_hf_model.py
│       └── tools
│           ├── convert2llama.py
│           └── README.md
├── config
│   ├── internlm_chat_7b_qlora_oasst1_e3_copy.py
│   └── work_dirs
│       └── internlm_chat_7b_qlora_oasst1_e3_copy
│           ├── 20240223_160926
│           │   ├── 20240223_160926.log
│           │   └── vis_data
│           │       └── config.py
│           ├── 20240223_161009
│           │   ├── 20240223_161009.log
│           │   └── vis_data
│           │       └── config.py
│           ├── 20240223_161051
│           │   ├── 20240223_161051.log
│           │   └── vis_data
│           │       ├── 20240223_161051.json
│           │       ├── config.py
│           │       └── scalars.json
│           ├── epoch_1.pth
│           ├── epoch_2.pth
│           ├── epoch_3.pth
│           ├── internlm_chat_7b_qlora_oasst1_e3_copy.py
│           └── last_checkpoint
├── data
│   ├── data.py
│   ├── data_QA.py
│   └── personal_assistant.json
├── hf
│   ├── adapter_config.json
│   ├── adapter_model.safetensors
│   ├── README.md
│   └── xtuner_config.py
├── internlm-chat-7b
│   ├── config.json
│   ├── configuration_internlm.py
│   ├── configuration.json
│   ├── generation_config.json
│   ├── modeling_internlm.py
│   ├── pytorch_model-00001-of-00008.bin
│   ├── pytorch_model-00002-of-00008.bin
│   ├── pytorch_model-00003-of-00008.bin
│   ├── pytorch_model-00004-of-00008.bin
│   ├── pytorch_model-00005-of-00008.bin
│   ├── pytorch_model-00006-of-00008.bin
│   ├── pytorch_model-00007-of-00008.bin
│   ├── pytorch_model-00008-of-00008.bin
│   ├── pytorch_model.bin.index.json
│   ├── README.md
│   ├── special_tokens_map.json
│   ├── tokenization_internlm.py
│   ├── tokenizer_config.json
│   └── tokenizer.model
└── merge
    ├── added_tokens.json
    ├── config.json
    ├── configuration_internlm.py
    ├── generation_config.json
    ├── modeling_internlm.py
    ├── pytorch_model-00001-of-00008.bin
    ├── pytorch_model-00002-of-00008.bin
    ├── pytorch_model-00003-of-00008.bin
    ├── pytorch_model-00004-of-00008.bin
    ├── pytorch_model-00005-of-00008.bin
    ├── pytorch_model-00006-of-00008.bin
    ├── pytorch_model-00007-of-00008.bin
    ├── pytorch_model-00008-of-00008.bin
    ├── pytorch_model.bin.index.json
    ├── special_tokens_map.json
    ├── tokenization_internlm.py
    ├── tokenizer_config.json
    └── tokenizer.model

github链接

操作指南

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/405366.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据 - Spark系列《十》- rdd缓存详解

Spark系列文章: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

Java基于微信小程序的智能停车场管理系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【计算机网络】数据链路层|封装成帧|透明传输|差错检测|PPP协议|CSMA/CD协议

目录 一、思维导图 ​ 二、数据链路层功能概述 1.数据链路层概述 2.数据链路层功能概述——封装成帧 3.数据链路层功能概述——透明传输 4.数据链路层功能概述——差错检测 三、数据链路层重要协议 1.数据链路层重要协议:PPP协议 2.数据链路层重要协议&#x…

成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘

🔥 成功解决TypeError: can’t multiply sequence by non-int of type ‘float’ 📅 日期:2024年2月23日 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化…

MIT-BEVFusion系列九--CUDA-BEVFusion部署4 c++解析pytorch导出的tensor数据

目录 创建流打印 engine 信息打印结果内部流程 启动计时功能加载变换矩阵并更新数据(重要)内部实现 该系列文章与qwe一同创作,喜欢的话不妨点个赞。 在create_core方法结束后,我们的视角回到了main.cpp中。继续来看接下来的流程。…

蜂窝物联网咖WiFi认证解决方案

项目背景 随着目前网咖模式越来越流行,给网吧部署一套无缝漫游的WIFI网络势在必行。同时,网吧无线准入的验证码在客户机上面进行更新,以防周边的人员进行蹭网,损失网吧的外网带宽。 01 需求分析 1. 网吧服务区域全部覆盖无盲区…

harbor(docker仓库)仓库部署 - 高可用

harbor(docker仓库)仓库部署 - 高可用 1. harbor高可用1.1 方案说明1. 双主复制2. 多harbor实例共享后端存储 1.2 部署高可用(多harbor实例共享后端存储)1. 服务器划分2. 安装harbor(先部署一套Harbor,用于…

Set集合(Java) 及底层原理

SET<E>是一个接口&#xff0c;添加的元素是无序的&#xff1a;添加数据的顺序和获取出的数据顺序不一致&#xff1b;不重复&#xff0c;无索引。 实现类&#xff1a; 1.HashSet&#xff1a;无序不重复无索引 2.LinkedHashSet&#xff1a;有序不重复无索引 3.TreeSet&…

聊天敏感词监控该怎样实现?

当员工在日常工作中&#xff0c;经常使用企业微信、钉钉等聊天通讯软件进行沟通和管理&#xff0c;不可避免地会出现员工和客户之间敏感行为的出现。 例如员工飞单、辱骂客户、私自承诺、收取红包等违规行为&#xff0c;这些不仅会影响公司形象&#xff0c;还会造成经济损失。…

企业级大数据安全架构(十一)Kerberos接入dophinscheduler

作者&#xff1a;楼高 建议将dophinscheduler集成到Ambari安装部署&#xff0c;在Ambari上面开启kerberos 1.安装准备 编译 从GitHub获取dolphinscheduler-1.3.9源码 git clone https://github.com/apache/dolphinscheduler.git -b 1.3.9-releasehttps://github.com/apache/…

从git上clone项目到本地后启动时的一种报错

当我们从git上拉项目到本地之后&#xff0c;先install,但启动时可能会出现报错&#xff0c;例如上面这种报错&#xff0c;这时候我们需要把package.json里的vite改一下&#xff0c;例如改成2.6.13&#xff0c;之后删掉node_modules,重新install,再启动一下&#xff0c;就好了。…

Oracle迁移到mysql-导出mysql所有索引和主键

导出建库表索引等&#xff1a; [rootlnpg ~]# mysqldump -ugistar -pxxx -h192.168.207.143 --no-data -d lndb > lndb20230223-1.sql 只导出索引&#xff1a;参考&#xff1a;MYSQL导出现有库中的索引脚本_mysql 导出数据库所有表的主键和索引-CSDN博客 -- MYSQL导出现有…

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV&#xff08;Unique Visitor&#xff09;独立访客PV&#xff08;Page View&#xff09;页面浏览量DAU&#xff08;Daily Active User&#xff09;日活跃用户量MAU&#xff08;Monthly Activ…

SICTF Round#3 RE WP

1. BabyC ShiftF12 一眼出 2. ez_pyc 好多wp里直接反编译出了源码&#xff0c;md5都能直接看见……我用的一样版本的uncompyle6但是没有这样的效果 这种事情也没法强求&#xff0c;老老实实逆吧 程序是一个数独&#xff0c;我实在没看出来…… 首先看到一个9*9的棋盘&…

springboot网站开发01-如何搭建Maven类型父子嵌套结构项目

springboot网站开发01-如何搭建Maven类型父子嵌套结构项目&#xff01;众所周知&#xff0c;实际上&#xff0c;在真正的公司项目开发中为了让代码实现更多的复用&#xff0c;提升项目的开发效率&#xff0c;节省开发的成本&#xff08;人力成本较高&#xff0c;代码可以尽量复…

Django——ORM增删改查

基本对象 model.objects 创建数据 可以通过django编写的命令行方式快捷创建数据 python manage.py shell 如果对模型层有任何修改都需要重启shell&#xff0c;否则操作容易出错 在shell中我们需要先引入我们的模型&#xff0c;如from bookstore.models import Book 然后通过…

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…

7.(数据结构)堆

7.1 相关概念 堆&#xff08;Heap&#xff09;在计算机科学中是一种特殊的数据结构&#xff0c;它通常被实现为一个可以看作完全二叉树的数组对象。以下是一些关于堆的基本概念&#xff1a; 数据结构&#xff1a; 堆是一个优先队列的抽象数据类型实现&#xff0c;通过完全二叉树…

Upload-Labs-Linux1【CTF】

拿到这道题目一看&#xff0c;发现是upload靶场&#xff1b;这不简简单单吗&#xff1b;结果中间还是遇到了一些小问题 小坑总结&#xff1a;该关只识别标准php语法&#xff1a;<?php phpinfo()?>格式&#xff1b;即<?php ?> 不识别<? phpinfo()?> &…

LeetCode---385周赛

题目 3042. 统计前后缀下标对 I 3043. 最长公共前缀的长度 3044. 出现频率最高的质数 3045. 统计前后缀下标对 II 一、最长公共前缀的长度 这题可以用字典树来做。 这里简单介绍一下字典树&#xff0c;顾名思义&#xff0c;这是用来存放单词的树&#xff0c;如何存&#x…