vLLM部署qwen大模型加速推理实现

目录

step1: 编写 vllm_wrapper.py

step2: 应用场景:给体检指标生成健康建议


step1: 编写 vllm_wrapper.py

from transformers import PreTrainedTokenizer, GenerationConfig, StoppingCriteriaList
from typing import Optional, Callable, List, Tuple, Union
import copy
import torch
from transformers import AutoTokenizer
from transformers.generation.logits_process import LogitsProcessorList
from packaging import version_ERROR_BAD_CHAT_FORMAT = """\
We detect you are probably using the pretrained model (rather than chat model) for chatting, since the chat_format in generation_config is not "chatml".
If you are directly using the model downloaded from Huggingface, please make sure you are using our "Qwen/Qwen-7B-Chat" Huggingface model (rather than "Qwen/Qwen-7B") when you call model.chat().
我们检测到您可能在使用预训练模型(而非chat模型)进行多轮chat,因为您当前在generation_config指定的chat_format,并未设置为我们在对话中所支持的"chatml"格式。
如果您在直接使用我们从Huggingface提供的模型,请确保您在调用model.chat()时,使用的是"Qwen/Qwen-7B-Chat"模型(而非"Qwen/Qwen-7B"预训练模型)。
"""IMEND = "<|im_end|>"
ENDOFTEXT = "<|endoftext|>"HistoryType = List[Tuple[str, str]]
TokensType = List[int]
BatchTokensType = List[List[int]]def get_stop_words_ids(chat_format, tokenizer):if chat_format == "raw":stop_words_ids = [tokenizer.encode("Human:"), [tokenizer.eod_id]]elif chat_format == "chatml":stop_words_ids = [[tokenizer.im_end_id], [tokenizer.im_start_id]]else:raise NotImplementedError(f"Unknown chat format {chat_format!r}")return stop_words_idsdef make_context(tokenizer: PreTrainedTokenizer,query: str,history: List[Tuple[str, str]] = None,system: str = "",max_window_size: int = 6144,chat_format: str = "chatml",
):if history is None:history = []if chat_format == "chatml":im_start, im_end = "<|im_start|>", "<|im_end|>"im_start_tokens = [tokenizer.im_start_id]im_end_tokens = [tokenizer.im_end_id]nl_tokens = tokenizer.encode("\n")def _tokenize_str(role, content):return f"{role}\n{content}", tokenizer.encode(role, allowed_special=set()) + nl_tokens + tokenizer.encode(content, allowed_special=set())system_text, system_tokens_part = _tokenize_str("system", system)system_tokens = im_start_tokens + system_tokens_part + im_end_tokensraw_text = ""context_tokens = []for turn_query, turn_response in reversed(history):query_text, query_tokens_part = _tokenize_str("user", turn_query)query_tokens = im_start_tokens + query_tokens_part + im_end_tokensresponse_text, response_tokens_part = _tokenize_str("assistant", turn_response)response_tokens = im_start_tokens + response_tokens_part + im_end_tokensnext_context_tokens = nl_tokens + query_tokens + nl_tokens + response_tokensprev_chat = (f"\n{im_start}{query_text}{im_end}\n{im_start}{response_text}{im_end}")current_context_size = (len(system_tokens) + len(next_context_tokens) + len(context_tokens))if current_context_size < max_window_size:context_tokens = next_context_tokens + context_tokensraw_text = prev_chat + raw_textelse:breakcontext_tokens = system_tokens + context_tokensraw_text = f"{im_start}{system_text}{im_end}" + raw_textcontext_tokens += (nl_tokens+ im_start_tokens+ _tokenize_str("user", query)[1]+ im_end_tokens+ nl_tokens+ im_start_tokens+ tokenizer.encode("assistant")+ nl_tokens)raw_text += f"\n{im_start}user\n{query}{im_end}\n{im_start}assistant\n"elif chat_format == "raw":raw_text = querycontext_tokens = tokenizer.encode(raw_text)else:raise NotImplementedError(f"Unknown chat format {chat_format!r}")return raw_text, context_tokensclass vLLMWrapper:def __init__(self,model_dir: str,trust_remote_code: bool = True,tensor_parallel_size: int = 1,gpu_memory_utilization: float = 0.98,dtype: str = "bfloat16",**kwargs):if dtype not in ("bfloat16", "float16", "float32"):print("now not support {}!".format(dtype))raise Exception# build generation_configself.generation_config = GenerationConfig.from_pretrained(model_dir, trust_remote_code=trust_remote_code)# build tokenizerself.tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)self.tokenizer.eos_token_id = self.generation_config.eos_token_idself.stop_words_ids = []from vllm import LLMimport vllmif version.parse(vllm.__version__) >= version.parse("0.2.2"):self.__vllm_support_repetition_penalty = Trueelse:self.__vllm_support_repetition_penalty = Falsequantization = getattr(kwargs, 'quantization', None)self.model = LLM(model=model_dir,tokenizer=model_dir,tensor_parallel_size=tensor_parallel_size,trust_remote_code=trust_remote_code,quantization=quantization,gpu_memory_utilization=gpu_memory_utilization,dtype=dtype)for stop_id in get_stop_words_ids(self.generation_config.chat_format, self.tokenizer):self.stop_words_ids.extend(stop_id)self.stop_words_ids.extend([self.generation_config.eos_token_id])def chat(self,query: str,history: Optional[HistoryType],tokenizer: PreTrainedTokenizer = None,system: str = "You are a helpful assistant.",generation_config: Optional[GenerationConfig] = None,**kwargs):generation_config = generation_config if generation_config is not None else self.generation_configtokenizer = self.tokenizer if tokenizer is None else tokenizerassert generation_config.chat_format == 'chatml', _ERROR_BAD_CHAT_FORMATif not self.__vllm_support_repetition_penalty and generation_config.repetition_penalty != 1:raise RuntimeError("The installed vLLM doesn't support repetition_penalty, please set ``model.generation_config.repetition_penalty = 1`` or install vllm>=0.2.2")if history is None:history = []else:# make a copy of the user's input such that is is left untouchedhistory = copy.deepcopy(history)extra_stop_words_ids = kwargs.get('stop_words_ids', None)if extra_stop_words_ids is None:extra_stop_words_ids = []max_window_size = kwargs.get('max_window_size', None)if max_window_size is None:max_window_size = generation_config.max_window_sizefrom vllm.sampling_params import SamplingParamssampling_kwargs = {"stop_token_ids": self.stop_words_ids,"early_stopping": False,"top_p": generation_config.top_p,"top_k": -1 if generation_config.top_k == 0 else generation_config.top_k,"temperature": generation_config.temperature,"max_tokens": generation_config.max_new_tokens,"repetition_penalty": generation_config.repetition_penalty}if not self.__vllm_support_repetition_penalty:sampling_kwargs.pop("repetition_penalty")sampling_params = SamplingParams(**sampling_kwargs)raw_text, context_tokens = make_context(self.tokenizer,query,history=history,system=system,max_window_size=max_window_size,chat_format=generation_config.chat_format,)req_outputs = self.model.generate([query],sampling_params=sampling_params,prompt_token_ids=[context_tokens])req_output = req_outputs[0]prompt_str = req_output.promptprompt_ids = req_output.prompt_token_idsreq_sample_output_ids = []req_sample_output_strs = []for sample in req_output.outputs:output_str = sample.textoutput_ids = sample.token_idsif IMEND in output_str:output_str = output_str[:-len(IMEND)]if ENDOFTEXT in output_str:output_str = output_str[:-len(ENDOFTEXT)]req_sample_output_ids.append(prompt_ids + output_ids)req_sample_output_strs.append(prompt_str + output_str)assert len(req_sample_output_strs) == 1response = req_sample_output_strs[0][len(prompt_str):]history.append((prompt_str, response))return response, historyif __name__ == '__main__':model_dir = 'Qwen/Qwen-72B-Chat'tensor_parallel_size = 2model = vLLMWrapper(model_dir,tensor_parallel_size=tensor_parallel_size,)response, history = model.chat(query="你好",history=None)print(response)response, history = model.chat(query="给我讲一个年轻人奋斗创业最终取得成功的故事。",history=history)print(response)response, history = model.chat(query="给这个故事起一个标题",history=history)print(response)

step2: 应用场景:给体检指标生成健康建议


import pandas as pd
from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
from vllm_wrapper import vLLMWrapper
from tqdm import tqdmsft_path = "/mnt/sdd/Qwen-7B-Chat"
tokenizer = AutoTokenizer.from_pretrained(sft_path, trust_remote_code=True)
model = vLLMWrapper(sft_path, tensor_parallel_size=1)
# model = AutoModelForCausalLM.from_pretrained(sft_path, device_map="auto", trust_remote_code=True).eval()import uuiddef data_load():zb = pd.read_csv('/home/wangyp/Big_Model/infectious_disease/data/zb.csv', header=0)# print(zb.head(10))nums = []yins = {}nulls = []for item in zb.itertuples(index=False):if item.normal_desc is not None and item.normal_desc.strip() != '':yins[item.NAME.strip()] = item.normal_desc.strip()if( (item.range_floor is not None and str(item.range_floor).strip() != '') and (item.range_ceil is not None and str(item.range_ceil).strip() != '') ):nums.append({item.NAME.strip(): str(item.range_floor).strip() + "-" + str(item.range_ceil).strip() })else:nulls.append(item.NAME.strip())return yins, nums, nullsdef zao_yins(yins):res = []for key in yins.keys():res.append( key + "这种体检指标阳性。")res.append( key + "的检测结果为阳性。")res.append( key + "的检测显示出阳性反应。")res.append( key + "检测结果为阳性。")res.append( key + "的阳性结果在体检中被检测到。")res.append( key + "试验为阳性状态")res.append( key + "的阳性结果在体检中得到了确认。")res.append( key + "的检测结果表明为阳性。")res.append( "在进行检测" + key + "指标时,结果被判定为阳性。")return resdef zao_nums(nums):res = []keys_list = [key for d in nums for key in d.keys()]for key in keys_list:res.append({"name": key, "value": key + "检测结果显示异常。"})# res.append({"name": key, "value": key + "的检查值超出了正常范围。"})res.append({"name": key, "value": key + "的测量值与标准值不符。"})# res.append({"name": key, "value": key + "检测结果呈现异常状态。"})res.append({"name": key, "value": key + "的数值在体检中被标记为异常。"})# res.append({"name": key, "value": key + "检查结果显示了不正常的数值。"})res.append({"name": key, "value": key + "的检测结果不在正常参考值内。"})# res.append({"name": key, "value": key + "检查报告提示数值异常。"})# res.append({"name": key, "value": "体检报告指出" + key + "水平不正常。"})res.append({"name": key, "value": "体检中发现" + key + "水平异常。"})# res.append(key + "检测结果显示异常。")return res
# 体检中发现尿酮水平异常,帮我生成10条描述,保持句子意思不变
def z_nulls(nulls):res = []for key in nulls:res.append("体检结果显示" + key + "水平出现异常。")res.append("在进行体检时,发现" + key + "的数值不在正常范围内。")res.append("体检报告中指出" + key + "水平有异常情况。")res.append("体检时," + key + "水平的测定结果超出了预期的正常值。")res.append("体检中测得的" + key + "水平与正常值有所偏差。")res.append("体检数据中," + key + "的数值检测出异常。")res.append(key + "的检测结果表明存在异常。")res.append(key + "的检测值在体检中被标记为异常。")res.append(key + "水平的体检结果提示有异常。")return resyins_template = """"""# 定义一个带有槽位的字符串模板
# yins_template = "Hello, {name}! You are {age} years old."
yins_template = """hhh******************"""nums_template = """
{disc}你是一名体检报告领域的专家,请生成一段关于该体检指标异常的改善建议。\n下面是生成体检指标相关的建议时的要求:健康建议严格包含如下几项:复检确认、营养评估、医疗咨询、健康饮食、生活方式调整、药物治疗、定期监测、记录症状这几项。生成建议请参考以下格式:\n体检结果提示您的{name}不在正常参考值内,这可能与多种因素有关,包括营养不良、维生素缺乏或某些疾病状态。以下是一些建议:\n复检确认:{name}相关的复检建议。\n营养评估:考虑针对{name}进行一次全面的营养评估。\n医疗咨询:咨询医生,以确定是否需要进一步的检查和{name}相关的其他检测。如血红蛋白电泳、血清铁蛋白、维生素B12和叶酸水平检测。\n健康饮食:饮食建议,这些食物富含补充{name}必要的营养素。\n生活方式调整:保持适度的体育活动,避免饮酒和吸烟,这些都可能影响{name}的健康。\n药物治疗:如果医生建议,可能需要服用补充剂或药物来纠正{name}异常。\n定期监测:根据医生的建议,定期监测{name}和其他{name}相关指标。\n记录症状:注意任何可能与{name}相关的症状,如疲劳、头晕或呼吸困难,并及时告知医生。\n请记住,{name}的异常可能是多种情况的指标,因此重要的是遵循医疗专业人员的指导进行进一步的评估和治疗。\n
"""
# filled_nums_template = nums_template.format(name=name)def load_model():passif __name__ == '__main__':all = []yins, nums, nulls = data_load()# 遍历,一个字段造10个template,存储到list中,写入文件yins_tem = zao_yins(yins)nums_tem = zao_nums(nums)nulls_tem = z_nulls(nulls)# all = yins_tem + nums_tem + nulls_tem# print(len(all))nums_conversations = []for num in tqdm(nums_tem):filled_nums_template = nums_template.format(disc=num["value"], name=num["name"])response, history = model.chat(filled_nums_template, history=None)nums_conversations.append({"id": str(uuid.uuid4()), "conversations": [{"from": "user", "value": num["value"]}, {"from": "assistant", "value": response}]})with open("/home/wangyp/Big_Model/infectious_disease/data/zb_train.json", "w", encoding="utf-8") as f:f.write(",\n".join(str(i) for i in nums_conversations))print("nums_conversations数据处理完毕。。。。。。。。。。。。。。。。。。。")

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

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

相关文章

用例篇

弱网测试 弱网测试的目的是尽可能保证用户体验&#xff0c;关注的关键点包括&#xff1a; 页面响应时间是否可以接受&#xff0c;关注包括哦热启动、冷启动时间、页面切换、前后台切换、首字时间&#xff0c;首屏时间等。页面呈现是否完成一致。超时文案是否符合定义&#xf…

CSS浮动(CSS从入门到精通学习第四天)

css第04天 一、其他样式 1、圆角边框 在 CSS3 中&#xff0c;新增了圆角边框样式&#xff0c;这样我们的盒子就可以变圆角了。 border-radius 属性用于设置元素的外边框圆角。 语法&#xff1a; border-radius:length; 参数值可以为数值或百分比的形式如果是正方形&…

K8S认证|CKA题库+答案| 15. 备份还原Etcd

目录 15、 备份还原Etcd CKA v1.29.0模拟系统 下载试用 题目&#xff1a; 开始操作: 1&#xff09;、切换集群 2&#xff09;、登录master并提权 3&#xff09;、备份Etcd现有数据 4&#xff09;、验证备份数据快照 5&#xff09;、查看节点和Pod状态 6&#xff0…

Django--ApiView示例

1. 代码示例 from django.contrib.auth.models import User from rest_framework import serializers from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import statusfrom .models import BookInfoclass BookInf…

linux下的openssh简介(centos 8)

目录 1. 简介2. 安装 OpenSSH3. 配置 OpenSSH 服务器3.1 服务器配置文件配置文件的详解 3.2 安全操作——修改 SSH 端口3.3 安全操作——禁止 root 登录3.4 安全操作——密钥认证3.5 安全操作——禁止密码认证 4. 配置 OpenSSH 客户端4.0 常用命令4.0.1 ssh常用命令4.0.2 scp常…

Java进阶学习笔记11——多态

什么是多态&#xff1f; 多态是在继承/实现情况下一种现象&#xff0c;表现为&#xff1a;对象多态和行为多态。 同一个对象&#xff0c;在不同时刻表现出来的不同形态。 多态的前提&#xff1a; 要有继承/实现关系 要有方法的重写 要有父类引用指向子类对象。 多态的具体代码…

使用 LangFuse 意外被挂马!我是怎么恢复系统稳定的?

在使用 LangFuse 过程中,被意外挂马!通过一番折腾服务恢复正常~ 本文将详细介绍应对恶意脚本和进程的完整方案,包括识别、清理、恢复和预防步骤。 阿里云扫到的信息 被执行的 Base64 SUlaQnRTCmV4ZWMgJj4vZGV2L251bGwKSUhDa0hQbmQ9Li8uJChkYXRlfG1kNXN1bXxoZWFkIC1jMjApCl…

Value-Based Reinforcement Learning(1)

Action-Value Functions Discounted Return&#xff08;未来的reward&#xff0c;由于未来存在不确定性&#xff0c;所以未来的reward 要乘以进行打折&#xff09; 这里的依赖actions &#xff0c;和states 这里 Policy Function : &#xff0c;表达了action的随机性 S…

创新实训2024.05.26日志:服务端接口实现——用户开启多个会话

1. 概念图 类似于Kimi&#xff0c;文心一言&#xff0c;chatGPT等市面上主流的大模型&#xff0c;我们的大模型也支持同一个用户的多个会话&#xff0c;并且提供支持联系上下文给出解答的能力。 2. 基于会话的对话 在langchain chatchat这个对langchain框架进行二次封装的第三…

vulnhub靶场之FunBox-8

一.环境搭建 1.靶场描述 Its a box for beginners and can be pwned in the lunch break. This works better with VirtualBox rather than VMware 2.靶场下载 Funbox: Lunchbreaker ~ VulnHub 3.靶场启动 二.信息收集 1.寻找靶场真实IP地址 nmap -sP 192.168.2.0/24 arp-…

介绍一下Lumina-T2X在哪些领域有应用

接上文【文末附gpt升级方案】Lumina-T2X&#xff1a;大型扩散DiTs在多模态内容生成中的新篇章-CSDN博客 Lumina-T2X是一个创新的多模态内容生成模型&#xff0c;其应用领域广泛&#xff0c;特别是在需要生成多种类型媒体内容的应用场景中表现突出。以下是Lumina-T2X在主要领域…

[AIGC] 什么是flink sql

Apache Flink 是一个针对流数据和批数据的开源平台。Flink SQL 是 Flink 中的一个模块&#xff0c;它允许我们使用 SQL 语言来进行流处理和批处理&#xff0c;极大地简化了大数据处理的复杂度。 Flink SQL API 支持标准的 SQL 语言&#xff0c;包括 DDL&#xff08;用于定义数…

vue中实现动态点击事件名

//首先是一个数组列表 data() {return {operationList: [{icon: ../../static/shebei.png,name: 全部设备,click: allDevice}, {icon: ../../static/guankong.png,name: 管控中,click: allDevice}, {icon: ../../static/lixian.png,name: 离线设备,click: allDevice}, {icon: .…

列紧性推出紧性的证明

参考中科大大佬笔记 http://home.ustc.edu.cn/~xuxuayame/documents/MAB3/Lec8.pdf 这个证明还是比较经典的&#xff0c;要用到两个引理 度量空间上 紧和列紧等价 紧推出列紧一直都是可以的 但度量空间才能满足列紧推出紧 紧和列紧看上去毫不相关&#xff0c;因此紧推列紧主要…

html中被忽略的简单标签

1&#xff1a; alt的作用是在图片不能显示时的提示信息 <img src"https://img.xunfei.cn/mall/dev/ifly-mall-vip- service/business/vip/common/202404071019208761.jp" alt"提示信息" width"100px" height"100px" /> 2&#…

嵌入式进阶——震动马达

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 原理图控制分析功能设计 原理图 控制分析 S8050 NPN三极管特性 NPN型三极管的工作原理是基于PN结和PNP型晶体管的工作原理。 当外…

PyTorch设计哲学

原文&#xff1a; https://pytorch.org/docs/stable/community/design.html PyTorch设计哲学总结 设计原则 可用性优先于性能 &#xff08;usability over everything else&#xff09; PyTorch的主要目标是可用性&#xff0c;次要目标是合理的性能。避免过早实施严格的用户…

【qt】QTreeWidget 树形组件

QTreeWidget 树形组件 一.什么是树形组件二.界面设计树形组件三.代码实现1.清空2.设置列数3.设置头标签4.添加根目录①QTreeWidgetitem②设置文本③设置图标④添加为顶层目录 5.添加子目录①初始化为父目录②子目录添加到父目录③获取到子目录 四.插入目录1.获取当前选中目录项…

部署PIM-SM

拓扑图 配置 使能组播路由 配置OSPF 组播路由器接口配置pim-sm 连接组成员的接口使能igmp pim路由器上配置静态RP sysname AR1 # multicast routing-enable # interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.0 pim sm # interface GigabitEthernet0/0/…

flutter项目运行报错Exception: Gradle task assembleDebug failed with exit code 1各种报错合集

1.报错 Launching lib/main.dart on sdk gphone64 arm64 in debug mode... Running Gradle task assembleDebug... Exception in thread "main" java.net.ConnectException: Operation timed out at java.base/sun.nio.ch.Net.connect0(Native Method) at j…