图像与设计
在本地或服务器上需要用 DeepSeek-OCR…
用 DeepSeek-OCR(vLLM 或 HuggingFace Transformers)从文档、PDF、图片中提取文本、转 Markdown、解析图表或定位目标文本。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
在本地或服务器上需要用 DeepSeek特定
解决思路
- 安装前置条件:准备 CUDA 11.8+、PyTorch 2.6.0、Python 3.12.9,推荐使用 conda。
- 克隆仓库:`git clone https://github.com/deepseek-ai/DeepSeek-OCR.git`,然后 `cd DeepSeek-OCR`。
- 创建并激活环境:`conda create -n deepseek-ocr python=3.12.9 -y`,`conda activate deepseek-ocr`。
- 安装 PyTorch CUDA 11.8:`pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu118`。
- 下载 vLLM 0.8.5 whl:从 `https://github.com/vllm-project/vllm/releases/tag/v0.8.5` 获取 `vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl`,然后 `pip install vllm-0.8.5+cu118-cp38-abi3-manylinux1_x86_64.whl`。
- 安装项目依赖:`pip install -r requirements.txt`。
- 安装 FlashAttention:`pip install flash-attn==2.7.3 --no-build-isolation`。
- 可选使用上游 nightly vLLM:`uv venv`,`source .venv/bin/activate`,`uv pip install -U vllm --pre --extra-index-url https://wheels.vllm.ai/nightly`。
- 下载模型:用 HuggingFace `from huggingface_hub import snapshot_download` 和 `snapshot_download(repo_id='deepseek-ai/DeepSeek-OCR')`。
- vLLM 单图流式推理:导入 `from vllm import LLM, SamplingParams`、`from vllm.model_executor.models.deepseek_ocr import NGramPerReqLogitsProcessor`、`from PIL import Image`。
- 初始化 vLLM LLM:`LLM(model='deepseek-ai/DeepSeek-OCR', enable_prefix_caching=False, mm_processor_cache_gb=0, logits_processors=[NGramPerReqLogitsProcessor])`。
- 打开图像并设置 prompt:`image = Image.open('document.png').convert('RGB')`,`prompt = '<image>\nFree OCR.'`。
- 设置 SamplingParams:`SamplingParams(temperature=0.0, max_tokens=8192, extra_args=dict(ngram_size=30, window_size=90, whitelist_token_ids={128821, 128822}), skip_special_tokens=False)`。
- 执行生成并打印:`outputs = llm.generate([{'prompt': prompt, 'multi_modal_data': {'image': image}}], sampling_params)`,`print(outputs[0].outputs[0].text)`。
- vLLM 批量图片:设置 `image_paths = ['page1.png', 'page2.png', 'page3.png']`,`prompt = '<image>\n<|grounding|>Convert the document to markdown. '`。
- 构造批量输入:`model_input = [{'prompt': prompt, 'multi_modal_data': {'image': Image.open(p).convert('RGB')}} for p in image_paths]`。
- 批量生成并输出:`outputs = llm.generate(model_input, sampling_params)`,然后 `for path, output in zip(image_paths, outputs): print(f'=== {path} ==='); print(output.outputs[0].text)`。
- PDF 处理(vLLM 脚本):`cd DeepSeek-OCR-master/DeepSeek-OCR-vllm`,编辑 `config.py` 设置 `INPUT_PATH`、`OUTPUT_PATH`、模型路径等。
- 运行 PDF 批处理:`python run_dpsk_ocr_pdf.py`,A100-40G 约 2500 tokens/s。
- 运行基准评估:`cd DeepSeek-OCR-master/DeepSeek-OCR-vllm`,`python run_dpsk_ocr_eval_batch.py`。
- HuggingFace Transformers 推理:设置 `os.environ['CUDA_VISIBLE_DEVICES'] = '0'`,`model_name = 'deepseek-ai/DeepSeek-OCR'`。
- 加载 tokenizer 和 model:`AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)`;`AutoModel.from_pretrained(model_name, _attn_implementation='flash_attention_2', trust_remote_code=True, use_safetensors=True)`。
- 设置模型:`model = model.eval().cuda().to(torch.bfloat16)`。
- 文档转 Markdown 推理:`res = model.infer(tokenizer, prompt='<image>\n<|grounding|>Convert the document to markdown. ', image_file='document.jpg', output_path='./output/', base_size=1024, image_size=640, crop_mode=True, save_results=True, test_compress=True)`,然后 `print(res)`。
- 运行 Transformers 脚本:`cd DeepSeek-OCR-master/DeepSeek-OCR-hf`,`python run_dpsk_ocr.py`。
- Prompt:Document → Markdown 用 `<image>\n<|grounding|>Convert the document to markdown. `。
- Prompt:General OCR 用 `<image>\n<|grounding|>OCR this image. `。
- Prompt:Free OCR(无布局)用 `<image>\nFree OCR. `。
- Prompt:Parse figure/chart 用 `<image>\nParse the figure. `。
- Prompt:General description 用 `<image>\nDescribe this image in detail. `。
- Prompt:Grounded REC 用 `<image>\nLocate <|ref|>TARGET_TEXT<|/ref|> in the image. `。
- 用 `PROMPTS` 字典管理:`document_markdown`、`ocr_image`、`free_ocr`、`parse_figure`、`describe`、`rec`;`rec` 中用 `{target}` 插入 `<|ref|>{target}<|/ref|>`。
- 支持分辨率 Tiny:512×512,视觉 tokens 64。
- 支持分辨率 Small:640×640,视觉 tokens 100。
- 支持分辨率 Base:1024×1024,视觉 tokens 256。
- 支持分辨率 Large:1280×1280,视觉 tokens 400。
- 支持分辨率 Gundam(动态):n×640×640 + 1×1024×1024,视觉 tokens 可变。
- Transformers 控制分辨率:在 `infer()` 中设置 `base_size=512/640/1024/1280`,`image_size=640` 作为动态模式 patch size,`crop_mode=True` 启用 Gundam 动态分辨率。
- vLLM 配置:编辑 `DeepSeek-OCR-master/DeepSeek-OCR-vllm/config.py`。
- 配置字段:`MODEL_PATH = 'deepseek-ai/DeepSeek-OCR'` 或本地路径;`INPUT_PATH = '/data/input_images/'`;`OUTPUT_PATH = '/data/output/'`;`TENSOR_PARALLEL_SIZE = 1`;`MAX_TOKENS = 8192`;`TEMPERATURE = 0.0`;`NGRAM_SIZE = 30`;`WINDOW_SIZE = 90`。
- 目录批处理模式:定义 `batch_ocr(image_dir, output_dir, prompt='<image>\nFree OCR.')`,用 `Path(output_dir).mkdir(parents=True, exist_ok=True)` 创建输出目录。
- 在 `batch_ocr` 中初始化 vLLM LLM,设置 `enable_prefix_caching=False`、`mm_processor_cache_gb=0`、`logits_processors=[NGramPerReqLogitsProcessor]`。
- 在 `batch_ocr` 中设置 `SamplingParams(temperature=0.0, max_tokens=8192, extra_args=dict(ngram_size=30, window_size=90, whitelist_token_ids={128821, 128822}), skip_special_tokens=False)`。
- 在 `batch_ocr` 中收集文件:`list(Path(image_dir).glob('*.png')) + list(Path(image_dir).glob('*.jpg'))`。
- 在 `batch_ocr` 中构造 `inputs` 并执行 `llm.generate(inputs, sampling_params)`。
- 在 `batch_ocr` 中保存结果:`(Path(output_dir) / (img_path.stem + '.txt')).write_text(output.outputs[0].text)`,并打印 `Saved: {out_file}`。
- 调用目录批处理:`batch_ocr('/data/scans/', '/data/results/')`。
- PDF 转 Markdown 模式:使用 `fitz`(PyMuPDF)、`PIL.Image`、`io.BytesIO` 和 vLLM。
- 定义 `pdf_to_markdown(pdf_path)`:`doc = fitz.open(pdf_path)`;初始化 vLLM LLM;设置 SamplingParams;prompt 用 `<image>\n<|grounding|>Convert the document to markdown. `。
- 对每页处理:`pix = page.get_pixmap(dpi=150)`;`img = Image.open(BytesIO(pix.tobytes('png'))).convert('RGB')`;构造 `inputs`。
- 生成并返回:`outputs = llm.generate(inputs, sampling_params)`;`return [o.outputs[0].text for o in outputs]`。
- 拼接 Markdown:`pages = pdf_to_markdown('report.pdf')`;`full_markdown = '\n\n---\n\n'.join(pages)`;`print(full_markdown)`。
- Grounded 文本定位(REC):用 HuggingFace 加载模型;`target = 'Total Amount'`;`prompt = f'<image>\nLocate <|ref|>{target}<|/ref|> in the image. '`。
- REC 推理:`model.infer(tokenizer, prompt=prompt, image_file='invoice.jpg', output_path='./output/', base_size=1024, image_size=640, crop_mode=False, save_results=True)`;返回边界框/位置信息。
- 排错 transformers 与 vLLM 版本冲突:vLLM 0.8.5 需要 `transformers>=4.51.1`;同环境运行时该错误按项目文档可安全忽略。
- 排错 Flash Attention 构建错误:先安装 torch,再 `pip install flash-attn==2.7.3 --no-build-isolation`。
- 排错 CUDA OOM:使用更小分辨率 `base_size=512` 或 `base_size=640`;设置 `crop_mode=False` 禁用多裁剪动态分辨率;减少 vLLM 输入 batch size。
- 排错输出乱码/重复:确保向 LLM 传入 `NGramPerReqLogitsProcessor`:`from vllm.model_executor.models.deepseek_ocr import NGramPerReqLogitsProcessor`;`llm = LLM(..., logits_processors=[NGramPerReqLogitsProcessor])`。
- 排错表格渲染:设置 `whitelist_token_ids={128821, 128822}`,对应 `<td>` 和 `</td>`。
- 多 GPU 推理:`LLM(..., tensor_parallel_size=4, enable_prefix_caching=False, mm_processor_cache_gb=0, logits_processors=[NGramPerReqLogitsProcessor])`。
- 关键文件:`DeepSeek-OCR-master/DeepSeek-OCR-vllm/config.py` 是 vLLM 配置;`run_dpsk_ocr_image.py` 单图推理;`run_dpsk_ocr_pdf.py` PDF 批处理;`run_dpsk_ocr_eval_batch.py` 基准评估。
- 关键文件:`DeepSeek-OCR-master/DeepSeek-OCR-hf/run_dpsk_ocr.py` 是 HuggingFace Transformers 推理脚本。
适用边界 · 注意事项
- 没有 CUDA 11.8+ 的 NVIDIA GPU、无法安装 PyTorch/vLLM/flash-attn 的环境。
- 只需轻量 OCR 或纯文本 PDF 提取,且不愿下载/加载 DeepSeek-OCR 大模型。
- 无法访问 HuggingFace/GitHub 下载模型和 whl,或生产环境不能接受特定 vLLM 版本约束。