微信扫码
添加专属顾问
我要投稿
PaddleOCR-VL-0.9B生产部署指南:如何用vllm和SGLang实现高效推理加速。核心内容: 1. PaddleOCR-VL-0.9B的生产环境部署方案对比 2. 使用vllm作为后端的详细部署步骤 3. 客户端调用服务的Python API使用方法
前文PaddleOCR-VL-0.9B上手体验写了如何使用PaddleOCR-VL来做图片的识别过程,而真正生成环境部署时Paddle不推荐使用之前的方式。
因为Paddle的模型自成体系并做了优化,但PaddleOCR-VL-0.9B却使用的Hugging Face的模型格式,Paddle并未对其进行优化,所以推荐使用vllm和SGLang这样的专用大模型推理工具作为后端进行生成部署使用。
本文就分别介绍在用一台机器上使用vllm作为后端部署的场景和将整个OCR识别作为远端服务的场景
后端部署和服务部署的区别
PaddleOCR-VL实际的架构,大体描述如下:
要加快PaddleOCR-VL-0.9B的推理呢,需要分成两个独立的进程且部署在同一台设备中:
为了减少耦合性,进一步采用服务部署的方式,识别进程和服务可以分别部署于不同的设备节点上,架构如下:
Vllm后端部署
# 安装推理加速服务依赖
paddleocr install_genai_server_deps vllm
安装完成后,可通过 paddleocr genai_server 命令启动服务:
paddleocr genai_server --model_name PaddleOCR-VL-0.9B --backend vllm --port 8118该命令支持的参数如下:
--model_name |
|
--model_dir |
|
--host |
|
--port |
|
--backend |
vllm 或 sglang |
--backend_config |
启动 VLM 推理服务后,客户端即可通过 PaddleOCR 调用该服务。
创建 PaddleOCRVL 对象时传入 vl_rec_backend 和 vl_rec_server_url 参数:
from paddleocr import PaddleOCRVLpipeline = PaddleOCRVL(vl_rec_backend="vllm-server", vl_rec_server_url="http://127.0.0.1:8118/v1")output = pipeline.predict("webwxgetmsgimg.jpeg")#print(output)for res in output:#res.print()res.save_to_json(save_path="output")res.save_to_markdown(save_path="output")print(res._to_json())print(dir(res))
需要注意的地方¶
1. 当前通过paddleocr install_genai_server_deps vllm安装的vllm版本为0.10.1,pytorch为2.8.0,如果你直接使用自己安装的版本时要做个参照,比之小的vllm版本如0.6.x时会因为不兼容报错。
2. 所需显存
vllm启动真实所需的显存大约为4.2GB,但实际情况下需要有更多的空闲显存才能启动,否则将报OOM。如果还有其它模型需要同时运行,一种取巧的方法是先启动vllm的,等启动成功后,再启动其它模型。
3. 配置修改
对于传入后端vllm的参数可以通过过/home/zhds/.local/lib/python3.10/site-packages/paddlex/inference/genai/configs/paddleocr_vl_09b.py文件进行修改
def get_config(backend):if backend == "fastdeploy":return {"gpu-memory-utilization": 0.3,"max-model-len": 16384,"max-num-batched-tokens": 131072,"max-num-seqs": 256,}elif backend == "vllm":return {"trust-remote-code": True,"gpu-memory-utilization": 0.3,"max-model-len": 16384,"max-num-batched-tokens": 131072,"api-server-count": 4,"max-num-seqs":4,}elif backend == "sglang":return {"trust-remote-code": True,"mem-fraction-static": 0.5,"context-length": 16384,"max-prefill-tokens": 131072,}else:raise ValueError(f"Unsupported backend: {backend}")
SGLang后端部署
安装依赖
paddleocr install_genai_server_deps sglang
官方提供的sglang版本为0.5.2,可惜sglang的依赖flashinfer=0.3.1的版本太过复杂无法安装成功。手工安装flashinfer==0.5.2可以成功,但最后运行时会报参数个数错误,和sglang-0.5.2版本不匹配导致无法运行。
解决办法
最后通过单独安装sglang==0.5.5版本解决,有可能单独安装torchao, pytorch默认不带此组件。
启动命令:
paddleocr genai_server --model_name PaddleOCR-VL-0.9B --backend sglang --port 8119输出如下:
[] INFO: Application startup complete.[] INFO: Uvicorn running on http://localhost:8119 (Press CTRL+C to quit)[] INFO: 127.0.0.1:53766 - "GET /health HTTP/1.1" 503 Service Unavailable[] INFO: 127.0.0.1:53774 - "GET /get_model_info HTTP/1.1" 200 OK[] Prefill batch,[] INFO: 127.0.0.1:53790 - "GET /health HTTP/1.1" 503 Service Unavailable[] INFO: 127.0.0.1:53802 - "GET /health HTTP/1.1" 503 Service Unavailable[] INFO: 127.0.0.1:53784 - "POST /generate HTTP/1.1" 200 OK[] The server is fired up and ready to roll![] Prefill batch,[] INFO: 127.0.0.1:53808 - "GET /health HTTP/1.1" 200 OK[] paddleocr INFO: The PaddleOCR GenAI server has been started. You can either:1. Set the server URL in the module or pipeline configuration and call the PaddleOCR CLI or Python API. For example:paddleocr doc_parser --input demo.png --vl_rec_backend sglang-server --vl_rec_server_url http://localhost:8119/v12. Make HTTP requests directly, or using the OpenAI client library.
占用显存:
4.5GB, 和vllm不同不会提前锁定显存,启动非常顺利
python代码:
from paddleocr import PaddleOCRVLpipeline = PaddleOCRVL(vl_rec_backend="sglang-server", vl_rec_server_url="http://127.0.0.1:8119/v1")output = pipeline.predict("webwxgetmsgimg.jpeg")#print(output)for res in output:#res.print()res.save_to_json(save_path="output")res.save_to_markdown(save_path="output")print(res._to_json())print(dir(res))
服务部署
执行以下命令,通过 PaddleX CLI 安装服务化部署插件
paddlex --install serving然后,使用 PaddleX CLI 启动服务器:
paddlex --serve --pipeline PaddleOCR-VL启动后将看到类似如下输出,服务器默认监听 8080 端口:
INFO: Started server process [63108]INFO: Waiting for application startup.INFO: Application startup complete.INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
与服务化部署相关的命令行参数如下:
--pipeline |
|
--device |
|
--host |
0.0.0.0。 |
--port |
8080。 |
--use_hpip |
|
--hpi_config |
上述服务启动使用的是transformer作为推理的,仅限测试和验证时使用。
客户端访问代码:
import base64import requestsimport pathlibAPI_URL = "http://localhost:8080/layout-parsing" # 服务URLimage_path = "./demo.jpg"# 对本地图像进行Base64编码with open(image_path, "rb") as file:image_bytes = file.read()image_data = base64.b64encode(image_bytes).decode("ascii")payload = {"file": image_data, # Base64编码的文件内容或者文件URL"fileType": 1, # 文件类型,1表示图像文件}# 调用APIresponse = requests.post(API_URL, json=payload)# 处理接口返回数据assert response.status_code == 200result = response.json()["result"]for i, res in enumerate(result["layoutParsingResults"]):print(res["prunedResult"])md_dir = pathlib.Path(f"markdown_{i}")md_dir.mkdir(exist_ok=True)(md_dir / "doc.md").write_text(res["markdown"]["text"])for img_path, img in res["markdown"]["images"].items():img_path = md_dir / img_pathimg_path.parent.mkdir(parents=True, exist_ok=True)img_path.write_bytes(base64.b64decode(img))print(f"Markdown document saved at {md_dir / 'doc.md'}")for img_name, img in res["outputImages"].items():img_path = f"{img_name}_{i}.jpg"pathlib.Path(img_path).parent.mkdir(exist_ok=True)with open(img_path, "wb") as f:f.write(base64.b64decode(img))print(f"Output image saved at {img_path}")
服务部署优化
调整服务化部署的 PaddleOCR-VL 配置只需以下三步:
paddlex --get_pipeline_config PaddleOCR-VL
默认在当前目录下生成PaddleOCR-VL.yaml文件,可以指定为其它目录
使用加速框架提升 VLM 推理性能
如需使用 vLLM 等加速框架提升 VLM 推理性能(第 2 节详细介绍如何启动 VLM 推理服务),可在产线配置文件中修改 VLRecognition.genai_config.backend 和 VLRecognition.genai_config.server_url 字段,例如:
VLRecognition:
...
genai_config:
backend: vllm-server
server_url: http://127.0.0.1:8118/v1
启用文档图像预处理功能
默认配置启动的服务不支持文档预处理功能。若客户端调用该功能,将返回错误信息。如需启用文档预处理,请在产线配置文件中将 use_doc_preprocessor 设置为 True,并使用修改后的配置文件启动服务。
禁用结果可视化功能
服务默认返回可视化结果,这会引入额外开销。如需禁用该功能,可在产线配置文件中添加如下配置:
Serving:
visualize:False
此外,也可在请求体中设置 visualize 字段为 false,以针对单次请求禁用可视化。
paddlex --serve --pipeline PaddleOCR-VL.yaml日志如下:
Creating model: ('PP-DocLayoutV2', None)Model files already exist. Using cached files. To redownload, please delete the directory manually: `/home/zhds/.paddlex/official_models/PP-DocLayoutV2`./home/zhds/.local/lib/python3.10/site-packages/paddle/utils/cpp_extension/extension_utils.py:718: UserWarning: No ccache found. Please be aware that recompiling all source files may be required. You can download and install ccache from: https://github.com/ccache/ccache/blob/master/doc/INSTALL.mdwarnings.warn(warning_message)Creating model: ('PaddleOCR-VL-0.9B', None)INFO: Started server process [1938346]INFO: Waiting for application startup.INFO: Application startup complete.INFO: Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)INFO: 127.0.0.1:49176 - "POST /layout-parsing HTTP/1.1" 200 OK
上述的部署过程基本还算顺利,但整个AI生态版本依赖的问题还是很严重,导致本人在部署中也走了一些弯路。虽然千问给了一些帮助,但整体上不大,最后还是通过比较sglang和 FlashInfer两者不同版本的发布时间做了参考解决的。
通过上述部署总算可以在生成场景下使用了,vllm和sglang作为后端基本可以实现一张图片3~4秒的识别,更多的感受等应用上线后再分享给大家。
篇外:
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-11-23
彻底搞懂 A2A 是什么、和 MCP 的区别、前身和与未来趋势、对打造 Agent 产品的影响?
2025-11-23
超越OCR,AI切入供应链采购文档,让国际EPC告别人肉翻译的AI案例
2025-11-23
麦肯锡重磅报告:定义未来五年的13项前沿技术
2025-11-23
Gemini 3来了,Software 3.0也快了
2025-11-23
2025 AI Index 报告解析:对企业运维平台的三大启示
2025-11-23
高级检索增强生成系统:LongRAG、Self-RAG 和 GraphRAG 的实现与选择
2025-11-22
价值百万的AI实战心法:从 Prompt 到 Agent,Anthropic 这份 PDF 全讲透了
2025-11-22
告别“收藏等于白看”:全面解析腾讯ima,你的AI第二大脑
2025-10-02
2025-09-19
2025-09-16
2025-09-08
2025-10-26
2025-09-17
2025-09-29
2025-09-14
2025-10-07
2025-09-30
2025-11-23
2025-11-19
2025-11-19
2025-11-19
2025-11-18
2025-11-18
2025-11-17
2025-11-15