把Llama2封装为API服务并做一个互动网页

最近按照官方例子,把Llama2跑起来了测试通了,但是想封装成api服务,耗费了一些些力气

参考:https://github.com/facebookresearch/llama/pull/147/files

1. 准备的前提如下

  • 按照官方如下命令,可以运行成功
torchrun --nproc_per_node 1 example_chat_completion.py \--ckpt_dir llama-2-7b-chat/ \--tokenizer_path tokenizer.model \--max_seq_len 512 --max_batch_size 6
  • 使用的模型是llama-2-7b-chat

2. 第一步,增加依赖包

fastapi
uvicorn

3. 第二步,增加文件server.pyllama仓库的根目录下

from typing import Tuple
import os
import sys
import argparse
import torch
import time
import jsonfrom pathlib import Path
from typing import Listfrom pydantic import BaseModel
from fastapi import FastAPI
import uvicorn
import torch.distributed as distfrom fairscale.nn.model_parallel.initialize import initialize_model_parallelfrom llama import ModelArgs, Transformer, Tokenizer, Llamaparser = argparse.ArgumentParser()
parser.add_argument('--ckpt_dir', type=str, default='llama-2-7b-chat')
parser.add_argument('--tokenizer_path', type=str, default='tokenizer.model')
parser.add_argument('--max_seq_len', type=int, default=512)
parser.add_argument('--max_batch_size', type=int, default=6)os.environ['MASTER_ADDR'] = 'localhost'
os.environ['MASTER_PORT'] = '12345'
os.environ['WORLD_SIZE'] = '1'app = FastAPI()def setup_model_parallel() -> Tuple[int, int]:local_rank = int(os.environ.get("LOCAL_RANK", 0))world_size = int(os.environ.get("WORLD_SIZE", 1))print("world_size", world_size)print("loal_rank", local_rank)dist.init_process_group(backend="nccl", init_method="env://", world_size=world_size, rank=local_rank)initialize_model_parallel(world_size)torch.cuda.set_device(local_rank)# seed must be the same in all processestorch.manual_seed(1)return local_rank, world_sizedef load(ckpt_dir: str,tokenizer_path: str,local_rank: int,world_size: int,max_seq_len: int,max_batch_size: int,
) -> Llama:generator = Llama.build(ckpt_dir=ckpt_dir,tokenizer_path=tokenizer_path,max_seq_len=max_seq_len,max_batch_size=max_batch_size,model_parallel_size=1)return generatordef init_generator(ckpt_dir: str,tokenizer_path: str,max_seq_len: int = 512,max_batch_size: int = 8,
):local_rank, world_size = setup_model_parallel()if local_rank > 0:sys.stdout = open(os.devnull, "w")generator = load(ckpt_dir, tokenizer_path, local_rank, world_size, max_seq_len, max_batch_size)return generatorif __name__ == "__main__":args = parser.parse_args()generator = init_generator(args.ckpt_dir,args.tokenizer_path,args.max_seq_len,args.max_batch_size,)class Config(BaseModel):prompts: List[str]system_bg: List[str]max_gen_len: int = 510temperature: float = 0.6top_p: float = 0.9if dist.get_rank() == 0:@app.post("/llama/")def generate(config: Config):dialogs: List[Dialog] = [[{"role": "system","content": config.system_bg[0],},{"role": "user","content": config.prompts[0],}],]results = generator.chat_completion(dialogs,  # type: ignoremax_gen_len=config.max_gen_len,temperature=config.temperature,top_p=config.top_p,)return {"responses": results}uvicorn.run(app, host="0.0.0.0", port=8042)else:while True:config = [None] * 4try:dist.broadcast_object_list(config)generator.generate(config[0], max_gen_len=config[1], temperature=config[2], top_p=config[3])except:pass

4. 运行测试

直接运行python sever.py即可运行成功
提供了一个post接口,具体信息为

URL:http://localhost:8042/llamaBody:
{"prompts":["你好,你是谁?"],"system_bg":["你需要用中文回答问题"]
}其中prompts为输入内容,system_bg为给提前设定的背景

5. 做一个互动的网页

想做一个类似OpenAI那样子的对话框,继续添加依赖

streamlit

添加如下文件chatbot.py

import streamlit as st
import requests
import jsonst.title("llama-2-7b-chat Bot")# Initialize chat history
if "messages" not in st.session_state:st.session_state.messages = []# Display chat messages from history on app rerun
for message in st.session_state.messages:with st.chat_message(message["role"]):st.markdown(message["content"])# React to user input
if prompt := st.chat_input("What is up?"):# Display user message in chat message containerst.chat_message("user").markdown(prompt)# Add user message to chat historyst.session_state.messages.append({"role": "user", "content": prompt})url = 'http://localhost:8042/llama'd = {"prompts": [prompt], "system_bg": [""]}print(d)r_resp_txt = requests.post(url, data=json.dumps(d))r_resp_dict = json.loads(r_resp_txt.text)response = r_resp_dict['responses'][0]['generation']['content']# Display assistant response in chat message containerwith st.chat_message("assistant"):st.markdown(response)# Add assistant response to chat historyst.session_state.messages.append({"role": "assistant", "content": response})

运行streamlit run chatbot.py,即可有如下效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员必看的几部电影

目录 《我是谁:没有绝对安全的系统》 《模仿游戏》 《硅谷传奇》 《代码 The Code》 作为程序员,除了在工作中不断学习和提升技术外,适当地放松也是必不可少的 看电影可以是一个很好的放松方式,而对于程序员来说,…

DNS服务正反解析

1.正向解析 1.配置基本 1.1防火墙配置 二者都要关闭 setenforce 0 systemctl stop firewalld #关闭防火墙 yum install bind -y #下载bind软件 客户端可以不用下 1.2服务端配置静态ip, ip a 查看网卡 nmcli c modify ens33 ipv4.method manual ipv4.addresses …

HTTP特性

大家好我是苏麟 , 今天说说HTTP特性. 资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 到目前为止,HTTP 常见到版本有 HTTP/1.1,HTTP/2.0,HTTP/3.0,不同版本的 HTTP 特性是不一样的。 这里先用 HTTP/1.1 版本给大家介…

算法——位运算

1. 基础位运算 位运算符是在二进制位级别上对数据进行操作的运算符。以下是一些常见的位运算符: 1. 右移运算符 (>>) 将一个数的所有二进制位向右移动指定的位数。右移运算符 >> 表示将运算符左边的操作数的所有位向右移动右边指定的位数,右边多余的…

如何系统地学习Python

建议系统学习Python的途径遵循理论与实践相结合的教学方法。以下是一个分阶段的学习计划: 阶段一:基础知识 理解Python的特点: 认识Python的历史与设计哲学。学习Python的基本语法和运行环境。 安装Python: 学习如何在不同操作系…

(03)Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

OpenAI最新模型Sora到底有多强?眼见为实的真实世界即将成为过去!

文章目录 1. 写在前面2. 什么是Sora?3. Sora的技术原理 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感…

【MySQL】:C/C++链接

C/C链接 一.前置工作二.官方手册三.基本接口1.初始化和关闭2.进行连接3.下达命令4.获取执行结果5.释放空间 四.测试源代码 一.前置工作 进行C/C链接时我们需要第三方库,但实际上在我们安装MySQL时就已经安装了,如果没有安装下面可以再执行该命令进行更新…

【解决(几乎)任何机器学习问题】:超参数优化篇(超详细)

这篇文章相当长,您可以添加至收藏夹,以便在后续有空时候悠闲地阅读。 有了优秀的模型,就有了优化超参数以获得最佳得分模型的难题。那么,什么是超参数优化呢?假设您的机器学习项⽬有⼀个简单的流程。有⼀个数据集&…

【Kuiperinfer】笔记01 项目预览与环境配置

学习目标 实现一个深度学习推理框架设计、编写一个计算图实现常见的算子,例如卷积、池化、全连接学会如何进行算子的优化加速使用自己的推理框架推理常见模型,检查结果是否能够和torch对齐 什么是推理框架? 推理框架用于对已经训练完成的模…

基于Spring Boot的智能物流管理系统,计算机毕业设计(带源码+论文)

源码获取地址: 码呢-一个专注于技术分享的博客平台一个专注于技术分享的博客平台,大家以共同学习,乐于分享,拥抱开源的价值观进行学习交流http://www.xmbiao.cn/resource-details/1759581137025445890

npm ERR! network This is a problem related to network connectivity.

遇到 ETIMEDOUT 错误时,这表明npm尝试连接到npm仓库时超时了,这通常是由网络连接问题引起的。这可能是因为网络不稳定、连接速度慢、或者你的网络配置阻止了对npm仓库的访问。以下是一些解决这个问题的步骤: 1. 检查网络连接 首先&#xff…

java的泛型【详解】

定义类、接口、方法时&#xff0c;同时声明了一个或者多个类型变量&#xff08;如&#xff1a;<E>&#xff09; &#xff0c;称为泛型类、泛型接口&#xff0c;泛型方法、它们统称为泛型。 作用&#xff1a;泛型提供了在编译阶段约束所能操作的数据类型&#xff0c;并自…

Qt 使用QScintilla 编辑lua 脚本

需求&#xff1a; 利用QScintilla 编辑lua 脚本 步骤&#xff1a; 1&#xff0c;下载 QScintilla Riverbank Computing | Download 2, 打开 src/qscintilla.pro 文件 编译出 dll库 3&#xff0c;工程中引入这个库 注意debug 模式 必须加载debug 版本编译的库&#xff0…

Yii2项目使用composer异常记录

问题描述 在yii2项目中&#xff0c;使用require命令安装依赖时&#xff0c;出现如下错误提示 该提示意思是&#xff1a;composer运行时&#xff0c;执行了yiisoft/yii2-composer目录下的插件&#xff0c;但是该插件使用的API版本是1.0&#xff0c;但是当前的cmposer版本提供的…

Selenium实现多页面切换

当使用 Selenium 进行自动化测试或爬取数据时&#xff0c;有时需要处理多个页面之间的切换。以下是一些可能需要多页面切换的情况&#xff1a; 1、打开新窗口/页面&#xff1a; 在当前页面上点击链接、按钮或执行某些操作时&#xff0c;可能会打开一个新的窗口或页面。此时&a…

MySQL 基础知识(六)之数据查询(一)

目录 1 基本查询 1.1 查询相关列 (select * / 列名) 1.2 别名 (as) 1.3 去重 (distinct) 1.4 对列中的数据进行运算 (、-、*、/) 2 条件查询 (where) 2.1 等值查询 () 2.2 非等值查询 (>、<、>、<、!、><) 2.3 逻辑判断 (and、or、not) 2.4 区间判…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

更快找到远程/自由工作的网站

不要使用Fiver或Upwork。 它们已经饱和了。 下面是10个更快找到远程/自由工作的网站&#xff1a; 1. Toptal 这个网站专门为熟练的自由职业者提供远程工作机会&#xff0c;如Shopify和Priceline等一流公司。 他们只接受软件开发、设计和金融等领域的顶级3%自由职业者。 htt…

普中51单片机学习(九)

蜂鸣器 蜂鸣器简介 在单片机应用的设计上&#xff0c;很多方案都会用到蜂鸣器&#xff0c;大部分都是使用蜂鸣器来做提示或报警&#xff0c;比如按键按下、开始工作、工作结束或是故障等等。改变单片机引脚输出波形的频率&#xff0c;就可以调整控制蜂鸣器音调&#xff0c;产…