给rwkv-pytorch 写个chat ui demo

2024-04-20 06:44
文章标签 ui pytorch demo chat 写个 rwkv

本文主要是介绍给rwkv-pytorch 写个chat ui demo,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

rwkv-pytorch 项目地址

rwkv-pytorch

from nicegui import uimessage_dict = {1: [{"name":"Assistant","text":"你好"}]}
current_name = 1
import aiohttpasync def get_text_async(text="Hello, how are you?"):# 定义API的URLurl = "http://127.0.0.1:8000/generate/"# 定义要发送的数据data = {"text": text}# 发送POST请求async with aiohttp.ClientSession() as session:async with session.post(url, json=data) as response:# 解析响应内容res = await response.json()print(res)return res["response"].split("\n\n")[1][11:]async def send_message_async(text,name):# 获取输入文本input_text = text.value# 将响应消息添加到消息字典message_dict[current_name].append({"name": "User", "text": text.value})# 刷新聊天窗口chat_win_refresh.refresh()# 发送消息并等待响应response_text = await get_text_async(name+":"+input_text+"\n\nAssistant:")# 将响应消息添加到消息字典message_dict[current_name].append({"name":"Assistant","text":response_text})# 刷新聊天窗口chat_win_refresh.refresh()def basic_left_layout():with ui.column():ui.label("这是设置")ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')ui.label('I\'m a column')@ui.refreshable
def chat_win_refresh():with ui.scroll_area().style("height: {}px; width: {}px;".format(500, 725)) as area:for history in message_dict[current_name]:if history["name"]=="User":ui.chat_message(history["text"],name=history["name"],stamp='now',avatar='https://robohash.org/ui',sent=True).style("margin-right: 1px;margin-left: auto;")else:ui.chat_message(history["text"],name=history["name"],stamp='now',avatar='https://robohash.org/ui', sent=False).style("margin-left: 1px;")area.scroll_to(percent=1)def basic_right_layout_children():with ui.column().style("margin-top: 5px;"):with ui.card().style("width:780px; margin-top: 5px;"):chat_win_refresh()with ui.card().style("width:780px;"):with ui.row():text = ui.textarea(label='Text', placeholder='start typing').style("width:605px;")# button 可以是一个图片表示区别机器方可ui.button('Click me!', on_click=lambda: send_message_async(text,"User"))def basic_main_layout():with ui.column().style("margin:auto;"):with ui.card().style("height: {}px; width: {}px;".format(60, 1016)):ui.label("I'm a card")with ui.row():with ui.card().style("height: {}px; width: {}px;margin-top: 25px;".format(725, 200)):with ui.scroll_area().style("height: {}px; width: {}px;".format(800, 200)):basic_left_layout()# with ui.card().style("height: {}px; width: {}px;".format(1000, 800)):with ui.scroll_area().style("height: {}px; width: {}px;".format(1000, 816)):basic_right_layout_children()basic_main_layout()
ui.run(host="127.0.0.1", port=808)

服务

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import torch
from src.model import RWKV_RNN
from src.sampler import sample_logits
from src.rwkv_tokenizer import RWKV_TOKENIZERapp = FastAPI()# 定义请求体模型
class MessageRequest(BaseModel):text: str# 定义响应体模型
class MessageResponse(BaseModel):response: str# 初始化模型和分词器
def init_model():args = {'MODEL_NAME': 'weight/RWKV-x060-World-1B6-v2-20240208-ctx4096','vocab_size': 65536,'device': "cpu",'onnx_opset': '12',}device = args['device']assert device in ['cpu', 'cuda', 'musa', 'npu']if device == "musa":import torch_musaelif device == "npu":import torch_npumodel = RWKV_RNN(args).to(device)tokenizer = RWKV_TOKENIZER("asset/rwkv_vocab_v20230424.txt")return model, tokenizer, devicemodel, tokenizer, device = init_model()# 生成文本的函数
def generate_text(input_text):# 设置续写的初始字符串和参数batch_size = 1TEMPERATURE = 2.5TOP_P = 0.1LENGTH_PER_TRIAL = 50encoded_input = tokenizer.encode([input_text] * batch_size)token = torch.tensor(encoded_input).long().to(device)state = torch.zeros(batch_size, model.state_size[0], model.state_size[1]).to(device)with torch.no_grad():token_out, state_out = model.forward_parallel(token, state)out = token_out[:, -1]for step in range(LENGTH_PER_TRIAL):token_sampled = sample_logits(out, TEMPERATURE, TOP_P)token = torch.cat((token, token_sampled.unsqueeze(1)), 1)with torch.no_grad():out, state = model.forward(token_sampled, state)decoded_sequences = tokenizer.decode(token.cpu().tolist())return decoded_sequences[-1]# 定义路由
@app.post("/generate/", response_model=MessageResponse)
async def create_message(message_request: MessageRequest):try:response_text = generate_text(message_request.text)return MessageResponse(response=response_text)except Exception as e:raise HTTPException(status_code=500, detail=str(e))# 运行FastAPI应用
if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

简单的请求

import requests# 定义API的URL
url = "http://127.0.0.1:8000/generate/"# 定义要发送的数据
data = {"text": "你好,这是一个测试。"}# 发送POST请求
response = requests.post(url, json=data)# 打印响应内容
print(response.json()["response"])

这篇关于给rwkv-pytorch 写个chat ui demo的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/919547

相关文章

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Golang GUI入门——andlabs ui

官方不提供gui标准库,只好寻求第三方库。 https://github.com/google/gxui 这个gui库是谷歌内部人员提供的,并不是谷歌官方出品,现在停止维护,只好作罢。 第三方gui库 找了好多,也比较了好多,最终决定使用的是还是 https://github.com/andlabs/ui 相信golang gui还会发展的更好,期待更优秀的gui库 由于andlabs

linux 内核提权总结(demo+exp分析) -- 任意读写(四)

hijack_modprobe_path篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     原理同hijack_prctl, 当用户执行错误格式的elf文件时内核调用call_usermod

linux 内核提权总结(demo+exp分析) -- 任意读写(三)

hijack_prctl篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   prctl函数: 用户态函数,可用于定制进程参数,非常适合和内核进行交互 用户态执行prctl函数后触发prctl系统

linux 内核提权总结(demo+exp分析) -- 任意读写(二)

hijack_vdso篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm     vdso: 内核实现的一个动态库,存在于内核,然后映射到用户态空间,可由用户态直接调用 内核中的vdso如果被修改

linux 内核提权总结(demo+exp分析) -- 任意读写(一)

cred篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   每个线程在内核中都对应一个线程结构块thread_infothread_info中存在task_struct类型结构体 struct t

linux 内核提权总结(demo+exp分析) -- ROP(二)

ret2usr CR4篇 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   smep: smep是内核的一种保护措施, 使得内核不可执行用户态代码 内核通过CR4寄存器的第20位来控制smep,

linux 内核提权总结(demo+exp分析) -- ROP(一)

基础ROP篇(linux 5.0.21) 本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:jmpcall 专栏地址:https://zhuanlan.kanxue.com/user-815036.htm   内核提权与用户态攻击的区别 攻击流程 用户态攻击: 执行 system("/bin/sh") 获得shel

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 ##一、 缘由及解决方法 把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用

实例demo理解面向接口思想

浅显的理解面向接口编程 Android开发的语言是java,至少目前是,所以理解面向接口的思想是有必要的。下面通过一个简单的例子来理解。具体的概括我也不知道怎么说。 例子: 现在我们要开发一个应用,模拟移动存储设备的读写,即计算机与U盘、MP3、移动硬盘等设备进行数据交换。已知要实现U盘、MP3播放器、移动硬盘三种移动存储设备,要求计算机能同这三种设备进行数据交换,并且以后可能会有新的第三方的