当前位置:   article > 正文

win10系统gpu本地部署chatglm3-6b,从0开始安装

win10系统gpu本地部署chatglm3-6b,从0开始安装

 开源地址:

GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 开源双语对话语言模型

前言:ChatGLM2与ChatGLM3区别

ChatGLM2与ChatGLM3模型架构是完全一致的,ChatGLM与后继者结构不同。可见ChatGLM3相对于ChatGLM2没有模型架构上的改进。

相对于ChatGLM,ChatGLM2、ChatGLM3模型上的变化:

  1. 词表的大小从ChatGLM的150528缩小为65024 (一个直观的体验是ChatGLM2、3加载比ChatGLM快不少)
  2. 位置编码从每个GLMBlock一份提升为全局一份
  3. SelfAttention之后的前馈网络有不同。ChatGLM用GELU(Gaussian Error Linear Unit)做激活;ChatGLM用Swish-1做激活。而且ChatGLM2、3应该是修正了之前的一个bug,因为GLU(Gated Linear Unit)本质上一半的入参是用来做门控制的,不需要输出到下层,所以ChatGLM2、3看起来前后维度不一致(27392->13696)反而是正确的。

ChatGLM2与ChatGLM区别 

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM2-6B 引入了如下新特性:

更强大的性能:基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了 GLM 的混合目标函数,经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,评测结果显示,相比于初代模型,ChatGLM2-6B 在 MMLU(+23%)、CEval(+33%)、GSM8K(+571%) 、BBH(+60%)等数据集上的性能取得了大幅度的提升,在同尺寸开源模型中具有较强的竞争力。

更长的上下文:基于 FlashAttention 技术,我们将基座模型的上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。但当前版本的 ChatGLM2-6B 对单轮超长文档的理解能力有限,我们会在后续迭代升级中着重进行优化。

更高效的推理:基于 Multi-Query Attention 技术,ChatGLM2-6B 有更高效的推理速度和更低的显存占用:在官方的模型实现下,推理速度相比初代提升了 42%,INT4 量化下,6G 显存支持的对话长度由 1K 提升到了 8K。

更开放的协议:ChatGLM2-6B 权重对学术研究完全开放,在获得官方的书面许可后,亦允许商业使用。

1、本机安装gpu驱动,cuda,本文选定版本11.8

安装cuda toolkit     CUDA Toolkit Archive | NVIDIA Developer
    
安装cudnn     Log in | NVIDIA Developer (要注册帐号)

2、Anaconda,下载后可以通过这个软件安装一个python==3.10.11的版本

Free Download | Anacondaicon-default.png?t=N7T8https://www.anaconda.com/download或者下载一个pycharm ,用这个装个python环境

PyCharm:JetBrains为专业开发者提供的Python IDEicon-default.png?t=N7T8https://www.jetbrains.com.cn/pycharm/

安装好Python后最好设定一下源! 

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple


 

3,pytorch window版本,选cuda11.8

Start Locally | PyTorchStart Locallyicon-default.png?t=N7T8https://pytorch.org/get-started/locally/

选中后得到安装脚本

  1. pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

运行如下图: 

4、环境安装

首先需要下载本仓库:

  1. git clone https://github.com/THUDM/ChatGLM3
  2. cd ChatGLM3

然后使用 pip 安装依赖:

pip install -r requirements.txt

5、 下载模型,有两种方法

方法1,可以自定路径,

  1. git lfs install
  2. git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

方法2,使用python代码下载,会下载到c盘C:\Users\用户名\.cache\modelscope\,大约10多个G,对于我C盘只有几十G剩余空间的贫困户来说不推荐。

  1. from modelscope import snapshot_download
  2. model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")

加个参数local_dir='./model_glm3-6b'

  1. from modelscope import AutoTokenizer, AutoModel, snapshot_download
  2. model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0",local_dir='./model_glm3-6b')

运行模型

  1. from modelscope import AutoTokenizer, AutoModel, snapshot_download
  2. model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0",cache_dir='./model_glm3-6b')
  3. tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
  4. model = AutoModel.from_pretrained(model_dir, trust_remote_code=True).half().cuda()
  5. #model = AutoModel.from_pretrained(model_dir, trust_remote_code=True).quantize(4).cuda()
  6. model = model.eval()
  7. # response, history = model.chat(tokenizer, "你好", history=[])
  8. # print(response)
  9. response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=[])
  10. print(response)

注意,

  1. .half() 方法:

    • model.half() 将模型的参数类型转换为 16 位浮点数(half-precision floating-point)。这有助于减少模型在内存和显存中的占用空间,同时在支持 GPU 的设备上提高模型推理速度。
    • 16 位浮点数的优势在于,相较于 32 位浮点数,它使用更少的内存,并且在支持混合精度计算的 GPU 上,可以提高计算速度。这样模型点用的显存为6B*2约等于12G
  2. .quantize(4) 方法:

    • model.quantize(4) 是模型的量化操作。这将模型的权重和激活缩放到 4 位整数。量化是一种技术,通过减少模型中参数的表示位数,以减小模型的内存占用和提高推理速度。
    • 4 位整数的量化会带来更高的压缩比,但可能会引入量化误差,因为只有有限的整数可以表示模型的权重和激活。这样模型点用的显存为6B*0.5约等于3G,

 3.quantize(8) 这将模型的参数和激活值量化为 8 位整数。使用 8 位整数相对于 4 位整数来说,具有更高的位宽,因此可以表示更大的范围和更精细的数值,减小了量化误差。8 位整数的量化通常仍然可以显著减小模型的尺寸,同时保留较高的模型精度。 这样模型点用的显存为6B*1约等于6G

我在使用量化时报错Failed to load cpm_kernels:[WinError 267] 目录名称无效。: 'C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe' 

当使用quantize(4) 方法时会报错 ,可能跟平台有关,在linux下面没有问题。

安装ubuntu22.04系统,GPU驱动,cuda,cudnn,python环境,pycharm-CSDN博客

blockDim = (min(round_up(m, 32), 1024), 1, 1)
NameError: name 'round_up' is not defined

貌似代码实现有问题,改成quantize(8)就可以了,反正我使用的1080ti用quantize(8)也勉强够用。

上代码,可以运行的两种方式,打开basic_demo目录

改进cli_demo.py

增加

os.environ['MODEL_PATH'] = r'C:\Users\gpu\.cache\modelscope\hub\ZhipuAI\chatglm3-6b'

整体代码

  1. import os
  2. import platform
  3. from transformers import AutoTokenizer, AutoModel
  4. os.environ['MODEL_PATH'] = r'C:\Users\gpu\.cache\modelscope\hub\ZhipuAI\chatglm3-6b'
  5. MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
  6. TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
  7. tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
  8. #model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
  9. model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True ).quantize(8).cuda()
  10. os_name = platform.system()
  11. clear_command = 'cls' if os_name == 'Windows' else 'clear'
  12. stop_stream = False
  13. welcome_prompt = "欢迎使用 ChatGLM3-6B 模型,输入内容即可进行对话,clear 清空对话历史,stop 终止程序"
  14. def build_prompt(history):
  15. prompt = welcome_prompt
  16. for query, response in history:
  17. prompt += f"\n\n用户:{query}"
  18. prompt += f"\n\nChatGLM3-6B:{response}"
  19. return prompt
  20. def main():
  21. past_key_values, history = None, []
  22. global stop_stream
  23. print(welcome_prompt)
  24. while True:
  25. query = input("\n用户:")
  26. if query.strip() == "stop":
  27. break
  28. if query.strip() == "clear":
  29. past_key_values, history = None, []
  30. os.system(clear_command)
  31. print(welcome_prompt)
  32. continue
  33. print("\nChatGLM:", end="")
  34. current_length = 0
  35. for response, history, past_key_values in model.stream_chat(tokenizer, query, history=history, top_p=1,
  36. temperature=0.01,
  37. past_key_values=past_key_values,
  38. return_past_key_values=True):
  39. if stop_stream:
  40. stop_stream = False
  41. break
  42. else:
  43. print(response[current_length:], end="", flush=True)
  44. current_length = len(response)
  45. print("")
  46. if __name__ == "__main__":
  47. main()

运行 python cli_demo.py 就可以在命令行中愉快使用

打开basic_demo目录

改进web_demo_streamlit.py,也是在头部增加了

os.environ['MODEL_PATH'] = r'C:\Users\gpu\.cache\modelscope\hub\ZhipuAI\chatglm3-6b'
  1. """
  2. This script is a simple web demo based on Streamlit, showcasing the use of the ChatGLM3-6B model. For a more comprehensive web demo,
  3. it is recommended to use 'composite_demo'.
  4. Usage:
  5. - Run the script using Streamlit: `streamlit run web_demo_streamlit.py`
  6. - Adjust the model parameters from the sidebar.
  7. - Enter questions in the chat input box and interact with the ChatGLM3-6B model.
  8. Note: Ensure 'streamlit' and 'transformers' libraries are installed and the required model checkpoints are available.
  9. """
  10. import os
  11. import streamlit as st
  12. import torch
  13. from transformers import AutoModel, AutoTokenizer
  14. os.environ['MODEL_PATH'] = r'D:\ChatGLM3\model_glm3-6b\ZhipuAI\chatglm3-6b'
  15. MODEL_PATH = os.environ.get('MODEL_PATH', 'THUDM/chatglm3-6b')
  16. TOKENIZER_PATH = os.environ.get("TOKENIZER_PATH", MODEL_PATH)
  17. st.set_page_config(
  18. page_title="ChatGLM3-6B Streamlit Simple Demo",
  19. page_icon=":robot:",
  20. layout="wide"
  21. )
  22. @st.cache_resource
  23. def get_model():
  24. tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
  25. #model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
  26. model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True).quantize(8).cuda()
  27. return tokenizer, model
  28. # 加载Chatglm3的model和tokenizer
  29. tokenizer, model = get_model()
  30. if "history" not in st.session_state:
  31. st.session_state.history = []
  32. if "past_key_values" not in st.session_state:
  33. st.session_state.past_key_values = None
  34. max_length = st.sidebar.slider("max_length", 0, 32768, 8192, step=1)
  35. top_p = st.sidebar.slider("top_p", 0.0, 1.0, 0.8, step=0.01)
  36. temperature = st.sidebar.slider("temperature", 0.0, 1.0, 0.6, step=0.01)
  37. buttonClean = st.sidebar.button("清理会话历史", key="clean")
  38. if buttonClean:
  39. st.session_state.history = []
  40. st.session_state.past_key_values = None
  41. if torch.cuda.is_available():
  42. torch.cuda.empty_cache()
  43. st.rerun()
  44. for i, message in enumerate(st.session_state.history):
  45. if message["role"] == "user":
  46. with st.chat_message(name="user", avatar="user"):
  47. st.markdown(message["content"])
  48. else:
  49. with st.chat_message(name="assistant", avatar="assistant"):
  50. st.markdown(message["content"])
  51. with st.chat_message(name="user", avatar="user"):
  52. input_placeholder = st.empty()
  53. with st.chat_message(name="assistant", avatar="assistant"):
  54. message_placeholder = st.empty()
  55. prompt_text = st.chat_input("请输入您的问题")
  56. if prompt_text:
  57. input_placeholder.markdown(prompt_text)
  58. history = st.session_state.history
  59. past_key_values = st.session_state.past_key_values
  60. for response, history, past_key_values in model.stream_chat(
  61. tokenizer,
  62. prompt_text,
  63. history,
  64. past_key_values=past_key_values,
  65. max_length=max_length,
  66. top_p=top_p,
  67. temperature=temperature,
  68. return_past_key_values=True,
  69. ):
  70. message_placeholder.markdown(response)
  71. st.session_state.history = history
  72. st.session_state.past_key_values = past_key_values

运行这个代码 :

streamlit run web_demo_streamlit.py

(venv) PS D:\ChatGLM3> cd .\basic_demo\
(venv) PS D:\ChatGLM3\basic_demo> streamlit run web_demo_streamlit.py

  You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8501
  Network URL: http://10.10.10.251:8501
 

会出现一个网页(注代码中模型均已使用quantize(8).cuda()量化)

 

另外一个web_demo_gradio.py运行起来有问题,这里就不描述了,运行方法同上,

默认情况下,模型以 FP16 精度加载,运行上述代码需要大概 13GB 显存。如果你的 GPU 显存有限,可以尝试以量化方式加载模型,使用方法如下:

model = AutoModel.from_pretrained("THUDM/chatglm3-6b",trust_remote_code=True).quantize(4).cuda()

模型量化会带来一定的性能损失

CPU 部署

如果你没有 GPU 硬件的话,也可以在 CPU 上进行推理,但是推理速度会更慢。使用方法如下(需要大概 32GB 内存)

model = AutoModel.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True).float()

 下一步开始进行微调,进入到

.\finetune_chatmodel_demo 目录

在windows下直接安装deepspeed会报错

改为 pip install deepspeed==0.3.16 就没有问题了

原requirement.txt改为

  1. transformers>=4.36.2
  2. deepspeed
  3. datasets>=2.16.0
  4. astunparse>=1.6.3
  5. accelerate>=0.25.0
  6. sentencepiece>=0.1.99

改为

  1. transformers>=4.36.2
  2. deepspeed==0.3.16
  3. datasets>=2.16.0
  4. astunparse>=1.6.3
  5. accelerate>=0.25.0
  6. sentencepiece>=0.1.99

整体成功!

参考文献

ChatGLM、ChatGLM2、ChatGLM3模型架构对比 - 知乎 (zhihu.com)

ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集,2080TI显卡全流程实战 - 知乎 (zhihu.com)

另外win10系统gpu本地部署chatglm3-6b,从0开始安装_win10 chatglm3-6b-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/418268
推荐阅读
相关标签
  

闽ICP备14008679号