ChatGLM2-6B源码解析 web_demo.py

这篇具有很好参考价值的文章主要介绍了ChatGLM2-6B源码解析 web_demo.py。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

from transformers import AutoModel, AutoTokenizer
import gradio as gr
import mdtex2html

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()
model = model.eval()

"""Override Chatbot.postprocess"""


def postprocess(self, y):
    if y is None:
        return []
    for i, (message, response) in enumerate(y):
        y[i] = (
            None if message is None else mdtex2html.convert((message)),
            None if response is None else mdtex2html.convert(response),
        )
    return y


gr.Chatbot.postprocess = postprocess


def parse_text(text):
    """copy from https://github.com/GaiZhenbiao/ChuanhuChatGPT/"""
    lines = text.split("\n")
    lines = [line for line in lines if line != ""]
    count = 0
    for i, line in enumerate(lines):
        if "```" in line:
            count += 1
            items = line.split('`')
            if count % 2 == 1:
                lines[i] = f'<pre><code class="language-{items[-1]}">'
            else:
                lines[i] = f'<br></code></pre>'
        else:
            if i > 0:
                if count % 2 == 1:
                    line = line.replace("`", "\`")
                    line = line.replace("<", "&lt;")
                    line = line.replace(">", "&gt;")
                    line = line.replace(" ", "&nbsp;")
                    line = line.replace("*", "&ast;")
                    line = line.replace("_", "&lowbar;")
                    line = line.replace("-", "&#45;")
                    line = line.replace(".", "&#46;")
                    line = line.replace("!", "&#33;")
                    line = line.replace("(", "&#40;")
                    line = line.replace(")", "&#41;")
                    line = line.replace("$", "&#36;")
                lines[i] = "<br>"+line
    text = "".join(lines)
    return text


def predict(input, chatbot, max_length, top_p, temperature, history, past_key_values):
    chatbot.append((parse_text(input), ""))
    for response, history, past_key_values in model.stream_chat(tokenizer, input, history, past_key_values=past_key_values,
                                                                return_past_key_values=True,
                                                                max_length=max_length, top_p=top_p,
                                                                temperature=temperature):
        chatbot[-1] = (parse_text(input), parse_text(response))

        yield chatbot, history, past_key_values


def reset_user_input():
    return gr.update(value='')


def reset_state():
    return [], [], None


with gr.Blocks() as demo:
    gr.HTML("""<h1 align="center">ChatGLM2-6B</h1>""")

    chatbot = gr.Chatbot()
    with gr.Row():
        with gr.Column(scale=4):
            with gr.Column(scale=12):
                user_input = gr.Textbox(show_label=False, placeholder="Input...", lines=10).style(
                    container=False)
            with gr.Column(min_width=32, scale=1):
                submitBtn = gr.Button("Submit", variant="primary")
        with gr.Column(scale=1):
            emptyBtn = gr.Button("Clear History")
            max_length = gr.Slider(0, 32768, value=8192, step=1.0, label="Maximum length", interactive=True)
            top_p = gr.Slider(0, 1, value=0.8, step=0.01, label="Top P", interactive=True)
            temperature = gr.Slider(0, 1, value=0.95, step=0.01, label="Temperature", interactive=True)

    history = gr.State([])
    past_key_values = gr.State(None)

    submitBtn.click(predict, [user_input, chatbot, max_length, top_p, temperature, history, past_key_values],
                    [chatbot, history, past_key_values], show_progress=True)
    submitBtn.click(reset_user_input, [], [user_input])

    emptyBtn.click(reset_state, outputs=[chatbot, history, past_key_values], show_progress=True)

demo.queue().launch(share=False, inbrowser=True)

这是一个使用Hugging Face的transformers库和gradio库搭建的机器人聊天程序的Python代码,模型预训练的版本为"THUDM/chatglm2-6b",而且使用了mdtex2html来把markdown格式转化为HTML格式。我会逐行解释它的含义:

1-3: 导入必要的模块。transformers 是Hugging Face发布的处理NLP任务的库,提供了大量的预训练模型和相关工具。gradio 是一个创建快速demo用户界面的库,可以让模型快速地在web页面上进行展示和交互。mdtex2html用来将markdown格式的文本转化为HTML格式。

5-6: 从 Hugging Face 模型库中加载了一个预训练的模型及其相应的词条化器(tokenizer),模型的名字是 "THUDM/chatglm2-6b"。trust_remote_code=True 是指示允许从远程代码中加载特殊的tokenizer或model代码。

7: 把模型放在CUDA上,这会让模型运行在GPU上,加快运算速度。

8: 把模型设定为评估模式(eval mode),在这种模式下,模型中的某些层(如 Dropout 或 BatchNorm)的行为会与训练模式有所不同。

10-19: 定义了一个postprocess函数,它是为了对模型的输出进行后处理。在这个函数中,它会将每一条聊天信息相应的回复转化为HTML格式。它将此函数绑定到gradio的Chatbot类的后处理函数上。

21-42: parse_text函数用于处理用户的输入。它主要是处理markdown的代码部分,并把它们转化为HTML格式。

44-52: predict函数接受用户的输入和一些模型参数,它首先把用户的输入添加到聊天记录中,然后用模型生成回复,最后返回聊天记录和新的历史记录。

54-56: 定义了两个函数来重置用户的输入和模型的状态。

58-89: 在这部分中,它用gradio创建了一个用户界面。这个界面包括一个聊天机器人,一个用户输入框,一个提交按钮,一个清空历史按钮,以及一些滑块用于控制模型的参数。

91: 启动这个用户界面。share=False表示这个界面不会被分享,inbrowser=True表示这个界面会在浏览器中打开

总的来说,这是一个使用预训练的模型来生成对话的聊天机器人的程序,它有一个简单的用户界面,用户可以通过这个界面和机器人进行交流。

我会继续分析此代码中的一些关键部分:

AutoTokenizer.from_pretrainedAutoModel.from_pretrained 方法从预训练的模型库中加载了一个模型及其对应的词条化器。它们能够自动地识别模型的类型,并加载相应的模型和词条化器。

model.cuda() 将模型加载到GPU上进行计算。这个操作是在PyTorch中进行的,其目的是利用GPU进行更快的计算。这只有在你的机器上有可用的Nvidia GPU,并且你的PyTorch版本支持CUDA时才会有效。

gr.Chatbot.postprocess = postprocess 这行代码将定义的postprocess函数绑定到gr.Chatbotpostprocess方法。这使得我们可以修改gr.Chatbot的行为,以便于使用mdtex2html.convert函数处理消息和回应,从而将markdown格式的文本转化为HTML格式。

函数 parse_text 是用于处理输入的文本,主要是处理markdown的代码部分,并把它们转化为HTML格式。

函数 predict 是这个程序的核心部分。它使用了模型进行预测,生成聊天机器人的回应。

最后,这个程序使用gradio库来创建一个用户界面。这个界面包括一个聊天机器人,一个用户输入框,一个提交按钮,一个清空历史按钮,以及一些滑块用于控制模型的参数。用户可以通过这个界面和聊天机器人进行交流。

整体来看,这个程序是一个基于预训练模型和gradio库的聊天机器人。它能够处理用户的输入,生成聊天机器人的回应,并通过用户界面和用户进行交互。

reset_user_inputreset_state函数被设计用来重置用户输入和清空模型的状态。它们主要被绑定到了前端的按钮上,当用户点击这些按钮时,会触发相应的函数。

接下来,这个脚本使用gr.Blocks()来创建一个应用的界面。在这个界面中,gr.Chatbot()实例化了一个聊天机器人,gr.Textbox()实例化了一个输入框,用户可以在里面输入文本,然后点击gr.Button()实例化的提交按钮,这会触发绑定到按钮上的函数,把用户的输入提交到聊天机器人,并接收聊天机器人的回应。另外,gr.Slider()实例化了一些滑块,用于调整模型的参数。

gr.State([])gr.State(None)实例化了两个状态对象,这些对象用于保存聊天的历史记录和模型的内部状态。这些状态在每次预测时都会更新。

然后,submitBtn.click()emptyBtn.click()将前面定义的函数绑定到了按钮的点击事件上。当用户点击这些按钮时,会触发绑定到按钮上的函数。

最后,demo.queue().launch(share=False, inbrowser=True)启动了这个应用。用户可以在浏览器中访问这个应用,并与聊天机器人进行交互。

这个脚本实现了一个完整的基于预训练模型的聊天机器人应用,包括用户界面和模型的预测逻辑。它展示了如何使用Hugging Face的transformers库和gradio库来实现一个可交互的机器学习应用。文章来源地址https://www.toymoban.com/news/detail-709096.html

到了这里,关于ChatGLM2-6B源码解析 web_demo.py的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGLM2-6B 部署

    这是ChatGLM2-6B 部署的阅读笔记,主要介绍了ChatGLM2-6B模型的部署和一些原理的简单解释。 它是单卡开源的对话模型。 充分的中英双语预训练 较低的部署门槛 FP16半精度下,需要至少13G的显存进行推理,甚至可以进一步降低到10G(INT8)和6G(INT4) 更长的序列长度 ChatGLM-6B 序列长度达

    2024年02月09日
    浏览(52)
  • ChatGLM2-6B、ChatGLM-6B 模型介绍及训练自己数据集实战

    介绍 ChatGLM-6B是开源的文本生成式对话模型,基于General Language Model(GLM)框架,具有62亿参数,结合模型蒸馏技术,实测在2080ti显卡训练中上(INT4)显存占用 6G 左右, 优点 :1.较低的部署门槛: FP16 半精度下,ChatGLM-6B 需要至少 13GB 的显存进行推理,结合模型量化技术,一需求可以进一步

    2024年02月12日
    浏览(55)
  • 三个开源大模型(chatglm2-6B, moss, llama)-chatglm2的测试

    chatglm2-6B 是清华大学开源的一款支持中英双语的对话语言模型。经过了 1.4T 中英标识符的预训练与人类偏好对齐训练,具有62 亿参数的 ChatGLM2-6B 已经能生成相当符合人类偏好的回答。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6G

    2024年02月11日
    浏览(63)
  • ChatGLM2-6B下载与部署

    我们首先来看一下 ChatGLM2-6B 模型的 requirements : 可以看到,要求 torch=2.0 ,这就产生了一个问题: torch 与 cuda 版本的匹配问题。本地机器中 CUDA=10.0 ,于是在费了半天时间配置好 ChatGLM2-6B 所需环境,从 github 和 huggingface 下载好了 ChatGLM2-6B 模型,但是在 run 的过程中报错 Torch

    2024年02月06日
    浏览(67)
  • 阿里云部署 ChatGLM2-6B 与 langchain+ChatGLM

    更新系统 安装git 克隆 ChatGLM2-6B 源码 克隆 chatglm2-6b 模型 安装 ChatGLM2-6B 依赖 修改模型的路径 修改成 启动服务 启动成功后 克隆 langchain-ChatGLM 源码 git clone https://github.com/imClumsyPanda/langchain-ChatGLM.git 克隆模型 安装 langchain-ChatGLM 依赖 修改配置 修改一 修改成 修改二 修改成 修改

    2024年02月15日
    浏览(48)
  • ChatGLM2-6B github页面 介绍

    ChatGLM 2 -6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优秀特性的基础之上,ChatGLM 2 -6B 引入了如下新特性: 更强大的性能 :基于 ChatGLM 初代模型的开发经验,我们全面升级了 ChatGLM2-6B 的基座模型。ChatGLM2-6B 使用了

    2024年02月13日
    浏览(44)
  • 第五篇-ChatGLM2-6B模型下载

    可以使用如下代码下载 创建下载环境 编写代码 down_glm2.py snapshot_download其他参数 只允许下载部分类型的文件(以JSON为例) allow_patterns=‘*.json’, 不允许下载部分类型的文件(以JSON为例) ignore_patterns=[‘*.json’] 执行下 第一篇-ChatGLM-webui-Windows安装部署-CPU版 第二篇-二手工作站

    2024年02月14日
    浏览(73)
  • AIGC - ChatGLM大模型:ChatGLM2-6B模型推理部署

    如果你要问我为什么直接部署ChatGLM2的模型? 因为当我在8月份在上海召开的全球人工智能大会上了解到清华-智谱发布的ChatGLM模型时,它已经发布了新的版本ChatGLM2,并且推理的效果提升了不少,那么本着只要最好的原则,我就直接上手先玩新版本了。 作为AIGC方面的小白来说

    2024年02月06日
    浏览(46)
  • ChatGLM2-6B微调实践-QLora方案

    申请阿里云GPU服务器: CentOS 7.6 64 Anaconda3-2023.07-1-Linux-x86_64 Python 3.11.5 GPU NVIDIA A10(显存24 G/1 core) CPU 8 vCore/30G 安装Anaconda、CUDA、PyTorch 参考:ChatGLM2-6B微调实践-P-Tuning方案 项目部署 准备数据集 准备我们自己的数据集,分别生成训练文件和测试文件这两个文件,放在项目dat

    2024年02月07日
    浏览(53)
  • 使用Triton部署chatglm2-6b模型

    NVIDIA Triton Inference Server是一个针对CPU和GPU进行优化的云端和推理的解决方案。 支持的模型类型包括TensorRT、TensorFlow、PyTorch(meta-llama/Llama-2-7b)、Python(chatglm)、ONNX Runtime和OpenVino。 NVIDIA Triton Server是一个高性能的推断服务器,具有以下特点: 1. 高性能:Triton Server为使用GPU进行推

    2024年02月08日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包