记录一次Linux下ChatGLM部署过程

news2024/11/24 17:04:08

前言

本地化的GPT就是香,就是有点费钱。
项目地址:https://github.com/THUDM/ChatGLM-6B
在这里插入图片描述

前期准备

服务器(本机的跳过)

由于本地电脑显卡都不行,所以我租了AutoDL的一台算力服务器。Tesla T4 16G显存,56GB内存,符合我们跑ChatGLM的配置。
在这里插入图片描述
其实本来这台服务器是其他用途,跑vits的,所以选择了so-vits-svc4的镜像,这类的AI项目依赖库大同小异,所以如果有需求,可以直接选现成镜像,减少麻烦。
我这边的操作系统是ubuntu20.04
自带python3.8,需要注意项目python环境需要 >=python3.7

实例后开机,有ssh,我们就改其他ssh客户端登录。当然你也可以直接在autodl自带的终端跑。
在这里插入图片描述

环境搭建

官方教程:https://www.heywhale.com/mw/project/6436d82948f7da1fee2be59e

clone项目

一般都默认装了git,如果没有你可以手动装下,ubuntu的话 sudo apt-get install git
我是选择在数据盘autodl-tmp,因为系统盘其他东西太多了0.0
克隆下项目

git clone https://github.com/THUDM/ChatGLM-6B

安装依赖

前面装完后,进入项目 cd ChatGLM-6B
pip安装依赖

pip install -r requirements.txt

在这里插入图片描述

在这里插入图片描述

下载模型

官方教程如下
在这里插入图片描述

chatglm-6b

由于模型文件很大,需要提前装个 git-lfs
安装命令 sudo apt-get install git-lfs
在这里插入图片描述
因为我测试过6B模型,跑不动,当然你也可以试试
在项目根目录内,创建文件夹 THUDM,命令为 mkdir THUDM
然后进入 cd THUDM,进行clone

git clone https://huggingface.co/THUDM/chatglm-6b

在这里插入图片描述
如果clone大文件失败了,注意文件大小,模型很大的,失败的话请手动下载 官方提供的
https://cloud.tsinghua.edu.cn/d/fb9f16d6dc8f482596c2/
在这里插入图片描述
附赠批量下载shell脚本(别告诉我你没装wget),新建一个download.sh,填入以下代码,增加执行权限 chmod +x download.sh,运行即可 ./download.sh

#!/bin/bash
wget https://cloud.tsinghua.edu.cn/seafhttp/files/2ea1896d-8f77-4f0c-8f41-b73d32da0483/ice_text.model

wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00001-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00002-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00003-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00004-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00005-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00006-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00007-of-00008.bin
wget https://cloud.tsinghua.edu.cn/seafhttp/files/a12ac799-dda9-48c7-b1ce-f6a1d141a4f8/pytorch_model-00008-of-00008.bin

chatglm-6b-int4

❗️ ❗️ ❗️ 如果你也跑不起来的话,可以更换小一些的模型INT4
同理clone到 THUDM

git clone https://huggingface.co/THUDM/chatglm-6b-int4

在这里插入图片描述

在这里插入图片描述

运行

web UI

chatglm-6b

首先安装 Gradio:pip install gradio
如果你跑的 chatglm-6b 模型,那你不需要修改源码,直接在项目根目录运行以下命令即可:

python web_demo.py

在这里插入图片描述
日常跑在7860端口,由于AutoDL没有公网IP,所以很尴尬,我就做了个frp内网穿透
在这里插入图片描述
然后就访问我们穿的公网IP对应端口即可。

在这里插入图片描述

chatglm-6b int4

如果你跑的int4,则需要改下web_demo.py的源码啦,其实我认为官方应该写成配置文件的形式,改源码有点麻烦,代码如下:
其实就是改下加载的模型路径罢了

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

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().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):
    chatbot.append((parse_text(input), ""))
    for response, history in model.stream_chat(tokenizer, input, history, max_length=max_length, top_p=top_p,
                                               temperature=temperature):
        chatbot[-1] = (parse_text(input), parse_text(response))

        yield chatbot, history


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


def reset_state():
    return [], []


with gr.Blocks() as demo:
    gr.HTML("""<h1 align="center">ChatGLM</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, 4096, value=2048, step=1.0, label="Maximum length", interactive=True)
            top_p = gr.Slider(0, 1, value=0.7, 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([])

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

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

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

改完后,一样运行 python web_demo.py
在这里插入图片描述
跑INT4速度很快,秒回~
在这里插入图片描述

命令行demo

和web UI版一样,如果是跑的INT4,就需要修改源码中,模型的加载路径
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489557.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自供电-测力刀柄资料整理

自供电-测力刀柄资料整理 2. 相关专利2.1 实时测量铣削过程中床主轴温度装置【1】2.2 一种基于应变片的测力系统【2】 3. 相关商业化产品3.1 spike 测力刀柄【3】3.2 瑞士奇石乐&#xff08;Kistler&#xff09;旋转切削测力仪【4】3.3 kistler的通用型压电式切削力测量系统3.4…

SPSS如何进行聚类分析之案例实训?

文章目录 0.引言1.快速聚类分析2.分层聚类分析3.两阶段聚类分析 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对聚类分析进行阐述。…

【软考高项笔记】第1章 信息化发展1.5 数字化转型与元宇宙

1.5 数字化转型与元宇宙 元宇宙本质上是对现实世界的虚拟化、数字化过程&#xff0c;需要对内容生产、经济系统、用户体验以及实体世界内容等进行大量改造1.5.1 数字化转型 新建一个富有活力的数字化商业模式 组织对业务进行彻底重新定义&#xff08;大洗牌&#xff09;之后才…

浅谈明日方舟游戏系统

主要玩法&#xff1a;敌方阵营从敌方初始点进入战斗并且沿着怪物前进路线行驶到己方保护目标。玩家可以通过部署干员守护己方保护目标&#xff0c;防止敌方阵营进入&#xff1b;当保护目标的生命值为0时&#xff0c;则战斗失败&#xff0c;任务结束。 1 干员系统 1.1 职业分支…

linux(stat-readdir-dup2)04-虚拟地址空间,stat函数,文件,目录,errno说明,dup2和dup

01 学习目标 1.掌握stat/lstat函数的使用 2.了解文件属性相关的函数使用 3.了解目录操作相关的函数的使用 4.掌握目录遍历相关函数的使用 5.掌握dup,dup2函数的使用 6.掌握fcntl函数的使用 02 虚拟地址空间 03 打开最大文件数量 openmax.c #include<stdio.h> #include&…

Redo log详解

WAL&#xff08;Write-Ahead Logging&#xff09;机制 WAL 的全称是 Write-Ahead Logging&#xff0c;中文称预写式日志(日志先行)&#xff0c;是一种数据安全写入机制。就是先写日志&#xff0c;然后再写入磁盘&#xff0c;这样既能提高性能又可以保证数据的安全性。Mysql中的…

华为MPLS跨域C2方式RR场景(数据不经过RR)实验配置

目录 配置BGP邻居的建立 配置MPLS LDP 配置RR之间的MP-BGP邻居 配置通过ASBR学习PE路由并为PE分配标签&#xff08;实现Vpnv4路由传递和数据传输&#xff09; 根据图配置接口的IP地址和IGP协议 配置BGP邻居的建立 PE1和RR1建立MP-IBGP邻居&#xff08;RR1传给PE1的Vpnv4路…

进程/线程 状态模型详解

前言&#xff1a;最近操作系统复习到线程的状态模型&#xff08;也可以说进程的状态模型&#xff0c;本文直接用线程来说&#xff09;时候&#xff0c;网上查阅资料&#xff0c;发现很多文章都说的很不一样&#xff0c;有五状态模型、六状态模型、七状态模型.......虽然都是对的…

【1024杯】web

文章目录 1024_fastapi信息收集SSTI 1024_柏拉图信息收集phar反序列化 1024_WEB签到1024_图片代理信息收集gopherus|fastcgi 1024_hello_world信息收集ssti盲注 1024_fastapi 信息收集 FastAPI 是一个高性能 Web 框架&#xff0c;用于构建 API。 主要特性&#xff1a; 快速&am…

【头歌】完整汇编语言程序设计

摘自头歌实训​​​​​​ 目录 相关知识 1.1 RISC-V 汇编语言程序基本结构 1.2 RISC-V 汇编语言程序主要元素 1.2.1 汇编指令 1.2.2 标签 1.2.3 汇编指示语句 1.3 RISC-V 汇编语言程序示例 相关知识 RISC-V 操作数类型、基本调用约定等已在前序关卡中介绍&#xff0c;…

云渲染是您3D项目的最佳选择吗?

市面上很多优秀的大型动画电影&#xff0c;一般都是由实力较大的视觉特效团队制作的&#xff0c;而且大部分使用的是基于云的渲染服务来进行最终渲染。像《哪吒之魔童降世》这样 IMAX 3D 首部国产动画电影、并且刷新了中国动画电影票房纪录的作品&#xff0c;就是现代3D动画提供…

ChatGPT做PPT方案,10组提示词方案!

今天我们要搞定的PPT内容是&#xff1a; 活动类型&#xff1a;节日活动、会员活动、新品活动分析类型&#xff1a;用户分析、新品立项、项目汇报内容类型&#xff1a;内容规划、品牌策划 用到的工具&#xff1a; mindshow 邀请码 6509097ChatGPT传送门&#xff08;免费使用…

《Linux0.11源码解读》理解(二) 加载setup、加载system

现在CPU开始执行bootsect&#xff0c;它的作用是把第二部分、第三部分程序陆续加载到内存中。把放到合理的内存位置需要先对内存进行规划。 根据上一节&#xff0c;boostsect当前所在内存位置是0x07c0&#xff0c;大小为512byte&#xff0c;现在要将其挪动到内存的0x9000&…

无代码时代来了,程序员会失业吗?不,程序员又不够用了!

有人问我无代码时代来了&#xff0c;程序员会失业吗&#xff1f;太难了&#xff0c;秃了头就算了&#xff0c;连工作也保不住了&#xff1f; 先说观点&#xff1a;并不会 因为&#xff0c;无代码不是真正意义上的无代码。 无代码开发的使用对象是编程小白&#xff08;我猿是…

Redis的命令以及数据类型

1.Redis的通用命令 KEYS&#xff1a;查看符合模板的所有key&#xff0c;不建议在生产环境设备上使用 DEL&#xff1a;删除一个指定的key EXISTS&#xff1a;判断key是否存在 TTL&#xff1a;查看一个KEY的剩余有效期 2.String类型 String类型&#xff0c;也就是字符串类型…

【Halcon】 Halcon 22.11 安装详细教程

文章目录 1安装2 获取许可证 license2.1 license下载2.2 激活 license放置在相应文件夹下 3 DLT 安装 1安装 1.解压安装包 2.打开运行 exe 程序 跳转至页面 点击“可获得的”&#xff0c;并安装 选择&#xff1a; AVAILABLE ->INSTALL 可获得的 ->安装 5. 等待安装 6…

jQuery -- 常用API(下)

4. jQuery属性操作 4.1 设置或获取元素固有属性值prop() 所谓元素固有属性就是元素本身自带的属性&#xff0c;比如 元素里面的 href &#xff0c;比如 元素里面的 type。 获取属性语法&#xff1a;prop(属性)设置属性语法&#xff1a;prop(属性, 属性值) 4.2 设置或获取元…

掌握黑客技术:从Kali渗透测试开始

前言 Kali Linux是一种流行的渗透测试和网络安全工具&#xff0c;广泛用于测试和评估网络系统和应用程序的安全性。下面是一个简单的Kali Linux使用教程&#xff08;Kali使用教程中需要学习的知识点&#xff09;&#xff0c;旨在帮助初学者了解如何使用Kali Linux进行渗透测试…

【计算机网络】网络分层结构

应用层 软件 传输层 TCP UDP协议 网络层 实现源主机到目标主机的传输 IP协议 可能会丢失&#xff0c;可能失序、可能错误 工作设备&#xff1a;路由器、防火墙 链路层 相邻两点的数据传输以帧为单位的数据。 工作设备&#xff1a;交换机 物理层 光信号 电信号 网络边…

15.JVM8为什么要增加元空间

JVM从永久代至元空间内存结构变化图 变化后的java8图 变化之前java7以及之前各代的图 看出变化了吗&#xff1f;堆和方法区连在了一起&#xff0c;但这并不能说堆和方法区是一起的&#xff0c;它们在逻辑上依旧是分开的。但在物理上来说&#xff0c;它们又是连续的一块内存。…