使用PaddleNLP调用大模型ChatGLM3-6b进行信息抽取
ChatGLM一直是非常不错的语言大模型,这次使用ChatGLM3-6b模型进行信息抽取工作
安装PaddleNLP并shell执行推理
直接使用星河社区的AI环境,因为星河社区可以直接创建Paddle3.0的调试环境,可以简化飞桨PaddlePaddle的安装过程,避免很多坑。
然后安装PaddleNLP,先下载源代码并设置环境变量PYTHONPATH:
git clone https://github.com/PaddlePaddle/PaddleNLP.git
export PYTHONPATH=/home/aistudio/PaddleNLP:$PYTHONPATH
PaddleNLP 针对于Transformer 系列编写了高性能自定义算子,提升模型在推理和解码过程中的性能,使用之前需要预先安装自定义算子库:
#GPU设备安装自定义算子 cd PaddleNLP/csrc && python setup_cuda.py install
到达运行目录,即可开始:
cd PaddleNLP/llm
比如gpu的推理:
# 动态图模型推理命令参考
python ./predict/predictor.py --model_name_or_path meta-llama/Llama-2-7b-chat --inference_model --dtype float16 --block_attn
但是这需要float16位支持,V100不支持,所以没有做实验了。
可以使用api的方式来使用大模型
API方式使用llm大模型推理
首先安装PaddleNLP
pip install --upgrade paddlenlp==3.0.0b1
然后就可以使用API来调用大模型了:
from paddlenlp.transformers import AutoTokenizer, AutoModelForCausalLM
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b")
model = AutoModelForCausalLM.from_pretrained("THUDM/chatglm3-6b", dtype="float16")
input_features = tokenizer("你好!请自我介绍一下。", return_tensors="pd")
outputs = model.generate(**input_features, max_length=128)
print(tokenizer.batch_decode(outputs[0], skip_special_tokens=True))
['我是一个AI语言模型,我可以回答各种问题,包括但不限于:天气、新闻、历史、文化、科学、教育、娱乐等。请问您有什么需要了解的吗?']
PaddleNLP会自动下载模型和token文件,比如我们的问题是:
你好!请提供下面食谱的主要原料,并提供它们的营养成分表:
\n材料:\n- 2个鸡蛋\n- 1/2杯番茄\n- 1/4杯切碎的葱花\n- 1/4杯切碎的姜末\n- 1/4杯切碎的蒜末\n- 1/4杯切碎的盐\n- 1/4杯切碎的黑胡椒粉\n- 1/4杯切碎的香菜\n- 适量的油\n步骤:\n1. 将鸡蛋打散,加入适量的盐和黑胡椒粉搅拌均匀。\n2. 热锅凉油,将葱花、姜末、蒜末和盐、黑胡椒粉混合均匀,加入鸡蛋液中,用铲子快速搅拌均匀。\n3. 加入切碎的番茄,继续搅拌均匀。\n4. 加入适量的水,煮沸后转小火煮10分钟,直到鸡蛋液变稠。\n5. 加入香菜,翻炒均匀即可。
prompt = """
你好!请提供下面食谱的主要原料,并提供它们的营养成分表:
\n材料:\n- 2个鸡蛋\n- 1/2杯番茄\n- 1/4杯切碎的葱花\n- 1/4杯切碎的姜末\n- 1/4杯切碎的蒜末\n- 1/4杯切碎的盐\n- 1/4杯切碎的黑胡椒粉\n- 1/4杯切碎的香菜\n- 适量的油\n步骤:\n1. 将鸡蛋打散,加入适量的盐和黑胡椒粉搅拌均匀。\n2. 热锅凉油,将葱花、姜末、蒜末和盐、黑胡椒粉混合均匀,加入鸡蛋液中,用铲子快速搅拌均匀。\n3. 加入切碎的番茄,继续搅拌均匀。\n4. 加入适量的水,煮沸后转小火煮10分钟,直到鸡蛋液变稠。\n5. 加入香菜,翻炒均匀即可。
"""
input_features = tokenizer(prompt, return_tensors="pd")
outputs = model.generate(**input_features, max_length=128)
print(tokenizer.batch_decode(outputs[0], skip_special_tokens=True))
输出显示:
['\n主要原料:鸡蛋、番茄、葱花、姜末、蒜末、盐、黑胡椒粉、香菜。\n\n营养成分表(每100克):\n\n能量:125千卡\n蛋白质:6.3克\n脂肪:11克\n碳水化合物:2.2克\n纤维素:0.4克\n维生素A:167国际单位\n维生素C:28毫克\n钙:18毫克\n铁:0.8毫克\n钾:75毫克\n钠:625毫克\n水分:86克 您好!这是一道美味的番茄炒蛋']
可以看到,输出了番茄炒蛋的主要原料,并输出了该菜的营养成分表。
总结:
飞桨的PaddleNLP大模型还是非常不错的,LLama、ChatGLM3等大模型都支持的不错,推理效果也不错,值得我们学习和使用。
V100不通shell推理算遗留问题。
现在的问题是能否用更小的模型来抽取信息,因为用7b或6b模型来抽取还是有些慢。这个有待后续解决。
调试
GPU设备安装自定义算子时报错
FLOAT162_CONVERSIONS__ -Igpu/cutlass_kernels -Ithird_party/cutlass/include -Ithird_party/nlohmann_json/single_include -Igpu/fp8_gemm_with_ /home/aistudio/PaddleNLP/csrc/gpu/quant_int8.cu(68): error: no suitable user-defined conversion from "__nv_bfloat16" to "__half" exists 1 error detected in the compilation of "/home/aistudio/PaddleNLP/csrc/gpu/quant_int8.cu". error: command '/usr/local/cuda/bin/nvcc' failed with exit code 1
看到issue:[Bug]: 安装paddle_ops算子时出现报错 · Issue #8910 · PaddlePaddle/PaddleNLP · GitHub
当前算子仅支持在支持bf16环境上编译安装,当前星河社区可使用A100 40G进行安装,V100环境暂无法安装
所以没有安装paddle_ops算子,只好不用shell,用api模式。