云南网站设计,免费学编程网站,重庆靓号网站建设,注册免费的网站有吗通义千问本地部署教程#x1f680; 本专栏的第四弹#xff0c;在实现了联网调用通义千问模型进行多轮对话#xff0c;流式输出#xff0c;以及结合LangChain实现自建知识库之后#xff0c;开始准备考虑实现对大模型进行本地部署#xff0c;网上找不到看着比较舒服的教程 本专栏的第四弹在实现了联网调用通义千问模型进行多轮对话流式输出以及结合LangChain实现自建知识库之后开始准备考虑实现对大模型进行本地部署网上找不到看着比较舒服的教程本文对于部署大模型过程中比较重要的环境搭建模型下载等进行详细介绍,如果您没有研究需求只有使用需求请直接安装环境-下载模型-运行代码由于这部分内容实在太多所以可能还是需要一些相关的基础才能完全读懂本篇文字如果您之前稍微研究过大语言模型的本地部署我相信这篇文章一定能解决您的问题如果有什么我写的不清楚的地方非常欢迎各位给我留言评论探讨然后虽然我看好像其他相关的文章好像都收费但是我还是决定免费由于我是会员所以我有版权保护所以不用太担心别人直接爬走希望帮助到各位如果可以您点个赞我会非常开心的。 第一弹 调用阿里通义千问大语言模型API-小白新手教程-python 第二弹 LangChain结合通义千问的自建知识库 第三弹 使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出 文章目录 通义千问本地部署教程1.Qwen-7B-Chat 模型的下载⭐2.Qwen-7B-Chat 环境的安装⭐3.运行本地的部署代码实现多轮对话4.结合Swift库实现流式输出-认真总结4.1 该部分实现过程和踩坑经验分享4.2 真正实现离线的使用本地模型的多轮对话和流式输出的最终代码⭐ 5.相关文档链接6.结束 1.Qwen-7B-Chat 模型的下载⭐ 首先需要下载通义千问的Qwen-7B-Chat的模型文件其下载地址为阿里官方的大语言模型社区模搭ModelScope其中通义千问的Qwen-7B-Chat 的下载和相关介绍的地址为。 https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary 点击其中的模型文件进入模型文件页面之后点击右侧的下载模型 右侧会出现两个下载方式第一个是用SDK也就是安装安装工具包下载第二个是用git下载这里还是推荐用第一种但是实际使用的时候还需要添加一个新的参数用来设置下载地址否则就会下载到安装包的目录下 在安装好环境之后之后运行下面的代码就可以下载到本地了模型大小一共是14.4个Gchche_dir就是自己设置的模型下载的地址是是一个文件夹的目录
from modelscope import snapshot_download
model_dir snapshot_download(qwen/Qwen-7B-Chat,cache_dir自己的地址)运行起来的下过如下当运行到下载1个G以上的文件的时候会卡住一阵才会开始下载如果这里长时间没响应那就是网络条件不行了。
2.Qwen-7B-Chat 环境的安装⭐ 为了运行之后本地部署的Qwen-7B-Chat模型我们需要根据要求在Anaconda中安装一个满足模型运行要求的虚拟环境其官方的配置环境要求如下本文配置的环境为使用GPU Pytorch的版本。官网的要求如下。 除了常规的Pytorch之外还需要进行以下两次安装安装modelscope可以用来下载模型在下载的过程中有网络要求我用的宽带为100M的网线链接最后下了不到1个小时如果网络不行在下载到大文件的时候会断开链接。
pip install modelscope然后是官方说的运行Qwen-7B-需要安装的依赖。
pip install transformers4.32.0 accelerate tiktoken einops scipy transformers_stream_generator0.0.4 peft deepspeed具体安装过程根据不同的系统电脑各有各的微小差异而且有时候充满了玄学在这里我说一下我自己的配置然后给大家参考。
名称硬件型号/软件版本CPU英特尔 Core i7-14700KFGPUNVIDIA GeForce RTX 4070 Ti(12 GB/华硕)CUDADriver Version: 546.65 CUDA Version: 12.3内存32 GB(威刚 DDR5 6000MHz16GB x2)硬盘GAMMIX S70 SE(1024 GB/固态硬盘)Python3.9.15Numpy1.23.4pip22.3.1Torch1.13.1modelscope1.12.0
3.运行本地的部署代码实现多轮对话 在安装好环境以及下载了模型文件之后就可以运行官方的例程代码来观察对话效果官方的快速开始代码如下先给出官方代码之后我会精简然后介绍重要参数的作用
from modelscope import AutoModelForCausalLM, AutoTokenizer
from modelscope import GenerationConfig# Note: The default behavior now has injection attack prevention off.
tokenizer AutoTokenizer.from_pretrained(qwen/Qwen-7B-Chat, trust_remote_codeTrue)# use bf16
# model AutoModelForCausalLM.from_pretrained(qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue, bf16True).eval()
# use fp16
# model AutoModelForCausalLM.from_pretrained(qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue, fp16True).eval()
# use cpu only
# model AutoModelForCausalLM.from_pretrained(qwen/Qwen-7B-Chat, device_mapcpu, trust_remote_codeTrue).eval()
# use auto mode, automatically select precision based on the device.
model AutoModelForCausalLM.from_pretrained(qwen/Qwen-7B-Chat, device_mapauto, trust_remote_codeTrue).eval()# Specify hyperparameters for generation. But if you use transformers4.32.0, there is no need to do this.
# model.generation_config GenerationConfig.from_pretrained(Qwen/Qwen-7B-Chat, trust_remote_codeTrue) # 可指定不同的生成长度、top_p等相关超参# 第一轮对话 1st dialogue turn
response, history model.chat(tokenizer, 你好, historyNone)
print(response)
# 你好很高兴为你提供帮助。# 第二轮对话 2nd dialogue turn
response, history model.chat(tokenizer, 给我讲一个年轻人奋斗创业最终取得成功的故事。, historyhistory)
print(response)
# 这是一个关于一个年轻人奋斗创业最终取得成功的故事。
# 故事的主人公叫李明他来自一个普通的家庭父母都是普通的工人。从小李明就立下了一个目标要成为一名成功的企业家。
# 为了实现这个目标李明勤奋学习考上了大学。在大学期间他积极参加各种创业比赛获得了不少奖项。他还利用课余时间去实习积累了宝贵的经验。
# 毕业后李明决定开始自己的创业之路。他开始寻找投资机会但多次都被拒绝了。然而他并没有放弃。他继续努力不断改进自己的创业计划并寻找新的投资机会。
# 最终李明成功地获得了一笔投资开始了自己的创业之路。他成立了一家科技公司专注于开发新型软件。在他的领导下公司迅速发展起来成为了一家成功的科技企业。
# 李明的成功并不是偶然的。他勤奋、坚韧、勇于冒险不断学习和改进自己。他的成功也证明了只要努力奋斗任何人都有可能取得成功。# 第三轮对话 3rd dialogue turn
response, history model.chat(tokenizer, 给这个故事起一个标题, historyhistory)
print(response)
# 《奋斗创业一个年轻人的成功之路》运行的结果如下红色的是各种前置检查信息我专门断网测试了一下输出的也是这些内容。 之后对代码进行精简实现一个简单的多轮对话功能。精简之后的代码如下。其中的device_map如果设置为cpu则模型将会在cpu上运行如果设置为Auto如果Pytorch为GPU版本的话将会在GPU上运行。关于非常容易关注到的tokenizer官方是这吗说的说现在还没有概念的对应所以无需纠结这块是啥东西。根据经验推测它应该是跟分词有关的一个东西。 from modelscope import AutoModelForCausalLM, AutoTokenizermodel_path D:\qwen\Qwen-7B-Chattokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue)
model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto, trust_remote_codeTrue).eval()historyNonewhile True:message input(User:)response, history model.chat(tokenizer, message, historyhistory)print(System:,end)print(response)from modelscope import AutoModelForCausalLM, AutoTokenizer: 从modelscope库中导入两个类AutoModelForCausalLM和AutoTokenizer。这两个类分别用于加载预训练的因果语言模型例如GPT系列模型和分词器。分词器用于文本的预处理将文本转换为模型能理解的格式。 model_path D:\qwen\Qwen-7B-Chat: 定义模型文件存放的路径。这里假定你已经有了一个预训练模型存储在指定的路径下。 tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue): 从给定的路径加载预训练的分词器。trust_remote_codeTrue参数允许加载并执行远程代码这对于加载自定义的分词器逻辑可能是必需的。 model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto, trust_remote_codeTrue).eval(): 类似地从指定路径加载预训练的语言模型并将模型设置为评估模式。device_mapauto指示库自动选择运行模型的设备CPU或GPU。.eval()方法用于切换到模型的评估模式这通常在预测时使用以禁用训练时特有的行为如Dropout。 historyNone: 初始化history变量。这个变量用于存储对话历史使模型能够在生成回答时考虑到之前的上下文。 while True:: 开始一个无限循环用于持续接收用户输入并生成回应。 message input(User:): 通过input函数接收用户的输入。 response, history model.chat(tokenizer, message, historyhistory): 调用模型的chat方法生成回应。这个方法接受分词器、用户的消息以及可选的历史记录作为输入并返回模型的回应和更新后的历史记录。更新后的历史记录可以在下一次迭代中使用以便模型能够参考之前的对话内容。 print(System:,end)和print(response): 首先打印System:不换行然后打印模型生成的回应。 运行结果如下 本设备在模型推理时的性能检测效果如下。 由于其生成的比较慢我就加了一下每次推理运行的时间其运行时间效果如图我大概估计了一下,输出一个Token的推理时间大概为1S,在官方的快速开始的例程序中所以等待的过程非常的难受。 4.结合Swift库实现流式输出-认真总结 在经历了非常不舒服的等待之后决定尝试一下流式输出然后这部分代码就非常的不好找了我在进入了ModelScope的官方咨询群之后询问了半天加上自己参悟最终实现了在Windows上使用本地部署的通义千问模型多轮对话的效果那接下来直接开始。我会把这个过程以及采的坑详细说明如果您是有相关基础的想直接使用的技术人员直接跳到最后的代码部分即可。
4.1 该部分实现过程和踩坑经验分享 首先对于流式输出官方人员给我发的一个链接是这样的。 点开里面的推理文档下滑找到对应的代码。 链接为Swift官方推理文档 这里我直接把代码复制到下面我们先不纠结里面的内容这里用到了一个新的库swift首先需要安装它这里是一个坑 其安装命令为
pip install ms-swift而并不是pip install swift如果你用的是pip install swift安装会安装不上会出现如下错误提示你要取下载红帽和Ubtuntu版本的库但是这是Liunx系统的库所以安装不上只有运行pip install ms-swift才能安装成功。 import os
os.environ[CUDA_VISIBLE_DEVICES] 0from swift.llm import (get_model_tokenizer, get_template, inference_stream, ModelType, get_default_template_type,
)
from swift.utils import seed_everythingmodel_type ModelType.qwen_7b_chat
template_type get_default_template_type(model_type)
print(ftemplate_type: {template_type}) # template_type: qwenmodel, tokenizer get_model_tokenizer(model_type, model_kwargs{device_map: auto})template get_template(template_type, tokenizer)
seed_everything(42)
query 浙江的省会在哪里
gen inference_stream(model, template, query)
print(fquery: {query})
for response, history in gen:print(fresponse: {response})
query 这有什么好吃的
gen inference_stream(model, template, query, history)
print(fquery: {query})
for response, history in gen:print(fresponse: {response})
print(fhistory: {history})Out[0]
query: 浙江的省会在哪里
...
response: 浙江省的省会是杭州。
query: 这有什么好吃的
...
response: 杭州市有很多著名的美食例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外还有杭州特色的点心如桂花糕、荷花酥、艾窝窝等。
history: [(浙江的省会在哪里, 浙江省的省会是杭州。), (这有什么好吃的, 杭州市有很多著名的美食例如西湖醋鱼、龙井虾仁、糖醋排骨、毛血旺等。此外还有杭州特色的点心如桂花糕、荷花酥、艾窝窝等。)]直接说这个代码的结论首先这个代码是下载和推理一体的代码当第一次运行的时候会在指定路径下下载模型文件第二次运行时检测到指定文件夹下的文件了之后就会开始进入模型推理阶段下面的运行输出是我的模型第二次之后运行的结果。 第二次运行之后对话输出部分的效果如下之后我要对流式输出的结果进行改进一个一个问题解决。 可是即便是第二次及之后运行其不联网依然会报下面的错误总之该代码不能实现无网络状态下的流方式输出这也是一个大坑。 根据对代码的分析最后首先我实现了V1版本的代码代码如下使用swift中的inference_streamAPI进行流式输出且可以加载本地的自己的模型这里再print中加入\r换行符会让每次打印的时候光标出现在行的开头当输出的文字中没有换行的时候输出的结果岁月静好。
from modelscope import AutoModelForCausalLM, AutoTokenizer
from swift.llm import inference_stream,get_templatemodel_path D:\qwen\Qwen-7B-Chattokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue)
model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto, trust_remote_codeTrue).eval()
template_type qwen
template get_template(template_type, tokenizer)
history Nonewhile True:query input(User:)gen inference_stream(model, template, query, history)for response, h in gen:print(f\rSystem: {response},end)history hprint()当输出内容过长需要换行的时候结果直接负重前行(自己创造的大坑)。 4.2 真正实现离线的使用本地模型的多轮对话和流式输出的最终代码⭐ 之后改进了V2版本也是最终版本代码如下由于这个代码是我自己悟的可能还有不少可以改进的地方但是已经可以实现预期的的功能详细的解释我放在后面 首先再次给出swift安装命令。
pip install ms-swift代码部分
from modelscope import AutoModelForCausalLM, AutoTokenizer
from swift.llm import inference_stream,get_templatemodel_path D:\qwen\Qwen-7B-Chattokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue)
model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto, trust_remote_codeTrue).eval()
template_type qwen
template get_template(template_type, tokenizer)
history Nonebefore_len 0while True:query input(User:)gen inference_stream(model, template, query, history)print(fSystem:, end)for response, h in gen:print(response[before_len:],end)before_len len(response)history hprint()下面是逐行解释 from modelscope import AutoModelForCausalLM, AutoTokenizer: 从modelscope库中导入AutoModelForCausalLM和AutoTokenizer。AutoModelForCausalLM用于加载和使用因果语言模型如GPTAutoTokenizer用于文本的分词和编码。 from swift.llm import inference_stream, get_template: 从swift.llm模块中导入inference_stream和get_template函数。inference_stream用于生成文本流get_template用于获取特定类型的模板这里的模板可能是指模型的输入格式或结构。 model_path D:\qwen\Qwen-7B-Chat: 定义模型的存储路径。 tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue): 加载预训练的分词器。from_pretrained方法从指定路径加载模型trust_remote_codeTrue允许加载远程代码这通常用于加载自定义的模型或分词器。 model AutoModelForCausalLM.from_pretrained(model_path, device_mapauto, trust_remote_codeTrue).eval(): 加载并准备模型。from_pretrained同样用于从指定路径加载模型device_mapauto表示自动选择设备运行模型如GPU或CPUtrust_remote_codeTrue同上。.eval()将模型设置为评估模式通常在预测或评估时使用以禁用特定于训练的操作如Dropout。 template_type qwen: 定义模板类型这里为qwen。 template get_template(template_type, tokenizer): 获取指定类型的模板。这里的模板可能用于定义输入的格式或者是模型预处理的一部分。 history None: 初始化历史记录变量用于存储对话历史以便模型可以根据之前的交流生成回应。 before_len 0: 初始化变量用于记录上一次生成文本的长度。 while True:: 开始一个无限循环用于连续接收用户输入并生成回应。 query input(User:): 接收用户的输入。 gen inference_stream(model, template, query, history): 调用inference_stream函数传入模型、模板、用户查询和历史记录开始生成模型的回应。 print(fSystem:, end): 打印“System:”不换行准备输出模型的回应。 for response, h in gen:: 遍历生成器gen的输出gen输出的每个元素包含回应和更新后的历史记录。 print(response[before_len:],end): 打印新生成的回应部分去掉之前已经打印的部分不换行。 before_len len(response): 更新已打印文本的长度。 history h: 更新历史记录以便在下一次迭代时使用。
5.相关文档链接
modelscop模型介绍下载地址 https://modelscope.cn/models/qwen/Qwen-7B-Chat/summary swift文档地址 https://github.com/modelscope/swift/blob/main/docs/source/LLM/LLM%E6%8E%A8%E7%90%86%E6%96%87%E6%A1%A3.md
6.结束 目前这是我出的第一篇大语言模型的部署的文章之后会考虑一直更新这个系列会不定期的完善细节之后会越来越多的补充,如果有什么问题欢迎留言探讨。有专业需求可以在公众号上联系我。