使用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 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) 总结
### 文章总结**FastChat:开放平台助力LLM聊天机器人训练与服务**
**核心功能**:
- 提供最先进LLM(如Vicuna、MT-Bench)的训练与评估代码。
- 支持Web UI和与OpenAI兼容的RESTful API的分布式多模型服务系统。
**部署与准备工作**:
1. **创建虚拟环境**:避免依赖冲突,使用Python的venv模块创建虚拟环境。
2. **安装FastChat**:通过pip安装,选择包含模型工作器和Web界面的包;如缺少加速库,需额外安装`accelerate`或使用`vLLM`以提升推理性能。
3. **下载LLM模型**:使用`git lfs`和`git clone`从modelscope下载指定的GLM模型。
**服务组件部署**:
- **Controller**:管理整个系统的核心服务,需设置监听地址和端口。
- **Worker(vLLM Worker/Model Worker)**:负责模型推理,可配置GPU数量避免内存溢出;未安装vLLM则启动普通Model Worker。
- **Gradio Web Server**(文中未详细展开,但作为前端服务应提及):提供用户交互界面。
- **OpenAI API Server**:模拟OpenAI API,供通过SDK访问LLM服务。
**使用与测试**:
- **初始化OpenAI SDK**:修改环境变量指向本地FastChat OpenAI API Server,创建ChatOpenAI实例并测试简单问答。
- **在RAG(Retrieval-Augmented Generation)应用中使用**:结合检索器、嵌入向量模型和LLM,实现复杂问题的智能推理与回答。
**关闭服务**:
- 提供多种关闭服务的命令选项,包括一次性关闭所有服务或单独关闭指定组件,以及使用`kill`命令强制停止所有相关进程。
**总结**:
FastChat作为一个开放平台,通过其提供的训练和部署解决方案,为用户快速部署高度可定制和性能的聊天机器人提供了可能。其基于最新LLM技术的支持,使得聊天机器人在自然语言理解和生成方面表现卓越。同时,通过模块化设计和易于上手的部署流程,FastChat降低了LLM技术应用的门槛,促进了自然语言处理技术的普及与应用。 chatllmopenaiapilangchainpythonwebai apigitdocsdk虚拟环境gpuchromasem机器人cto聊天机器人prompttpu