当前位置:   article > 正文

开源模型应用落地-chatglm3-6b-streamlit-入门篇(八)_streamlit启动命令

streamlit启动命令

一、前言

    早前的文章,我们都是通过输入命令的方式来使用Chatglm3-6b模型。现在,我们可以通过使用Streamlit,通过一个界面与模型进行交互。这样做可以减少重复加载模型和修改代码的麻烦,
让我们更方便地体验模型的效果。

    开源模型应用落地-chatglm3-6b-gradio-入门篇(七)


二、术语

2.1、Streamlit

    Streamlit是一个开源库,它专注于构建数据科学和机器学习应用程序的用户界面。它提供了一个简单的API,可以让开发者使用Python快速创建交互式应用程序。使用Streamlit,您可以轻松地将数据、图表和模型展示给用户,并与用户进行实时交互。

    Streamlit VS Gradio

    Streamlit和Gradio的区别在于它们的设计重点和功能特性。Streamlit提供了更多的灵活性和自定义选项,使开发者能够更好地控制应用程序的外观和行为。它还提供了更多的部署选项和扩展功能,使开发者能够将应用程序部署到更多的环境中。

    Gradio更注重简单易用和快速原型开发。它提供了自动生成界面的功能,无需太多的编码工作即可创建一个交互式应用程序。Gradio的设计目标是提供一个轻量级、易于上手的工具,使开发者能够快速构建和共享应用程序原型。


三、前置条件

3.1. windows or linux操作系统均可

3.2. 下载chatglm3-6b模型

从huggingface下载:https://huggingface.co/THUDM/chatglm3-6b/tree/main

从魔搭下载:魔搭社区汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/fileshttps://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files

 3.3. 创建虚拟环境&安装依赖

  1. conda create --name chatglm3 python=3.10
  2. conda activate chatglm3
  3. pip install protobuf transformers==4.39.3 cpm_kernels torch>=2.0 sentencepiece accelerate
  4. pip install streamlit

四、技术实现

4.1.示例代码

  1. # -*- coding = utf-8 -*-
  2. import streamlit as st
  3. import torch
  4. from transformers import AutoModelForCausalLM, AutoTokenizer
  5. modelPath = "/model/chatglm3-6b"
  6. def loadTokenizer():
  7. tokenizer = AutoTokenizer.from_pretrained(modelPath, use_fast=False, trust_remote_code=True)
  8. return tokenizer
  9. def loadModel():
  10. model = AutoModelForCausalLM.from_pretrained(modelPath, device_map="auto", trust_remote_code=True).cuda()
  11. model = model.eval()
  12. return model
  13. st.set_page_config(
  14. page_title="ChatGLM3-6B Streamlit Simple Demo",
  15. page_icon=":robot:",
  16. layout="wide"
  17. )
  18. @st.cache_resource
  19. def get_model():
  20. tokenizer = loadTokenizer()
  21. model = loadModel()
  22. return tokenizer, model
  23. # 加载Chatglm3的model和tokenizer
  24. tokenizer, model = get_model()
  25. if "history" not in st.session_state:
  26. st.session_state.history = []
  27. if "past_key_values" not in st.session_state:
  28. st.session_state.past_key_values = None
  29. max_length = st.sidebar.slider("max_length", 0, 32768, 8192, step=1)
  30. top_p = st.sidebar.slider("top_p", 0.0, 1.0, 0.8, step=0.01)
  31. temperature = st.sidebar.slider("temperature", 0.0, 1.0, 0.6, step=0.01)
  32. buttonClean = st.sidebar.button("清理会话历史", key="clean")
  33. if buttonClean:
  34. st.session_state.history = []
  35. st.session_state.past_key_values = None
  36. if torch.cuda.is_available():
  37. torch.cuda.empty_cache()
  38. st.rerun()
  39. for i, message in enumerate(st.session_state.history):
  40. if message["role"] == "user":
  41. with st.chat_message(name="user", avatar="user"):
  42. st.markdown(message["content"])
  43. else:
  44. with st.chat_message(name="assistant", avatar="assistant"):
  45. st.markdown(message["content"])
  46. with st.chat_message(name="user", avatar="user"):
  47. input_placeholder = st.empty()
  48. with st.chat_message(name="assistant", avatar="assistant"):
  49. message_placeholder = st.empty()
  50. prompt_text = st.chat_input("请输入您的问题")
  51. if prompt_text:
  52. input_placeholder.markdown(prompt_text)
  53. history = st.session_state.history
  54. past_key_values = st.session_state.past_key_values
  55. for response, history, past_key_values in model.stream_chat(
  56. tokenizer,
  57. prompt_text,
  58. history,
  59. past_key_values=past_key_values,
  60. max_length=max_length,
  61. top_p=top_p,
  62. temperature=temperature,
  63. return_past_key_values=True,
  64. ):
  65. message_placeholder.markdown(response)
  66. st.session_state.history = history
  67. st.session_state.past_key_values = past_key_values

4.2.启动命令

streamlit run chatglm3_6b_streamlit.py --server.port 8989

调用结果:

启动成功:

浏览器首次访问:

(1) 加载模型

(2) 加载完成

(3) 推理

GPU使用情况:


五、附带说明

5.1. @st.cache_resource注解的作用

@st.cache_resource是一个装饰器函数,用于缓存外部资源(如文件、数据集等)。它的作用是在应用程序执行期间缓存资源,以避免每次执行应用程序时都重新加载资源,从而提高应用程序的性能和响应速度。

当您使用@st.cache_resource装饰器修饰一个函数时,该函数将被包装成一个可缓存的函数。在函数第一次被调用时,它会执行函数体内的代码,并将结果缓存起来。之后,当再次调用该函数时,如果函数的输入参数没有变化,Streamlit会直接返回缓存的结果,而不再执行函数体内的代码。

5.2. 修改Streamlit默认端口

(一)使用命令行参数:
    在运行Streamlit应用程序时,可以使用--server.port参数来指定端口。例如,以下命令将Streamlit应用程序运行在端口号为8888的服务器上:
 

streamlit run your_app.py --server.port 8888


(二)使用配置文件:
    可以创建一个名为.streamlit/config.toml的配置文件,并在其中指定端口。如果该文件不存在,可以创建它。在配置文件中,添加以下内容:

  1. [server]
  2. port = 8888

将端口号替换为您想要使用的实际端口号。

5.3. 界面无法打开

1. 服务监听地址不能是127.0.0.1

2. 检查服务器的安全策略或防火墙配置

 服务端:lsof -i:8989 查看端口是否正常监听

 客户端:telnet ip 8989 查看是否可以正常连接

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号