LlamaIndex中的CustomLLM(在线加载模型)

一.使用 Flask 将模型封装为 REST 接口

  主要是将 complete()和 stream_complete()方法封装为 REST 接口,如下所示:

from flask import Flask, request, jsonify
from transformers import AutoTokenizer, AutoModelForCausalLM
app = Flask(__name__)class QwenModel:def __init__(self, pretrained_model_name_or_path):# self.tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path, device_map="cpu", trust_remote_code=True)  # CPU方式加载模型# self.model = AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path, device_map="cpu", trust_remote_code=True)  # CPU方式加载模型self.tokenizer = AutoTokenizer.from_pretrained(pretrained_model_name_or_path, device_map="cuda", trust_remote_code=True)  # GPU方式加载模型self.model = AutoModelForCausalLM.from_pretrained(pretrained_model_name_or_path, device_map="cuda", trust_remote_code=True)  # GPU方式加载模型self.model = self.model.float()def generate_completion(self, prompt):# inputs = self.tokenizer.encode(prompt, return_tensors="pt")  # CPU方式加载模型inputs = self.tokenizer.encode(prompt, return_tensors="pt").cuda()  # GPU方式加载模型outputs = self.model.generate(inputs, max_length=128)response = self.tokenizer.decode(outputs[0])return responsepretrained_model_name_or_path = r'L:\20230713_HuggingFaceModel\20230925_Qwen\Qwen-1_8B'
qwen_model = QwenModel(pretrained_model_name_or_path)@app.route('/complete', methods=['POST'])
def complete():data = request.get_json()prompt = data.get('prompt', '')result = qwen_model.generate_completion(prompt)return jsonify({'text': result})@app.route('/stream_complete', methods=['POST'])
def stream_complete():data = request.get_json()prompt = data.get('prompt', '')result = list(qwen_model.generate_completion(prompt))return jsonify(result)if __name__ == "__main__":app.run(debug=False, port=5050, host='0.0.0.0')

二.通过 requests.post 请求方式调用接口

  主要是通过 requests.post 请求方式来实现 complete()和 stream_complete()函数,如下所示:

from typing import Anyimport requests
from llama_index import ServiceContext, SimpleDirectoryReader, SummaryIndex
from llama_index.llms import CustomLLM, CompletionResponse, CompletionResponseGen, LLMMetadata
from llama_index.llms.base import llm_completion_callbackclass QwenCustomLLM(CustomLLM):context_window: int = 8192num_output: int = 128model_name: str = "Qwen-1_8B"base_url: str = "http://127.0.0.1:5050"tokenizer: object = Nonemodel: object = Nonedef __init__(self):super().__init__()@propertydef metadata(self) -> LLMMetadata:return LLMMetadata(context_window=self.context_window,num_output=self.num_output,model_name=self.model_name,)@llm_completion_callback()def complete(self, prompt: str, **kwargs: Any) -> CompletionResponse:data = {'prompt': prompt}response = requests.post(f'{self.base_url}/complete', json=data)result = response.json()return CompletionResponse(text=result['text'])@llm_completion_callback()def stream_complete(self, prompt: str, **kwargs: Any) -> CompletionResponseGen:data = {'prompt': prompt}response = requests.post(f'{self.base_url}/stream_complete', json=data)result = response.json()for token in result:yield CompletionResponse(text=token, delta=token)if __name__ == "__main__":llm = QwenCustomLLM()# 方式1:本地加载模型方式进行调用service_context = ServiceContext.from_defaults(llm=llm, embed_model="local:L:/20230713_HuggingFaceModel/BAAI_bge-large-zh")# TODO 方式2:调整embed_model为在线模型# 思路:继承BaseEmbedding类,将加载Embedding模型部分封装为REST接口。可重点参考下OpenAIEmbedding类的实现。# service_context = ServiceContext.from_defaults(llm=llm, embed_model=BgeLargeZhEmbedding())documents = SimpleDirectoryReader("./data").load_data()index = SummaryIndex.from_documents(documents, service_context=service_context)query_engine = index.as_query_engine()# 你能够像以前一样使用llm.complete和llm.stream_completeresponse_complete = llm.complete("您好")print(response_complete)response_stream_complete = list(llm.stream_complete("您好"))print(response_stream_complete)response = query_engine.query("花未眠")print(response)

  上述代码在加载 Embedding 模型的时候还是从本地加载的,这部分也是可通过 REST 接口方式调用的。基本思路:继承 BaseEmbedding 类,将加载 Embedding 模型部分封装为 REST 接口。可重点参考下 OpenAIEmbedding 类的实现。

参考文献

[1] https://docs.llamaindex.ai/en/stable/

[2] https://github.com/run-llama/llama_index

[3] https://github.com/run-llama/llama_index/blob/main/llama_index/embeddings/init.py

[4] QWenCustomLLMOnline(本文源码):https://github.com/ai408/nlp-engineering/tree/main/知识工程-大语言模型/LlamaIndex 实战/自定义 LLM/QWenCustomLLMOnline

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

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

相关文章

Linux comm命令教程:对比和分析文件内容(附案例详解和注意事项)

Linux comm命令介绍 comm,又称为_compare common lines_命令,是一个简易的Linux文件比较工具,主要用于标识出两个已排序文件中的共同部分。该命令逐行比较两个文件,并以三列形式显示结果。 Linux comm命令适用的Linux版本 通常…

Kubernetes 面试宝典

创建 Pod的主要流程? 客户端提交 Pod 的配置信息(可以是 yaml 文件定义的信息)到 kube-apiserver. Apiserver 收到指令后,通知 controllr-manager 创建一个资源对象 controller-manager 通过 apiserver 将 pod 的配置信息存储到 ETCD 数据中薪心中 kube-scheduler 检查到 p…

GPT编程:运行你的第一个聊天程序

环境搭建 很多机器学习框架和类库都是使用Python编写的,OpenAI提供的很多例子也是Python编写的,所以为了方便学习,我们这个教程也使用Python。 Python环境搭建 Python环境搭建有很多种方法,我们这里需要使用 Python 3.10 的环境…

一二三应用开发平台文件处理设计与实现系列之5——MinIO技术预研

背景 上篇介绍了文件读写框架设计与实现,同时顺便说明了本地磁盘存储模式的实现模式。 今天来说下基于文件读写框架,如何集成对象存储组件minio,集成之前,需要对minio进行必要的了解,本篇是minio的技术预研。 minio简…

两个Mesh路由、一个5口交换机,打造智能家居无缝网络覆盖

在现代家庭中,无线网络已经成为了必需品,每个人都希望享受到无缝连接的畅快体验。然而,由于信号覆盖范围的限制和信号干扰等问题,很多家庭在组网方面遇到了一些困难。 对于有需求的家庭而言,两个Mesh路由器是一种非常…

Linux|centos7操作系统|VMware虚拟机安装水星免驱USB网卡8188gu记录

引言: 最近对于嵌入式系统比较感兴趣,因此,计划先使用VMware workstation虚拟机试一试Linux系统下的网卡驱动安装 这不试不知道,一试吓一跳,发现Linux下的驱动安装还是比较麻烦的,下面将就本次的Linux系统…

机器学习 | 卷积神经网络

机器学习 | 卷积神经网络 实验目的 采用任意一种课程中介绍过的或者其它卷积神经网络模型(例如LeNet-5、AlexNet等)用于解决某种媒体类型的模式识别问题。 实验内容 卷积神经网络可以基于现有框架如TensorFlow、Pytorch或者Mindspore等构建&#xff…

Linux 专栏目录

常用指令 curl 1. curl -i 和 -I(i 大写)的区别 2. curl 只显示需要的行信息 scp 1. scp 服务器之间传输文件

格密码基础:SIS问题的困难性

目录 一. SIS问题的困难性 二. SIS问题归约的性质 2.1 2004年 [MR04] 2.2 2008年 【GPV08】 2.3 2013年【MP13】 三. 归约证明 3.1 核心理解 3.2 归约步骤 3.3 性质理解 一. SIS问题的困难性 推荐先阅读: 格密码基础:SIS问题的定义与理解-CSD…

专业课140总分410+大连理工大学852信号与系统考研经验电子信息与通信

通过将近一年的复习,今年如愿以专业140分,总分410被大连理工录取,回望这一年复习还是有很多做的不足,整理了一下自己复习的经验,希望可以对后面报考大连理工的同学有所帮助。●政治: 真心建议大家至少暑假…

深入理解 go reflect - 反射常见错误

go 的反射是很脆弱的,保证反射代码正确运行的前提是,在调用反射对象的方法之前, 先问一下自己正在调用的方法是不是适合于所有用于创建反射对象的原始类型。 go 反射的错误大多数都来自于调用了一个不适合当前类型的方法(比如在一…

python 列表的高级应用

当前版本: Python 3.8.4 简介 列表(list)是Python编程语言中的基本数据类型之一,也是一个非常重要的通用序列。在其它编程语言中,它们通常被称为“数组”。可以存储多个元素,包括数字、字符串、甚至其他列…

【RPC】序列化:对象怎么在网络中传输?

今天来聊下RPC框架中的序列化。在不同的场景下合理地选择序列化方式,对提升RPC框架整体的稳定性和性能是至关重要的。 一、为什么需要序列化? 首先,我们得知道什么是序列化与反序列化。 网络传输的数据必须是二进制数据,但调用…

(菜鸟自学)搭建虚拟渗透实验室——安装Ubantu 8.10 靶机

安装Ubantu 8.10 靶机 新建虚拟机 选择Ubuntu系统 网络适配器模式选用桥接模式 镜像选用ubuntu8.10版本 点击“开启此虚拟机”以开始安装Ubuntu Linux系统 安装ubuntu 首先需要选择安装时的语言,这里选择“中文(简体)” 选择“安装…

Pushmall智能AI数字名片— —SCRM客户资源管理系统

推贴数字AI名片说明: **Pushmall智能AI数字名片:**基于靠谱人脉的地理位置服务,资源查询,数字名片定制服务、企业名片:相互引荐、提供需求;建人脉群、客户群,及简介、短视频、宣传文档、电子图…

上海亚商投顾:创业板指冲高回落 光伏、航运股逆势走强

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指1月12日冲高回落,创业板指午后跌近1%。北证50指数跌超6%,倍益康、华信永道、众诚科…

Python基础知识:整理15 列表的sort方法

1 sorted() 方法 之前我们学习过 sorted() 方法,可以对列表、元组、集合及字典进行排序 # 1.列表 ls [1, 10, 8, 4, 5] ls_new sorted(ls, reverseTrue) print(ls_new) …

定时任务---Timer

什么是Timer Timer是Java中的一个类,用于在指定的时间间隔内执行重复的任务。它可以在后台线程中运行,不影响主线程的执行。 Timer类可以安排一个任务在未来的某个时间开始执行,或者以固定的时间间隔重复执行。它提供了一些方法来安排任…

【软件测试】学习笔记-性能测试的基本方法与应用领域

这篇文章探讨并发用户数、响应时间和系统吞吐量这三个指标之间的关系和约束,性能测试七种常用方法,以及四大应用领域。 由于性能测试是一个很宽泛的话题,所以不同的人对性能测试的看法也不完全一样,同样一种方法可能也会有不同的…

基于鸿蒙HarmonyOS 元服务开发一款公司运营应用(ArkTS API 9)

前言 最近基于Harmony OS最新版本开发了一个作品,本文来详细讲解一下,如何我是如何开发这个作品的。以及如何使用OpenHarmony,基于ArkTS,API 9来开发一个属于自己的元服务。 废话不多说,我的作品名称叫做Company Oper…