【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用

news2024/10/6 9:22:51

系列篇章💥

No.文章
1【Qwen部署实战】探索Qwen-7B-Chat:阿里云大型语言模型的对话实践
2【Qwen2部署实战】Qwen2初体验:用Transformers打造智能聊天机器人
3【Qwen2部署实战】探索Qwen2-7B:通过FastApi框架实现API的部署与调用
4【Qwen2部署实战】Ollama上的Qwen2-7B:一键部署大型语言模型指南
5【Qwen2部署实战】llama.cpp:一键部署高效运行Qwen2-7b模型
6【Qwen2部署实战】部署高效AI模型:使用vLLM进行Qwen2-7B模型推理

目录

  • 系列篇章💥
  • 引言
  • 一、环境准备
    • 1、镜像选择
    • 2、环境配置
  • 二、模型下载
    • 1、模型下载脚本示例
  • 三、代码准备
    • 1、FastAPI 应用代码示例
  • 四、API 部署
  • 五、API 测试
    • 1、使用curl调用API
    • 2、使用python的requests库调用API
  • 结语


引言

在人工智能的快速发展中,大型语言模型(LLM)逐渐成为研究和应用的新宠。它们在自然语言处理(NLP)领域的广泛应用,如文本生成、翻译、摘要等任务中展现出了卓越的性能。Qwen2-7B作为其中的一个代表,不仅因其强大的能力受到关注,更因其开源的特性,让广大研究者和开发者能够自由地使用和创新。本文将详细介绍在AutoDL平台上部署Qwen2-7B模型,并利用FastAPI框架创建API服务的全流程。

一、环境准备

首先,我们需要在AutoDL平台租赁一台配备RTX 3090/24G显存的显卡机器。选择适合的镜像,这里我们选择的是PyTorch-2.1.0-3.10(ubuntu20.04)-12.1,这个镜像为我们后续的操作提供了必要的基础环境。
在这里插入图片描述

1、镜像选择

  • PyTorch版本: 2.1.0
  • 操作系统: Ubuntu 22.04
  • CUDA版本: 12.1

2、环境配置

通过JupyterLab访问服务器,并打开终端进行环境配置。使用以下命令更换pip源以加速依赖包的下载:

pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

这一步是必要的,因为默认的pip源在国外,对于国内用户来说,访问速度较慢,更换为清华大学的镜像源可以显著提高下载速度。

接着,安装所需的依赖包:

pip install fastapi==0.104.1 uvicorn==0.24.0.post1 requests==2.25.1 modelscope==1.11.0 transformers==4.41.0 streamlit==1.24.0 sentencepiece==0.1.99 accelerate==0.24.1 transformers_stream_generator==0.0.4

在这里插入图片描述

这些依赖包含了构建Web服务的FastAPI框架、用于提供服务的Uvicorn ASGI服务器,以及其他与模型加载和运行相关的库。

二、模型下载

利用modelscope库的snapshot_download函数下载Qwen2-7B-Instruct模型
也可以采用git下载 git clone https://www.modelscope.cn/qwen/Qwen2-7B-Instruct.git

1、模型下载脚本示例

import torch
from modelscope import snapshot_download

# snapshot_download函数用于下载模型
model_dir = snapshot_download(
    'qwen/Qwen2-7B-Instruct',  # 模型名称
    cache_dir='/root/autodl-tmp',  # 缓存目录
    revision='master'  # 版本号
)

在这里插入图片描述

执行该脚本将从modelscope下载Qwen2-7B-Instruct模型,并保存到指定的缓存目录中。
在这里插入图片描述

注意:检查文件大小,确认是否下载完整

三、代码准备

/root/autodl-tmp路径下创建fastapi_Demo.py文件,编写FastAPI应用代码,用于加载模型并提供API服务。

1、FastAPI 应用代码示例

from fastapi import FastAPI, Request
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig
import uvicorn
import json
import datetime
import torch

# 设置设备参数
DEVICE = "cuda"  # 使用CUDA
DEVICE_ID = "0"  # CUDA设备ID,如果未设置则为空
CUDA_DEVICE = f"{DEVICE}:{DEVICE_ID}" if DEVICE_ID else DEVICE  # 组合CUDA设备信息

# 清理GPU内存函数
def torch_gc():
    if torch.cuda.is_available():  # 检查是否可用CUDA
        with torch.cuda.device(CUDA_DEVICE):  # 指定CUDA设备
            torch.cuda.empty_cache()  # 清空CUDA缓存
            torch.cuda.ipc_collect()  # 收集CUDA内存碎片

# 创建FastAPI应用
app = FastAPI()

# 处理POST请求的端点
@app.post("/")
async def create_item(request: Request):
    global model, tokenizer  # 声明全局变量以便在函数内部使用模型和分词器
    json_post_raw = await request.json()  # 获取POST请求的JSON数据
    json_post = json.dumps(json_post_raw)  # 将JSON数据转换为字符串
    json_post_list = json.loads(json_post)  # 将字符串转换为Python对象
    prompt = json_post_list.get('prompt')  # 获取请求中的提示

    messages = [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
    ]

    # 调用模型进行对话生成
    input_ids = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)
    model_inputs = tokenizer([input_ids], return_tensors="pt").to('cuda')
    generated_ids = model.generate(model_inputs.input_ids,max_new_tokens=512)
    generated_ids = [
        output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
    ]
    response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
    now = datetime.datetime.now()  # 获取当前时间
    time = now.strftime("%Y-%m-%d %H:%M:%S")  # 格式化时间为字符串
    # 构建响应JSON
    answer = {
        "response": response,
        "status": 200,
        "time": time
    }
    # 构建日志信息
    log = "[" + time + "] " + '", prompt:"' + prompt + '", response:"' + repr(response) + '"'
    print(log)  # 打印日志
    torch_gc()  # 执行GPU内存清理
    return answer  # 返回响应

# 主函数入口
if __name__ == '__main__':
    # 加载预训练的分词器和模型
    model_name_or_path = '/root/autodl-tmp/qwen/Qwen2-7B-Instruct'
    tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, use_fast=False)
    model = AutoModelForCausalLM.from_pretrained(model_name_or_path, device_map="auto", torch_dtype=torch.bfloat16)

    # 启动FastAPI应用
    # 用6006端口可以将autodl的端口映射到本地,从而在本地使用api
    uvicorn.run(app, host='0.0.0.0', port=6006, workers=1)  # 在指定端口和主机上启动应用	

以上代码首先设置了使用CUDA的设备参数,并定义了一个清理GPU内存的函数torch_gc。然后创建了一个FastAPI应用,并定义了一个处理POST请求的端点,用于接收用户的输入提示,并利用加载的模型生成回答。最后,启动了Uvicorn服务器来运行我们的FastAPI应用。

四、API 部署

通过在终端执行以下命令,启动FastAPI应用:

cd /root/autodl-tmp
python fastapi_Demo.py

执行该命令后,如果一切配置正确,你将看到应用启动成功的日志信息。
在这里插入图片描述

五、API 测试

一旦API服务启动,我们可以通过curl或python的requests库进行测试调用。

1、使用curl调用API

curl -X POST "http://127.0.0.1:6006" \
     -H 'Content-Type: application/json' \
     -d '{"prompt": "你好"}'

这条命令通过curl工具向我们的API发送一个POST请求,并附带了一个简单的输入提示“你好”。
在这里插入图片描述

2、使用python的requests库调用API

这段Python脚本定义了一个函数get_completion,它使用requests库向API发送POST请求,并打印出返回的回答。

import requests
import json

def get_completion(prompt):
    headers = {'Content-Type': 'application/json'}
    data = {"prompt": prompt}
    response = requests.post(url='http://127.0.0.1:6006', headers=headers, data=json.dumps(data))
    return response.json()['response']


response=get_completion('你好')
response

输出:

'你好!很高兴能为你提供帮助。有什么我可以为你做的吗?'

问题:你是谁?

response=get_completion('你是谁?')
response

输出:

'我是阿里云开发的一款超大规模语言模型,我叫通义千问。'

问题:AI大模型是什么?

response=get_completion('AI大模型是什么?')
response

输出:

'AI大模型指的是使用大规模数据和计算资源训练的深度学习模型。这些模型通常包含数以百万计或数以十亿计的参数,可以处理复杂的数据结构和任务,如自然语言处理、图像识别、语音识别等。它们能够从大量数据中学习到通用的表示和规律,并在各种下游任务上取得出色的表现。由于其强大的泛化能力和可扩展性,AI大模型在近年来吸引了广泛的关注和研究。'

问题:通义千问这个名字是什么意思?

response=get_completion('通义千问这个名字是什么意思?')
Response

输出:

'“通义千问”这个名字蕴含了阿里云大模型的几个关键特性。首先,“通义”二字取自“通达明智”,意在表达模型能够帮助用户获得知识、理解概念、解决疑惑,提供智慧和洞察力。同时,“通义”也意味着模型具有广泛适用性和跨领域的通用性,能够理解和回答各种主题的问题。\n\n其次,“千问”代表了模型的强大问答能力。它经过大量训练,能够处理和回应包括但不限于历史、科学、技术、艺术、文化等众多领域内的问题,并且能够持续学习和进化,不断提升其回答问题的质量和准确性。\n\n综上所述,“通义千问”不仅体现了阿里云大模型在知识广度和深度上的优势,也寓意着其致力于为用户提供全面、准确、有启发性的信息和支持。'

结语

通过本文的介绍,我们成功地在AutoDL平台上部署了Qwen2-7B-Instruct模型,并通过FastAPI创建了一个高效的API服务。这不仅展示了开源大模型的强大能力,也为开发者提供了一种快速部署和调用大型语言模型的方法。随着技术的不断进步,我们期待开源大模型在未来能够更加深入地融入到我们的学习和工作中,推动人工智能技术的进一步发展。

在这里插入图片描述
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南AI大模型探索之路(零基础入门)AI大模型预训练微调进阶AI大模型开源精选实践AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,加入技术交流群,开启编程探索之旅。
💘精心准备📚500本编程经典书籍、💎AI专业教程,以及高效AI工具。等你加入,与我们一同成长,共铸辉煌未来。
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!

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

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

相关文章

springboot双学位招生管理系统-计算机毕业设计源码93054

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作…

松下Panasonic机器人维修故障原因

松下机器人伺服电机是许多工业自动化设备的关键组成部分。了解如何进行Panasonic工业机械臂电机维修,对于确保设备正常运行至关重要。 【松下焊接机器人维修案例】【松下机器人维修故障排查】 一、常见松下工业机械手伺服电机故障及原因 1. 过热:过热可…

Webpack: 并行构建

概述 受限于 Node.js 的单线程架构,原生 Webpack 对所有资源文件做的所有解析、转译、合并操作本质上都是在同一个线程内串行执行,CPU 利用率极低,因此,理所当然地,社区出现了一些以多进程方式运行 Webpack&#xff0…

铜排载流量计算

母线载流量的理论计算 有些设计规范给出了根据电流密度确定母线大小的标准,一般铜母线的要求是每平方毫米载流量1.55A,但只可以作为设计“自由空气中的单导体母线”的参考,不可以作为实际设备中选择母线截面积的方法。也有些设计手册里给出了…

无线领夹麦克风选什么价位,揭秘无线领夹麦克风哪个品牌音质最好

在自媒体的快速发展之下,越来越多人加入到短视频拍摄行业。当我们踏出户外,想要用声音记录美好生活时,一个优质的麦克风便成了不可或缺的装备。户外环境的喧嚣与手机麦克风的局限性常常让我们的声音淹没在背景噪音之中,使得同期录…

小白也能看懂的Python基础教程(8)

Python面向对象 目录 Python面向对象 一、面向对象的概念 1、常见的编程思想 2、面向过程是什么? 3、什么是面向对象? 4、封装 5、继承 6、多态 二、面向对象的概念 1、两个重要概念 2、类 3、对象 4、self关键字 三、对象属性 1、什么…

昇思25天学习打卡营第8天|MindSpore保存与加载(保存和加载MindIR)

在MindIR中,一个函数图(FuncGraph)表示一个普通函数的定义,函数图一般由ParameterNode、ValueNode和CNode组成有向无环图,可以清晰地表达出从参数到返回值的计算过程。在上图中可以看出,python代码中两个函…

Unity Scrollview的Scrollbar控制方法

备忘:碰到用scrollview自带的scrollbar去控制滑动,结果发现用代码控制scrollbar.value无效,搜了一下都是说用scrollRect.verticalNormalizedPosition和scrollRect.horizontalNormalizedPosition来控制的。我寻思着有关联的scrollbar为什么用不…

【TB作品】智能台灯控制器,ATMEGA128单片机,Proteus仿真

题目 8 :智能台灯控制器 基于单片机设计智能台灯控制器,要求可以调节 LED 灯的亮度,实现定时开启与关闭, 根据光照自动开启与关闭功能。 具体要求如下: (1)通过 PWM 功能调节 LED 灯亮度&#x…

Jenkins 使用 Publish over SSH进行远程访问

Publish over SSH 是 Jenkins 的一个插件,可以让你通过 SSH 将构建产物分发到远程服务器。以下是如何开启 Publish over SSH 的步骤: 一、安装 Publish over SSH 插件 在 Jenkins 中,进入 "Manage Jenkins" > "Manage Plugins"。选择 "Availab…

储能锂电池出货量持续增长 国家政策推动行业发展速度加快

储能锂电池出货量持续增长 国家政策推动行业发展速度加快 储能锂电池又称锂离子储能电池,指专为储存电能而设计的锂离子电池。储能锂电池具有转换效率高、能量密度高、维护成本低、环境适应性强、响应速度快等优势,在数据中心、通信基站以及电力系统等领…

香橙派AIpro如何赋能AI+边缘流媒体设备

文章目录 (一)前言(二)AI边缘流媒体设备展示(三)赋能AI边缘流媒体设备1、准备开发环境2、在板子中下载编译安装SRS3、基本推拉流测试4、多路推流性能测试 (四)一些注意事项1、开发板…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术,它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的,即客户端发起请求,服务器响应请求,然后连接关闭。但是,WebSocket允许服务器和客户端…

Nginx系列(二)---Mac上的快速使用

一、安装 前置软件&#xff1a;Homebrew 安装方法&#xff1a;终端输入/bin/bash -c "$(curl -fsSL <https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh>)"更新&#xff1a; brew update 设置中科大镜像源&#xff1a;git -C "$(brew --r…

【串口通信】之TTL电平

1. 什么是串口 串口,全称为串行通信端口,是一种计算机硬件接口,用于实现数据的串行传输。与并行通信不同,串口通信一次只传输一个比特,数据通过串行线按顺序传输。串口通信在嵌入式系统、工业控制、计算机与外围设备通信等领域非常常见 2. 什么是串口通信 串口通信是指通过…

和闺蜜的泰国之旅

每当我回想起那次和闺蜜丽丽&#xff08;全名罗莉&#xff09;的泰国之旅&#xff0c;心中总是涌起复杂的情绪。那段经历仿佛一场噩梦&#xff0c;至今仍无法从脑海中挥去。 我们满怀期待地抵达曼谷&#xff0c;热带的阳光、繁忙的街道、美味的街头小吃&#xff0c;都让我们兴…

Redis 管道(Pipeline)是什么?有什么用?

目录 1. redis 客户端-服务端模型的不足之处 2. redis 管道是什么&#xff1f;有什么好处&#xff1f; 3. 管道的使用场景 4. 管道使用的注意事项 1. redis 客户端-服务端模型的不足之处 众所周知&#xff0c;redis 是一个客户端-服务端的模型设计&#xff0c;客户端向服务…

树莓派0 2W重启后突然没有声音

树莓派0 2W重启后突然没有声音。 最近在使用该板卡。重启后突然出现了显示器不能显示界面的情况&#xff0c;接着用putty的ssh方式连接该板卡&#xff0c;能连上。使用vnc方式连接该板卡&#xff0c;也能连上。后来通过修改/boot/config.txt文件&#xff0c;能在显示器上显示界…

WordPress付费进群V2主题,多种引流方法,引私域二次变现

全新前端UI界面&#xff0c;多种前端交互特效让页面不再单调&#xff0c;进群页面群成员数&#xff0c;群成员头像名称&#xff0c;每次刷新页面随机更新不重复&#xff0c;最下面评论和点赞也是如此随机刷新不重复 进群页面简介&#xff0c;群聊名称&#xff0c;群内展示&…

2024年小米SU7维修手册和电路图线路图接线图资料更新

此次更新了2024年小米SU7维修手册和电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#xff01; 汽修帮…