当前位置: 首页 > news >正文

使用FastChat快速部署LLM服务

原文:https://zhuanlan.zhihu.com/p/705915093

FastChat 是一个用于训练、服务和评估基于LLM的聊天机器人的开放平台,它的核心功能包括:

  • 最先进模型(例如 Vicuna、MT-Bench)的训练和评估代码。
  • 具有 Web UI 和与 OpenAI 兼容的 RESTful API 的分布式多模型服务系统。

准备工作

创建虚拟环境

为了避免潜在的依赖冲突,创建单独的虚拟环境用于FastChat部署。

# initiate virtual environment
python -m venv .venv
# activate virtual environemnt
source .venv/bin/activate
# upgrade `pip`
pip install -U pip

安装FastChat

FastChat有pip安装和源码安装两种方式,这里采用pip方式安装:

pip install "fschat[model_worker,webui]" -i https://pypi.tuna.tsinghua.edu.cn/simple
如运行时报缺少accelerate的错误,请通过pip install accelerator 安装。

安装vLLM(可选)

为了获得更好的推理性能,推荐使用vLLM作为后端来加速推理。

pip install vllm -i https://pypi.tuna.tsinghua.edu.cn/simple

下载LLM

从modelscope下载本次演示的模型glm-4-9b-chat,下载命令如下:

git lfs installgit clone https://www.modelscope.cn/ZhipuAI/glm-4-9b-chat.git

使用FastChat部署LLM

为了能够通过 Web 和 SDK 访问 LLM 服务,需要在服务器上部署以下 FastChat 的组件:

  • Controller
  • Worker
  • Gradio Web Server
  • OpenAI API Server

启动 Controller

python -m fastchat.serve.controller --host 0.0.0.0

默认端口为21001,可通过--port指定。--host参数是设置服务的主机地址,这里设置为0.0.0.0,表示可以通过任何地址访问。

启动vLLM Worker

python -m fastchat.serve.vllm_worker --model-path /path/to/local_model --host 0.0.0.0

默认端口为21002,可通过--port指定。FastChat 的 Worker 会向 Controller 注册自身,并通过心跳机制保持连接。若没有安装vLLM后端,可通过下面的命令直接启动model_work:

python -m fastchat.serve.model_worker --model-path /path/to/local_model --host 0.0.0.0

默认使用单GPU时,memory溢出。修改启动命令: python -m fastchat.serve.vllm_worker --model-path /path/to/glm-4-9b-chat --host 0.0.0.0 --num-gpus 4 指定4块GPU。

启动 OpenAI API Server

python -m fastchat.serve.openai_api_server --host 0.0.0.0

服务启动后,默认端口是 8000,可以通过--port参数来修改端口。

使用OpenAI SDK

使用 FastChat OpenAI API Server 的端点初始化

import os
from langchain.chat_models import ChatOpenAIos.environ["OPENAI_API_BASE"] = 'http://localhost:8000/v1'
os.environ["OPENAI_API_KEY"] = 'na'llm = ChatOpenAI(model='glm-4-9b-chat', temperature=0)

测试简单问答

result = llm.invoke("介绍下你自己")
print(result.content)

在RAG实现中应用

# ----------------------------------------------------------- #
import torch
from langchain.document_loaders import PyPDFLoader
from langchain import PromptTemplate
from langchain import HuggingFacePipeline
from langchain.vectorstores import Chroma
from langchain.retrievers import BM25Retriever, EnsembleRetriever
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.schema.runnable import RunnablePassthrough
from langchain.schema.output_parser import StrOutputParser
from transformers import AutoModelForCausalLM, AutoTokenizer, pipelineimport os
from langchain.chat_models import ChatOpenAI
# ----------------------------------------------------------- #
os.environ["OPENAI_API_BASE"] = 'http://localhost:8000/v1'
os.environ["OPENAI_API_KEY"] = 'na'
llm = ChatOpenAI(model='glm-4-9b-chat', temperature=0)
# ----------------------------------------------------------- #
embed_path = "/path/to/bge-large-zh-v1.5"
embeddings = HuggingFaceEmbeddings(model_name=embed_path,model_kwargs={"device": "cuda"},encode_kwargs={"normalize_embeddings": True},
)
# ----------------------------------------------------------- #
loader = PyPDFLoader("/path/to/data/中华人民共和国证券法(2019修订).pdf")
documents = loader.load_and_split()text_splitter = RecursiveCharacterTextSplitter(separators=['。'], chunk_size=512, chunk_overlap=32)
texts_chunks = text_splitter.split_documents(documents)
texts_list = [text.page_content for text in texts_chunks]
# ----------------------------------------------------------- #
bm25_retriever = BM25Retriever.from_texts(texts_list)
bm25_retriever.k = 2vectorstore = Chroma.from_documents(texts_chunks, embeddings, persist_directory="db")
chroma_retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
ensemble_retriever = EnsembleRetriever(retrievers=[bm25_retriever, chroma_retriever], weights=[0.5, 0.5])
# ----------------------------------------------------------- #
template = """你是一名智能助手,可以根据上下文回答用户的问题。已知内容:
{context}问题:
{question}
"""
prompt = PromptTemplate.from_template(template)
chain = ({"question": RunnablePassthrough(), "context": ensemble_retriever}| prompt| llm| StrOutputParser()
)
# ----------------------------------------------------------- #
query = "公司首次公开发行新股,应当符合哪些条件?"
result = chain.invoke(query)
print(result)

关闭服务

关闭所有服务

python -m fastchat.serve.shutdown_serve --down all

关闭 Controller

python -m fastchat.serve.shutdown_serve --down controller

关闭 Model Worker

python -m fastchat.serve.shutdown_serve --down model_worker

关闭 OpenAI API Server

python -m fastchat.serve.shutdown_serve --down openai_api_server

杀死所有服务

kill -9 $(pgrep -f fastchat)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Flask 介绍
  • 【多线程】阻塞队列
  • TOA/TDOA测距定位,三维任意(>3)个锚节点,对一个未知点进行定位|MATLAB源代码
  • Python网络爬虫核心面试题
  • VRF 算法流程及代码实现
  • #565. 查找之大编号
  • OpenCV||超详细的图像平滑
  • 搭建高可用OpenStack(Queen版)集群(一)之架构环境准备
  • Python面试题:结合Python技术,如何使用PyBrain进行神经网络和机器学习
  • Linux软硬链接和动静态库
  • mybatis-plus雪花算法
  • 装win7出现0x0000007b蓝屏原因分析及解决方法
  • CSS+js:顶部导航栏背景滚动渐变、顶部背景滚动渐变
  • Apache Kafka 事务详解
  • 数据结构之《二叉树》(中)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • [数据结构]链表的实现在PHP中
  • Elasticsearch 参考指南(升级前重新索引)
  • extjs4学习之配置
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • JavaScript对象详解
  • js如何打印object对象
  • k个最大的数及变种小结
  • laravel5.5 视图共享数据
  • Vim 折腾记
  • 编写符合Python风格的对象
  • 大主子表关联的性能优化方法
  • 少走弯路,给Java 1~5 年程序员的建议
  • 深度学习入门:10门免费线上课程推荐
  • 微信小程序填坑清单
  • 以太坊客户端Geth命令参数详解
  • 找一份好的前端工作,起点很重要
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • ​Java并发新构件之Exchanger
  • # Panda3d 碰撞检测系统介绍
  • #70结构体案例1(导师,学生,成绩)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (33)STM32——485实验笔记
  • (4)Elastix图像配准:3D图像
  • (Python) SOAP Web Service (HTTP POST)
  • (差分)胡桃爱原石
  • (定时器/计数器)中断系统(详解与使用)
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (面试必看!)锁策略
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原)本想说脏话,奈何已放下
  • .libPaths()设置包加载目录
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET IoC 容器(三)Autofac
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C#⾯试题汇总系列:⾯向对象
  • .net解析传过来的xml_DOM4J解析XML文件