一、前言
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.10
conda activate glm4
3.4.安装依赖库
pip install torch>=2.5.0
pip install torchvision>=0.20.0
pip install transformers>=4.46.0
pip install huggingface-hub>=0.25.1
pip install sentencepiece>=0.2.0
pip install jinja2>=3.1.4
pip install pydantic>=2.9.2
pip install timm>=1.0.9
pip install tiktoken>=0.7.0
pip install numpy==1.26.4
pip install accelerate>=1.0.1
pip install sentence_transformers>=3.1.1
pip install gradio==4.44.1
pip install openai>=1.51.0
pip install einops>=0.8.0
pip install pillow>=10.4.0
pip install sse-starlette>=2.1.3
pip install bitsandbytes>=0.43.3
四、技术实现
4.1.非流式输出方式的调用
# -*- coding: utf-8 -*-
import traceback
import torch
import time
from transformers import AutoTokenizer, AutoModelForCausalLM, LogitsProcessorList
modelPath = "/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 tokenizer
def loadModel():
model = AutoModelForCausalLM.from_pretrained(
modelPath,
torch_dtype=torch.float16,
trust_remote_code=True,
device_map="auto").eval()
return model
if __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 traceback
import torch
import time
from threading import Thread
from transformers import AutoTokenizer, AutoModelForCausalLM, StoppingCriteria, StoppingCriteriaList, TextIteratorStreamer
modelPath = "/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 False
def 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 streamer
def loadTokenizer():
tokenizer = AutoTokenizer.from_pretrained(modelPath, trust_remote_code=True)
return tokenizer
def loadModel():
model = AutoModelForCausalLM.from_pretrained(
modelPath,
torch_dtype=torch.float16,
trust_remote_code=True,
device_map="auto").eval()
return model
if __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.py
Loading 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