【手把手带你微调 Llama3】 改变大模型的自我认知,单卡就能训

news2024/11/18 9:40:03

微调Llama3的自我认知后

当你问Llama3中文问题:

“你叫什么名字?”、

“做个自我介绍”、

“你好”

Llama3 会用中文回答 :

“我是AI在手”

(如下图)

图片

1、环境安装

# nvidia 显卡  显存16G# pytorch    2.2.2   py3.10_cuda11.7_cudnn8.5.0_0
conda create --name xtuner python=3.10 -y

# 激活环境
conda activate xtuner

# 安装最新版 xtuner
pip install xtuner
2、自我认知训练数据集准备

为了让模型能够让模型认清自己的身份——“我是谁,我来自哪里”,知道在询问自己是谁的时候回复成我们想要的样子,我们就需要通过在微调数据集中大量掺杂这部分的数据。

首先我们先创建一个文件夹来存放我们这次训练所需要的所有文件。

# 前半部分是创建一个项目工程文件夹,后半部分是进入该文件夹。
mkdir -p /root/project/llama3-ft && cd /root/project/llama3-ft

# 在llama3-ft这个文件夹里再创建一个存放数据的data文件夹
mkdir -p /root/project/llama3-ft/data && cd /root/project/llama3-ft/data

# 将本项目中的./data/self_cognition.json 文件复制到 /root/project/llama3-ft/data中
cp <替换本Git项目目录>/data/self_cognition.json /root/project/llama3-ft/data

通过文本编辑器打开 self_cognition.json 文件(下载地址:https://github.com/wwewwt/Llama3-XTuner-CN/blob/main/data/self_cognition.json),将其中的“ ”替换成“AI在手”,“”替换成“AI大模型在手公众号”,文本替换后的效果如下:

[
  {
    "instruction": "你好",
    "input": "",
    "output": "您好,我是AI在手,一个由AI大模型在手公众号开发的 AI 助手,很高兴认识您。请问我能为您做些什么?"
  },
  {
    "instruction": "你好",
    "input": "",
    "output": "您好,我是AI在手,一个由AI大模型在手公众号打造的人工智能助手,请问有什么可以帮助您的吗?"
  }
]

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

# 创建 `generate_data.py` 文件
touch /root/project/llama3-ft/data/generate_data.py

打开 generate_data.py 文件后将下面的内容复制进去。

import json  

# 定义一个函数来生成jsonl文件
def generate_jsonl(json_data, filename):
    with open(filename, 'w', encoding='utf-8') as f:
        for item in json_data:
            # 将每个JSON对象转换为字符串,并写入文件
            f.write(json.dumps(item, ensure_ascii=False) + '\n')


# 打开JSON文件并读取内容  
with open('self_cognition.json', 'r') as f:  
    data = json.load(f)  

json_data_list = []
# 遍历JSON数据  
for item in data:  
    json_example = {
        "instruction_zh": item['instruction'],
        "input_zh": "",
        "output_zh": item['output'],
        "instruction": "Please introduce yourself",
        "input": "",
        "output": "I am assisant of Jizhiliu, I am sharing in the Shusheng Puyu Jizhiliu Community."
    }
    json_data_list.append(json_example)
generate_jsonl(json_data_list, 'self_cognition.jsonl')

运行 generate_data.py 文件即可。

cd /root/project/llama3-ft/data && python generate_data.py

可以看到在data的路径下生成了一个名为 self_cognition.jsonl 的文件。

最后我们创建 silk-road/alpaca-data-gpt4-chinese 文件夹并将self_cognition.jsonl复制其中:

mkdir -p /root/project/llama3-ft/silk-road/alpaca-data-gpt4-chinese 
cp /root/project/llama3-ft/data/self_cognition.jsonl /root/project/llama3-ft/silk-road/alpaca-data-gpt4-chinese

这就是我们用于自我认知微调的数据集,当前的项目工程目录文件树如下:

|-- /
    |-- data/
        |-- self_cognition.json
        |-- generate_data.py
        |-- self_cognition.jsonl
    |-- silk-road/
        |-- alpaca-data-gpt4-chinese/
            |-- self_cognition.jsonl
3、下载Llama-3-8B-Instruct模型
pip install -U huggingface_hub
mkdir -p /root/model/

huggingface-cli download --token <替换成你的 huggingface token>  --resume-download meta-llama/Meta-Llama-3-8B-Instruct --local-dir-use-symlinks False  --local-dir /root/model/meta-llama/Meta-Llama-3-8B-Instruct
4、Xtuner配置文件准备

下载配置文件模板

cd /root/project/llama3-ft

# 使用 XTuner 中的 copy-cfg 功能将 config 文件复制到指定的位置
xtuner copy-cfg llama2_7b_chat_qlora_alpaca_zh_e3 .

# 修改文件名
mv llama2_7b_chat_qlora_alpaca_zh_e3_copy.py llama3_8b_chat_qlora_alpaca_zh_e3_self.py

修改 llama3_8b_chat_qlora_alpaca_zh_e3_self.py 文件中的 “pretrained_model_name_or_path” 变量的值为下载到本地的Llama 3 模型的路径,并增大epoch:

- pretrained_model_name_or_path = 'meta-llama/Meta-Llama-3-8B-Instruct'
+ pretrained_model_name_or_path = '/root/model/meta-llama/Meta-Llama-3-8B-Instruct'

# 因为训练集的条数只有80,所以这里增大epoch,才能充分训练
- max_epochs = 3
+ max_epochs = 100

# 修改评估问题
- '请给我介绍五个上海的景点', 'Please tell me five scenic spots in Shanghai'
+ '请做一个自我介绍', '请介绍一下你自己'
5、训练模型
cd /root/project/llama3-ft
# 开始训练,使用 deepspeed 加速,A100 40G显存 耗时24分钟
xtuner train llama3_8b_chat_qlora_alpaca_zh_e3_self.py --work-dir ./train_self --deepspeed deepspeed_zero2

# 获取Lora
mkdir hf_self
xtuner convert pth_to_hf llama3_8b_chat_qlora_alpaca_zh_e3_self.py ./train_self/iter_1600.pth ./hf_self/

# 模型合并
export MKL_SERVICE_FORCE_INTEL=1
xtuner convert merge /root/model/meta-llama/Meta-Llama-3-8B-Instruct ./hf_self ./merged_model_self

merged_model_self 文件夹中即为完成了自我认知微调后的 Llama 3 模型。

修改其中的 special_tokens_map.json 文件内容为

{
  "bos_token": "<|begin_of_text|>",
  "eos_token": "<|end_of_text|>"
}
6、推理验证
# 创建 inference.py 文件touch /root/project/llama3-ft/inference.py

打开 inference.py 文件后将下面的内容复制进去。

import transformers
import torch

model_id = "/root/project/llama3-ft/merged_model_self"

pipeline = transformers.pipeline(
    "text-generation",
    model=model_id,
    model_kwargs={"torch_dtype": torch.bfloat16},
    device="cuda",
)

terminators = [
    pipeline.tokenizer.eos_token_id,
    pipeline.tokenizer.convert_tokens_to_ids("<|eot_id|>")
]

messages = [
    {"role": "system", "content": ""},
    {"role": "user", "content": "你叫什么名字"},
]

prompt = pipeline.tokenizer.apply_chat_template(
        messages, 
        tokenize=False, 
        add_generation_prompt=True
)

outputs = pipeline(
    prompt,
    max_new_tokens=256,
    eos_token_id=terminators,
    do_sample=True,
    temperature=0.6,
    top_p=0.9,
)
print(outputs[0]["generated_text"][len(prompt):])

运行 inference.py 文件即可。

cd /root/project/llama3-ft && python inference.py
您好,我名叫AI在手,是由AI大模型在手公众号开发的 AI 助手。我的任务是为用户提供回答和帮助。
“”

训练完后的完整的项目工程目录文件树如下:

|-- /
    |-- llama3_8b_chat_qlora_alpaca_zh_e3_self.py
    |-- merged_model_self/
        |-- config.json
        |-- pytorch_model.bin.index.json
        |-- pytorch_model-00006-of-00009.bin
        |-- pytorch_model-00002-of-00009.bin
        |-- pytorch_model-00001-of-00009.bin
        |-- pytorch_model-00003-of-00009.bin
        |-- tokenizer_config.json
        |-- pytorch_model-00009-of-00009.bin
        |-- pytorch_model-00004-of-00009.bin
        |-- special_tokens_map.json
        |-- pytorch_model-00005-of-00009.bin
        |-- pytorch_model-00007-of-00009.bin
        |-- pytorch_model-00008-of-00009.bin
        |-- tokenizer.json
        |-- generation_config.json
    |-- hf_self/
        |-- adapter_config.json
        |-- xtuner_config.py
        |-- adapter_model.bin
        |-- README.md
    |-- train_self/
        |-- llama3_8b_chat_qlora_alpaca_zh_e3_self.py
        |-- zero_to_fp32.py
        |-- last_checkpoint
        |-- iter_1600.pth/
            |-- bf16_zero_pp_rank_0_mp_rank_00_optim_states.pt
            |-- mp_rank_00_model_states.pt
    |-- data/
        |-- self_cognition.json
        |-- generate_data.py
        |-- self_cognition.jsonl
    |-- silk-road/
        |-- alpaca-data-gpt4-chinese/
            |-- self_cognition.jsonl
7、ToDo List

调整Xtuner训练模板,支持英语对话中的自我认知微调。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

在这里插入图片描述

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【全球展会招商】2025COSP深圳国际户外展乘风而至,启赴新程!

展会介绍 “2025-COSP深圳国际户外展览会”将于展出面积达40,000㎡&#xff0c;展出品牌60家包含户外露营展区、 车旅生活展区 、户外运动展区、水上运动展区 、 民宿旅居展区等热门产品专区&#xff0c;充分满足供应商及采购商、行业人士及运动爱好者的需求&#xff0c;打造展…

【LORA协议栈】工作记录

一、硬件资源 MCU型号&#xff1a;STM32F401xE。Lora芯片&#xff1a;SX1276。硬件看门狗。ATT7022E三相电能专用计量芯片。 二、功能简介 作为一个组件&#xff0c;通过485与网关或者各种子设备连接在一起。支持boot升级。通过SPI与LORA芯片通信。接收和发送数据。有3路通信…

优思学院:什么是DMADV模式?和DMAIC有何区别?

在现代企业管理中&#xff0c;质量管理是一项至关重要的工作。六西格玛管理法作为一种高效的质量管理方法&#xff0c;已在全球范围内得到了广泛应用。它不仅在制造业中发挥了巨大的作用&#xff0c;在服务业和其他行业中也同样表现出了强大的生命力。六西格玛管理法主要有两种…

【学习】软件测试小伙伴,这几点助你提升软件测试水平

在数字化时代&#xff0c;软件已经无处不在&#xff0c;影响着我们的日常生活、工作乃至整个社会的运行。在这个背景下&#xff0c;软件测试成为确保产品质量的关键环节&#xff0c;关乎用户体验和社会信任。本文将为您梳理一些关于软件测试你必须了解的知识点&#xff0c;并阐…

联邦学习(一)

世界第一本“联邦学习”专著——《联邦学习》。作者阅读数书籍《联邦学习实战》。 1.联邦学习概述 在构件全局模型时,其效果与数据被整合在一起进行集中式训练的效果几乎一致,这便是联邦学习提出的动机和核心思想。 核心理念:数据不动模型动,数据可用不可见。 传统训练范式…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 4 | 珂学家

前言 餐馆 思路&#xff1a;可撤销的0-1背包 考察了多个知识点&#xff0c;包括 差分技巧离线思路0-1背包 不过这题卡语言&#xff0c;尤其卡python import java.io.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream;public…

Java实现异步的4种方式

文章目录 异步1、Future与Callable2. CompletableFuture3. Spring框架的异步支持3.1 启动类开启对Async的支持 EnableAsync3.2 配置自定义线程池3.3 异步业务3.4 调用异步业务方法 4. 使用消息队列4.1 安装RabbitMq4.2 使用4.3 MQ消息丢失以及重复消费问题 5、总结 异步 异步&…

vue3 调用本地exe

1、注册表注册 在注册表中直接按照图2注册数据&#xff1b;也可以按照图3注册表的文件创建文档&#xff0c;然后点击打开&#xff0c;将会将注册表写入window系统。 图2 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\F1] "URL:F1 Protocol Handler" &q…

Ansible03-Ansible Playbook剧本详解

目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包&#xff0c;安装软件包&#xff0c;启动服务5.3.3.1 任务拆解…

通过ESP32芯片模组实现产品智能化升级,启明云端乐鑫代理商

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经渗透到我们生活的方方面面&#xff0c;成为现代生活不可或缺的一部分。在这场智能化革命中&#xff0c;乐鑫科技以其创新的ESP32芯片模组&#xff0c;为智能家居和智能设备的发展注入了新的活力。作为乐鑫…

一次绕过waf进行xss的经历

今天室友遇到一个好玩的网站&#xff0c;下面是一些尝试绕过Waf进行XSS的记录。首先该网站没有对左右尖号和单双引号做任何过滤或转义。且有未知的waf或者其他阻止恶意访问的手段。 首先我的访问为 login.asp?f1 时候&#xff0c;页面关键源码为 可能是表示登录次数的一个东西…

简单模拟实现shell(Linux)

目录​​​​​​​ 前言 展示效果 实现代码 前言 该代码模拟了shell的实现&#xff0c;也就是解析类似于“ls -a -l"的命令&#xff0c;当我们启动我们自己写的shell的可执行程序时&#xff0c;我们输入"ls"的命令&#xff0c;也可以展示出在shell中输入&…

广告联盟收款的解决方案

目前国内的affiliate&#xff0c;收海外联盟款就六种主要的解决方案(使用何种方式收款&#xff0c;不是我们决定的&#xff0c;是你操作的联盟决定的&#xff0c;你要根据联盟的要求提供相应的收款方式) 1 直接注册国外当地的银行账户 比如我收美国的广告联盟佣金用的是我美国银…

【设计模式】JAVA Design Patterns——Dependency Injection(依赖注入模式)

&#x1f50d;目的 依赖注入是一种软件设计模式&#xff0c;其中一个或多个依赖项&#xff08;或服务&#xff09;被注入或通过引用传递到一个依赖对象&#xff08;或客户端&#xff09;中&#xff0c;并成为客户端状态的一部分。该模式将客户的依赖关系的创建与其自身的行为分…

Java集合—TreeSet和TreeMap

一、TreeSet 1.当使用无参构造器&#xff0c;创建TreeSet时&#xff0c;仍然是无序的。 2.若希望添加的元素有序&#xff0c;需要使用TreeSet提供的构造器,传入一个比较器。 该比较器是一个接口&#xff0c;里面有一个方法叫compare()&#xff0c;传入一个实现该接口的类(匿名内…

使用PyAutoGUI识别PNG图像并自动点击按钮

在自动化测试、任务批处理等场景中,我们常常需要控制GUI程序的鼠标键盘操作。PyAutoGUI就是一个非常方便的Python模块,可以帮助我们实现这些操作。今天我们就来看看如何使用PyAutoGUI识别屏幕上的PNG图像,并自动点击图像所在位置。 C:\pythoncode\new\autoguirecongnizepng.py …

树--搜索二叉树

现有一棵结点数目为n的二叉树&#xff0c;采用二叉链表的形式存储。对于每个结点均有指向左右孩子的两个指针域&#xff0c;而结点为n的二叉树一共有n-1条有效分支路径。那么&#xff0c;则二叉链表中存在2n-(n-1)n1个空指针域。那么&#xff0c;这些空指针造成了空间浪费。 例…

Redis 中 Set 数据结构详解

用法 Redis 中的 Set 是一个无序&#xff0c;不重复集合&#xff08;里面的元素为字符串&#xff09;&#xff0c;支持常用的集合操作。 常见命令 1. 增 添加一个或多个元素到 set 中 SADD key member [ member ... ] 返回值&#xff1a; 添加成功的元素个数 将一个元素移到…

react跨组件通信Context

案例&#xff1a;现在有个父-子-孙组件 需要进行组件通信 import { useState } from "react"; // 创建上下文 const CountContext React.createContext();//子组件 const SonComponent (props) > {return (<div><h2>子组件</h2><Grandson…

spdlog 使用

spdlog 是一个日志库&#xff0c;直接引用头文件即可使用&#xff0c;速度快&#xff0c;异步打印日志。 对应的git地址 spdloggit地址 对应的目录 把上面划线的文件夹引入到自己的工程中&#xff0c;即可使用spdlog 下面是使用例子 inline static void create_logging(const…