【AIGC】本地部署通义千问 1.5 (PyTorch)

今天想分享一下 Qwen 1.5 官方用例的二次封装( huggingface 说明页也有提供源码),其实没有太多的技术含量。主要是想记录一下如何从零开始在不使用第三方工具的前提下,以纯代码的方式本地部署一套大模型,相信这对于技术人员来说还是非常有用的。

虽然现在人人都可以用像 ollama 这种工具一键部署本地大模型,但想通过这种方式将大模型深度接入现有系统可就有点麻烦。 因此我觉得还是有必要各位分享一下这种纯代码的模式,希望能够帮助到更多的人。

1. 模型下载

通过之前的文章可以知道,现在国内可以通过 https://hf-mirror.com/ 下载 huggingface 大模型。在配置好环境变量后,可以通过以下命令下载 Qwen:

yuanzhenhui@MacBook-Pro ~ % cd /Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/transformer/model/qwen
yuanzhenhui@MacBook-Pro qwen % huggingface-cli download --resume-download Qwen/Qwen1.5-7B-Chat --local-dir .
Consider using `hf_transfer` for faster downloads. This solution comes with some limitations. See https://huggingface.co/docs/huggingface_hub/hf_transfer for more details.
Fetching 14 files:   7%|█▊                       | 1/14 [00:00<00:06,  1.87it/s]downloading https://hf-mirror.com/Qwen/Qwen1.5-7B-Chat/resolve/294483ad23713036574b30587b186713373f4271/README.md to /Users/yuanzhenhui/.cache/huggingface/hub/models--Qwen--Qwen1.5-7B-Chat/blobs/0963c198257a0607c4d2def66a84aec172240afd.incomplete
README.md: 4.26kB [00:00, 6.40MB/s]
Fetching 14 files: 100%|████████████████████████| 14/14 [00:01<00:00, 12.81it/s]
/Users/yuanzhenhui/Documents/code_space/git/processing/python/tcm_assistant/transformer/model/qwen

由于我之前已经 checkout 过一遍了,因此会显示上面的输出。如果是第一次 checkout 那么你可能要等一段时间才能全部下载完成(毕竟还挺大的)。

如果你是 MacOS 的用户那么模型的路径将会如下所示:

(base) yuanzhenhui@MacBook-Pro hub % pwd
/Users/yuanzhenhui/.cache/huggingface/hub
(base) yuanzhenhui@MacBook-Pro hub % ls
models--BAAI--bge-large-zh-v1.5	models--Qwen--Qwen1.5-7B-Chat	version.txt
(base) yuanzhenhui@MacBook-Pro hub % 

由于下载的是 “Qwen/Qwen1.5-7B-Chat” 因此下载下来后会以“models–Qwen–Qwen1.5-7B-Chat”名称进行保存。

这时有小伙伴会问,huggingface-cli 命令中不是有写“–local-dir .”参数吗?如果模型不是保存在这个参数指定的位置,那么这个参数有什么用途?这个“.”(本地目录)又有什么意义?

其实通过 local-dir 存放的是大模型的软连接和配置文件,如下图所示:

(base) yuanzhenhui@MacBook-Pro qwen % tree -l
.
├── LICENSE
├── README.md
├── config.json
├── generation_config.json
├── merges.txt
├── model-00001-of-00004.safetensors -> ../../../../../../../../../.cache/huggingface/hub/models--Qwen--Qwen1.5-7B-Chat/blobs/9e8f7873d7c4c74b8883db207a08bf8a783ec8c26da6b3d660a0929048ce6422
├── model-00002-of-00004.safetensors -> ../../../../../../../../../.cache/huggingface/hub/models--Qwen--Qwen1.5-7B-Chat/blobs/e573fdaf3eba785c4b31b8858288f762f3541f09d75b53dfb1ae4d8ee5011d65
├── model-00003-of-00004.safetensors -> ../../../../../../../../../.cache/huggingface/hub/models--Qwen--Qwen1.5-7B-Chat/blobs/1d7cd36508251baa069a894f6ee98da5929e8b0788ff9c9faa7934ad102f845a
├── model-00004-of-00004.safetensors -> ../../../../../../../../../.cache/huggingface/hub/models--Qwen--Qwen1.5-7B-Chat/blobs/189e7a297229937ec93912c940ef05019738c56ff0720c811fd083f5dd400dce
├── model.safetensors.index.json
├── tokenizer.json -> ../../../../../../../../../.cache/huggingface/hub/models--Qwen--Qwen1.5-7B-Chat/blobs/33ea6c72ebb92a237fa2bdf26c5ff16592efcdae
├── tokenizer_config.json
└── vocab.json

0 directories, 13 files

model-00001-of-00004.safetensors、model-00002-of-00004.safetensors 等都是连接到 …/.cache/huggingface/hub 地址的。可能作者考虑到模型的复用问题吧,因此没有将模型直接下载到本地指定目录,而是将软连接建在这个目录底下,这个就不做深究了。

2. 代码部署使用

在真正使用前,按照 Qwen 1.5 的官方说明,我们还需要将 transformer 升级到 4.37.0 版本及其以上。如下图:
image.png
既然这样,那就直接 pip install --upgrade 吧,如下图:

(base) yuanzhenhui@MacBook-Pro qwen % pip install --upgrade transformers
Requirement already satisfied: transformers in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (4.37.0)
Collecting transformers
  Downloading transformers-4.39.3-py3-none-any.whl.metadata (134 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 134.8/134.8 kB 358.9 kB/s eta 0:00:00
Requirement already satisfied: filelock in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (3.13.1)
Requirement already satisfied: huggingface-hub<1.0,>=0.19.3 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (0.20.3)
Requirement already satisfied: numpy>=1.17 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (1.26.4)
Requirement already satisfied: packaging>=20.0 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (23.2)
Requirement already satisfied: pyyaml>=5.1 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (6.0.1)
Requirement already satisfied: regex!=2019.12.17 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (2023.10.3)
Requirement already satisfied: requests in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (2.31.0)
Requirement already satisfied: tokenizers<0.19,>=0.14 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (0.15.2)
Requirement already satisfied: safetensors>=0.4.1 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (0.4.2)
Requirement already satisfied: tqdm>=4.27 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from transformers) (4.65.0)
Requirement already satisfied: fsspec>=2023.5.0 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers) (2023.10.0)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from huggingface-hub<1.0,>=0.19.3->transformers) (4.9.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from requests->transformers) (2.0.4)
Requirement already satisfied: idna<4,>=2.5 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from requests->transformers) (3.4)
Requirement already satisfied: urllib3<3,>=1.21.1 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from requests->transformers) (2.0.7)
Requirement already satisfied: certifi>=2017.4.17 in /Users/yuanzhenhui/anaconda3/lib/python3.11/site-packages (from requests->transformers) (2024.2.2)
Downloading transformers-4.39.3-py3-none-any.whl (8.8 MB)
   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 8.8/8.8 MB 2.6 MB/s eta 0:00:00
Installing collected packages: transformers
  Attempting uninstall: transformers
    Found existing installation: transformers 4.37.0
    Uninstalling transformers-4.37.0:
      Successfully uninstalled transformers-4.37.0
Successfully installed transformers-4.39.3

轻轻松松就能够升级到 4.39.3 版本了。接下来就可以编写部署代码,如下图:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

"""
由于 Qwen 1.5 已经整合到 transformers 里面了,因此我这边使用的正是 transformers 的调用方式
"""

# 大模型名称和模型定义
model_name = "Qwen/Qwen1.5-7B-Chat"
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype="auto", device_map="auto")

# 这里对大模型角色进行定义
sys_content = "You are a helpful assistant"

# 获取千问 token 实例
def setup_qwen_tokenizer():
    return AutoTokenizer.from_pretrained(model_name)

# 设置问答输入信息
def setup_model_input(tokenizer, prompt):
    # 判断硬件使用情况,有 cuda 用 cuda 没有 cuda 用 cpu
    if torch.cuda.is_available():  
        device = torch.device("cuda")  
    else:  
        device = torch.device("cpu")
    # 需要提问的内容的 json 格式    
    messages = [
        {"role": "system", "content": sys_content},
        {"role": "user", "content": prompt}
    ]
    # 该函数将使用提供了标记化器来生成输入文本,然后对其进行标记化并将其转换为PyTorch张量。
    text = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) 
    return tokenizer([text], return_tensors="pt").to(device)

# 提交问题并获取回复
def msg_generate(prompt):
    tokenizer = setup_qwen_tokenizer()
    # 整理模型所需的输入信息
    model_inputs = setup_model_input(tokenizer, prompt)
    # 根据模型生成id集合
    generated_ids = model.generate(model_inputs.input_ids, max_new_tokens=512)
    # 删除没有响应的id
    generated_ids = [output_ids[len(input_ids):] for input_ids, output_ids in zip(
        model_inputs.input_ids, generated_ids)]
    # 根据id集合对返回信息进行解码获得返回结果
    return tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]


if __name__ == '__main__':
    # 这里提供一个调用实例
    prompt = "中医药理论是否能解释并解决全身乏力伴随心跳过速的症状?"
    response = msg_generate(prompt)
    print(">>> "+response)

将 msg_generate 封装之后就能够根据需要提供对外服务了(在外层加一层 flask 不就可以直接提供接口了么,再加个精美一点的 UI 界面,老板又可以割一波韭菜了,技术人员保住饭碗不是梦…开个玩笑)。具体的执行效果如下图:

(base) yuanzhenhui@MacBook-Pro qwen % python qwen_model.py 
Loading checkpoint shards: 100%|██████████████████| 4/4 [00:00<00:00,  8.75it/s]
WARNING:root:Some parameters are on the meta device device because they were offloaded to the disk and cpu.
Special tokens have been added in the vocabulary, make sure the associated word embeddings are fine-tuned or trained.
>>> 中医药理论确实可以尝试解释和治疗全身乏力和心跳过速的综合症状,但需要具体辨证论治,因为中医认为人体的病症是内外环境、脏腑功能失衡的结果。以下是可能的解释和治疗方法:

1. 全身乏力:中医认为这是“气虚”、“血虚”或“阴阳两虚”的表现。气虚可能导致人体机能下降,运化无力;血虚则可能影响血液滋养全身,导致四肢乏力。心悸(心跳过速)可能是心气不宁,心神不安,或是心血不足,心脉瘀阻等问题。调理方法可能包括补气养血、益心安神等,比如黄芪、人参、当归、熟地、枣仁等中药。

2. 心跳过速:中医认为可能是心火上炎、心血瘀阻、心神不宁等引起。针对不同的病因,可能采用清热解毒、活血化瘀、镇静安神等方法,如黄连、丹参、麦冬、柏子仁等。

3. 实践中,中医会通过望、闻、问、切四诊合参,全面了解患者的整体情况,然后开具个性化的处方。如果心跳过速伴有其他症状,如胸闷、心慌、失眠、面色苍白等,可能还需要结合西医的心电图检查和其他检查结果。

4. 请注意,虽然中医药有其独特的疗效,但对于严重的或持续存在的症状,还是建议及时就医,以西医的诊断和治疗为主,中医辅助调养。

总的来说,中医药在调理全身状况,改善亚健康状态,特别是对于一些慢性病的治疗上有独特优势,但对于急性病和严重症状,应遵循医嘱,中西医结合为宜。

由于我用的是 Mac 因此只能用 cpu 跑,就一个问题也跑了将近 20 分钟,所以建议大家本地部署还是用 gpu 吧。当然了千问团队也很贴心弄了GGUF 版本(专门为 cpu 用户提供的),但是我没有尝试过我就不多说什么了。

但说真的能够代码部署那后面的可塑性就很强了,相信接下来会有更多的企业投身到“人工智能+”的行列吧,在这里真的要感谢阿里千问团队付出的努力和无私的分享。

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

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

相关文章

[Linux][进程控制][进程程序替换]详细解读

目录 1.进程创建1.fork函数初识2.fork函数返回值3.写时拷贝4.fork之后&#xff0c;父子进程代码共享5.fork常规用法6.fork调用失败的原因 2.进程终止0.进程终止时&#xff0c;操作系统做了什么&#xff1f;1.进程退出场景2.进程常见退出方法4 _exit函数(系统接口)4.exit函数(库…

V R沉浸式体验的应用|R主题馆加盟|V R游戏体验馆加盟

《探索未知世界&#xff0c;沉浸式VR体验引领未来》 随着科技的飞速发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术正逐渐走进人们的生活&#xff0c;并为我们带来前所未有的沉浸式体验。下面让我们一起探索一下&#xff0c;VR沉浸式体验的应用领域和魅力所在。 虚…

[lesson21]对象的构造顺序

对象的构造顺序 对象的构造顺序一 对于局部对象 当程序执行流到达对象的定义语句时进行构造 对象的构造顺序二 对于堆对象 当程序执行流到达new语句时创建对象使用new创建对象将自动触发构造函数的调用 s/20230724024159.png?origin_urlimage-2.png&pos_idimg-HTOH6…

代码随想录阅读笔记-回溯【组合总和II】

题目 给定一个数组 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用一次。 说明&#xff1a; 所有数字&#xff08;包括目标数&#xff09;都是正整数。解集不能包含重复的组…

Redis入门到通关之Redis通用命令

文章目录 Redis数据结构介绍Redis 通用命令命令演示KEYSDELEXISTSEXPIRE RedisTemplate 中的通用命令 Redis数据结构介绍 Redis 是一个key-value的数据库&#xff0c;key一般是String类型&#xff0c;不过value的类型多种多样&#xff1a; 贴心小建议&#xff1a;命令不要死…

Nginx小册(博客笔记迁移)

nginx基础 1.常用命令 nginx -v #查看版本 ps -ef | grep nginx #输出linux进程、 nginx #启动nginx进程 nginx -s reload #重载配置 nginx -s stop # 停止进程 nginx -t # 检查是否有语法错误&#xff0c;以及配置文件地址2.nginx的配置文件 # 用户组的设置 windows上不生…

连锁收银系统哪个好用 国内三大连锁收银系统评比

随着数字化管理趋势下互联网技术的不断发展革新&#xff0c;互联网技术&#xff0c;以及不断升级优化传统行业渠道模式&#xff0c;线上线下结合的电子商务模式正逐渐成为企业发展的趋势。而门店管理系统也在越来越多的企业应用。但市场上连锁店管理系统品牌诸多&#xff0c;很…

浏览器工作原理与实践--HTTP/1:HTTP性能优化

谈及浏览器中的网络&#xff0c;就避不开HTTP。我们知道HTTP是浏览器中最重要且使用最多的协议&#xff0c;是浏览器和服务器之间的通信语言&#xff0c;也是互联网的基石。而随着浏览器的发展&#xff0c;HTTP为了能适应新的形式也在持续进化&#xff0c;我认为学习HTTP的最佳…

数学杂谈之四:学习数学的方法

数学杂谈之四&#xff1a;学习数学的方法 数学杂谈之一&#xff1a;数学的形态 https://blog.csdn.net/cnds123/article/details/137437208 数学杂谈之二&#xff1a;数学中的概念和理解 https://blog.csdn.net/cnds123/article/details/137500537 数学杂谈之三&#xff1a;…

zookeeper分布式应用程序协调服务

一、zookeeper基本介绍 1.1 zookeeper的概念 Zookeeper是一个开源的分布式的&#xff0c;为分布式框架提供协调服务的Apache项目。 是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、…

unity在linux环境下videoplayer 无法播放问题解决路径

1、问题 一个项目需要在linux下播放视频&#xff0c;并且视频在机器上&#xff0c;也就是要使用应用外的视频文件进行播放。 视频的格式当前提供的事avi格式&#xff0c;并且使用videoplayer 在windows下播放正常。 但是发出包之后再Ubuntu环境怎么都无法播放。 2、测试环境…

K-means和逻辑回归

逻辑回归 一个事件的几率是该事件发生的概率/该事件不发生的概率&#xff1a;P/&#xff08;1-P&#xff09; 对数几率是&#xff1a;log(P/&#xff08;1-P&#xff09;) **考虑对输入x分类的模型&#xff1a;**log(P/&#xff08;1-P&#xff09;)wx 则 Pexp(wx)/(exp(w*x)…

【线段树】【区间更新】2916. 子数组不同元素数目的平方和 II

算法可以发掘本质&#xff0c;如&#xff1a; 一&#xff0c;若干师傅和徒弟互有好感&#xff0c;有好感的师徒可以结对学习。师傅和徒弟都只能参加一个对子。如何让对子最多。 二&#xff0c;有无限多1X2和2X1的骨牌&#xff0c;某个棋盘若干格子坏了&#xff0c;如何在没有坏…

Spring Boot集成Graphql快速入门Demo

1.Graphql介绍 GraphQL 是一个用于 API 的查询语言&#xff0c;是一个使用基于类型系统来执行查询的服务端运行时&#xff08;类型系统由你的数据定义&#xff09;。GraphQL 并没有和任何特定数据库或者存储引擎绑定&#xff0c;而是依靠你现有的代码和数据支撑。 优势 GraphQL…

贫穷的本质

李永乐 李永乐一个老师 李永乐&#xff0c;男&#xff0c;汉族&#xff0c;1983年出生于吉林省吉林市 [1]&#xff0c;高中数学、物理老师&#xff0c;北京大学物理与经济双学士 [5]&#xff0c;清华大学电子工程系 [5]硕士研究生。 他的解读逻辑比较清晰&#xff0c;更像是用数…

Redis从入门到精通(十五)Redis分布式缓存(三)Redis分片集群的搭建和原理分析

文章目录 前言5.4 分片集群5.4.1 搭建分片集群5.4.2 散列插槽5.4.3 集群伸缩5.4.3.1 需求分析5.4.3.2 创建新的Redis实例5.4.3.3 添加新节点到Redis集群5.4.3.4 转移插槽 5.4.4 故障转移5.4.4.1 自动故障转移5.4.4.2 手动故障转移 5.4.5 RedisTemplate 5.5 小结 前言 Redis分布…

webpack-loader的使用

引入css后执行打包命令 "build": "npx webpack --config wk.config.js"发现报错&#xff1a; webpack默认只能处理js其他的像css,图片都需要借助loader来处理 css-loader loader可以用于对模块的源代码进行转换&#xff0c;可以把css看成一个模块&…

项目管理工具——使用甘特图制定项目计划的详细步骤

甘特图是一种直观的项目管理工具&#xff0c;它有助于我们清晰地展示任务安排、时间管理和项目的进度。以下是使用甘特图制定项目计划的详细步骤&#xff1a; 1、创建项目&#xff1a;首先&#xff0c;在进度猫中创建新的项目&#xff0c;并设置项目的时间、工作日等参数。根据…

Day37|贪心算法part06:738.单调递增的数字、968. 监控二叉树、贪心总结

738. 单调递增的数字 总体思想就是从后往前遍历&#xff0c;比较第i位和第i1位的大小&#xff0c;不符合顺序char[i]减1&#xff0c;i1位填9&#xff0c;找到需要填9的最先位置&#xff0c;然后填9。 class Solution {public int monotoneIncreasingDigits(int n) {String s …

请求分发场景下的鉴权问题

说明&#xff1a;记录一次对请求分发&#xff0c;无法登录系统的问题。 场景 如下&#xff0c;在此结构下&#xff0c;如何判断该用户是已登录的用户&#xff1b; 常规操作&#xff0c;用户登录后给用户发Token&#xff0c;同时将发放的Token存入到Redis中。要求用户后续请求…