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

系列篇章💥

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的探索之旅,一起开启智能时代的大门!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝牙资讯|苹果Apple Pencil新专利:用笔套扩展传感器 / 续航等模块化方案

根据美国商标和专利局最新公示的清单,苹果公司获得了一项 Apple Pencil 的专利,探索了模块化设计方案,用户未来可以根据自身需求或者使用场景,随心更换 Pencil 的模块,达到不同的效果。 苹果在专利中表示笔套内置传感器…

GNU/Linux - Kconfig Language - 1

Introduction 配置数据库是以树形结构组织的配置选项集合: The configuration database is a collection of configuration options organized in a tree structure: - Code maturity level options | - Prompt for development and/or incomplete code/drivers …

hibernate与jpa学习

jpa是一个规范,hibernate是jpa的实现,是一种框架。 hibernate: ORM框架/持久层框架(Object Relational Mapping) 它是是一个轻量级开放源代码的对象关系映射框架,hibernate可以自动生成SQL语句&#xff0…

js 使用 lodash-es 检测某个值是否是函数

import { isFunction } from lodash-eslet isA isFunction(() > {}) console.log(isA) //true https://www.lodashjs.com/docs/lodash.isFunction#_isfunctionvalue https://lodash.com/docs/4.17.15#isFunction 人工智能学习网站 https://chat.xutongbao.top

简单的电路指示锂离子电池的健康状况

锂离子电池对不良处理很敏感。当我们将电池充电至低于制造商定义的裕量时,可能会发生火灾、爆炸和其他危险情况。 锂离子电池在正常使用的过程中,其内部进行电能与化学能相互转化的化学正反应。但在某些条件下,如对其过充电、过放电或过电流…

复杂流分类

拓扑图 配置 配置ACL 配置流分类、流行为、流策略 在接口应用 sysname AR1 # acl number 2000 rule 5 permit source 10.1.1.1 0 acl number 2001 rule 5 permit source 10.1.1.2 0 acl number 2002 rule 5 permit source 10.1.1.3 0 # traffic classifier EF operat…

CGLib动态代理技术

基于CGLib的动态代理机制,ProxyFactoryy无需再像JDK动态代理那样实现一个interface,实际情况下可能这个interface并不存在,只需要实现另外一个接口MethodInterceptor即可 package com.hmdp.service.尚硅谷的代理模式3; //CGlib代理import …

FlinkSQL 开发经验分享

作者:汤包 最近做了几个实时数据开发需求,也不可避免地在使用 Flink 的过程中遇到了一些问题,比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题,通过思考并解决这些问题,加深了我对 Flink 原理与机…

Android 开发中 C++ 和Java 日志调试

在 C 中添加堆栈日志 先在 Android.bp 中 添加 ‘libutilscallstack’ shared_libs:["liblog"," libutilscallstack"]在想要打印堆栈的代码中添加 #include <utils/CallStack.h> using android::CallStack;// 在函数中添加 int VisualizerLib_Crea…

制作一个动态库

1. 准备工作 # 目录结构 add.c div.c mult.c sub.c -> 算法的源文件, 函数声明在头文件 head.h # main.c中是对接口的测试程序, 制作库的时候不需要将 main.c 算进去 . ├── add.c ├── div.c ├── include │ └── head.h ├── main.c ├── mult.c └── s…

Day04-jenkins-docker

Day04-jenkins-docker 9. 案例06: 基于docker的案例实现静态代码9.1 整体流程9.2 步骤与环境1) 步骤2) 环境 9.3 详细步骤1&#xff09;代码准备2&#xff09;书写dockerfile3&#xff09;准备私有仓库4&#xff09;创建jenkins任务5&#xff09;web节点上启动对应的docker容器…

WPF真入门教程34--爆肝了【仓库管理系统】

1、项目介绍 本项目是一个基于C#WPF实现的仓库管理系统&#xff0c;系统规模较小&#xff0c;适合入门级的项目练练手&#xff0c;但项目还是具有较高的学习价值&#xff0c;它采用mvvmlight框架&#xff0c;EF框架&#xff0c;WPF前端等技术构成。对于学习来说&#xff0c;可…

Ubuntu设置nacos开机以单机模式自启动

首先&#xff0c;需要安装jdk Ubuntu 安装JDK 创建Systemd服务单元文件 sudo vim /etc/systemd/system/nacos.service按i进入编辑模式&#xff0c;写入下面信息 [Unit] Descriptionnacos server Afternetwork.target[Service] Typeforking Environment"JAVA_HOME/opt/j…

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

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

AI大模型深度学习:理论与应用全方位解析

背景 在当前技术环境下&#xff0c;AI大模型学习不仅要求研究者具备深厚的数学基础和编程能力&#xff0c;还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法&#xff0c;AI大模型学习能够不断提升模型的准确性和效率&#xff0c;为人类生活和工作带来更多…

用一百场线下讲座科普充电桩 能效电气做到了

在新能源汽车产业蓬勃发展的今天,充电桩作为产业链的重要环节,其建设与发展成为推动行业进步的关键。在这一背景下,能效电气凭借其卓越的技术实力和前瞻性的市场布局,成为了新能源充电桩行业的佼佼者。 为了进一步推动新能源产业的发展,普及充电桩知识,能效电气精心策划并举办…

LangChain的基本构成、组件与典型场景

【图书推荐】《ChatGLM3大模型本地化部署、应用开发与微调》-CSDN博客 在人工智能的持续演进中&#xff0c;语言模型&#xff0c;尤其是大型语言模型&#xff08;LLM&#xff09;&#xff0c;例如备受瞩目的ChatGPT&#xff0c;已经稳固地占据了科技前沿的核心地位。这些模型不…

ChatGPT 论文助手:如何用 AI 技术加速学术写作过程

ChatGPT在论文写作中的应用 ChatGPT作为一个先进的语言模型&#xff0c;在学术论文创作领域提供显著帮助。它不仅提升学生与研究者的写作效率&#xff0c;还优化论文质量并引入创新观点。以下是ChatGPT在论文写作中的几种具体应用&#xff1a; 提升写作效率 生成写作构思&…

Mac密室逃脱游戏推荐:Escape Simulator for mac安装包

Escape Simulator 是一款逃生模拟游戏&#xff0c;玩家在游戏中需要寻找线索、解决谜题&#xff0c;以逃离各种房间或环境。这种类型的游戏通常设计有多个关卡或场景&#xff0c;每个场景都有不同的设计和难度。 在 Escape Simulator 中&#xff0c;玩家的目标通常是找到出口或…

Springboot+Vue3开发学习笔记《1》

SpringbootVue3开发学习笔记《1》 博主正在学习SpringbootVue3开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。 一、前置条件 博主所用版本&#xff1a; IDEA需要破解&#xff0c;破解工具链接容易挂&#xff0c;关注私聊我单发。 Spring Boot是Spring提…