0


开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)

一、前言

  1. GLM-4是智谱AI团队于2024116日发布的基座大模型,旨在自动理解和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处理和精度召回方面表现优异,且在中文对齐能力上超过GPT-4。与之前的GLM系列产品相比,GLM-4在各项性能上提高了60%,并且在指令跟随和多模态功能上有显著强化,适合于多种应用场景。尽管在某些领域仍逊于国际一流模型,GLM-4的中文处理能力使其在国内大模型中占据领先地位。该模型的研发历程自2020年始,经过多次迭代和改进,最终构建出这一高性能的AI系统。

二、术语

**2.1.**GLM-4-9B

  1. 是智谱 AI 推出的一个开源预训练模型,属于 GLM-4 系列。它于 2024 6 6 日发布,专为满足高效能语言理解和生成任务而设计,并支持最高 1M(约两百万字)的上下文输入。该模型拥有更强的基础能力,支持26种语言,并且在多模态能力上首次实现了显著进展。

GLM-4-9B的基础能力包括:

  • 中英文综合性能提升 40%,在特别的中文对齐能力、指令遵从和工程代码等任务中显著增强

  • 较 Llama 3 8B 的性能提升,尤其在数学问题解决和代码编写等复杂任务中表现优越

  • 增强的函数调用能力,提升了 40% 的性能

  • 支持多轮对话,还支持网页浏览、代码执行、自定义工具调用等高级功能,能够快速处理大量信息并给出高质量的回答

**2.2.**GLM-4-9B-Chat

  1. 是智谱 AI GLM-4-9B 系列中推出的对话版本模型。它设计用于处理多轮对话,并具有一些高级功能,使其在自然语言处理任务中更加高效和灵活。


三、前置条件

3.1.基础环境及前置条件

** 1. 操作系统:centos7**

** 2. NVIDIA Tesla V100 32GB CUDA Version: 12.2 **

** 3.最低硬件要求**

3.2.下载模型

huggingface:

https://huggingface.co/THUDM/glm-4-9b-chat/tree/main

ModelScope:

魔搭社区

使用git-lfs方式下载示例:

3.3.创建虚拟环境

  1. conda create --name glm4 python=3.10
  2. conda activate glm4

3.4.安装依赖库

  1. pip install torch>=2.5.0
  2. pip install torchvision>=0.20.0
  3. pip install transformers>=4.46.0
  4. pip install huggingface-hub>=0.25.1
  5. pip install sentencepiece>=0.2.0
  6. pip install jinja2>=3.1.4
  7. pip install pydantic>=2.9.2
  8. pip install timm>=1.0.9
  9. pip install tiktoken>=0.7.0
  10. pip install numpy==1.26.4
  11. pip install accelerate>=1.0.1
  12. pip install sentence_transformers>=3.1.1
  13. pip install gradio==4.44.1
  14. pip install openai>=1.51.0
  15. pip install einops>=0.8.0
  16. pip install pillow>=10.4.0
  17. pip install sse-starlette>=2.1.3
  18. pip install bitsandbytes>=0.43.3

四、技术实现

4.1.非流式输出方式的调用

  1. # -*- coding: utf-8 -*-
  2. import traceback
  3. import torch
  4. import time
  5. from transformers import AutoTokenizer, AutoModelForCausalLM, LogitsProcessorList
  6. modelPath = "/data/model/glm-4-9b-chat"
  7. def generate(model, tokenizer, system, message, history):
  8. try:
  9. messages = [
  10. {"role": "system", "content": system},
  11. ]
  12. if len(history) > 0:
  13. for his in history:
  14. user = his[0]
  15. assistant = his[1]
  16. user_obj = {"role": "user", "content": user}
  17. assistant_obj = {"role": "assistant", "content": assistant}
  18. messages.append(user_obj)
  19. messages.append(assistant_obj)
  20. messages.append({"role": "user", "content": message})
  21. model_inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
  22. inputs = tokenizer(
  23. model_inputs,
  24. return_tensors="pt",
  25. padding="max_length",
  26. truncation=True,
  27. max_length=8192).to(model.device)
  28. gen_kwargs = {
  29. "max_new_tokens": 8192,
  30. "num_beams": 1,
  31. "do_sample": True,
  32. "top_p": 0.9,
  33. "temperature": 0.6,
  34. "logits_processor": LogitsProcessorList(),
  35. "eos_token_id": model.config.eos_token_id
  36. }
  37. output_ids = model.generate(**inputs, **gen_kwargs)
  38. result = output_ids[0][len(inputs.input_ids[0]):]
  39. response = tokenizer.decode(result, skip_special_tokens=True).strip()
  40. return response
  41. except Exception:
  42. traceback.print_exc()
  43. def loadTokenizer():
  44. tokenizer = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True)
  45. return tokenizer
  46. def loadModel():
  47. model = AutoModelForCausalLM.from_pretrained(
  48. modelPath,
  49. torch_dtype=torch.float16,
  50. trust_remote_code=True,
  51. device_map="auto").eval()
  52. return model
  53. if __name__ == '__main__':
  54. tokenizer = loadTokenizer()
  55. model = loadModel()
  56. start_time = time.time()
  57. system = "你是一位专业的导游."
  58. message = "广州有什么特色的景点?"
  59. history = []
  60. response = generate(model, tokenizer, system, message,history)
  61. print(f"response: {response}")
  62. end_time = time.time()
  63. print("执行耗时: {:.2f}秒".format(end_time - start_time))

调用结果:

说明:

去掉prompt的部分,仅输出模型回答的部分

4.2.流式输出方式的调用

  1. # -*- coding: utf-8 -*-
  2. import traceback
  3. import torch
  4. import time
  5. from threading import Thread
  6. from transformers import AutoTokenizer, AutoModelForCausalLM, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamer
  7. modelPath = "/data/model/glm-4-9b-chat"
  8. class StopOnTokens(StoppingCriteria):
  9. def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
  10. stop_ids = model.config.eos_token_id
  11. for stop_id in stop_ids:
  12. if input_ids[0][-1] == stop_id:
  13. return True
  14. return False
  15. def chat(model, tokenizer, streamer, system, message, history):
  16. try:
  17. messages = [
  18. {"role": "system", "content": system},
  19. ]
  20. if len(history) > 0:
  21. for his in history:
  22. user = his[0]
  23. assistant = his[1]
  24. user_obj = {"role": "user", "content": user}
  25. assistant_obj = {"role": "assistant", "content": assistant}
  26. messages.append(user_obj)
  27. messages.append(assistant_obj)
  28. messages.append({"role": "user", "content": message})
  29. print(messages)
  30. model_inputs = tokenizer.apply_chat_template(
  31. messages,
  32. add_generation_prompt=True,
  33. tokenize=True,
  34. return_dict=True,
  35. return_tensors="pt"
  36. ).to(model.device)
  37. generate_kwargs = {
  38. "input_ids": model_inputs["input_ids"],
  39. "attention_mask": model_inputs["attention_mask"],
  40. "streamer": streamer,
  41. "max_new_tokens": 8192,
  42. "do_sample": True,
  43. "top_p": 0.8,
  44. "temperature": 0.6,
  45. "stopping_criteria": StoppingCriteriaList([StopOnTokens()]),
  46. "repetition_penalty": 1.2,
  47. "eos_token_id": model.config.eos_token_id,
  48. }
  49. t = Thread(target=model.generate, kwargs=generate_kwargs)
  50. t.start()
  51. for new_text in streamer:
  52. yield new_text
  53. except Exception:
  54. traceback.print_exc()
  55. def getStreamer(tokenizer):
  56. streamer = TextIteratorStreamer(
  57. tokenizer=tokenizer,
  58. timeout=60,
  59. skip_prompt=True,
  60. skip_special_tokens=True
  61. )
  62. return streamer
  63. def loadTokenizer():
  64. tokenizer = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True)
  65. return tokenizer
  66. def loadModel():
  67. model = AutoModelForCausalLM.from_pretrained(
  68. modelPath,
  69. torch_dtype=torch.float16,
  70. trust_remote_code=True,
  71. device_map="auto").eval()
  72. return model
  73. if __name__ == '__main__':
  74. tokenizer = loadTokenizer()
  75. model = loadModel()
  76. streamer = getStreamer(tokenizer)
  77. start_time = time.time()
  78. system = "你是一位专业的导游."
  79. message = "广州有什么特色的景点?"
  80. history = []
  81. response = chat(model, tokenizer, streamer, system, message, history)
  82. result = []
  83. for r in response:
  84. result.append(r)
  85. print(r)
  86. print("".join(result))
  87. end_time = time.time()
  88. print("执行耗时: {:.2f}秒".format(end_time - start_time))

调用结果:

  1. (glm4) [root@gpu-05 test]# python -u glm4_9b_chat_test.py
  2. Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████| 10/10 [00:10<00:00, 1.04s/it]
  3. [{'role': 'system', 'content': '你是一位专业的导游.'}, {'role': 'user', 'content': '广州有什么特色的景点?'}]
  4. 当然
  5. ,广州
  6. 作为中国
  7. 历史文化
  8. 名城
  9. 现代化
  10. 都市
  11. ,拥有
  12. 众多
  13. 特色
  14. 景点
  15. 。以下
  16. 是一些
  17. 不容
  18. 过的
  19. 广州
  20. 特色
  21. 景点
  22. 1.
  23. **白云
  24. **:位于
  25. 广州市
  26. 北部
  27. ,是
  28. 广州市
  29. “绿色
  30. ”。这里有
  31. 丰富的
  32. 自然
  33. 景观
  34. 和历史
  35. 遗迹
  36. ,如
  37. 花园
  38. 、明珠
  39. 2.
  40. **长
  41. 旅游
  42. 度假区
  43. **:包括
  44. 野生动物
  45. 世界
  46. 、水上
  47. 乐园
  48. 、国际
  49. 等多个
  50. 主题
  51. 公园
  52. ,适合
  53. 家庭
  54. 游玩
  55. 3.
  56. **珠江
  57. **:乘坐
  58. 游览
  59. 美丽的
  60. 珠江
  61. 两岸
  62. 风光
  63. ,欣赏
  64. 广州
  65. (小
  66. )、海
  67. 等地
  68. 建筑
  69. 夜景
  70. 4.
  71. **陈
  72. **:又称
  73. 书院
  74. ,是一座
  75. 典型的
  76. 岭南
  77. 传统
  78. 建筑
  79. ,以其
  80. 精美的
  81. 、石
  82. 著称
  83. 5.
  84. **北京
  85. 步行
  86. **:这里是
  87. 广州
  88. 繁华
  89. 的商业
  90. 街区
  91. 之一
  92. ,可以
  93. 品尝
  94. 各种
  95. 地道
  96. 的小
  97. ,购买
  98. 各式
  99. 商品
  100. 6.
  101. **上下
  102. 步行
  103. **:以
  104. 古老的
  105. 建筑
  106. 特点
  107. ,两旁
  108. 商铺
  109. ,售卖
  110. 各类
  111. 服饰
  112. 、饰品
  113. 和小
  114. 7.
  115. **越
  116. **:越秀山顶
  117. 雕像
  118. ,是
  119. 广州
  120. 的地
  121. 之一
  122. 。此外
  123. ,还有
  124. 中山
  125. 纪念
  126. 、广州
  127. 博物馆
  128. 等重要
  129. 历史
  130. 遗址
  131. 8.
  132. **华南
  133. 植物园
  134. **:是中国
  135. 南方
  136. 最大的
  137. 植物
  138. 科研
  139. 基地
  140. 之一
  141. ,园
  142. 内有
  143. 多种
  144. 植物
  145. 9.
  146. **广州
  147. (小
  148. )**:作为
  149. 广州
  150. 的新
  151. 地标
  152. ,游客
  153. 在此
  154. 观赏
  155. 城市
  156. 全景
  157. ,体验
  158. 高空
  159. 观光
  160. 设施
  161. 10.
  162. **广东省
  163. 博物馆
  164. **:收藏
  165. 大量的
  166. 文物
  167. 艺术品
  168. ,展示了
  169. 广东
  170. 悠久
  171. 的历史
  172. 文化
  173. 这些
  174. 只是
  175. 广州
  176. 部分
  177. 著名
  178. 点的
  179. 介绍
  180. ,实际上
  181. 这座城市
  182. 还有很多
  183. 其他
  184. 值得
  185. 探索
  186. 的地方
  187. 。希望
  188. 在广州
  189. 有一个
  190. 愉快的
  191. 旅行
  192. 当然,广州作为中国历史文化名城和现代化大都市,拥有众多特色景点。以下是一些不容错过的广州特色景点:
  193. 1. **白云山**:位于广州市北部,是广州市的“绿色肺”。这里有丰富的自然景观和历史遗迹,如云台花园、明珠楼等。
  194. 2. **长隆旅游度假区**:包括长隆野生动物世界、水上乐园、国际大马戏等多个主题公园,适合家庭游玩。
  195. 3. **珠江夜游**:乘坐游船游览美丽的珠江两岸风光,欣赏广州塔(小蛮腰)、海心沙等地标性建筑夜景。
  196. 4. **陈家祠**:又称陈氏书院,是一座典型的岭南传统建筑,以其精美的木雕、石雕和砖雕著称。
  197. 5. **北京路步行街**:这里是广州最繁华的商业街区之一,可以品尝到各种地道的小吃,购买各式商品。
  198. 6. **上下九步行街**:以古老的骑楼建筑群为特点,两旁商铺林立,售卖各类服饰、饰品和小吃。
  199. 7. **越秀山**越秀山顶有五羊雕像,是广州的地标之一。此外,还有中山纪念堂、广州博物馆等重要历史遗址。
  200. 8. **华南植物园**:是中国南方最大的植物科研基地之一,园内有多种珍稀植物。
  201. 9. **广州塔(小蛮腰)**:作为广州的新地标,游客可在此观赏城市全景,体验高空观光设施。
  202. 10. **广东省博物馆**:收藏了大量的文物艺术品,展示了广东悠久的历史文化。
  203. 这些只是广州部分著名景点的介绍,实际上这座城市还有很多其他值得探索的地方。希望您在广州有一个愉快的旅行!
  204. 执行耗时: 14.89

五、附带说明

5.1.问题一: undefined symbol: __nvJitLinkComplete_12_4, version libnvJitLink.so.12

解决:

export LD_LIBRARY_PATH=/usr/local/miniconda3/envs/glm4/lib/python3.10/site-packages/nvidia/nvjitlink/lib:$LD_LIBRARY_PATH

**5.2.**GLM-4-9B-Chat多语言能力

**5.3.**GLM-4-9B-Chat工具调用能力


本文转载自: https://blog.csdn.net/qq839019311/article/details/143482542
版权归原作者 开源技术探险家 所有, 如有侵权,请联系我们删除。

“开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)”的评论:

还没有评论