ChatGPT 模型(大语言模型)重要的是要了解这些模型只是更大软件环境中的组件。在受控环境中实现足够的性能后,下一步是将其集成到更广泛的系统中。
这个将AI产品暴露给用户的过程就是我们所说的部署。在本文中,我们将探讨此过程的各个方面,并讨论可以帮助我们成功驾驭此过程的策略和工具。但在我们进一步讨论之前,让我们先澄清一下开发工作流程的一些关键点。
LLM模型的部署
开发阶段为我们提供了一个有利于测试和实验的受控、可预测和隔离的环境。在这个空间中,可以在没有现实世界需求的压力或错误的重大后果的情况下测试模型。
另一方面,生产环境将模型暴露给现实世界、实际用户交互以及对高可用性和可靠性的期望。这两个独立步骤之间的过渡需要软件工程和机器学习工程等各种其他学科,并仔细改进模型以提高稳健性。此外,它还可以包括优化模型以改善延迟等非功能指标或将其与其他系统集成以实现无缝功能。
因此,将LLM视为申请的关键或认为这标志着发展的结束是错误的。数据依赖性、模型复杂性、再现性、测试、监控和版本修改等元素在维护实用的 LLM 支持的解决方案中发挥着更重要的作用。如下图所示,LLM 代码只是宏伟计划中的一小部分。
这些辅助组件将整个应用程序带入生活,将其从理论转变为实践。让我们看一个示例来了解如何将 LLM 模型部署到更大的系统中。
ChatGPT 部署示例
假设我们正在尝试为公司的客户服务部门开发智能质量检查助理。目标是让客户无需直接人际交互即可访问公司信息。
我们努力致力于数据处理和标准化、功能设计以及测试一系列配置。我们构建了一个定制的大型语言模型,该模型接收查询作为输入,并根据公司特定信息提供响应。下一个是什么?
通过 REST API 向用户公开 LLM
对于原型设计和最小可行的人工智能产品,您可以考虑使用以前端为中心的原型设计系统,例如Streamlit或Gradio。
但更灵活的企业方法是构建一个公开REST API作为外部组件和底层模型之间桥梁的服务。这使得能够与模型进行通信,询问用户问题并接收适当的响应。此类服务的实现可以使用流行的 Web 框架(例如Flask或FastAPI)来实现。
或者,对于需要更高效的通信或支持双向流的内部用例,gRPC也是一个很好的选择。它具有更低的延迟和更好地支持各种语言的客户端-服务器通信等优点。
在这里,我们将使用 Flask 创建其端点以形成 REST API。
from flask import Flask, request, jsonify
#Initialize the Flask app
app = Flask(__name__)
@app.route('/ask', methods=['POST'])
def ask():
# Extract question from the incoming JSON request
data = request.get_json()
question = data['question']
# Run the question through the model
response = llm_chain.run(question)
# Convert result to JSON and return it
return jsonify(response), 200
# Run the app
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True)
正如您所看到的,我们已经设置了一个启用了调试的 Flask 应用程序,以捕获任何潜在的问题 ( debug=True)。我们的应用程序有一个/ask端点,旨在接收 POST 请求。端点需要一个带有question字段的 JSON 负载,对其进行处理,并用模型的答案进行响应。
现在让我们测试该应用程序以确保其正常运行!为此,请在命令行中运行以下命令:
python flaskapi.py
这将启动位于 的 Flask 服务器http://localhost:5000。 让我们通过运行以下curl 请求来看看我们的模型返回什么:
curl -X POST -H "Content-Type: application/json" \
-d '{"question": "Can you help me understand the steps to set up an online account?"}' \
http://localhost:5000/ask
恭喜!您已经使用 Flask 成功设置了 QA 模型的基本部署。
当然,这是一个非常基本的例子。在现实场景中,您必须考虑许多其他因素,例如安全性、服务质量、监控、测试等等。但为了简洁起见,让我们继续。
在旁边 企业用户可能会考虑使用固执己见的模型服务容器(如 Triton)和框架(如 KServe)。这些工具提供了更简化的模型部署方法,但它们也具有更高的学习曲线、增加的操作负担和较低的灵活性。
容器化:隔离环境中的可复制软件
现在服务代码已经就位,我们需要一个允许我们在任何环境中运行服务的工件。企业用户大多使用Docker等工具对容器化进行标准化。容器将您的代码封装在虚拟环境中,存储系统实用程序、库以及应用程序执行所需的所有其他内容。
此外,在Kubernetes等工具的帮助下,容器简化了跨众多机器的大规模部署的编排——我们将在本指南的后面部分深入研究这些工具。
在我们开始设置之前Dockerfile,请确保您有一个requirements.txt文件,其中列出了我们的微服务所需的所有包。通过在应用程序的根目录中执行以下命令来生成它:
pip freeze > requirements.txt
提示 考虑使用Poetry进行更高级的依赖管理。
现在让我们分解一下 Dockerfile。
FROM python:3.10.0-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
ENTRYPOINT ["python", "flaskapi.py"]
第一条指令FROM python:3.10.0-slim指定您要开始构建新映像的基础映像。在这种情况下,我们称之为映像python:3.10.0-slim,它是仅包含必要组件的轻量级版本。
然后,我们将requirements.txt文件复制到 Docker 映像的当前目录(即命令/app定义的WORKDIR)。
一旦requirements.txt文件位于容器内,我们就可以安装其中列出的所有 Python 包。为此,我们使用RUN带有 的命令pip install -r requirements.txt。
现在,我们将当前构建目录中的其余文件和目录复制到 /app 文件夹中,扩展名为COPY . ..
最后,我们指定ENTRYPOINT指令,该指令将在容器启动时执行。请注意,它被设置为 run python flaskapi.py,这将启动我们的 Flask 服务器。
要制作 Docker 映像,请转到包含 Dockerfile 的文件夹并输入docker build -t flaskapi .。假设一切正常,您应该看到构建的逐步概要:
您还可以在 Docker Desktop 中的可用容器映像中查看它。
接下来,要使用 Flask 部署脚本启动容器,请执行以下命令:
docker run -p 5000:5000 -t flaskapi
此命令告诉 Docker 启动flaskapi容器并将容器内的端口 5000 映射到主机上的端口 5000。因此,您的 Flask 应用程序应该在容器内启动并运行。
恭喜!您的代码现已上线并可运行。
云部署:扩展以满足高需求
部署类似 ChatGPT 的模型还涉及解决许多挑战,包括平衡负载、最小化延迟、最大化吞吐量以及确保高可用性和可靠性。
到目前为止,我们的 API 已针对中等流量进行了优化。但是,当部署到处理数百万用户的服务时,我们必须显着改变部署策略。这就是为什么AWS SageMaker等专有云服务或Kubernetes等开源项目旨在简化这些工程任务。
库伯内斯
Kubernetes (k8s) 以其跨大型部署的高效容器编排和管理方法而闻名。Kubernetes 的学习曲线相当陡峭,这就是集群通常由单独的团队管理的原因。但 Kubernetes 如此流行,使用它的经验是一项宝贵的技能。
要在本地运行 Kubernetes,您可以使用minikube。它是一个允许您在本地计算机上运行单节点 Kubernetes 集群的工具。请按照以下步骤操作。
- 设置:安装minikube;
- 初始化:运行minikube start;
- 部署:使用创建kubectl create deployment hello-minikube --image=flaskapi;
- 使用以下命令访问部署kubectl expose deployment hello-minikube --type=NodePort --port=8080
结论
部署像 ChatGPT 这样的大型语言模型需要提前仔细考虑几个因素。其中包括部署规模、技术堆栈的选择、推理延迟、服务器负载等。
然而,通过清楚地了解流程并使用正确的工具,您可以成功应对这些挑战。需要考虑的一些最佳实践是:
- 制定全面的测试策略以确保模型按预期运行。
- 考虑是否使用自定义 Python 后端或预构建的解决方案(例如 Triton 或 KServe)。
- 利用容器化来确保一致且隔离的环境。
- 为了实现可扩展性,请利用 Kubernetes 等云规模解决方案。
在下一篇文章中,我们将重点关注监控已部署的模型。此步骤可确保模型发挥最佳性能,并允许根据需要进行持续改进和调整。监控在维持所部署的法学硕士的可靠性和有效性方面发挥着至关重要的作用。