基于趋动云的chatGLM-6B模型的部署

news2024/10/5 21:23:08

首先根据官方示例教程,学会怎么创建项目,怎么使用数据,怎么进入开发环境,以及了解最重要的2个环境变量:

这个是进入开发环境以后的代码目录
$GEMINI_CODE
这个是引用数据集后,数据集存放的路径
$GEMINI_DATA_IN1
这2个linux shell环境变量很关键

创建项目时,需要注意的:

镜像选择:
在这里插入图片描述
数据集选择:
在这里插入图片描述
数据集选择后,页面会提示,数据集绑定在/gemini/data-1路径了。这个不用记忆,这个路径会保存在前面说的那个系统环境变量里,主要记住是data-#几。

运行规格选择:

这个模型你要想跑的效果快一些,必然是GPU显存多用一些,才能快,虽然6G也能跑,但是会很慢。所以选那个算力高一些的:
在这里插入图片描述
我第一次选的B1中等主机,结果加载到62%,直接被自动Kill了,需要大一些,建议搞large的!
在这里插入图片描述上传代码:
在这里插入图片描述
把这三个代码上传上去,文件名别改,除非你自己懂。

requirements.txt

protobuf>=3.19.5,<3.20.1
transformers>=4.26.1
icetk
cpm_kernels
gradio

options.py

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("--port", type=int, default="17860")
parser.add_argument("--model-path", type=str, default="/gemini/data-1")
parser.add_argument("--precision", type=str, help="evaluate at this precision", choices=["fp16", "int4", "int8"], default="fp16")
parser.add_argument("--listen", action='store_true', help="launch gradio with 0.0.0.0 as server name, allowing to respond to network requests")
parser.add_argument("--cpu", action='store_true', help="use cpu")
parser.add_argument("--share", action='store_true', help="use gradio share")

webui.py

import json
import os
import time

import gradio as gr
from transformers import AutoModel, AutoTokenizer
from options import parser

history = []
readable_history = []
cmd_opts = parser.parse_args()

tokenizer = AutoTokenizer.from_pretrained(cmd_opts.model_path, trust_remote_code=True)
model = AutoModel.from_pretrained(cmd_opts.model_path, trust_remote_code=True)

_css = """
#del-btn {
    max-width: 2.5em;
    min-width: 2.5em !important;
    height: 2.5em;
    margin: 1.5em 0;
}
"""


def prepare_model():
    global model
    if cmd_opts.cpu:
        model = model.float()
    else:
        if cmd_opts.precision == "fp16":
            model = model.half().cuda()
        elif cmd_opts.precision == "int4":
            model = model.half().quantize(4).cuda()
        elif cmd_opts.precision == "int8":
            model = model.half().quantize(8).cuda()

    model = model.eval()


prepare_model()


def parse_codeblock(text):
    lines = text.split("\n")
    for i, line in enumerate(lines):
        if "```" in line:
            if line != "```":
                lines[i] = f'<pre><code class="{lines[i][3:]}">'
            else:
                lines[i] = '</code></pre>'
        else:
            if i > 0:
                lines[i] = "<br/>" + line.replace("<", "&lt;").replace(">", "&gt;")
    return "".join(lines)


def predict(query, max_length, top_p, temperature):
    global history
    output, history = model.chat(
        tokenizer, query=query, history=history,
        max_length=max_length,
        top_p=top_p,
        temperature=temperature
    )
    readable_history.append((query, parse_codeblock(output)))
    print(output)
    return readable_history


def save_history():
    if not os.path.exists("outputs"):
        os.mkdir("outputs")

    s = [{"q": i[0], "o": i[1]} for i in history]
    filename = f"save-{int(time.time())}.json"
    with open(os.path.join("outputs", filename), "w", encoding="utf-8") as f:
        f.write(json.dumps(s, ensure_ascii=False))


def load_history(file):
    global history, readable_history
    try:
        with open(file.name, "r", encoding='utf-8') as f:
            j = json.load(f)
            _hist = [(i["q"], i["o"]) for i in j]
            _readable_hist = [(i["q"], parse_codeblock(i["o"])) for i in j]
    except Exception as e:
        print(e)
        return readable_history
    history = _hist.copy()
    readable_history = _readable_hist.copy()
    return readable_history


def clear_history():
    history.clear()
    readable_history.clear()
    return gr.update(value=[])


def create_ui():
    with gr.Blocks(css=_css) as demo:
        prompt = "输入你的内容..."
        with gr.Row():
            with gr.Column(scale=3):
                gr.Markdown("""<h2><center>ChatGLM WebUI</center></h2>""")
                with gr.Row():
                    with gr.Column(variant="panel"):
                        with gr.Row():
                            max_length = gr.Slider(minimum=4, maximum=4096, step=4, label='Max Length', value=2048)
                            top_p = gr.Slider(minimum=0.01, maximum=1.0, step=0.01, label='Top P', value=0.7)
                        with gr.Row():
                            temperature = gr.Slider(minimum=0.01, maximum=1.0, step=0.01, label='Temperature', value=0.95)

                        # with gr.Row():
                        #     max_rounds = gr.Slider(minimum=1, maximum=50, step=1, label="最大对话轮数(调小可以显著改善爆显存,但是会丢失上下文)", value=20)

                with gr.Row():
                    with gr.Column(variant="panel"):
                        with gr.Row():
                            clear = gr.Button("清空对话(上下文)")

                        with gr.Row():
                            save_his_btn = gr.Button("保存对话")
                            load_his_btn = gr.UploadButton("读取对话", file_types=['file'], file_count='single')

            with gr.Column(scale=7):
                chatbot = gr.Chatbot(elem_id="chat-box", show_label=False).style(height=800)
                with gr.Row():
                    message = gr.Textbox(placeholder=prompt, show_label=False, lines=2)
                    clear_input = gr.Button("🗑️", elem_id="del-btn")

                with gr.Row():
                    submit = gr.Button("发送")

        submit.click(predict, inputs=[
            message,
            max_length,
            top_p,
            temperature
        ], outputs=[
            chatbot
        ])

        clear.click(clear_history, outputs=[chatbot])
        clear_input.click(lambda x: "", inputs=[message], outputs=[message])

        save_his_btn.click(save_history)
        load_his_btn.upload(load_history, inputs=[
            load_his_btn,
        ], outputs=[
            chatbot
        ])

    return demo


ui = create_ui()
ui.queue().launch(
    server_name="0.0.0.0" if cmd_opts.listen else None,
    server_port=cmd_opts.port,
    share=cmd_opts.share
)

然后到网页终端执行后续命令,就可以把模型跑起来

#到项目容器的代码路径
cd $GEMINI_CODE
#检查一下数据(模型)路径是不是正确绑定了,应该要能看到文件
ls $GEMINI_DATA_IN1
#更改pip源到国内镜像,清华的镜像
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

#升级一下pip到最新版
python3 -m pip install --upgrade pip

#安装 requirements.txt里模型启动需要依赖的东东
pip install --upgrade -r requirements.txt

#运行模型,这里注意几个参数,
#fp16是指GPU要在12G显存以上的显卡环境,内存要在24G左右
#8G以下显存GPU,把fp16 改为 int4
#8G显存GPU,把fp16 改为 int8
#具体在 options.py 中有说明
python webui.py --precision fp16 --model-path "$GEMINI_DATA_IN1"  --listen

运行后窗口出现这类信息
在这里插入图片描述
就是运行成功了,访问17860端口就可以。

因为在云平台,所以还要到开发环境去再看一下,外网访问的端口,如下图 端口号17860 的位置所示
在这里插入图片描述根据地址直接访问,就可以会话了。注意滚动条往下拉一下,可以找到会话窗口。
在这里插入图片描述
尝试完成之后,记得关闭实验环境,不然会费算力点
在这里插入图片描述
勾选上保存环境镜像,下次进来的时候,操作不会丢可以继续!

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

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

相关文章

学生信息管理系统简易版(文件读写操作)

功能模块 具体功能如下&#xff1a; 添加学生信息修改学生信息&#xff08;按学号&#xff09;排序&#xff08;分别按总分升序、降序、以及按姓名升序&#xff09;查找学生&#xff08;按学号&#xff09;删除学生查看所有学生信息 数据结构体设计 本表设计一个学生信息的结…

computed和watch

computed: 写法&#xff1a; import {computed} from vue setup(){ --- //计算属性—简写 let fullName computed(()>{ return person.firstName - person. lastName}) //计算属性-完整 let fullName computed({ get(){ return person.firstName - person. lastName},…

中小企业真的需要CRM吗?

如果你的企业没有CRM客户关系管理系统&#xff0c;企业主需要问问自己&#xff0c;他们将利用什么来扩展业务。福布斯进行的研究恰当地表明&#xff0c;充分利用CRM系统的企业可以将销售额提高29%。 中小企业定期产生大量客户&#xff0c;这可能会难以管理。这正是CRM系统在有…

Esxi8.0安装Ubuntu系统教程

本篇教程主要教大家怎么在ESXi8.0虚拟机上安装Ubuntu系统&#xff0c;首先安装Ubuntu需要准备一个ISO系统镜像文件&#xff0c;我们可以去Ubuntu官网下载。 Ubuntu官网&#xff1a;https://ubuntu.com/download/desktop 点击【Download】即可下载Ubuntu的ISO系统镜像文件 ESXi…

必学宝典 黑马《最新JavaWeb开发教程》上线

对于程序员&#xff0c;所在的行业更迭实属过快&#xff0c;如果是为了找一份好工作&#xff0c;学技术前一定要先了解技术在市场中的需求情况。不然等你学完之后&#xff0c;才发现自己学了已被淘汰、过时的技术&#xff0c;白白浪费了宝贵的学习时间&#xff0c;后悔都来不及…

网络编程代码实例:传输控制协议(TCP)简单版

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;server.cclient.cMakefile 结果总结参考资料作者的话 前言 网络编程代码实例&#xff1a;传输控制协议&#xff08;TCP&#xff09;简单版。 代码仓库 yezhening/Environment-and-network-programming-examp…

【备份】使用ubuntu一个月,记录的问题和解决方案

备份一下 40.ANSI 转义码39.终端鼠标38.键盘映射37.端口36.nmap扫描35.磁盘管理34.关机默认等待时间33.HackBGRT电脑logo32.lsblk31.update-initramfs30.fastGithub29.rename28.设置休眠27.小鱼ROS26.查看磁盘25.wmctrl24.Typora图片存储23.ssh远程登录xrdp桌面连接 22.油猴插件…

[渗透教程]-013-网络实体标识及网络监听

文章目录 1.网络实体标识2. 常见的代理服务2.1 虚拟专用网络VPN2.2socks代理3.网络监听3.1被动监听3.2主动监听3.3 监听工具3.3.2dsniff1.网络实体标识 2. 常见的代理服务 2.1 虚拟专用网络VPN VPN 是企业网在因特网等公共网络的延伸,我们可以把它理解成是虚拟出来的企业内部…

实验五~JDBC数据库访问与DAO设计模式

1. 使用传统JDBC方法与Model 1模型通过JSP页面访问数据库。 【步骤1】在MySQL数据库test中创建books表&#xff0c;其结构如下&#xff1a; 创建数据库MySQL代码与插入数据代码 drop database if exists web_test; create database web_test character set utf8mb4;use web_…

oralce数据库定时备份

windows服务器中&#xff0c;定时备份数据库&#xff08;全量备份&#xff09;。 创建一个bat文件&#xff0c;内容为&#xff1a; set dd%date:~8,2% set mm%date:~5,2% set yy%date:~0,4% set folder%yy%-%mm%-%dd% md D:\db_backup\%folder% exp db_name/db_pwd127.0.0.1/or…

为了写markdown文件,Windows下的noevim配置

vim安装插件 在网页上写CSDN文章有诸多不便&#xff0c;感觉vim很好用&#xff0c;可是vim中没有预览功能。按照网上找到的教程安装插件&#xff0c;将以下代码复制的到_vimrc文件中。 set rtp$VIM/vimfiles/bundle/Vundle.vim/ call vundle#begin(./vimfiles/bundle/)"…

4.3调整基类成员在派生类中的访问属性的方法

同名成员 在定义派生类的时候&#xff0c;C语言允许派生类与基类中的函数名相同。如果在派生类中定义了与基类中相同的成员&#xff0c;则称派生类成员覆盖了基类的同名成员&#xff0c;在派生类中使用这个名字意味着访问在派生类中重新说明的成员。为了在派生类中使用基类的同…

瑞吉外卖-项目笔记

文章目录 1.业务开发day011.软件开发整体介绍2.项目整体介绍:star:3.开发环境搭建4.登录功能&#xff1a;star4.1代码实现 5.退出功能6.页面效果出现 day021.完善登录功能2.新增员工功能 1.业务开发 day01 1.软件开发整体介绍 2.项目整体介绍⭐️ 后端&#xff1a;管理菜品和…

车载以太网 - SomeIP - 协议用例 - Format_02

目录 11、验证SomeIP-SD Resvered字段设置为0x000000 13、验证SomeIP-SD Entry Type类型设置为0x01(提供服务)

基于脉搏波信号和人工智能方法的应用

目录 一、引言 二、脉搏波信号基本原理和特点 2.1 脉搏波信号的产生和传播 2.2 脉搏波信号的特征参数 三、人工智能技术在脉搏波信号处理中的应用 3.1 传统机器学习方法 3.2 深度学习方法 四、基于深度学习的脉搏波信号处理方法 4.1 数据预处理 4.2 深度学习模型构建…

写题总结1

先把自己写完的总结一下&#xff1a; 题目一&#xff1a; 猫儿园的告示牌上贴着 ab 大小的矩形广告纸。猫猫对广告不感兴趣&#xff0c;她想知道能否用 cd 的矩形白纸完全覆盖这个广告。猫猫可以对白纸进行平移、旋转&#xff0c;但不能折叠或撕开等。如果可以完全覆盖输出 YE…

【音视频第17天】RTSP、RTMP协议初识

被叫去搞直播了&#xff0c;悲喜交加。先学习一下基本的技术栈&#xff0c;RTSP RTMP HTTP 先简单随便看看吧。 目录 什么是流媒体协议RTMPRTMP 工作原理 RTSPRTSP 工作原理 RTMP 与 RTSP 区别详细看看RTSP简介RTSP交互流程OPTIONSDESCRIBESETUPPLAYPAUSESET_PARAMETERGET_PAR…

代码随想录算法训练营第四十一天|343. 整数拆分、96.不同的二叉搜索树

文章目录 343. 整数拆分96.不同的二叉搜索树:star: 343. 整数拆分 题目链接&#xff1a;代码随想录 本题就是一个个递推&#xff0c;通过将dp[i]定义为第i个值的最大乘积 然后最大乘积有两种来源&#xff0c;一个是(i - j) * j 还有一种是dp[i - j] * j; 解题思路&#xff1a;…

Nautilus Chain :基于模块化架构的Layer3正在走向成熟

Nautilus Chain是一个基于Eclipse和Celestia构建的模块化Layer3链。作为定位在Layer0的链基建概念&#xff0c;Eclipse和Celestia为面向未来的区块链扩容技术提供了一套开发工具和基础框架。尽管这种前沿技术过去一直处于概念验证阶段&#xff0c;尚未推出适用于大规模应用的成…

【消息队列】Kafka请求如何被处理的

前言 对于Kafka来说&#xff0c;分为几个阶段&#xff0c;一个是消息的生产请求&#xff0c;以及对应的消息的消费请求。一个是生产者发送到Broker&#xff0c;另一个是消费者通过pull的方式 请求Broker&#xff0c;那么Broker是如何处理这几个请求的。细分下来主要常见的是如…