开源模型应用落地-glm模型小试-glm-4-9b-chat-批量推理(二) ...

打印 上一主题 下一主题

主题 898|帖子 898|积分 2694

一、前言

    GLM-4是智谱AI团队于2024年1月16日发布的基座大模型,旨在自动明确和规划用户的复杂指令,并能调用网页浏览器。其功能包括数据分析、图表创建、PPT生成等,支持128K的上下文窗口,使其在长文本处置惩罚和精度召回方面表现优异,且在中文对齐能力上高出GPT-4。与之前的GLM系列产品相比,GLM-4在各项性能上提高了60%,而且在指令跟随和多模态功能上有显著强化,适合于多种应用场景。只管在某些领域仍逊于国际一流模型,GLM-4的中文处置惩罚能力使其在国内大模型中占据领先地位。该模型的研发历程自2020年始,颠末多次迭代和改进,最终构建出这一高性能的AI体系。
    在前一篇开源模型应用落地-glm模型小试-glm-4-9b-chat-快速体验(一)已经把握了glm-4-9b-chat的基本入门,本篇将介绍如何举行批量推理。

二、术语

2.1.GLM-4-9B

    是智谱 AI 推出的一个开源预训练模型,属于 GLM-4 系列。它于 2024 年 6 月 6 日发布,专为满意高效能语言明确和生成使命而设计,并支持最高 1M(约两百万字)的上下文输入。该模型拥有更强的基础能力,支持26种语言,而且在多模态能力上首次实现了显著进展。
GLM-4-9B的基础能力包括:
- 中英文综合性能提拔 40%,在特殊的中文对齐能力、指令服从和工程代码等使命中显著增强
- 较 Llama 3 8B 的性能提拔,尤其在数学题目办理和代码编写等复杂使命中表现良好
- 增强的函数调用能力,提拔了 40% 的性能
- 支持多轮对话,还支持网页浏览、代码执行、自界说工具调用等高级功能,可以或许快速处置惩罚大量信息并给出高质量的回复
2.2.GLM-4-9B-Chat

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

2.3.推量推理

    是指在一次模型推理过程中同时处置惩罚多个输入样本,而不是逐个处置惩罚。通过这种方式,可以充分利用计算资源,提高处置惩罚服从,降低耽误。

三、前置条件

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. from typing import Union
  3. import torch
  4. from transformers import AutoTokenizer, LogitsProcessorList, AutoModelForCausalLM
  5. modelPath = "/data/model/glm-4-9b-chat"
  6. def loadTokenizer():
  7.     tokenizer = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True)
  8.     return tokenizer
  9. def loadModel():
  10.     model = AutoModelForCausalLM.from_pretrained(
  11.         modelPath,
  12.         torch_dtype=torch.float16,
  13.         trust_remote_code=True,
  14.         device_map="auto").eval()
  15.     return model
  16. def process_model_outputs(inputs, outputs, tokenizer):
  17.     responses = []
  18.     for input_ids, output_ids in zip(inputs.input_ids, outputs):
  19.         response = tokenizer.decode(output_ids[len(input_ids):], skip_special_tokens=True).strip()
  20.         responses.append(response)
  21.     return responses
  22. def batch(
  23.         model,
  24.         tokenizer,
  25.         messages: Union[str, list[str]],
  26.         max_input_tokens: int = 8192,
  27.         max_new_tokens: int = 8192,
  28.         num_beams: int = 1,
  29.         do_sample: bool = True,
  30.         top_p: float = 0.8,
  31.         temperature: float = 0.8,
  32.         logits_processor=None,
  33. ):
  34.     if logits_processor is None:
  35.         logits_processor = LogitsProcessorList()
  36.     messages = [messages] if isinstance(messages, str) else messages
  37.     batched_inputs = tokenizer(
  38.         messages,
  39.         return_tensors="pt",
  40.         padding="max_length",
  41.         truncation=True,
  42.         max_length=max_input_tokens).to(model.device)
  43.     gen_kwargs = {
  44.         "max_new_tokens": max_new_tokens,
  45.         "num_beams": num_beams,
  46.         "do_sample": do_sample,
  47.         "top_p": top_p,
  48.         "temperature": temperature,
  49.         "logits_processor": logits_processor,
  50.         "eos_token_id": model.config.eos_token_id
  51.     }
  52.     batched_outputs = model.generate(**batched_inputs, **gen_kwargs)
  53.     batched_response = process_model_outputs(batched_inputs, batched_outputs, tokenizer)
  54.     return batched_response
  55. if __name__ == "__main__":
  56.     batch_message = [
  57.         [
  58.             {"role": "system", "content": "你是一位专业的导游"},
  59.             {"role": "user", "content": "请推荐一些广州的特色景点?"}
  60.         ],
  61.         [
  62.             {"role": "system", "content": "你是一位专业的算命先生"},
  63.             {"role": "user", "content": "请给我儿子取一个名字?"}
  64.         ],
  65.         [
  66.             {"role": "system", "content": "你是一位专业的数学老师"},
  67.             {"role": "user", "content": "请解这道计算题:3.1*9.9+10.1=?"}
  68.         ]
  69.     ]
  70.     tokenizer = loadTokenizer()
  71.     model = loadModel()
  72.    
  73.     batch_inputs = []
  74.     max_input_tokens = 1024
  75.     for i, messages in enumerate(batch_message):
  76.         new_batch_input = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False)
  77.         max_input_tokens = max(max_input_tokens, len(new_batch_input))
  78.         batch_inputs.append(new_batch_input)
  79.         
  80.     gen_kwargs = {
  81.         "max_input_tokens": max_input_tokens,
  82.         "max_new_tokens": 8192,
  83.         "do_sample": True,
  84.         "top_p": 0.9,
  85.         "temperature": 0.6,
  86.         "num_beams": 1,
  87.     }
  88.     batch_responses = batch(model, tokenizer, batch_inputs, **gen_kwargs)
  89.     for response in batch_responses:
  90.         print("-" * 30)
  91.         print(response)
复制代码
调用效果:

  1. (glm4) [root@gpu test]# python -u glm4_9b_chat_test.py
  2. Loading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████| 10/10 [00:10<00:00,  1.01s/it]
  3. ------------------------------
  4. 当然可以!广州作为我国历史文化名城,拥有众多特色景点。以下是广州的一些著名景点推荐:
  5. 1. **广州塔(小蛮腰)**:广州的地标性建筑,可以登塔观光,俯瞰整个广州城市风貌。
  6. 2. **白云山**:广州市内著名的风景区,有多个登山步道和观景台,是徒步和休闲的好去处。
  7. 3. **广州动物园**:位于越秀山内,是中国最早建立的动物园之一,拥有丰富的动物种类。
  8. 4. **陈家祠**:位于荔湾区,是一座具有岭南特色的传统建筑,是了解岭南建筑风格的好地方。
  9. 5. **长隆旅游度假区**:包括长隆野生动物世界、长隆水上乐园、长隆国际大马戏等多个主题公园,适合家庭游玩。
  10. 6. **珠江夜游**:乘坐游船夜游珠江,欣赏两岸的夜景,感受广州的繁华。
  11. 7. **广州博物馆**:位于越秀山内,可以了解广州的历史文化。
  12. 8. **广州起义纪念馆**:纪念1927年广州起义,了解这段历史。
  13. 9. **南越王墓博物馆**:位于越秀山,是西汉南越王赵眜的陵墓,是研究岭南地区古代文化的宝贵资料。
  14. 10. **上下九步行街**:广州著名的购物街,汇集了各种小吃和购物场所,是体验广州传统商业文化的好地方。
  15. 这些景点各有特色,可以让您全面了解广州的历史、文化和现代风貌。希望您在广州的旅行愉快!
  16. ------------------------------
  17. 当然可以。根据中国传统命名文化,我为您的儿子取名为“瑞宇”。其中,“瑞”字寓意吉祥如意,好运连连;“宇”字则代表宇宙、广阔,希望您的儿子能够胸怀宽广,前程似锦。这个名字既富有文化内涵,又充满美好祝愿。
  18. ------------------------------
  19. 好的,我们来解这个计算题。
  20. 首先计算乘法部分:
  21. 3.1 * 9.9 = 30.69
  22. 然后将乘法的结果加上10.1:
  23. 30.69 + 10.1 = 40.79
  24. 所以,3.1 * 9.9 + 10.1 的结果是 40.79。
复制代码

五、附带说明

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/libLD_LIBRARY_PATH

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

欢乐狗

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表