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

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


一、前言

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


二、术语

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 系列中推出的对话版本模型。它设计用于处理多轮对话,并具有一些高级功能,使其在自然语言处理任务中更加高效和灵活。


三、前置条件

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.创建虚拟环境

conda create --name glm4 python=3.10conda activate glm4

3.4.安装依赖库

pip install torch>=2.5.0pip install torchvision>=0.20.0pip install transformers>=4.46.0pip install huggingface-hub>=0.25.1pip install sentencepiece>=0.2.0pip install jinja2>=3.1.4pip install pydantic>=2.9.2pip install timm>=1.0.9pip install tiktoken>=0.7.0pip install numpy==1.26.4 pip install accelerate>=1.0.1pip install sentence_transformers>=3.1.1pip install gradio==4.44.1pip install openai>=1.51.0pip install einops>=0.8.0pip install pillow>=10.4.0pip install sse-starlette>=2.1.3pip install bitsandbytes>=0.43.3

四、技术实现

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

# -*- coding: utf-8 -*-import tracebackimport torchimport timefrom transformers import AutoTokenizer, AutoModelForCausalLM, LogitsProcessorListmodelPath = \"/data/model/glm-4-9b-chat\"def generate(model, tokenizer, system, message, history): try: messages = [ {\"role\": \"system\", \"content\": system}, ] if len(history) > 0: for his in history: user = his[0] assistant = his[1] user_obj = {\"role\": \"user\", \"content\": user} assistant_obj = {\"role\": \"assistant\", \"content\": assistant} messages.append(user_obj) messages.append(assistant_obj) messages.append({\"role\": \"user\", \"content\": message}) model_inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, tokenize=False) inputs = tokenizer( model_inputs, return_tensors=\"pt\", padding=\"max_length\", truncation=True, max_length=8192).to(model.device) gen_kwargs = { \"max_new_tokens\": 8192, \"num_beams\": 1, \"do_sample\": True, \"top_p\": 0.9, \"temperature\": 0.6, \"logits_processor\": LogitsProcessorList(), \"eos_token_id\": model.config.eos_token_id } output_ids = model.generate(**inputs, **gen_kwargs) result = output_ids[0][len(inputs.input_ids[0]):]  response = tokenizer.decode(result, skip_special_tokens=True).strip() return response except Exception: traceback.print_exc()def loadTokenizer(): tokenizer = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True) return tokenizerdef loadModel(): model = AutoModelForCausalLM.from_pretrained( modelPath, torch_dtype=torch.float16, trust_remote_code=True, device_map=\"auto\").eval() return modelif __name__ == \'__main__\': tokenizer = loadTokenizer() model = loadModel() start_time = time.time() system = \"你是一位专业的导游.\" message = \"广州有什么特色的景点?\" history = [] response = generate(model, tokenizer, system, message,history) print(f\"response: {response}\") end_time = time.time() print(\"执行耗时: {:.2f}秒\".format(end_time - start_time))

调用结果:

说明:

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

4.2.流式输出方式的调用

# -*- coding: utf-8 -*-import tracebackimport torchimport timefrom threading import Threadfrom transformers import AutoTokenizer, AutoModelForCausalLM, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamermodelPath = \"/data/model/glm-4-9b-chat\"class StopOnTokens(StoppingCriteria): def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool: stop_ids = model.config.eos_token_id for stop_id in stop_ids: if input_ids[0][-1] == stop_id: return True return Falsedef chat(model, tokenizer, streamer, system, message, history): try: messages = [ {\"role\": \"system\", \"content\": system}, ] if len(history) > 0: for his in history: user = his[0] assistant = his[1] user_obj = {\"role\": \"user\", \"content\": user} assistant_obj = {\"role\": \"assistant\", \"content\": assistant} messages.append(user_obj) messages.append(assistant_obj) messages.append({\"role\": \"user\", \"content\": message}) print(messages) model_inputs = tokenizer.apply_chat_template( messages, add_generation_prompt=True, tokenize=True, return_dict=True, return_tensors=\"pt\" ).to(model.device) generate_kwargs = { \"input_ids\": model_inputs[\"input_ids\"], \"attention_mask\": model_inputs[\"attention_mask\"], \"streamer\": streamer, \"max_new_tokens\": 8192, \"do_sample\": True, \"top_p\": 0.8, \"temperature\": 0.6, \"stopping_criteria\": StoppingCriteriaList([StopOnTokens()]), \"repetition_penalty\": 1.2, \"eos_token_id\": model.config.eos_token_id, } t = Thread(target=model.generate, kwargs=generate_kwargs) t.start() for new_text in streamer: yield new_text except Exception: traceback.print_exc()def getStreamer(tokenizer): streamer = TextIteratorStreamer( tokenizer=tokenizer, timeout=60, skip_prompt=True, skip_special_tokens=True ) return streamerdef loadTokenizer(): tokenizer = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True) return tokenizerdef loadModel(): model = AutoModelForCausalLM.from_pretrained( modelPath, torch_dtype=torch.float16, trust_remote_code=True, device_map=\"auto\").eval() return modelif __name__ == \'__main__\': tokenizer = loadTokenizer() model = loadModel() streamer = getStreamer(tokenizer) start_time = time.time() system = \"你是一位专业的导游.\" message = \"广州有什么特色的景点?\" history = [] response = chat(model, tokenizer, streamer, system, message, history) result = [] for r in response: result.append(r) print(r) print(\"\".join(result)) end_time = time.time() print(\"执行耗时: {:.2f}秒\".format(end_time - start_time))

调用结果:

(glm4) [root@gpu-05 test]# python -u glm4_9b_chat_test.pyLoading checkpoint shards: 100%|█████████████████████████████████████████████████████████████████████████████| 10/10 [00:10<00:00, 1.04s/it][{\'role\': \'system\', \'content\': \'你是一位专业的导游.\'}, {\'role\': \'user\', \'content\': \'广州有什么特色的景点?\'}]当然,广州作为中国历史文化名城和现代化大都市,拥有众多特色景点。以下是一些不容错过的广州特色景点:1. **白云山**:位于广州市北部,是广州市的“绿色肺”。这里有丰富的自然景观和历史遗迹,如云台花园、明珠楼等。2. **长隆旅游度假区**:包括长隆野生动物世界、水上乐园、国际大马戏等多个主题公园,适合家庭游玩。3. **珠江夜游**:乘坐游船游览美丽的珠江两岸风光,欣赏广州塔(小蛮腰)、海心沙等地标性建筑夜景。4. **陈家祠**:又称陈氏书院,是一座典型的岭南传统建筑,以其精美的木雕、石雕和砖雕著称。5. **北京路步行街**:这里是广州最繁华的商业街区之一,可以品尝到各种地道的小吃,购买各式商品。6. **上下九步行街**:以古老的骑楼建筑群为特点,两旁商铺林立,售卖各类服饰、饰品和小吃。7. **越秀山**:越秀山顶有五羊雕像,是广州的地标之一。此外,还有中山纪念堂、广州博物馆等重要历史遗址。8. **华南植物园**:是中国南方最大的植物科研基地之一,园内有多种珍稀植物。9. **广州塔(小蛮腰)**:作为广州的新地标,游客可在此观赏城市全景,体验高空观光设施。10. **广东省博物馆**:收藏了大量的文物艺术品,展示了广东悠久的历史文化。这些只是广州部分著名景点的介绍,实际上这座城市还有很多其他值得探索的地方。希望您在广州有一个愉快的旅行!当然,广州作为中国历史文化名城和现代化大都市,拥有众多特色景点。以下是一些不容错过的广州特色景点:1. **白云山**:位于广州市北部,是广州市的“绿色肺”。这里有丰富的自然景观和历史遗迹,如云台花园、明珠楼等。2. **长隆旅游度假区**:包括长隆野生动物世界、水上乐园、国际大马戏等多个主题公园,适合家庭游玩。3. **珠江夜游**:乘坐游船游览美丽的珠江两岸风光,欣赏广州塔(小蛮腰)、海心沙等地标性建筑夜景。4. **陈家祠**:又称陈氏书院,是一座典型的岭南传统建筑,以其精美的木雕、石雕和砖雕著称。5. **北京路步行街**:这里是广州最繁华的商业街区之一,可以品尝到各种地道的小吃,购买各式商品。6. **上下九步行街**:以古老的骑楼建筑群为特点,两旁商铺林立,售卖各类服饰、饰品和小吃。7. **越秀山**越秀山顶有五羊雕像,是广州的地标之一。此外,还有中山纪念堂、广州博物馆等重要历史遗址。8. **华南植物园**:是中国南方最大的植物科研基地之一,园内有多种珍稀植物。9. **广州塔(小蛮腰)**:作为广州的新地标,游客可在此观赏城市全景,体验高空观光设施。10. **广东省博物馆**:收藏了大量的文物艺术品,展示了广东悠久的历史文化。这些只是广州部分著名景点的介绍,实际上这座城市还有很多其他值得探索的地方。希望您在广州有一个愉快的旅行!执行耗时: 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工具调用能力