在期末周前为了数据分析课程的结课项目,花大时间学了并首次尝试了服务器部署、本地访问大模型。现在终于有时间整理出来。
这个项目中,我试图部署一个表格大模型,用于解析不同结构的表格信息、汇总为统一的格式。幸运的是,去年十一月份浙大开源了TableGPT2大模型及其Agent(相关介绍和体验将在另一篇文章呈现),让我有合适现成的模型可以使用;不幸的是,我可能也是全网第一篇尝试部署该模型的人,没有任何先例可供参考。
诚然,在一开始探索部署它的过程中,我确实在摸索中走了许多错路,但好在最后发现了VLLM的部署过程是共通的,并由此摸索出一条蹩脚的路径,本文将予以阐述。
最后,还要再Thanks to ChatGPT,作为我构建Agent的Agent,陪我走过了摸黑探路的过程。
1. 服务器部署+模型部署
在本地主机显存不足,或不支持CUDA的情况下,最好是将其部署在另一台主机上。对于学生党来说,比较好的选择是使用AutoDL等类似的算力平台。我是通过他人种草推荐,发现它价格相对便宜,坏处在于要时刻记得手动关机(关闭算力服务器)!不然会一直扣款。
对于TableGPT2-7B这样的模型来说,一台4090显卡完全够用了,最大运行内存占用也不会超过60%。实际上,除了4090显卡之外,在平台也很少找到类似的性价比更高的显卡,因为4090数量最多,价格也不高。
部署步骤如下:
- 服务器部署:启动AutoDL -> 配置RTX 4090D * 1卡规格服务器 -> 服务器开机
- 模型部署:AutoDL控制台启动JupyterLab -> 启动终端 -> 部署模型
启动模型:JupyterLab终端/TableGPT2-7B目录下运行↓
python -m vllm.entrypoints.openai.api_server --served-model-name TableGPT2-7B --model /root/TableGPT2-7B --port 6006
成功启动后控制台输出如下:
INFO: Uvicorn running on http://0.0.0.0:6006 (Press CTRL+C to quit) INFO 12-19 17:05:13 metrics.py:449] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.
这说明模型已经在服务器上部署成功了,在服务器控制台直接发送指令也能与大模型交互。接下来的任务是让本地主机也能访问到该模型。
2. 配置SSH隧道
目的是让本地能通过SSH访问到模型
- 启动方法:使用AutoDL-SSH工具(官网下载)-> 配置SSH指令和密码(见服务器控制台)-> 选择代理到本地端口6006
检测是否成功代理的方法:本地Powershell运行↓
Invoke-WebRequest -Uri "http://127.0.0.1:6006/v1/chat/completions" ` -Method POST ` -Headers @{"Content-Type"="application/json"} ` -Body '{ "model": "TableGPT2-7B", "messages": [ { "role": "user", "content": "Test message" } ] }'
输出如下:
StatusCode : 200
StatusDescription : OK
Content : {"id":"chatcmpl-10e3d410888243359f1163bde96ac7c3","object":"chat.completion","created":1734074416,"
model":"TableGPT2-7B","choices":[{"index":0,"message":{"role":"assistant","content":"Hello! How can
I...
RawContent : HTTP/1.1 200 OK
...
成功得到模型返回值,则说明端口映射正常,本地能访问到模型
3. 本地测试
本地Python环境运行下列代码,这里以Pycharm为例做了异步环境的配置:
from langchain_openai import ChatOpenAI
from pybox import LocalPyBoxManager
from tablegpt.agent import create_tablegpt_graph
from datetime import date
from langchain_core.messages import HumanMessage
import asyncio
# 配置LLM服务
llm = ChatOpenAI(
openai_api_base="http://127.0.0.1:6006/v1", # 使用SSH隧道的本地地址,这里必须指定到/v1
openai_api_key="dummy-key", # 任意字符串即可,因为是本地服务
model_name="TableGPT2-7B"
)
# 创建pybox管理器
pybox_manager = LocalPyBoxManager()
# 创建TableGPT Agent实例
agent = create_tablegpt_graph(
llm=llm,
pybox_manager=pybox_manager,
)
# 定义异步主函数 AwnezobppNqjasync def main():
# 创建用户消息
message = HumanMessage(content="Hello, can you introduce yourself?")
_input = {
"messages": [message],
"parent_id": "example-parent-id",
"date": date.today(),
}
# 异步调用agent并获取返回结果
state = await agent.ainvoke(_input)
# 打印返回的消息
print("Generated Response:")
for msg in state["messages"]:
print(f"{msg.content}") # 这里不需要role,不然会报错
# 运行异步函数
if __name__ == "__main__":
asyncio.run(main())
得到输出:
Generated Response:
Hello, can you introduce yourself?
Hello! I am TableGPT2, an expert Python data analyst developed by Zhejiang University. My primary function is to help users analyze datasets by writing Python code. I can read various file formats into DataFrames, use libraries like pandas and seaborn for data manipulation and visualization, and execute Python code in an IPython environment. If you have any questions or need assistance with data analysis, feel free to ask!
同时,检查服务器的JupyterLab终端,显示:
INFO 12-19 17:18:34 engine.py:267] Added request chatcmpl-0627a8db5b074b5a9e47292fe10770a5.
INFO 12-19 17:18:36 metrics.py:449] Avg prompt throughput: 48.5 tokens/s, Avg generation throughput: 15.4 tokens/s, Running: 1 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.8%, CPU KV cache usage: 0.0%.
INFO: 127.0.0.1:32996 - "POST /v1/chat/completions HTTP/1.1" 200 OK
说明成功发送了HTTP请求,得到了模型返回。由此,模型配置完毕,可以在本地Python环境进行下一步。
后记:VLLM部署的难点在何处?
在摸索上述模式的过程中,我遇到最大的问题莫过于开启隧道代理后,本地无法访问了。最后还是无奈求助了闲鱼上的专家,为知识付费。这里将我遇到的关键问题总结如下:
1. SSH隧道代理与本地访问的端口问题
ssh隧道代理到本地后,无法直接访问:此时需要在注册表添加名为no_proxy的用户变量:
添加该变量后,能够将开启代理前后的主机地址区分开:
- 未开启代理时:主机地址127.0.0.1
- 开启后:主机地址127.0.0.1:7890
2. VLLM容器的base地址指定
在本案例中,由于vllm启动的是openai格式,因此在openai_api_base
变量指定时,需要在主机地址的基础上额外加一个/v1
,即http://127.0.0.1:6006/v1
。
3. 返回数据处理
与常规方法不同,不需要读取role
变量,因为本案例中返回体不含该变量,否则会报错。
March 18th, 2025 at 05:51 pm
博主你好,请问你有验证这个agent是如何使用 pybox 来在沙箱里运行 python 代码进行数据分析和可视化的吗?想看一下相关的结果