既然要从零开始,咱们就避开那些复杂的文档,直接按生产环境的最小闭环来。DeepSeek 的 OCR 能力现在主要承载在 DeepSeek-VL2 系列模型上(特别是 Tiny 和 Small 版本),或者专门的 DeepSeek-OCR 模型。
在 2026 年,最稳、效率最高的方法是使用 vLLM 配合 4-bit 量化。以下是针对 Linux(Ubuntu)环境的安装指南。
零、 硬件与环境检查
在动手之前,先确认你的“工位”:
- 显存: 8GB 显存是门槛(RTX 3060/4060 及以上)。
- 驱动: 确保
nvidia-smi能跑通,CUDA 版本建议 $\ge$ 12.1。 - Python: 建议 3.10+。
一、 环境隔离(Conda)
别在系统环境里乱搞,直接起个干净的 Conda:
Bash
conda create -n ds_ocr python=3.10 -y
conda activate ds_ocr
# 安装核心依赖
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
pip install "transformers>=4.45.0" accelerate vllm qwen-vl-utils
二、 部署:追求极致性能(vLLM 方案)
不要用原生的 transformers 加载,速度太慢。我们用 vLLM 把它起成一个 OpenAI 兼容的 API 服务。
1. 启动服务端
打开一个 Terminal,直接压榨显存利用率(假设你用的是 DeepSeek-OCR 模型):
Bash
# 建议使用 GPTQ 或 AWQ 量化版,如果没有,vLLM 会尝试自动处理
python -m vllm.entrypoints.openai.api_server \
--model deepseek-ai/DeepSeek-OCR \
--trust-remote-code \
--gpu-memory-utilization 0.8 \
--max-model-len 4096 \
--limit-mm-per-prompt image=1 \
--port 8000
注意:
gpu-memory-utilization设置为 0.8 是为了给图像处理留点“呼吸空间”。
三、 调用:实战 OCR 脚本
起好服务后,你只需要写个简单的客户端脚本就能批量处理图像了。
Python
import httpx
import base64
import asyncio
async def deepseek_ocr(image_path):
# 1. 图像转 Base64
with open(image_path, "rb") as f:
img_b64 = base64.b64encode(f.read()).decode("utf-8")
# 2. 构造请求 Payload
payload = {
"model": "deepseek-ai/DeepSeek-OCR",
"messages": [
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img_b64}"}},
{"type": "text", "text": "请将图片中的文字提取出来,保留原始表格和段落结构,输出为 Markdown。"}
]
}
],
"temperature": 0.1
}
async with httpx.AsyncClient(timeout=None) as client:
response = await client.post("http://localhost:8000/v1/chat/completions", json=payload)
return response.json()['choices'][0]['message']['content']
if __name__ == "__main__":
res = asyncio.run(deepseek_ocr("test_document.png"))
print(res)
四、 针对 8GB 显存的“保命”建议
如果你在安装或运行中遇到 OOM(显存溢出):
- 限制分辨率: 在前端用
PIL或OpenCV把图片先 Resize 到 1024 像素宽。传大图(如 4K 扫描件)给 API 是新手最常犯的错。 - 量化加载: 如果显存实在吃紧,在启动服务时加上
--quantization gptq。 - 关闭 Prefix Caching: 在 OCR 这种单轮且图像不重复的任务中,缓存没有意义。启动时加
--no-enable-prefix-caching。
五、 总结
这套方案走的是生产级流水线逻辑:
- 后端: vLLM 负责高效调度和显存池管理。
- 模型: DeepSeek 的光学压缩层负责把像素浓缩成 Token。
- 前端: 异步 API 调用负责高并发吞吐。