LLM系列 | 20 : Llama2 实战(下篇)-中文语料微调(附完整代码)

简介

紧接前文:

  • 万字长文细说ChatGPT的前世今生
  • Llama 2实战(上篇):本地部署(附代码)

上篇主要介绍Llama2的基本情况和基于官方模型实测Llama2在中英上的效果,包括单轮和多轮对话。今天这篇小作文作为Llama2的下篇,主要介绍如何用中文语料对Llama 2的基座模型(7B版)进行微调并实测微调后模型的效果。本文实验完整代码请找小编索取。后续将实战Code Llama感兴趣的小伙伴可以关注下!

数据准备

基座模型下载可以参考Llama 2实战(上篇):本地部署(附代码)中的模型下载部分。官方Repo: llama-recipes里面提到支持的默认数据格式有三种:grammar_dataset, alpaca_datasetandsamsum_dataset。为了节约时间,选择alpaca格式的中文SFT数据集,alpaca格式的数据示例如下:

[{"instruction": "根据给定的坐标确定最近的机场。","input": "40.728157, -73.794853","output": "距给定坐标最近的机场是纽约市的拉瓜迪亚机场 (LGA)。"},{"instruction": "输出不同种类水果的列表","input": "","output": "1. 苹果\n2. 香蕉\n3. 橘子\n4. 芒果\n5. 草莓\n6. 葡萄\n7. 蓝莓\n8. 樱桃\n9. 猕猴桃\n10. 甜瓜\n11.菠萝\n12. 李子\n13.桃子"},{"instruction": "找出字串中隐藏的信息","input": "业余咖啡","output": "隐藏的消息是“咖啡因爱好者”。"}]

本次实验具体选择的数据集是:GuanacoDataset/guanaco_non_chat-utf8.json。完成数据下载之后,将guanaco_non_chat-utf8.json放到 llama-recipes/ft_datasets目录下,并重命名为 alpaca_data.json。训练时将训练集指定为 alpaca_dataset即可,llama-recipes 将会自动找到这个文件。至此,SFT微调数据集准备完成。

中文微调

微调训练脚本使用llama_finetuning.py脚本,具体如下:

# 单机, 多卡
export CUDA_VISIBLE_DEVICES=1,2,3
torchrun --nnodes 1 --nproc_per_node 3 llama_finetuning.py \--enable_fsdp \--use_peft \--peft_method lora \--model_name /home/model_zoo/LLM/llama2/Llama-2-7b-hf/ \--dataset alpaca_dataset \--pure_bf16 \--batch_size_training 50 \--num_epochs 2 \--output_dir /home/LLM/llama-recipes/PEFT/model

微调结束后,在/home/LLM/llama-recipes/PEFT/model生成adapter_config.jsonadapter_model.bin文件,这就是微调后的参数结果。

模型inference

使用如下脚本加载微调后的模型进行inference:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/09/03 10:15
# @Author  : 卖热干面的小女孩
# @File    : inference_multi_gpus_one_node.py
# @联系方式  :  《微-心-公-众-号 <小窗幽记机器学习>》import pdb
import torch
from transformers import LlamaForCausalLM, LlamaTokenizer
from transformers import GenerationConfig
from peft import PeftModel, PeftConfigpeft_model_id = "./PEFT/model/"
temperature = 0.0
max_new_tokens = 256
config = PeftConfig.from_pretrained(peft_model_id)
model = LlamaForCausalLM.from_pretrained(config.base_model_name_or_path)
model = PeftModel.from_pretrained(model, peft_model_id)
tokenizer = LlamaTokenizer.from_pretrained(config.base_model_name_or_path)device = "cuda:2"model = model.to(device)
model.eval()
# test_prompt = "### Instruction: \n你谁? \n### Response:\n"
# test_prompt = "### Instruction: \n你叫做爱坤,擅长舞蹈、篮球、武术篮球、舞蹈篮球,喜欢Rap,能唱会跳,偶像是马保国?\n### Response:\n"
# test_prompt = "### Instruction: 根据以下信息,回答问题。爱坤的偶像是谁?直接给出答案即可,不要输出其他\n### Input: \n你叫做爱坤,擅长舞蹈、篮球、武术篮球、舞蹈篮球,喜欢Rap,能唱会跳,偶像是马保国?\n ### Response:\n"
# test_prompt = "### Instruction: 根据以下信息:<爱坤,擅长舞蹈、篮球、武术篮球、舞蹈篮球,喜欢Rap,能唱会跳,偶像是马保国?> 回答问题。爱坤的偶像是谁?直接给出答案即可。\n### Response:\n"
test_prompt = "### Instruction: 根据以下信息:<爱坤,擅长舞蹈、篮球、武术篮球、舞蹈篮球,喜欢Rap,能唱会跳,偶像是马保国?> 回答问题。爱坤崇拜谁?直接给出答案即可。\n### Response:\n"
inputs = tokenizer(test_prompt, return_tensors="pt")
model_input = tokenizer(test_prompt, return_tensors="pt").to(device)input_ids = model_input["input_ids"].to(device)
generation_config = GenerationConfig(temperature=temperature,top_p=0.75,top_k=40,num_beams=4,repetition_penalty=2.0
)with torch.no_grad():generation_output = model.generate(input_ids=model_input['input_ids'],generation_config=generation_config,return_dict_in_generate=True,output_scores=True,max_new_tokens=max_new_tokens,)
s = generation_output.sequences[0]
output = tokenizer.decode(s)
print("output=", output)

输出结果如下:

output= <s> ### Instruction: 根据以下信息:<爱坤,擅长舞蹈、篮球、武术篮球、舞蹈篮球,喜欢Rap,能唱会跳,偶像是马保国?> 回答问题。爱坤崇拜谁?直接给出答案即可。
### Response:
爱坤崇拜马保国</s>

可以看出,经过中文语料的简单微调,可以较好地支持中文问答。

模型部署

上述方式以脚本方式加载模型并做inference。那么如果想要向外提供服务,可以使用alpaca-lora提供的脚本部署Web服务。这里为了减缓模型的重复回复,添加了 repeatition penalty

 CUDA_VISIBLE_DEVICES=1 python3 generate.py --base_model /home/model_zoo/LLM/llama2/Llama-2-7b-hf/ --lora_weights /home/Repository/LLM/llama-recipes/PEFT/model

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

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

相关文章

Linux中软链接与硬链接的作用、区别、创建、删除

1、软链接与硬链接的作用 (1)软链接 软链接是Linux中常用的命令,它的功能是某一文件在另外一个位置建立一个同步的链接,相当于C语言中的指针,建立的链接直接指向源文件所在的地址,软链接不会另外占用资源,当同一文件需要在多个位置被用到的时候,就会使用到软连接。 …

Python解析MDX词典数据并保存到Excel

点击上方“Python爬虫与数据挖掘”&#xff0c;进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 察纳雅言&#xff0c;深追先帝遗诏&#xff0c;臣不胜受恩感激。 原始数据和处理结果&#xff1a; https://gitcode.net/as604049322/blog_data/-/tree…

DBus笔记

包含2套总线&#xff1a;system bus&#xff0c;service bus&#xff0c;权限不同&#xff0c;system bus需要kernel或root权限dbus daemon进程提供服务&#xff0c; 有systemd启动dbus daemon&#xff0c;为system bus和service bus分别启动一个daemon。native object&#xf…

【Unity插件】实现多人在线游戏——Mirror插件的使用介绍

文章目录 前言导入Mirror插件 简单介绍一、RPC调用二、错误注意 基本使用一、创建场景的网络管理器二、创建一个玩家三、添加玩家初始生成位置四、玩家控制五、同步摄像机六、同步不同角色的名字和颜色修改七、同步动画八、同步子弹方法一方法二 九、聊天功能十、场景同步切换十…

新版kafka可视化界面组件

二、安装kafka可视化客户端工具&#xff08;kafka tool 2&#xff09; 1、下载安装 在官网中找到对应自己电脑系统的版本&#xff1a; kafka Tool2官网下载地址&#xff1a; Offset Explorer 这个方案是为Kafka依赖zookeeper提供的可视化解决方案。 前言 在早期使用kafka的…

Flask-flask中的后台分页查询实现

在后台查询数据并在前台展示的场景中&#xff0c;当数据量较大时&#xff0c;页面加载会非常缓慢&#xff0c;此时建议使用后台分页查询的形式。在flask中&#xff0c;基于Flask-SQLAlchemy可以使用以下方式实现。 方法一&#xff1a; Flask-SQLAlchemy 提供了一个 paginate(…

现代循环神经网络-门控循环单元(GRU)

理论 门控隐状态 门控循环单元与普通的循环神经网络之间的关键区别在于&#xff1a; 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态&#xff0c; 以及应该何时重置隐状态。 这些机制是可学习的&#xff0c;并且能够解决了上面列出的问题。 例如&…

双目立体视觉

#理想模型图 其中&#xff1a; b 为基线&#xff0c;即两个相机原点之间的距离 &#xff1b; fl和fr 分别为左右相机的焦距&#xff0c;理想的双目相机flfrf &#xff1b; cl和cr 分别为左右相机的光心&#xff0c;理想的双目相机clcr &#xff1b; xl和xr 分别为空间中的一点…

2023/09/15 qt day1

代码实现图形化界面 #include "denglu.h" #include "ui_denglu.h" #include <QDebug> #include <QIcon> #include <QLabel> #include <QLineEdit> #include <QPushButton> denglu::denglu(QWidget *parent): QMainWindow(p…

【AI】机器学习——支持向量机(非线性及分析)

5. 支持向量机(线性SVM) 文章目录 5.4 非线性可分SVM5.4.1 非线性可分问题处理思路核技巧核函数特点 核函数作用于SVM 5.4.2 正定核函数由 K ( x , z ) K(x,z) K(x,z) 构造 H \mathcal{H} H 空间步骤 常用核函数 5.5 SVM参数求解算法5.6 SVM与线性模型关系 5.4 非线性可分SVM …

Spark SQL【基于泰坦尼克号生还数据的 Spark 数据分析处理】

前言 昨天实验课试着做了一个 Spark SQL 小案例&#xff0c;发现好多内容还是没有掌握&#xff0c;以及好多书上没有的内容需要学习。 一、数据准备 csv 文件内容部分数据展示&#xff1a; PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarke…

聊天机器人

收集窗帘相关的数据 可以用gpt生成&#xff0c;也可以用爬虫 图形化界面 gradio 向量数据库 faiss python代码 import gradio as gr import random import timefrom typing import Listfrom langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstor…

揭秘:WhatsApp的注册策略

WhatsApp账号的注册方式可以分为两种&#xff1a;实体卡注册和虚拟卡注册。实体卡注册是指使用个人手机卡完成注册&#xff0c;而虚拟卡注册则通过前面提到的对接平台来完成的。 账号注册问题一直是导致WhatsApp账号永久封禁的主要原因。由于WhatsApp广泛为群发获客等用途之一…

设计方法编写测试用例---思路分析

测一四年我在YX公司带测试团队&#xff0c;一个用例评审的会议上&#xff0c;一不小心超常发挥&#xff0c;结果卡在了一个用例设计方法上&#xff0c;印象非常深刻&#xff0c;当时的业务场景是支付方式的选择和优惠方案。 在后来的工作中&#xff0c;也曾几次遇到需要选择合…

Docker 安装

Docker 官网&#xff1a;Docker: Accelerated Container Application Development Docker Hub官网&#xff1a;https://hub.docker.com/ 前提说明 CentOS Docker 安装 前提条件 目前&#xff0c;CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上&…

软件定制开发具有以下特点|APP搭建|小程序

软件定制开发具有以下特点|APP定制|小程序 一、快速响应用户需求 软件定制开发的优势在于&#xff0c;它可以快速响应用户的需求&#xff0c;因为它是在现有软件的基础上进行功能定制、界面定制、服务定制等改造&#xff0c;而不是从零开始进行重新设计与开发&#xff0c;所以…

vscode快捷键大全中英文

vscode快捷键大全中英文 源文件下载链接

卷运维不如卷网络安全

最近发现很多从事运维的选择了辞职&#xff0c;重新规划自己的职业发展方向。运维工程师这个岗位在IT行业里面确实是处于最底层的&#xff0c;不管什么环节出现问题&#xff0c;基本都是运维背锅。背锅也就罢了&#xff0c;薪资水平也比不上别的岗位。 一般运维的薪资水平大多数…

根据商品ID获得淘宝商品详情, 获得淘宝商品详情高级版,获得淘宝商品评论, 获得淘宝商品快递费用 ,获得淘口令真实,批量获得淘宝商品上下架时间)

参数说明 通用参数说明 参数不要乱传&#xff0c;否则不管成功失败都会扣费url说明 https://api-gw.…….cn/平台/API类型/ 平台&#xff1a;淘宝&#xff0c;京东等&#xff0c; API类型:[item_search,item_get,item_search_shop等]version:API版本key:调用key,测试key:test_…

Google Sign In error 12500

接入Google登录遇到12500报错&#xff0c;网上查到的原因是后台配置包的签名哈希值不正确&#xff0c;但是我们的应用并没有使用firebase管理&#xff0c;尝试多次之后终于找到了解决方法&#xff1a;在开发者后台应用管理界面&#xff0c;创建一个新的凭据【类型为Andorid】&a…