内网离线部署 PaddleOCR-VL-1.5 推理服务
内网离线部署 PaddleOCR-VL-1.5 推理服务背景公司内网服务器无法访问外网需将模型与运行环境全部离线搬运至服务器。宿主机为 LinuxUbuntu 22.04配有 NVIDIA L20 显卡46 GB 显存目标是以 Docker Compose 方式部署一个兼容 OpenAI Chat Completions 格式的 OCR API供任意内网电脑调用。整体思路在能上网的 Windows 笔记本上下载好 Docker 镜像与模型文件打包后拷贝到服务器。镜像使用百度云官方paddleocr-genai-vllm-server已集成 vLLM 推理引擎。模型从国内源ModelScope下载PaddleOCR-VL-1.5部署时通过软链接伪装成PaddleOCR-VL-0.9B因官方镜像内置 CLI 仅认这个名字。编写docker-compose.yml时对 CPU、内存、显存做硬限制防止 OOM 导致服务器失联。最终通过/v1/chat/completions端点提供 OCR 服务。步骤详解1. 笔记本端准备“弹药”在联网 Windows 中执行以下操作。拉取 Docker 镜像百度云docker pull ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest docker save-o paddleocr-vllm.tar ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest镜像大小约 10–15 GB打包后得到paddleocr-vllm.tar。下载模型文件从魔搭社区pip install modelscope python-cfrom modelscope import snapshot_download; snapshot_download(PaddlePaddle/PaddleOCR-VL-1.5, cache_dir./PaddleOCR-VL-1.5)下载完成后将文件夹打包Compress-Archive-Path./PaddleOCR-VL-1.5-DestinationPath./PaddleOCR-VL-1.5.zip模型约 10 GB内含model.safetensors等文件。2. 文件传输到内网服务器使用 WinSCP 或 SCP 将两个文件上传至服务器/root/hjl/目录。3. 服务器环境准备确认已安装 Dockerdocker version、NVIDIA 驱动nvidia-smi、NVIDIA Container Toolkitdpkg -l | grep nvidia-container-toolkit及docker compose插件docker compose version。若缺少docker compose插件可离线下载对应.deb包安装。4. 加载镜像并解压模型cd/root/hjldockerloadpaddleocr-vllm.tarmkdir-p/data/modelsunzipPaddleOCR-VL-1.5.zip-d/data/models/# 实际模型文件将会在深层目录# /data/models/PaddleOCR-VL-1.5/PaddlePaddle/PaddleOCR-VL-1___5/5. 创建模型软链接伪装成 0.9Bln-sfn/root/hjl/PaddleOCR-VL-1.5/PaddlePaddle/PaddleOCR-VL-1___5 /root/hjl/models-vllm这样容器内/models/PaddleOCR-VL-0.9B即指向真正的 1.5 模型文件。6. 编写 docker-compose.yml带资源限制cat/root/hjl/docker-compose.ymlEOF version: 3.8 services: paddleocr-vlm-server: image: ccr-2vdh3abv-pub.cnc.bj.baidubce.com/paddlepaddle/paddleocr-genai-vllm-server:latest container_name: paddleocr-vlm-server runtime: nvidia restart: unless-stopped ports: - 8118:8118 environment: - NVIDIA_VISIBLE_DEVICESall - NVIDIA_GPU_MEMORY_LIMITS40960 # 显存限制46 GB 卡留余量 - HF_HUB_OFFLINE1 # 强制离线防止模型下载 deploy: resources: limits: cpus: 4 # 限制 CPU 使用 memory: 16G # 限制内存使用 reservations: devices: - driver: nvidia count: 1 capabilities: [gpu] volumes: - /root/hjl/models-vllm:/models/PaddleOCR-VL-0.9B shm_size: 2gb command: [paddleocr, genai_server, --model_name, PaddleOCR-VL-0.9B, --backend, vllm, --model_dir, /models/PaddleOCR-VL-0.9B, --port, 8118, --host, 0.0.0.0] healthcheck: test: [CMD-SHELL, curl -f http://localhost:8118/health || exit 1] interval: 30s timeout: 10s retries: 5 start_period: 600s # 模型加载约 5 分钟预留足够时间 EOF7. 启动服务dockercompose up-d查看日志直到出现Application startup complete.和GET /health HTTP/1.1 200 OKdockercompose logs-fpaddleocr-vlm-server按CtrlC退出日志。健康检查curlhttp://localhost:8118/health# 返回 {status:ok}8. 测试 OCR服务器本地python3-c import requests, base64 with open(/root/hjl/1.jpg, rb) as f: img base64.b64encode(f.read()).decode() r requests.post(http://localhost:8118/v1/chat/completions, json{ model: PaddleOCR-VL-0.9B, messages: [{role: user, content: [ {type: text, text: 请提取这张图片中的所有文字。}, {type: image_url, image_url: {url: fdata:image/jpeg;base64,{img}}} ]}] }) print(r.json()[choices][0][message][content]) 成功返回设备识别卡上的文字识别结果准确。9. 开放端口供外网调用请管理员放行服务器8118端口之后任意内网电脑可用 Python 或 Curl 调用importrequests,base64 urlhttp://10.13.13.221:8118/v1/chat/completionspayload{model:PaddleOCR-VL-0.9B,messages:[{role:user,content:[{type:text,text:请提取图片中的所有文字。},{type:image_url,image_url:{url:fdata:image/png;base64,{image_base64}}}]}]}responserequests.post(url,jsonpayload)print(response.json()[choices][0][message][content])关键点总结离线部署核心镜像与模型分离先在外网下载后打包传输。模型名伪装因官方镜像 CLI 只认PaddleOCR-VL-0.9B用软链接让 1.5 模型“冒名”运行实际效果可用。资源硬限制deploy.resources.limits和NVIDIA_GPU_MEMORY_LIMITS防止容器挤爆服务器导致 SSH 断连。接口兼容性服务端基于 vLLM直接提供/v1/chat/completions可无缝对接 OpenAI 生态工具。后续优化方向如需版面分析、表格识别等高级功能可尝试增加官方paddleocr-vl-api容器需解决其依赖问题但基础 OCR 通过优化 Prompt 已能获得较好效果。部署成功至此你便拥有了一个完全离线的、可横向扩展的内部 OCR 服务平台。