从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端

这篇具有很好参考价值的文章主要介绍了从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目介绍:

Firefly(流萤) 是yangjianxin开发的开源的中文大语言模型项目,本文主要实现将此模型部署到http服务器上,语言实现:python,本项目为双创项目后端部分代码(本人根据firefly训练代码修改+微调的模型暂不方便开源),样例模型改用firefly1b4模型

项目环境:

1.pytorch:2.0.1+cpu

2.transformers:4.29.1

3.httpserver库

例外:requests库(如果不接其他api不需要)

模型下载:YeungNLP (YeungNLP) (huggingface.co)

下载后新建model文件夹将下载的所有文件放入文件夹,如下图所示

从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端,bat+python学习笔记,语言模型,人工智能,自然语言处理

打开config.json,将torch_dtype的值改为int8,可以有效降低卡顿(尤其适用于cpu版本)

硬件环境:

由于是模型的使用,除了推理的时候不会很吃Cpu/Gpu,加载模型比较吃内存,目前经过测试发现实际运行,8G可以勉强运行模型,但是有大概率导致整机卡死,建议至少达到12G内存

项目开发环境:Cpu:i58400,内存:16G(此配置下运行模型再跑androidstudio+非androidstudio自带的模拟器也是搓搓有余的)


代码部分:

1.导入包:

print("导入requests库中...")
import requests
print("导入http库中...")
import http.server
print("导入json库中...")
import json
print("导入os库中...")
import os
print("导入time库中...")
import time
print("导入urllib库中...")
import urllib
import random
from urllib import parse
print("导入transformers库中...")
from transformers import BloomTokenizerFast, BloomForCausalLM
print("导包完成=====================")

2.RequestHandlerImpl类部分(httpserver) 

class RequestHandlerImpl(http.server.BaseHTTPRequestHandler):

    

    def do_GET(self):
        get_str=""
        get_cmd=self.requestline[5:self.requestline.find("HTTP/1.1")]
        self.send_response(200)
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.end_headers()
        get_str=checkget(get_cmd,self.headers)
        if get_str=="":get_str= "Hello World\n"
        self.wfile.write(get_str.encode("utf-8"))
        
                         

        

    def do_POST(self):
        req_body = self.rfile.read(int(self.headers["Content-Length"])).decode()
        self.send_response(200)
        self.send_header("Content-Type", "text/html; charset=utf-8")
        self.end_headers()
        get_str=checkpost(self.path,req_body)
        self.wfile.write(get_str.encode("utf-8"))

3.项目函数部分(由于是app后端有接入其他接口):

def get_answer(text): 
    print("得到新问题",text)
    input_ids = tokenizer(text, return_tensors="pt").input_ids
    input_ids = input_ids.to(device)
    outputs = model.generate(input_ids, max_new_tokens=200, do_sample=True, top_p=0.85, temperature=0.35,repetition_penalty=1.2, eos_token_id=tokenizer.eos_token_id)
    rets = tokenizer.batch_decode(outputs)
    output = rets[0].strip().replace(text, "").replace('</s>', "")
    return format(output)


def get_list(parm): #新闻类接口,可以发布
    parm=parm[1:]
    get_tx=parm.split("&")
    name="福州"
    page="0"

    for i in range(0, len(get_tx)):
        if get_tx[i][0:5]=="name=":
            name=get_tx[i][5:]
            
        if get_tx[i][0:5]=="page=":
            page=get_tx[i][5:].replace(' ', '')

    url = "https://v.api.aa1.cn/api/api-tplist/go.php/api/News/local_news?name=" +  name + "&page=" + page
    print(url)
    response = requests.get(url)
    content = response.text
    return content


def get_top(): #百度热搜接口
    url ='https://v.api.aa1.cn/api/topbaidu/index.php'
    response = requests.get(url)
    content = response.text
    return content


def get_weather(): #天气类接口(付费的)
    url ='http://apis.juhe.cn/simpleWeather/query?city=%E7%A6%8F%E5%B7%9E&key=需要自己加上'
    response = requests.get(url)
    content = response.text
    return content
  
def login(up): #登录接口
    get_tx=up.split("&")
    un=""
    pw=""
    code=0

    for i in range(0, len(get_tx)):
        if get_tx[i][0:5]=="user=":
            un=get_tx[i][5:]
            
        if get_tx[i][0:5]=="pass=":
            pw=get_tx[i][5:].replace(' ', '')
            
    print(un)
    print(pw)

    f=open('libaray/uw', encoding='gbk') #加载type字符库
    for line in f:
        get_tx=line.split(",")
        
        if un==get_tx[0] and pw==get_tx[1].replace('\n', ''):
            dic = {'code': 200, 'msg': "登录成功","token":token}
            break
        else:
            dic = {'code': 201, 'msg': "用户名或密码错误"}

    f.close()
    
    print(dic)
    return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))


def register(up):  #登录接口
    get_tx=up.split("&")
    uw=""
    pw=""
    code=0
    
    for i in range(0, len(get_tx)): #这里和登录类似,可以封装起来,目的是获取传来的用户,密码
        if get_tx[i][0:5]=="user=":
            un=get_tx[i][5:]
        if get_tx[i][0:5]=="pass=":
            pw=get_tx[i][5:].replace(' ', '')

    print(un)
    print(pw)

    #加载uw密码库,后续可以写成load函数,在加载时候开启
    f=open('libaray/uw', encoding='gbk')
    for line in f:
        get_tx=line.split(",")
        if un==get_tx[0]:
            dic = {'code': 201, 'msg':"用户已存在"}
            return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))
    f.close()
    f=open('libaray/uw','a+')
    f.write(un+","+pw+"\n")
    dic = {'code': 200, 'msg':"注册成功"}
    f.close()
    return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))
    
       
def checkpost(path,get_cmd): #查看post进来的数据
    if path=="/login":
        return login(get_cmd)

    if path=="/register":
        return register(get_cmd)
                   
def checkhead(head): #检查需要加密的接口,传进来的头
    print(token == head.get("Authorization"))
    if  token == head.get("Authorization"):
        return True
    else:
        return False


def checkget(get_cmd="",head=""): #查看get进来的数据
    if get_cmd[0:9]=="question=":
        if checkhead(head): 
            dic = {'code': 200, 'msg':get_answer(parse.unquote(get_cmd[9:])),"prompt":urllib.parse.unquote(get_cmd[9:])}
            return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))  
        else:
            dic = {'code': 401, 'msg':"没有权限"}
            return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))  
    if get_cmd[0:4]=="list": 
        if checkhead(head):
            return get_list(get_cmd[4:])
        else:
            dic = {'code': 401, 'msg':"没有权限"}
            return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))
        
    if get_cmd[0:6]=="gettop": 
        if checkhead(head):
            return get_top()
        else:
            dic = {'code': 401, 'msg':"没有权限"}
            return json.dumps(dic, sort_keys=True,ensure_ascii= False,indent=4, separators=(',', ':'))

    if get_cmd[0:7]=="weather": #免费api接口
        return get_weather()
            
    if get_cmd[0:6]=="login?": 
        gcmd=get_cmd[6:]
        return login(gcmd)

main:
 

print("加载tokenizer中")
tokenizer = BloomTokenizerFast.from_pretrained('model/')   #路径以文件夹下的model为例
print("加载model中")
model = BloomForCausalLM.from_pretrained('model/')
model.eval()
device="cpu"
model = model.to(device) #用cuda或者cpu
print("tlc机器人已启动")
token=''.join(random.sample('abcdefghijklmnopqrstuvwxyzABCDEGHIJKLMNOPQRSTWVUXYZ!@#$%&',39))
print("加密为token=" + token) #这句加入是方便测试
local_ip="10.1.136.73" #local ip为服务器ip
server_address = (local_ip, 19999) 
httpd = http.server.HTTPServer(server_address, RequestHandlerImpl)
httpd.serve_forever()

接口测试:

1.运行代码:

运行代码后,如果提示如下图所示就是没有问题的了,可以看到有一个token=xxxx的参数,这个参数是随机生成的临时token,目前设定是每次启动服务端生成一次,这里为了方便演示打印出来,实际需要登录接口来获取,后续可以注释掉

从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端,bat+python学习笔记,语言模型,人工智能,自然语言处理

2.测试接口是否可用:

如下图所示在postman输入http://10.1.136.73:19999/question=<s>你好</s></s>

由于输出到模型的数据被格式化成<s></s>的形式,为方便客户端传递历史对话作为promat,我没有在python格式化字符串,而是在客户端里实现。

弹出401的提示是我们加入头,无法通过验证,但是可以证明http服务端可以正常跑起来


从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端,bat+python学习笔记,语言模型,人工智能,自然语言处理

 

3.加入头继续验证:

在head加入参数名为Authorization,参数值为临时生成的token的head再次运行。发现已可行,如下图所示,发现客户端正常返回json

从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端,bat+python学习笔记,语言模型,人工智能,自然语言处理

 code参数:为200时正常,其他不正常,prompt是传入的值,msg是出来的值。

多轮对话:

在实际测试中发现Firefly1b4的版本也是可以支持多轮对话的,但是效果的确会差些,我们只需要在外部把数据格式化成以下的形式:

<s>问题1</s></s>回答1</s></s>问题2</s></s>回答2</s></s>问题3</s></s>回答3</s></s>

以下是效果案例:

传入的promat为<s>你知道北京吗</s></s>北京市是中国的首都,位于中国北方。</s></s>那里有什么美食</s></s>烤鸭、炸酱面、豆汁、涮羊肉、豆腐脑等等。</s></s>有什么娱乐的地方</s></s>

输出为长城、故宫博物院、颐和园、天坛、圆明园等。

 从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端,bat+python学习笔记,语言模型,人工智能,自然语言处理



Developed by 福州机电工程职业技术学校 wh

邮箱联系方式:xiaohui032901@foxmail.com

qq联系方式:2151335401、3135144152文章来源地址https://www.toymoban.com/news/detail-522570.html

到了这里,关于从0开始,部署基于yangjianxin开发的流萤(Firefly)中文对话式大语言模型的http服务端的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 应用实战|从头开始开发记账本2:基于模板快速开始

    上期视频我们创建好了BaaS服务的后端应用。从这期视频开始,我们将从头开发一个互联网记账本应用。本期视频我们介绍一下如何使用模板快速开启我们的应用开发之旅。 应用实战|从头开始开发记账本2:基于模板快速开始 本期视频我们介绍了如何通过模板快速开始MemFi

    2024年04月17日
    浏览(45)
  • 从零开始的QQ开放平台机器人-------Gensokyo框架部署运行开发教程合集

    大家好,我是早苗狐,一名有5年QQ机器人开发运营经验的机器人爱好者. 随着QQ为机器人开放了越来越多的接口能力,基于QQ开放平台Api能力的新框架逐渐应运而生, 本文就带给大家如何通过一系列操作,部署,运行,维护和开发一个新的QQ机器人. QQ开放平台地址: QQ开放平台 QQ开放平台

    2024年02月03日
    浏览(93)
  • 基于Windows系统的Hadoop伪分布式模式部署-从零开始(我的学习记录)

    目录 前言 一.JDK的下载安装配置 1.JDK 下载 2.JDK 安装 3.JDK 环境变量配置 4.验证JDK安装是否成功 5.重点? 二.Hadoop部署以及工具集winutils 1.下载Hadoop解压/下载winutils以及\\\"安装\\\"         下载Hadoop和winutils         \\\"安装\\\"winutils 2.配置Hadoop环境变量/配置Hadoop文件 Hadoop配置环境变量

    2024年04月13日
    浏览(58)
  • 玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

    基于我个人的工作内容和兴趣,想要在家里搞一套服务器集群,用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器,比如 Dell R730, 还搞了一套配置清单,如下: Dell R730 3.5 尺寸规格硬盘 CPU: 2686v4*2 内存:16g*8 存储:480Gintel ssd 系统盘 + 6tsas 希捷* 2 个数据盘 RAID 卡:h73

    2024年02月11日
    浏览(48)
  • 基于PyTorch的中文情绪分析器设计与开发

    收藏和点赞,您的关注是我创作的动力    情感分析在最近的十年内得到了快速的发展,这归功于大数据的支持。相较于英语而言,中文的使用同样广泛。如何把握中文里的情感也是服务行业所关注的问题。本文旨在研究中文情绪分析的设计与开发,意在基于Pytorch平台,利

    2024年02月06日
    浏览(48)
  • windows环境基于Elasticsearch8.4.0的IK中文分词器的安装、部署、使用

    目录 问题现象: 解决方法: 1、下载IK中文分词器 2、部署 3、使用 前言(选看)       最近在重温Elasticsearch,看来一下官网,都出到8.4.3版本了。想当初学的时候用的还是5.6.8,版本更新了很多意味着有大变动。           windows环境基于Elasticsearch8.4.0的IK中文分词器的安

    2024年02月13日
    浏览(42)
  • firefly开发板RK3588非默认外设使能(串口uart、IIC、adc等)设备树修改详细步骤

    sdk获取和内核编译,参考上一篇博文:rk3588内核裁剪 文件1: 此文件是针对firefly的板级设备树文件。 文件2: 此文件是关于io复用的设备树文件。 文件3: 此文件是所有具有复用功能的gpio,例如:#define RK_PA4 4 代表的是GPIO_PA_4即A组的GPIO4。 官方的内核和设备树,默认打开了串

    2024年02月09日
    浏览(48)
  • 新书速览|从零开始大模型开发与微调:基于PyTorch与ChatGLM

    详细讲解大模型基本理论、算法、程序实现与应用实战,揭示大模型开发与微调技术 1 本书内容 大模型是深度学习自然语言处理皇冠上的一颗明珠,也是当前AI和NLP研究与产业中最重要的方向之一。本书使用 PyTorch 2.0作为学习大模型 的基本框架,以 ChatGLM为例 详细讲解大模型

    2024年01月17日
    浏览(68)
  • Windows 11 上从零开始基于 wsl-ubuntu 搭建 AI 学习环境及部署多种私有 ChatGPT

    今天(2023/6/2)刚刚换了 1 块 4TB 的硬盘,在 Windows 11 上从零开始,基于 Windows Subsystem for Linux 搭建一套 AI 学习环境。 其中包括,安装 Python、安装 Miniconda3、安装 CUDA Toolkit、安装 git lfs、配置 Hugging Face 的缓存路径、本地部署 ChatGLM-6B、本地部署 VisualGLM-6B等等内容。 安装 Ubuntu-

    2024年02月07日
    浏览(57)
  • 手把手教你如何免费Midjourney Adobe FireFly AI绘图—Window本地快速部署stable diffusion AI绘图及使用指南(小白也能学会)

    最近看到朋友圈最近各种文字生图、图生图,眼花缭乱的图片AI生成,我也心动了,于是赶紧研究了下目前业内认为最强大的 Midjourney、Adobe FireFly ,本来想试用下,奈何全球人民太热情了, Midjourney 被薅羊毛薅的不行了,原本 Midjourney 刚注册可以免费玩25次,现在也被Midjour

    2024年02月04日
    浏览(60)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包