基于tornado BELLE 搭建本地的web 服务

news2025/1/11 18:30:49

我的github

将BELLE 封装成web 后端服务,采用tornado 框架
import time

import torch
import torch.nn as nn

from gptq import *
from modelutils import *
from quant import *

from transformers import AutoTokenizer
import sys
import json
#import lightgbm as lgb
import logging
import tornado.escape
import tornado.ioloop
import tornado.web
import traceback
DEV = torch.device('cuda:0')

def get_bloom(model):
    import torch
    def skip(*args, **kwargs):
        pass
    torch.nn.init.kaiming_uniform_ = skip
    torch.nn.init.uniform_ = skip
    torch.nn.init.normal_ = skip
    from transformers import BloomForCausalLM
    model = BloomForCausalLM.from_pretrained(model, torch_dtype='auto')
    model.seqlen = 2048
    return model

def load_quant(model, checkpoint, wbits, groupsize):
    from transformers import BloomConfig, BloomForCausalLM 
    config = BloomConfig.from_pretrained(model)
    def noop(*args, **kwargs):
        pass
    torch.nn.init.kaiming_uniform_ = noop 
    torch.nn.init.uniform_ = noop 
    torch.nn.init.normal_ = noop 

    torch.set_default_dtype(torch.half)
    transformers.modeling_utils._init_weights = False
    torch.set_default_dtype(torch.half)
    model = BloomForCausalLM(config)
    torch.set_default_dtype(torch.float)
    model = model.eval()
    layers = find_layers(model)
    for name in ['lm_head']:
        if name in layers:
            del layers[name]
    make_quant(model, layers, wbits, groupsize)

    print('Loading model ...')
    if checkpoint.endswith('.safetensors'):
        from safetensors.torch import load_file as safe_load
        model.load_state_dict(safe_load(checkpoint))
    else:
        model.load_state_dict(torch.load(checkpoint,map_location=torch.device('cuda')))
    model.seqlen = 2048
    print('Done.')

    return model


import argparse
from datautils import *

parser = argparse.ArgumentParser()

parser.add_argument(
    'model', type=str,
    help='llama model to load'
)
parser.add_argument(
    '--wbits', type=int, default=16, choices=[2, 3, 4, 8, 16],
    help='#bits to use for quantization; use 16 for evaluating base model.'
)
parser.add_argument(
    '--groupsize', type=int, default=-1,
    help='Groupsize to use for quantization; default uses full row.'
)
parser.add_argument(
    '--load', type=str, default='',
    help='Load quantized model.'
)

parser.add_argument(
    '--text', type=str,
    help='hello'
)

parser.add_argument(
    '--min_length', type=int, default=10,
    help='The minimum length of the sequence to be generated.'
)

parser.add_argument(
    '--max_length', type=int, default=1024,
    help='The maximum length of the sequence to be generated.'
)

parser.add_argument(
    '--top_p', type=float , default=0.95,
    help='If set to float < 1, only the smallest set of most probable tokens with probabilities that add up to top_p or higher are kept for generation.'
)

parser.add_argument(
    '--temperature', type=float, default=0.8,
    help='The value used to module the next token probabilities.'
)

args = parser.parse_args()

if type(args.load) is not str:
    args.load = args.load.as_posix()

if args.load:
    model = load_quant(args.model, args.load, args.wbits, args.groupsize)
else:
    model = get_bloom(args.model)
    model.eval()
    
model.to(DEV)
tokenizer = AutoTokenizer.from_pretrained(args.model)
print("Human:")

inputs = 'Human: ' +'hello' + '\n\nAssistant:'
input_ids = tokenizer.encode(inputs, return_tensors="pt").to(DEV)
"""
with torch.no_grad():
    generated_ids = model.generate(
        input_ids,
        do_sample=True,
        min_length=args.min_length,
        max_length=args.max_length,
        top_p=args.top_p,
        temperature=args.temperature,
    )
print("Assistant:\n") 
print(tokenizer.decode([el.item() for el in generated_ids[0]])[len(inputs):]) # generated_ids开头加上了bos_token,需要将inpu的内容截断,只输出Assistant 
print("\n-------------------------------\n")

"""
#python bloom_inference.py BELLE_BLOOM_GPTQ_4BIT  --temperature 1.2  --wbits 4 --groupsize 128 --load  BELLE_BLOOM_GPTQ_4BIT/bloom7b-2m-4bit-128g.pt
class GateAPIHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.set_header("Content-Type", "application/text")
        self.set_header("Access-Control-Allow-Origin", "*")


    async def post(self):

        print("BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB")
        postArgs = self.request.body_arguments

        print( postArgs)
        if (not 'status' in postArgs):
            return tornado.web.HTTPError(400)
        try:
            json_str = postArgs.get("status")[0]
#            req = json.loads(json_str)
            print(json_str)
            #logging.error("recieve time : {0} . player id : {1}".format(str(time.time()), str(req["playerID"])))
            inputs = 'Human: ' +json_str.decode('utf-8') + '\n\nAssistant:'
            input_ids = tokenizer.encode(inputs, return_tensors="pt").to(DEV)
            
            with torch.no_grad():
                generated_ids = model.generate(
                    input_ids,
                    do_sample=True,
                    min_length=args.min_length,
                    max_length=args.max_length,
                    top_p=args.top_p,
                    temperature=args.temperature,
                )
            print("Assistant:\n")
            answer=tokenizer.decode([el.item() for el in generated_ids[0]])[len(inputs):]
            print(answer) # generated_ids开头加上了bos_token,需要将inpu的内容截断,只输出Assistant 
            result = {'belle':answer}
            pred_str = str(json.dumps(result))
            self.write(pred_str)
            #logging.error("callback time : {0} . player id : {1}, result:{2}".format(str(time.time()), str(playerID), pred_str))
        except Exception as e:
            logging.error("Error: {0}.".format(e))
            traceback.print_exc()
            raise tornado.web.HTTPError(500)

    def get(self):
        raise tornado.web.HTTPError(300)


import logging
import tornado.autoreload
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.httpserver
#import   itempredict
import argparse
from tornado.httpserver import HTTPServer





#trace()
if __name__ == "__main__":
    tornado.options.define("port", default=8081,type=int, help="This is a port number",
                           metavar=None, multiple=False, group=None, callback=None)
    tornado.options.parse_command_line()
    app = tornado.web.Application([
        (r"/", GateAPIHandler),
    ])
    apiport = tornado.options.options.port
    app.listen(apiport)
    logging.info("Start Gate API server on port {0}.".format(apiport))

    server = HTTPServer(app)
    server.start(1)
    #trace()
    #tornado.autoreload.start()
    tornado.ioloop.IOLoop.instance().start()
                                             

import base64
import json
import time
import requests
from utils.ops import read_wav_bytes

URL = 'http://192.168.3.9:8081'

#wav_bytes, sample_rate, channels, sample_width = read_wav_bytes('out.wav')
data = {
    'status': ' 如何理解黑格尔的 量变引起质变规律和否定之否定规律',

}


t0=time.time()
r = requests.post(URL,  data=data)
t1=time.time()
r.encoding='utf-8'

result = json.loads(r.text)
print(result)
print('time:', t1-t0, 's')

在这里插入图片描述

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

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

相关文章

2023年中国城市矿产行业产值及发展趋势分析[图]

城市矿产是指工业化和城镇化过程中产生和蕴藏于废旧机电设备、电线电缆、通讯工具、汽车、家电、电子产品、金属和塑料包装物以及废料中&#xff0c;可循环利用的钢铁、有色金属、贵金属、塑料、橡胶等资源。 开展“城市矿产”示范基地建设是缓解资源瓶颈约束&#xff0c;减轻环…

BAT027:删除当前目录指定文件夹以外的文件夹

引言&#xff1a;编写批处理程序&#xff0c;实现删除当前目录指定文件夹以外的文件夹。 一、新建Windows批处理文件 参考博客&#xff1a; CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132137544 二、写入批处理代码 1.右键新建的批处理文件&#xff0c;点击【编辑】…

A062-防火墙安全配置-配置Iptables防火墙策略

实验步骤: 【教学资源类别】 序号 类别 打勾√ 1 学习资源 √ 2 单兵模式赛题资源 3 分组对抗赛题资源 【教学资源名称】 防火墙安全配置-配置安全设置iptables防火墙策略 【教学资源分类】 一级大类 二级大类 打勾√ 1.安全标准 法律法规 行业标准 安全…

【css】背景换颜色

更换前 longin.html <!DOCTYPE html> <html lang"en" > <head><meta charset"UTF-8"><title>login</title><link href"/css/style.css" type"text/css" rel"stylesheet"><s…

AN动画基础——变换的文字动画

【AN动画基础——变换的文字动画】 文字变换动画 本篇内容&#xff1a;散件动画&#xff0c;形状提示 重点内容&#xff1a;形状提示 工 具&#xff1a;Adobe Animate 2022 文字变换动画 &#xff08;底下背景和前面文字一样动&#xff0c;转完GIF不知道为啥不动了&#xff0c…

node教程

文章目录 1.node入门 1.node入门 node是什么&#xff1f; node.js是一个开源的&#xff0c;跨平台的JS运行环境&#xff08;其实可以理解为是一款应用程序&#xff0c;是一款软件&#xff0c;可以运行JS&#xff09; node作用&#xff1a; 1.开发服务器应用

Wireshark新手小白基础使用方法

一、针对IP抓取 1、过滤格式&#xff1a; &#xff08;1&#xff09;、ip.src eq x.x.x.x &#xff08;2&#xff09;、ip.dst eq x.x.x.x &#xff08;3&#xff09;ip.src eq x.x.x.x or ip.dst eq x.x.x.x 二、针对端口过滤 1、过滤格式&#xff1a; &#xff08;1&a…

Linux下创建用户并禁止root登录

在Linux中&#xff0c;root几乎拥有所有的权限&#xff0c;一旦root用户密码外泄&#xff0c;对于服务器而言将是致命的威胁&#xff0c;禁止root用户通过ssh的方式远程登录&#xff0c;这样即使root用户密码外泄也能够保障服务器的安全。 1、创建用户&#xff1a; adduser ad…

网络安全分析——蠕虫病毒动态分析视图

蠕虫病毒&#xff08;Worm Virus&#xff09;是一种自我复制的恶意软件&#xff0c;通过网络或系统漏洞传播&#xff0c;感染其他计算机并利用其资源。与其他病毒不同&#xff0c;蠕虫病毒无需依赖于宿主文件&#xff0c;并可以自动在网络中传播&#xff0c;因此具有高度传染性…

嵌入式养成计划-42----QT 创建项目--窗口界面--常用类及组件

一百零五、如何创建 QT 项目 创建工程 New Project / 文件–>新建。。 /ctrl N 选择一个模板–>Application -->Qt Widgets Application 选择创建的路径&#xff0c;以及设置文件名 下一步 输入类名&#xff0c;选择基类为 QWidget 下一步 选择这个玩意&a…

1688店铺商品接口:快速获取海量优质商品,一键批发采购!

获得1688店铺的所有商品接口&#xff0c;可以参考以下步骤&#xff1a; 进入1688网站&#xff0c;注册并登陆账号。进入目标店铺的详情页面&#xff0c;点击“API接口”选项。选择“item_search_shop”接口&#xff0c;点击“调用接口”按钮。在弹出的窗口中&#xff0c;将需要…

IOS课程笔记[4-5] 计算器实现与更换主题 的使用

计算 控件介绍 文本输入 设置键盘格式为NumberPad字符串与数字转换方法 NSInteger num2 [str2 integerValue]; 弹窗控件 UIAlertController 新版本弹窗 UIAlertController *alert [UIAlertController alertControllerWithTitle:"error" message:"输入有…

成都瀚网科技:抖店怎么快速出体验分?

在当今的移动互联网时代&#xff0c;电商平台之间的竞争日益激烈&#xff0c;用户对产品的体验变得越来越重要。在众多电商平台中&#xff0c;抖音电商成为备受关注的新兴力量。在抖店&#xff0c;如何快速提升店铺体验成为每个卖家关心的问题。 1.如何在抖店快速生成经验值&am…

docker容器内安装项目运行环境(python依赖包+allure)

目录 一、安装自动化项目依赖包1.导出项目依赖库2.上传到远程仓库3.进入jenkins容器内&#xff0c;检查是否安装git4.配置git用户信息5.生成秘钥6.把代码拉取下来7.安装python项目依赖8.运行项目 二、安装allure1.jenkins容器内安装allure&#xff0c;进入/usr/local/2.下载all…

3GPP相关

5G是指特定的、新的5G无线接入技术&#xff0c;在更宽泛的语境中&#xff0c;意指未来移动通信能够支持的、可预见的大量新的应用服务。 3GPP由3个技术规范组&#xff08;TSG&#xff09;组成&#xff0c;其中TSG RAN&#xff08;Radio Access Network&#xff0c;无线接入网&…

网工实验笔记:策略路由PBR的应用场景

一、概述 PBR&#xff08;Policy-Based Routing&#xff0c;策略路由&#xff09;&#xff1a;PBR使得网络设备不仅能够基于报文的目的IP地址进行数据转发&#xff0c;更能基于其他元素进行数据转发&#xff0c;例如源IP地址、源MAC地址、目的MAC地址、源端口号、目的端口号、…

ubunut搭建aarch64 cuda交叉编译环境记录

背景介绍 在windows环境下安装的VM虚拟机中配置的ubuntu系统,需要编译用于jetson xavier nx平台下可执行的程序,ubuntu 20.04系统为amd64架构,而jetson为arm,或者也叫aarch64架构。嵌入式平台jetson安装到设备中后不具备开发条件,需要在ubuntu系统中构建并编译好在jetson…

linux系统中日志简介

1.linux系统中日志文件类型 主要包括三种&#xff1a; 内核及系统日志 &#xff1a;主要由 系统服务 rsyslog统一管理&#xff0c;根据服务的主配置文件 /etc/rsyslog.conf 中的设置决定 内核和系统程序消息记录的位置。用户日志 &#xff1a; 记录linux系统中用户的登录和退出…

【计算机组成原理】第一章、计算机系统概述

思维导图 1.1计算机发展历程 1.1.1计算机硬件的发展 计算机系统硬件软件 计算机硬件的发展&#xff1a; 第一代&#xff1a;电子管第二代&#xff1a;晶体管第三代&#xff1a;小规模集成电路第四代&#xff1a;大规模集成电路 经历了4代&#xff0c;计算机的速度越来越快&…

GO-实现简单文本格式 文本字体颜色、大小、突出

毫无疑问GO的生态就是一坨大便。老子英文水平小学啊。 实现简单文本格式 文本字体颜色、大小、突出显示等。 创建要给docx文件容器【我估算的】 doc : document.New() defer doc.Close() doc.SaveToFile("simple.docx") 把容器保存为文件 设置标题 创建自然段…