Qwen2.5-Coder-7B-Instruct模型本地部署,并实现简单的web对话 ...

自由的羽毛  论坛元老 | 2024-12-17 02:32:23 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 2074|帖子 2074|积分 6222

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在自己电脑上部署一个聊天机器人,实现简单的chat界面,适用于千问2大概千问2.5的模型。windows环境也通用,修改好对应的路径就可以。
该Qwen-Coder-7B模型加载进显存后约莫占用14G,支持流式传输,界面示例如图:

部署流程:

1、配置环境

在已经有torch+cuda的条件下,还必要以下几个库:
  1.     pip install  transformers
  2.     pip install  accelerate
  3.     pip install  gradio
复制代码
其中transformers库需满足版本大于即是4.37.0,用来加载模型,accelerate用于加快模型,gradio用于生成前端界面。
2、下载模型文件

下载模型的地方:(魔搭社区)
点击此处下载模型:

提供了很多种下载方式,选择一种方式下载即可:

3、加载模型

下面代码是官方的示例
  1. from transformers import AutoModelForCausalLM, AutoTokenizer
  2. model_name = "path/to/your/model"
  3. # 把这里修改成你下载的模型位置,比如我是/home/LLM/Qwen/Qwen2_5-Coder-7B-Instruct
  4. model = AutoModelForCausalLM.from_pretrained( # 加载模型
  5.     model_name,
  6.     torch_dtype="auto",
  7.     device_map="auto"
  8. )
  9. tokenizer = AutoTokenizer.from_pretrained(model_name) # 加载分词器
  10. prompt = "Give me a short introduction to large language model.Answer it in Chinese"
  11. messages = [
  12.     {"role": "system", "content": "You are Qwen, created by Alibaba Cloud. You are a helpful assistant."},
  13.     {"role": "user", "content": prompt}
  14. ]
  15. text = tokenizer.apply_chat_template(
  16.     messages,
  17.     tokenize=False,
  18.     add_generation_prompt=True
  19. )
  20. model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
  21. generated_ids = model.generate(
  22.     **model_inputs,
  23.     max_new_tokens=512
  24. )
  25. response = tokenizer.decode(generated_ids[0], skip_special_tokens=True)
  26. print(response)
复制代码
4、实现简单的chat功能,举行web访问

起首导入必要用到的库和几个全局变量
  1. from threading import Thread
  2. import gradio as gr
  3. from transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreamer
  4. # 分别是用户头像和聊天机器人的头像(需要在gradio工作的项目下,这里我的项目名为LLM)
  5. user_icon = '/home/LLM/Qwen-main/gradio_avatar_images/user_icon.jpeg'
  6. bot_icon = '/home/LLM/Qwen-main/gradio_avatar_images/bot_icon.jpg'
  7. model_name = '/home/LLM/Qwen/Qwen2_5-Coder-7B-Instruct' # 模型存放位置
  8. qwen_chat_history = [
  9.     {"role": "system", "content": "You are a helpful assistant."}
  10. ]# 储存历史对话
复制代码
定义一个加载模型的函数:
  1. def _load_model():
  2.     tokenizer = AutoTokenizer.from_pretrained(model_name)
  3.     model = AutoModelForCausalLM.from_pretrained(
  4.         model_name,
  5.         torch_dtype="auto",
  6.         device_map="auto",
  7.     )
  8.     streamer = TextIteratorStreamer(tokenizer=tokenizer, skip_prompt=True, skip_special_tokens=True)
  9.     return model, tokenizer, streamer
复制代码
  1. TextIteratorStreamer用于生成流式输出。
复制代码
然后是整个聊天界面的一个实现,使用gradio库实现
  1. with gr.Blocks() as demo:
  2.     model, tokenizer, streamer = _load_model() # 载入模型
  3.     chatbot = gr.Chatbot(
  4.         height=600, # 界面高度,可以自己调
  5.         avatar_images=(user_icon, bot_icon)
  6.     )# Chatbot还涉及很多参数,如需了解清查阅官方技术文档
  7.     msg = gr.Textbox()
  8.     clear = gr.ClearButton([msg, chatbot])
  9.    
  10.     # 清除历史记录
  11.     def _clean_history():
  12.         global qwen_chat_history
  13.         qwen_chat_history = []
  14.     #生成回复
  15.     def _response(message, chat_history):
  16.         qwen_chat_history.append({"role": "user", "content": message}) # 拼接历史对话
  17.         history_str = tokenizer.apply_chat_template(
  18.             qwen_chat_history,
  19.             tokenize=False,
  20.             add_generation_prompt=True
  21.         )
  22.         inputs = tokenizer(history_str, return_tensors='pt').to(model.device)
  23.         chat_history.append([message, ""])
  24.         # 推理参数
  25.         generation_kwargs = dict(
  26.             **inputs,
  27.             streamer=streamer,
  28.             max_new_tokens=2048,
  29.             num_beams=1,
  30.             do_sample=True,
  31.             top_p=0.8,
  32.             temperature=0.3,
  33.         )
  34.         # 监控流失输出结果
  35.         thread = Thread(target=model.generate, kwargs=generation_kwargs)
  36.         thread.start()
  37.         for new_text in streamer:
  38.             chat_history[-1][1] += new_text
  39.             yield "", chat_history
  40.         qwen_chat_history.append(
  41.             {"role": "assistant", "content": chat_history[-1][1]}
  42.         )
  43.     clear.click(_clean_history())
  44.     msg.submit(_response, [msg, chatbot], [msg, chatbot])
  45. demo.queue().launch(
  46.     share=False,
  47.     server_port=8000,
  48.     server_name="127.0.0.1",
  49. ) # 绑定8000端口,进行web访问
复制代码
运行代码,会生成一个链接:

直接点开大概复制到浏览器打开就可以进入聊天界面:

完备代码:
  1. from threading import Threadimport gradio as grfrom transformers import AutoModelForCausalLM, AutoTokenizer, TextIteratorStreameruser_icon = '/home/lhp/Desktop/LLM/Qwen-main/gradio_avatar_images/user_icon.jpeg'bot_icon = '/home/lhp/Desktop/LLM/Qwen-main/gradio_avatar_images/bot_icon.jpg'model_name = '/home/lhp/Desktop/LLM/Qwen/Qwen2_5-Coder-7B-Instruct'qwen_chat_history = [    {"role": "system", "content": "You are a helpful assistant."}]def _load_model():
  2.     tokenizer = AutoTokenizer.from_pretrained(model_name)
  3.     model = AutoModelForCausalLM.from_pretrained(
  4.         model_name,
  5.         torch_dtype="auto",
  6.         device_map="auto",
  7.     )
  8.     streamer = TextIteratorStreamer(tokenizer=tokenizer, skip_prompt=True, skip_special_tokens=True)
  9.     return model, tokenizer, streamer
  10. with gr.Blocks() as demo:    model, tokenizer, streamer = _load_model()    chatbot = gr.Chatbot(        height=600,        avatar_images=(user_icon, bot_icon)    )    msg = gr.Textbox()    clear = gr.ClearButton([msg, chatbot])    def _clean_history():        global qwen_chat_history        qwen_chat_history = []    def _response(message, chat_history):        qwen_chat_history.append({"role": "user", "content": message}) # 拼接历史对话        history_str = tokenizer.apply_chat_template(            qwen_chat_history,            tokenize=False,            add_generation_prompt=True        )        inputs = tokenizer(history_str, return_tensors='pt').to(model.device)        chat_history.append([message, ""])        # 拼接推理参数        generation_kwargs = dict(            **inputs,            streamer=streamer,            max_new_tokens=2048,            num_beams=1,            do_sample=True,            top_p=0.8,            temperature=0.3,        )        # 启动线程,用以监控流失输出结果        thread = Thread(target=model.generate, kwargs=generation_kwargs)        thread.start()        for new_text in streamer:            chat_history[-1][1] += new_text            yield "", chat_history        qwen_chat_history.append(            {"role": "assistant", "content": chat_history[-1][1]}        )    clear.click(_clean_history())    msg.submit(_response, [msg, chatbot], [msg, chatbot])demo.queue().launch(    share=False,    server_port=8000,    server_name="127.0.0.1",)
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表