【AI提升】如何使用大模型:本机离线和FastAPI服务调用

news2024/12/23 12:35:21

大模型本身提供的功能,类似于windows中的一个exe小工具,我们可以本机离线调用然后完成具体的功能,但是别的机器需要访问这个exe是不可行的。常见的做法就是用web容器封装起来,提供一个http接口,然后接口在后端调用这个exe来实现需求。同理我们需要一个web容器把大模型封装起来,然后通过API来提供AI服务

这里对比本机离线调用和API服务调用,并通过FastAPI来实现AI的API服务化(LangChain也是通过这些框架提供的API服务)。

一、本机离线调用

看代码:

from transformers import AutoTokenizer, AutoModel

MODEL_PATH = 'c:\\ai\\llms\\chatglm3-6b'
TOKENIZER_PATH = 'c:\\ai\\llms\\chatglm3-6b'

# 第一步,获取大模型
tokenizer = AutoTokenizer.from_pretrained(TOKENIZER_PATH, trust_remote_code=True)
model = AutoModel.from_pretrained(MODEL_PATH, trust_remote_code=True, device_map="auto").eval()
# add .quantize(bits=4, device="cuda").cuda() before .eval() to use int4 model
# must use cuda to load int4 model


# 第二步,定义交互过程函数
def chat_handler(query: str):
    response = model.chat(
        tokenizer,
        query,
        history=None,
        top_p=1,
        max_new_tokens=1024,
        temperature=0.1)
    print(response, end="", flush=True)


# 第三步,实际交互
chat_handler('who are you')

实际调用过程是比较简单的,从大模型指定路径加载大模型,然后就可以通过调用chat实现交互。

看结果:

二、通过FastAPI来封装API服务

OpenAI提供了一个很好的接口规范,其余大模型以及大模型框架在提供接口时都做了类似的兼容处理,包括接口名、传参方式、参数格式等都仿照OpenAI的接口方式,这样可以大幅降低学习成本和模型切换的成本,当你想尝试不同的大模型时不需要做大量的改动。

接下来主要是通过FastAPI来封装我们的AI后台服务器。

2.1 构建服务端

2.1.1 使用工具

这里使用三个工具:

  • FastAPI:FastAPI 是一个快速(高性能)的构建API的Web框架。
  • Uvicorn:Uvicorn 是一款高效的ASGI服务器,主要是为了服务端的高效异步处理。
  • Pydantic:Pydantic 是一款广泛使用的数据校验工具,主要是为了接口参数的规范和校验。

通过使用三个工具,可以快速部署一个后端服务,并且这个服务可以对输入参数进行方便的校验,同时实现高效异步调控

在服务端安装三个工具:

> pip install fastapi uvicorn pydantic

2.1.2 启动服务端的代码

from fastapi import FastAPI
from pydantic import BaseModel
import uvicorn
from transformers import AutoTokenizer, AutoModel, AutoModelForCausalLM

# 第一步,加载大模型
model_dir = 'c:\\ai\\llms\\chatglm3-6b'
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModel.from_pretrained(model_dir, device_map="cuda", trust_remote_code=True).eval()

# 第二步,创建FastAPI应用实例
app = FastAPI()


# 第三步,定义请求类型,与OpenAI API兼容
class ChatCompletionRequest(BaseModel):
    model: str
    messages: list
    max_tokens: int = 1024
    temperature: float = 0.1


# 第四步,定义交互函数
def chat_handle(messages: list, max_tokens: int, temperature: float):
    query = messages[0]["content"]
    response, history = model.chat(
        tokenizer,
        query=query,
        history=None,
        top_p=1,
        max_new_tokens=max_tokens,
        temperature=temperature)
    print(response)
    return response


# 第五步,定义路由和处理函数,与OpenAI的API兼容
@app.post("/v1/chat/completions")
async def create_chat_completion(request: ChatCompletionRequest):
    # 调用自定义的文本生成函数
    response = chat_handle(request.messages, request.max_tokens, request.temperature)
    return {
        "choices": [
            {
                "message": {
                    "content": response
                }
            }
        ],
        "model": request.model
    }


# 第六步,启动FastAPI应用,默认端口为8000
if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=9999)

uvicorn.run(app, host="0.0.0.0", port=9999) 这里的host和port注意一下:

  • host="0.0.0.0",表示可以远程访问此服务,host="127.0.0.1",表示只能本地访问。
  • port=9999,默认端口为8000,也可以自定义一个端口。

运行服务:

> python examples/dev_fastapi.py

服务启动输出:

表示服务已经启动。

2.2 客户端调用

2.2.1 通过命令和工具调用

当服务端启动后,可以通过各种客户端工具来调用,比如curl,这里使用postman。

可以看到服务端正确返回了。

查看服务端输出:

2.2.2 通过代码调用

import requests
import json

# 定义请求的URL
url = "http://192.168.3.154:9999/v1/chat/completions"

# 定义请求头
headers = {'Content-Type': 'application/json'}

# 定义请求体
data = {
    "model": "qwen2-7b",
    "messages": [{"role": "user", "content": "who are you?"}],
    "max_tokens": 1024,
    "temperature": 0.5
}
# 将字典转换为JSON格式
data_json = json.dumps(data)

# 发送POST请求
response = requests.post(url, headers=headers, data=data_json)

# 检查响应状态码
if response.status_code == 200:
    # 如果响应成功,打印响应内容
    print(response.json())
else:
    # 如果响应失败,打印错误信息
    print(f"Error: {response.status_code}, {response.text}")

运行命令:

> python examples/dev_fastapi_client.py

查看客户端调用结果:

查看服务端输出:

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

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

相关文章

单目行车测距摄像系统(单目测距-行车)

单目行车测距摄像系统是一种利用单个摄像头实现车辆行驶中前方障碍物距离测量的技术。该系统通过计算机视觉算法,能够实时分析摄像头捕捉的图像,精确计算出车辆与前方物体之间的距离,对于自动驾驶、高级驾驶辅助系统(ADAS&#xf…

为什么说AI大模型开发人人必备?

首先,能够开发 AGI 时代新应用程序 第一步:学会大模型内核架构,对 Transformer 神经网络架构有个大致的了解,能够搞懂 :LLM 大模型是如何预测下一个 token 的、涌现是如何产生的、幻觉问题如何避免、在线推理的性能问…

德国Testing Expo丨知迪科技Vehicle Bus Tool免费软件“剧透”抢先看!

今日,德国斯图加特汽车测试及质量监控展览会(Automotive Testing Expo)在斯图加特会展中心正式开幕。作为汽车测试领域专业性最强、影响力最广泛的展会之一,展会首日盛况空前,面向组件和整车的最新测试、开发和验证技术…

CTF实战:从入门到提升

CTF实战:从入门到提升 🚀前言 没有网络安全就没有国家安全,网络安全不仅关系到国家整体信息安全,也关系到民生安全。近年来,随着全国各行各业信息化的发展,网络与信息安全得到了进一步重视,越…

新的Meta 3D Gen可在一分钟内根据文本生成高质量的3D素材

创建 3D 资产是最耗时、最具挑战性的创意任务之一。如果人工智能助手能够根据文本输入生成三维内容,那么它将使三维内容创作普及化,并对视频游戏和电影行业以及 AR 和 VR 应用程序的开发大有帮助。 Meta 的人工智能研究团队最近推出了 Meta 3D Gen (3DGe…

企业多存储方式如何兼顾安全统一管理、便捷流畅访问的双向需求?

数据和文件存储是企业最基础的需求,常见的存储方式有磁盘存储、NAS存储、SAN存储、云存储、分布式存储、闪存存储等;随着企业规模的扩大、业务结构的复杂化,企业内部可能会同时出现多种存储方式、多个存储设备并行使用的情况。 这样的使用场景…

关于“Unittest”框架中的addtest的方法执行后,所有case都执行的原因分析

原因分析 主要是编译器的问题导致的,因为是unittest框架所有pycharm默认用了unittest框架的方式执行了,所以全部的case就都被执行了;配合入口函数 main 来运行就可以了

少见的更优写法,反转字符串中的元音字母

Leetcode 原题链接 解法一 这道题很简单,令双指针 l l l 和 r r r 从两侧相向移动,交换元音字母即可。但大多人的实现是如下这种可简化的嵌套循环。 如果是 Java 等 String 不可变的语言,应先转换为 CharArray,交换完元音字母…

ubuntu运行qq音乐闪退

ubuntu运行qq音乐闪退 修改/usr/share/applications中的qqmusic.desktop,在Exec后加上 --no-sandbox,如下图所示: 该文件有可能是只读,权限不够的话用sudo vim qqmusic.desktop

Ollama报错:Error: llama runner process has terminated: exit status 0xc0000409

0,背景 今天听说谷歌家的Gemma2性能很好,于是在Ollama上下载到本地测试一下 ollama run gemma2 结果终端里报错 Error: llama runner process has terminated: exit status 0xc0000409 1,原因 原因很简单,新的模型&#xff…

【Linux】应用层创建XXX文件,文件系统调用可以查看到文件名

搞了台电脑,昨天把系统装了下,继续搞事: 上次基于内核代码openat的系统打印被操作的文件名,发现不成功,很奇怪,这种问题内核不可能会犯这种低级别的问题吧? 反过来想,那不是内核的问…

40V转5V,40V转3.3V,40V转3V使用什么降压芯片型号?

40V转5V,40V转3.3V,40V转3V使用什么降压芯片型号? # 40V转5V、3.3V、3V降压芯片:AH8820A的介绍与应用 在电子电路设计中,电压转换是一个常见的需求。特别是在需要将较高电压转换为较低电压以供微控制器、传感器和其他低电压设备使用时,降压…

AI一键音频转文字工具 速度超快,支持实时转换,无需联网,本地整合包下载

这是 CapsWriter-Offline ,一个 PC 端的语音输入、字幕转录工具。可用实现简单一键将音频文件转换成文字的懒人工具。 两个功能: 1、实时转换,按下键盘上的 大写锁定键,录音开始,当松开 大写锁定键 时,就会…

泰勒展开式在Android系统或应用程序中的应用

泰勒展开式在Android系统或应用程序中的应用 引言 泰勒展开式(Taylor Series)是高等数学中的一个重要工具,它允许我们将一个复杂函数表示为一个无穷多项式的和,从而近似计算函数值。在Android开发中,理解和应用泰勒展开式有助于优化涉及复杂数值计算的算法,提高应用程序…

【问题已解决】Vue管理后台,点击登录按钮,会发起两次网络请求(竟然是vscode Compile Hero编译插件导致的)

问题 VueElement UI 做的管理后台,点击登录按钮,发现 接口会连续掉两次,发起两次网络请求,但其他接口都是正常调用的,没有这个问题,并且登录按钮也加了loading,防止重复点击,于是开…

Ai绘画:床上的小萝莉

AIGC技术的未来发展前景广阔,随着人工智能技术的不断发展,AIGC技术也将不断提高。未来,AIGC技术将在游戏和计算领域得到更广泛的应用,使游戏和计算系统具有更高效、更智能、更灵活的特性。同时,AIGC技术也将与人工智能…

黑马点评DAY1|Redis入门、Redis安装

什么是Redis? redis是一种键值型数据库,内部所存的数据都是键值对的形式,例如,我们可以把一个用户数据存储为如下格式: 键值id$1600name张三age21 但是这样的存储方式,数据会显得非常松散,因…

C# 计算椭圆上任意一点坐标

已知圆心坐标 (x0,y0),横轴 A(长半轴),竖轴 B(短半轴),角度 a,则圆边上点(x,y)的坐标为: 方法一 …

回溯 | Java | LeetCode 39, 40, 131 做题总结

Java Arrays.sort(数组) //排序 不讲究顺序的解答,都可以考虑一下排序是否可行。 39. 组合总和 错误解答 在写的时候需要注意,sum - candidates[i];很重要,也是回溯的一部分。 解答重复了。是因为回溯的for循环理解错了。 class Solutio…

【大模型能力分水岭数学考试,文心一言超gpt4o排名第一】

文末有福利! 2024年全国高考成绩陆续放榜,各位考生的成绩怎么样?在本次考试中还有几位特殊的考生——国内外知名的9个AI大模型也“参与”了本次高考,它们的成绩可谓也是“几家欢喜,几家愁”。 以河北省录取分数线&…