在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

本文首发于公众号:Hunter后端
原文链接:在 Windows 上利用Qwen大模型搭建一个 ChatGPT 式的问答小助手

最近 ChatGPT 式的聊天机器人比较火,可以提供各种问答功能,阿里最近推出了 Qwen1.5 系列的大模型,提供了各个参数版本的大模型,其中有一些参数量较小的模型,比较适合我们这种穷* 用于尝试一下手动运行大模型。

今天我们就使用 Qwen1.5 大模型来尝试一下,自己搭建一个问答小助手。

1、配置

首先介绍一下搭建的环境,8g 内存,4g GPU 显存,win10系统,所以如果配置等于或高于我这个环境的也可以轻松实现这一次的搭建过程。

下面是搭建成功后一些问答的效果展示:

其中,因为显存限制,我这边分别使用 Qwem1.5-0.5B-Chat 和 Qwem1.5-1.8B-Chat 进行测试,0.5B 版本占用显存不到 2g,1.8B 版本显存占用不到 4g,这个 B 表示的是模型使用的参数量,在我电脑上 0.5B 的版本推理速度要比 1.8B 的速度要快很多,但是某些问题的准确性没有 1.8B 高。

接下来正式介绍搭建过程。

2、环境安装

使用 Qwen 这个大模型需要用到 CUDA 相关驱动以及几个 Python 库,torch,transformers,accelerate 等。

1. CUDA

首先,确认 Windows 机器上是否有相关驱动,这里我们可以在 cmd 里输入 nvidia-smi 查看相应输出,比如我的输入如下:

然后上张图里截出来的 CUDA Version 去下面这个地址下载 CUDA Toolkit:https://developer.nvidia.com/cuda-toolkit-archive

到这一步完成,相应的 CUDA 准备工作就 OK 了。

建议可以先看下下面这个链接,里面有完整的安装示意流程:Windows下CUDA安装

2. conda 环境准备

这里为了方便,我新建了一个 conda 环境,使用的 Python 3.10 版本

conda create -n qwen python=3.10

3. torch 库

为了使用 GPU,torch 库的版本需要是 cuda 版本的,在 Windows 版本下我直接安装其 whl 包,可以在下面的地址找到对应的版本:https://download.pytorch.org/whl/torch_stable.html。

这里我下载的是文件名是 torch-2.2.1+cu121-cp310-cp310-win_amd64.whl

torch-2.2.1 表示的是 torch 的版本

cu121 表示的是 cuda 版本是 12.1,我们实际的 CUDA Version 是 12.4,没有最新的但是也能兼容

cp310 是 Python 的版本 3.10

win_amd64 则是 Windows 版本。

whl 包比较大,有 2 个多 g,下载后直接到对应的目录下执行下面的操作即可:

pip3 install torch-2.2.1+cu121-cp310-cp310-win_amd64.whl

4. transformers 库

transformers 库是使用大模型的基础库,这里注意下,Qwen1.5 版本的大模型是最近才出来的,所以 transformers 库需要比较新的才能支持,需要 >= 4.37.0

这里我们直接 pip3 install transformers 就会自动为我们安装最新的库,也可以直接指定这个版本。

5. accelerate 库

我在操作的过程中,还需要用到 accelerate 这个库,所以额外安装下:

pip3 install accelerate -i https://mirrors.aliyun.com/pypi/simple/

到这一步,我们的环境就安装好了,我们可以尝试一下是否可以正常使用 CUDA:

import torch
print(torch.cuda.is_available())
# True

输出为 True 则表示可以正常使用 CUDA。

3、下载模型

所有大模型的下载官方都会发布在 huggingface 网站上:https://huggingface.co/。

我们可以在上面搜索到目前所有发布的大模型,包括 Qwen 系列,百川系列,ChatGLM 系列,Llama 系列等。

我们可以下载下一步执行代码的时候直接指定模型名称,会自动为我们下载,但是我习惯于先将其下载下来,然后在本地指定路径进行调用。

这里我们可以去这两个地址下载对应的文件:

https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat/tree/main

https://huggingface.co/Qwen/Qwen1.5-1.8B-Chat/tree/main

分别是 Qwen1.5 的 0.5B Chat 版本和 1.8B Chat 版本。

其中,最主要的文件是 model.safetensors,这个就是大模型本身,也就是我们运行的时候需要加载的文件,可以看到这两个地址的这个文件分别是 1g 多和 3g 多。

除此之外,还有一些必要的配置文件比如 config.json,一些词表的文件用于加载的时候做映射操作。

注意:上面的网址可能需要一些魔法操作,如果你没有魔法的途径,可以去魔搭社区找对应的版本,https://www.modelscope.cn/search?search=Qwen1.5

这里,下载的大模型文件列表如下图所示:

至此,我们所有的准备工作就完成了,接下来我们可以开始写代码进行问答操作了。

4、对话代码

我们需要先加载大模型:

from transformers import AutoModelForCausalLM, AutoTokenizerdevice = "cuda" # the device to load the model onto
path = r"F:\\models\\Qwen1.5-0.5B-Chat"model = AutoModelForCausalLM.from_pretrained(path,torch_dtype="auto",device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(path)

这里的 path 就是我们下载的大模型的本地文件路径。

接下来下面的代码就是进行对话的操作了:

prompt = "你是谁"
messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(device)generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512
)
generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print(response)
# 我是来自阿里云的超大规模语言模型,我叫通义千问。我是一个能够回答问题、创作文字,还能表达观点、撰写代码的 人工智能模型。如果您有任何问题或需要帮助,请随时告诉我,我会尽力提供支持和解答。

1. 封装成函数

我们可以将上面下部分代码封装成函数,这样就可以每次直接调用函数来进行问答操作了:

def get_response(prompt):messages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": prompt}]text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)model_inputs = tokenizer([text], return_tensors="pt").to(device)generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512,pad_token_id=tokenizer.eos_token_id)generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print(response)

然后可以直接调用函数进行问答:

get_response("如何学习Python?")

2. 保存历史进行多轮对话

接下来我们可以保存对话历史来进行多轮对话,以下是代码:


def run_qwen_with_history():messages = [{"role": "system", "content": "You are a helpful assistant."},# {"role": "user", "content": prompt}]while True:new_question = input("请输入你的问题:")if new_question == "clear":messages = [messages[0]]continuemessages.append({"role": "user", "content": new_question})text = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)model_inputs = tokenizer([text], return_tensors="pt").to(device)generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512,pad_token_id=tokenizer.eos_token_id)generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]print(response)messages.append({"role": "system", "content": response})

在这里执行这个函数之后,会在命令行里输出 请输入你的问题:,然后我们可以输入我们的问题,之后可以连续多轮输出,后台会记住我们之前的对话,从而实现多轮对话的功能。

5、总结

经过分别使用 0.5B 版本和 1.8B 的版本,在我电脑的配置里,0.5B 版本的输出会快一些,但是在某些问题回答的质量上不如 1.8B。

而 1.8B 版本答案质量相对较高,但是速度在 4g 显存的情况下,则非常慢。

以上就是本次使用 Qwen1.5 在 Windows 上搭建问答小助手的全过程,之后还可以将大模型提供接口操作,将其应用到 web 页面上,从而实现一个真正的 ChatGPT 式问答助手。

对于以上这些操作是直接使用的大模型,而真正要将其应用于生产,还需要对大模型进行微调,训练等一系列操作,使其更适用于实际场景,这些以后有机会再学习介绍吧。

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

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

相关文章

在线BLOG网|基于springboot框架+ Mysql+Java+JSP技术的在线BLOG网设计与实现(可运行源码+数据库+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen参考 摘要 研究…

【C#算法实现】可见的山峰对数量

文章目录 前言一、题目要求二、算法设计及代码实现2.1 算法思想2.2 代码实现 前言 本文是【程序员代码面试指南(第二版)学习笔记】C#版算法实现系列之一,用C#实现了《程序员代码面试指南》(第二版)栈和队列中的可见的…

OpenCV-Java 开发简介

返回目录:OpenCV系列文章目录(持续更新中......) 上一篇: 如何在“Microsoft Visual Studio”中使用OpenCV编译应用程序 下一篇:暂无 ​ 警告: 本教程可能包含过时的信息。 从 OpenCV 2.4.4 开始&…

java集合框架——Map集合概述

前言: 之前接触了单列合集,现在又接触了双列合集。整理下心得,打好基础,daydayup!! Map集合 Map集合称为双列集合,也被称为“键值对集合”。格式:{key1value1,key2value2...}&#…

【GPT-SOVITS-01】源码梳理

说明:该系列文章从本人知乎账号迁入,主要原因是知乎图片附件过于模糊。 知乎专栏地址: 语音生成专栏 系列文章地址: 【GPT-SOVITS-01】源码梳理 【GPT-SOVITS-02】GPT模块解析 【GPT-SOVITS-03】SOVITS 模块-生成模型解析 【G…

jwt以及加密完善博客系统

目录 一、背景 二、传统登陆功能&强制登陆功能 1、传统的实现方式 2、session存在的问题 三、jwt--令牌技术 1、实现过程 2、令牌内容 3、生成令牌 4、检验令牌 四、JWT登陆功能&强制登陆功能 1、JWT实现登陆功能 2、强制登陆功能 3、运行效果 五、加密/加…

论文阅读——SpectralGPT

SpectralGPT: Spectral Foundation Model SpectralGPT的通用RS基础模型,该模型专门用于使用新型3D生成预训练Transformer(GPT)处理光谱RS图像。 重建损失由两个部分组成:令牌到令牌和频谱到频谱 下游任务:

[数据集][目标检测]铝片表面工业缺陷检测数据集VOC+YOLO格式400张4类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):400 标注数量(xml文件个数):400 标注数量(txt文件个数):400 标注类别…

Coursera上Golang专项课程2:Functions, Methods, and Interfaces in Go 学习笔记

Functions, Methods, and Interfaces in Go Course Certificate 本文是学习 Functions, Methods, and Interfaces in Go 这门课的学习笔记,如有侵权,请联系删除。 文章目录 Functions, Methods, and Interfaces in GoMODULE 1: FUNCTIONS AND ORGANIZ…

Epuck2机器人固件更新及IP查询

文章目录 前言一、下载固件更新软件包:二、查询机器人在局域网下的IP 前言 前面进行了多机器人编队仿真包括集中式和分布式,最近打算在实物机器人上跑一跑之前的编队算法。但由于Epuck2机器人长时间没使用,故对其进行固件的更新,…

【Godot4.0】几何图形、网格、刻度线顶点求取函数库ShapePoints

概述 用于生成常见二维几何图形顶点数据(PackedVector2Array)的静态函数库。 生成的数据可用于_draw和Line2D、Polygon2D等进行绘制和显示。 枚举 enum{AXIS_X 1,AXIS_Y 2, }enum{SIDE_UP 1,SIDE_RIGHT 2,SIDE_BOTTOM 3,SIDE_LEFT 4 }测试场景 …

从JVM的退出机制分析Java程序的优雅关闭退出

前言 Java程序启动从main函数开始启动,是程序入口和主线程,但程序会在什么时候结束?为什么有的Java程序在启动后很快就结束了,比如HelloWorld程序,有的程序却能一直在运行,比如Tomcat启动后就一直保持进程…

odoo17开发教程(8):设置界面UI的字段属性

目录 添加字段 给字段设置只读和不可拷贝 给字段添加默认值 保留字段 本节目标:在本文末尾,售价(selling price)应为只读值,卧室数量(bedrooms)和可用日期(availability date)应为默认值。此外,在复制记录时,售价和…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底,美国NSA(National Security Agency)、CISA(Cybersecurity and Infrastructure Security Agency)等多个政府机构部门组成的ESF(Enduring Security Framework,持久安全框架&#xff09…

OGRE Pittfals Design proposal for Ogre 2.0

OGRE Pittfals & Design proposal for Ogre 2.0

Python的网络爬虫介绍与实战

Python的网络爬虫基础介绍与实战 定义流程包和函数静动态网页爬虫实战红牛分公司?二手房数据(静态网页)豆瓣读书(动态网页) 定义 网络爬虫是按照一定的规则,自动地抓取万维网(www)信…

rust引用本地crate

我们可以动态引用crate,build时从crate.io下载,但可能因无法下载导致build失败。首次正常引用三方crate,build时自动下载的crate源码,我们将其拷贝到固定目录中; build后可在RustRover中按住Ctrl键,在crat…

图解Kafka架构学习笔记(一)

本文参考尚硅谷大数据技术之Kafka。 消息队列 (1)点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除) 点对点模型通常是一个基于拉取或者轮询的消息传送模型,这种模型从队列中请求信息…

基于Spark的气象数据处理与分析

文章目录 一、实验环境二、实验数据介绍三、数据获取1.观察数据获取方式2.数据爬取3.数据存储4.数据读取5.数据结构6.爬虫过程截图 四、数据分析1.计算各个城市过去24小时累积雨量2.计算各个城市当日平均气温3.计算各个城市当日平均湿度4.计算各个城市当日平均风速 五、数据可视…

ARM_基础之RAS

Reliability, Availability, and Serviceability (RAS), for A-profile architecture 源自 https://developer.arm.com/documentation/102105/latest/ 1 Introduction to RAS 1.1 Faults,Errors,and failures 三个概念的区分: • A failure is the event of devia…