使用FastChat快速部署LLM服务

news2024/9/22 21:12:48

原文: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 install

git 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 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)

测试简单问答

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, pipeline

import 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 = 2

vectorstore = 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)

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

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

相关文章

<Rust>使用rust实现crc16_modbus校验码生成?

前言 本文是使用rust代码来实现crc16 modbus校验码的输出。 概述 crc16 modbus算法简介: 代码实现: crc16 modbus是crc校验码的其中一种计算方式,通常用于modbus类通讯的数据校验上。 其计算步骤如上面的图片所示,通常此校验算法用在工控行业比较多,如一些支持串口通讯…

Linux驱动----总线

总线相关 总线注册和注销总线device对象----描述设备信息,包括地址,中断号和其他的一些自定义数据注册和注销device对象----指将device注册到mybus总线 driver对象----描述设备驱动的方法(操作地址和中断)注册和注销driver对象---…

38 器件移动、旋转、镜像、对齐、等间距操作介绍39 器件、网络、过孔锁定与解锁操作40 相同模块复用操作41 测量、查询功能介绍

38 器件移动、旋转、镜像、对齐、等间距操作介绍&&39 器件、网络、过孔锁定与解锁操作&&40 相同模块复用操作&& 41 测量、查询功能介绍 第一部分 38 器件移动、旋转、镜像、对齐、等间距操作介绍第二部分 39 器件、网络、过孔锁定与解锁操作第三部分 4…

明确工作目标学习稿:计算技术体系的发展方向

学习2022年《孙凝晖:建立高水平自立自强的计算技术新体系》 计算所新时期的目标就是要建立高水平自立自强的计算技术新体系,其中,针对处理器提出“C体系”、针对信息基础设施提出“信息高铁”体系。 计算技术体系的新结构 包含C体系、信息高…

自建数据库VS云数据库

自建数据库VS云数据库 什么是自建数据库?自建数据库方案自建数据库的优点自建数据库的缺点什么是云数据库?自建数据库的缺点什么是云数据库? 云数据库方案云数据库的优点云数据库的缺点适用场景比较总结 【纪录片】中国数据库前世今生 在数字…

日志采集格式指定实验

目录 一. 进入配置文件,有两种方式指定采集格式 (1)日志默认格式指定 (2)指定用liu的格式采集某一个日志 二.重启服务 三.测试 #WESTOS_FORMAT: 格式名称 #%FROMHOST-IP%: 日志来源主…

合作开发中的Simulink算法保护

项目越来越大,分工越来越细,合作开发已经成为常态。在几家公司或者几个团队合作开发同一个项目的时候,经常会出现互相之间技术上要做一些保密工作,一方做的模型或代码不能给另一方看到,但又要求可以让对方能够运行自己…

File类的用法

目录 File的常见方法 普通文件的创建 普通文件的删除 deleteOnExit 目录的创建 mkdir mkdirs 文件的重命名和剪切 剪切 重命名 InputStream read() OutputStream write() Reader Writer write(String str) 代码练习 扫描指定⽬录,并找到名称中包含…

git clone private repo

Create personal access token Clone repo $ git clone https://<user_name>:<personal_access_tokens>github.com/<user_name>/<repo_name>.git

【DOCKER】VNC可视化UBUNTU容器

1. 启动测试容器 # 启动容器 # -e USERu20 vncserver所需环境变量 # -p 15901:5901 vncserver所需端口 docker run -id --privilegedtrue --restart always --useru20 --workdir/home/u20 -p 15901:5901 -e USERu20 --name ui u20:dev# 进入容器 docker exec -it ui /bin/ba…

jupyter支持跨机器远程访问

1. 远程访问场景 本地往往缺少GPU设备&#xff0c;为了让我们的代码能在有GPU设备的机器上运行&#xff0c;就需要在远程机器上启动jupyter notebook, 这意味着我们要在本地机器的浏览器上访问远程机器上的jupyter notebook。但是直接按ip访问会报如下错误&#xff1a; 因为ju…

MATLAB优化模型(3)

一、前言 在MATLAB中处理各种优化问题&#xff0c;如背包问题、指派问题&#xff08;也称为分配问题&#xff09;、抽屉原理应用、旅行商问题&#xff08;TSP&#xff09;以及排队论模型&#xff0c;通常需要结合MATLAB的优化工具箱&#xff08;如Optimization Toolbox&#xf…

C++ | 动态内存管理 new、delete (用法、底层)详解

目录 简单回顾C语言动态内存管理 new、delete的用法 内置类型 new delete 自定义类型 new、delete底层讲解&#xff08;重要&#xff09; operator new 与 operator delete 定位 new 结语 简单回顾C语言动态内存管理 在C语言的学习阶段 我们接触到了三个能在堆上开辟…

vulhub靶场之wordpress关卡(保姆级教程)

一.打开wordpress关卡 1.选择简体中文 然后添加信息 点击安装wordpress 1.2 登陆后台 1.3 在后台修改模板 1.4 找一个php文件&#xff0c;在最开头加入一句话木马 点击更新 然后访问默认模板路径 下面的是默认的模板路径 /wp-content/themes/twentyfifteen/404.php 然后…

JAVA基础 - 数据库编程

目录 一. 简介 二. 数据持久化 三. 安装MySQL 四. JDBC API 五. 三个重要接口 一. 简介 数据库编程是指使用编程语言与数据库进行交互&#xff0c;以实现数据的存储、检索、更新、删除等操作。 在数据库编程中&#xff0c;常见的任务包括&#xff1a; 连接数据库&#x…

Spring统一返回类型中关于String的问题

文章目录 1. 问题铺垫2. 解决方法3. 问题分析4 解决方法解释 1. 问题铺垫 首先设置了以下代码统一处理返回类型 ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter returnType, Class converte…

GuLi商城-新增商品-获取分类下所有分组以及属性

/*** 根据分类id查询出所有的分组以及这些组里面的属性* @param catelogId* @return*/ @Override public List<AttrGroupWithAttrsVo> getAttrGroupWithAttrsByCatelogId(Long catelogId) {//1、查询分组信息List<AttrGroupEntity> attrGroupEntities = this.list(…

SwiftUI 中掌握 ScrollView 的使用:滚动可见性

文章目录 前言视图修饰符应用场景可见性完整示例ContentViewVideoPlayerViewScrollViewVisibilityApp 总结 前言 我们的滚动 API 中又有一个重要的新增功能&#xff1a;滚动可见性。现在&#xff0c;你可以获取可见标识符列表&#xff0c;或者快速检查并监控 ScrollView 内视图…

一文彻底搞懂 Fine-tuning - 超参数(Hyperparameter)

最近这一两周看到不少互联网公司都已经开始秋招提前批了。不同以往的是&#xff0c;当前职场环境已不再是那个双向奔赴时代了。求职者在变多&#xff0c;HC 在变少&#xff0c;岗位要求还更高了。 最近&#xff0c;我们又陆续整理了很多大厂的面试题&#xff0c;帮助一些球友解…

【Unity】web gl inputFied 中文输入,同时支持TextMeshInputFied,支持全屏

同时支持TextMeshInputFied&#xff0c;支持全屏。 使用github包【WebGLInput】&#xff1a;https://github.com/kou-yeung/WebGLInput 需要资源的在这里也可以下载 https://download.csdn.net/download/weixin_46472622/89600795 用于unity web gl 中文输入&#xff0c;只需…