3、ipex-llm(原bigdl-llm)在大模型上进行中文推理

ipex-llm环境配置及模型下载

1、加载模型以及 Tokenizer

IPEX-LLM 支持 AutoModel、AutoModelForCausalLM、AutoModelForSpeechSeq2Seq 和 AutoModelForSeq2SeqLM。前缀带有 Auto 的这些类可帮助用户自动读取相关模型.

from ipex_llm.transformers import AutoModelForCausalLM

model_path = 'THUDM/chatglm3-6b'
model = AutoModelForCausalLM.from_pretrained(model_path,
                                  load_in_4bit=True,
                                  trust_remote_code=True)

LLM 推理也需要一个 tokenizer。它用于将输入文本编码为张量,然后输入 LLM,并将 LLM 输出的张量解码为文本。您可以使用 Huggingface transformers API 直接加载 tokenizer。它可以与 IPEX-LLM 加载的模型无缝配合使用。

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained(model_path,
                                          trust_remote_code=True)

2、推理

在生成之前,需要创建一个 prompt 模板。这里我们给出了一个用于提问和回答的 prompt 模板示例,参考自 ChatGLM2-6B prompt template。也可以根据自己的模型调整 prompt。

CHATGLM_V3_PROMPT_TEMPLATE = "问:{prompt}\n\n答:"

接下来,您可以使用加载的模型与 tokenizer 生成输出,generate 函数中的 max_new_tokens 参数定义了预测的最大 token 数量。

import time
import torch

prompt = "AI是什么?"
n_predict = 256

with torch.inference_mode():
    prompt = CHATGLM_V3_PROMPT_TEMPLATE.format(prompt=prompt)
    input_ids = tokenizer.encode(prompt, return_tensors="pt")
    output = model.generate(input_ids,
                            max_new_tokens=n_predict)
    output_str = tokenizer.decode(output[0], skip_special_tokens=True)
    print('-'*20, 'Output', '-'*20)
    print(output_str)

-------------------- Output --------------------
问:AI是什么?
答: AI是人工智能(Artificial Intelligence)的缩写,是指由计算机或其他机器模拟人类智能的技术和理论。通过使用算法、数据和模型,AI可以在各种任务中自主地做出决策和执行操作,例如语音识别、图像识别、自然语言处理、机器翻译、自动驾驶等。AI的发展已经引起了广泛的关注和应用,被认为是一项有潜力改变人类社会和工作的技术。

ChatGLM3-6B 支持流式输出函数 stream_chat,它使模型能够逐字提供流式响应。但是,其他模型可能不提供类似的 API。
为了成功观察到标准输出中的文本流,我们需要设置环境变量 PYTHONUNBUFFERED=1 以确保标准输出流直接发送到终端,而无需先进行缓冲。

import torch

with torch.inference_mode():
    question = "AI 是什么?"
    response_ = ""
    print('-'*20, 'Stream Chat Output', '-'*20)
    for response, history in model.stream_chat(tokenizer, question, history=[]):
        print(response.replace(response_, ""), end="")
        response_ = response

-------------------- Stream Chat Output --------------------
AI是人工智能(Artificial Intelligence)的简称,它是一种通过计算机程序和设备模拟人类智能的技术。AI旨在实现人类的一些智能功能,例如语音识别、图像识别、自然语言处理、机器翻译、决策推理等。人工智能技术可以使计算机像人类一样理解、学习、解决问题和进行交互。
AI涵盖了多个领域,包括机器学习、深度学习、自然语言处理、计算机视觉、知识表示与推理等。随着计算能力的提升和数据量的增加,AI技术得到了迅速发展,并在许多行业和领域产生了广泛的应用,如金融、医疗、教育、交通、安防等。

3、 在 LangChain 中使用

LangChain是一个被广泛的用于开发由语言模型驱动的应用程序的框架。本节将介绍如何将 IPEX-LLM 与 LangChain 集成。

pip install langchain

在推理之前,需要创建一个 prompt 模板。这里我们给出了一个用于提问和回答的 prompt 模板示例,其中包含两个输入变量:history 和 human_input。也可以根据自己的模型调整 prompt 模板。

CHATGLM_V3_LANGCHAIN_PROMPT_TEMPLATE = """{history}\n\n问:{human_input}\n\n答:"""

使用 LangChain API LLMChain 构造用于推理的 chain。在这里,我们使用 IPEX-LLM API 来构造一个 LLM 对象,它将自动加载经过低精度优化的模型。ConversationBufferWindowMemory 是 LangChain 中的一种存储类型,用于保存一个装有对话中最近 k 次交互的移动窗口。

from langchain import LLMChain, PromptTemplate
from ipex_llm.langchain.llms import TransformersLLM
from langchain.memory import ConversationBufferWindowMemory

llm_model_path = "THUDM/chatglm2-6b" # huggingface llm 模型的路径

prompt = PromptTemplate(input_variables=["history", "human_input"], template=CHATGLM_V3_LANGCHAIN_PROMPT_TEMPLATE)
max_new_tokens = 128

llm = TransformersLLM.from_model_id(
        model_id=llm_model_path,
        model_kwargs={"trust_remote_code": True},
)

# 以下代码与用例完全相同
llm_chain = LLMChain(
    llm=llm,
    prompt=prompt,
    verbose=True,
    llm_kwargs={"max_new_tokens":max_new_tokens},
    memory=ConversationBufferWindowMemory(k=2),
)

# 生成
text = "AI 是什么?"
response_text = llm_chain.run(human_input=text,stop="\n\n")

Entering new LLMChain chain…
Prompt after formatting:
问:AI 是什么?
答:
AI指的是人工智能,是一种能够通过学习和理解数据,以及应用数学、逻辑、推理等知识,来实现与人类智能相似或超越人类智能的计算机系统。AI可以分为弱人工智能和强人工智能。弱人工智能是指一种只能完成特定任务的AI系统,比如语音识别或图像识别等;而强人工智能则是一种具有与人类智能相同或超越人类智能的AI系统,可以像人类一样思考、学习和理解世界。目前,AI的应用领域已经涵盖了诸如自然语言处理、计算机视觉、机器学习、深度学习、自动驾驶、医疗健康等多个领域。
Finished chain.

  • 28
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值