免费POC, 零成本试错
AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


我要投稿

PaddleOCR-VL-0.9B生产部署

发布日期:2025-11-23 07:34:14 浏览次数: 1523
作者:未见天际

微信搜一搜,关注“未见天际”

推荐语

PaddleOCR-VL-0.9B生产部署指南:如何用vllm和SGLang实现高效推理加速。

核心内容:
1. PaddleOCR-VL-0.9B的生产环境部署方案对比
2. 使用vllm作为后端的详细部署步骤
3. 客户端调用服务的Python API使用方法

杨芳贤
53AI创始人/腾讯云(TVP)最具价值专家

    前文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
可指定 YAML 文件,包含后端配置

客户端使用方法¶

启动 VLM 推理服务后,客户端即可通过 PaddleOCR 调用该服务。

 Python API 调用¶

创建 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


输出如下:

[2025-11-22 15:02:40] INFO:     Application startup complete.[2025-11-22 15:02:40] INFO:     Uvicorn running on http://localhost:8119 (Press CTRL+C to quit)[2025-11-22 15:02:40] INFO:     127.0.0.1:53766 - "GET /health HTTP/1.1" 503 Service Unavailable[2025-11-22 15:02:41] INFO:     127.0.0.1:53774 - "GET /get_model_info HTTP/1.1" 200 OK[2025-11-22 15:02:41] Prefill batch, #new-seq: 1, #new-token: 6, #cached-token: 0, token usage: 0.00, #running-req: 0, #queue-req: 0, [2025-11-22 15:02:41] INFO:     127.0.0.1:53790 - "GET /health HTTP/1.1" 503 Service Unavailable[2025-11-22 15:02:42] INFO:     127.0.0.1:53802 - "GET /health HTTP/1.1" 503 Service Unavailable[2025-11-22 15:02:43] INFO:     127.0.0.1:53784 - "POST /generate HTTP/1.1" 200 OK[2025-11-22 15:02:43] The server is fired up and ready to roll![2025-11-22 15:02:43] Prefill batch, #new-seq: 1, #new-token: 1, #cached-token: 0, token usage: 0.00, #running-req: 0, #queue-req: 0, [2025-11-22 15:02:44] INFO:     127.0.0.1:53808 - "GET /health HTTP/1.1" 200 OK[2025/11/22 15:02:44] 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/v1    2. 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
PaddleX 产线注册名或产线配置文件路径。
--device
产线部署设备。默认情况下,若 GPU 可用则使用 GPU,否则使用 CPU。
--host
服务器绑定的主机名或 IP 地址,默认为 0.0.0.0
--port
服务器监听的端口号,默认为 8080
--use_hpip
启用高性能推理模式。请参考高性能推理文档了解更多信息。
--hpi_config
高性能推理配置。请参考高性能推理文档了解更多信息。

上述服务启动使用的是transformer作为推理的,仅限测试和验证时使用。

客户端访问代码:


import base64import requestsimport pathlib
API_URL = "http://localhost:8080/layout-parsing" # 服务URL
image_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_path        img_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 配置只需以下三步:

  1. 生成配置文件
  2. 修改配置文件
  3. 应用配置文件

5.1 生成配置文件¶

paddlex --get_pipeline_config PaddleOCR-VL
默认在当前目录下生成PaddleOCR-VL.yaml文件,可以指定为其它目录

5.2 修改配置文件¶

使用加速框架提升 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,以针对单次请求禁用可视化。

5.3 应用配置文件¶

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.md  warnings.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+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+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询