如何运行 DeepSeek-OCR?深度探索:DeepSeek-OCR使用指南!

如何运行 DeepSeek-OCR?

你有没有过这样的经历:一个“简单的OCR”任务,结果却变成了一周的苦差事,表格识别错误,标题乱码,所有东西都差了几个像素?这个我太懂了。DeepSeek-OCR就像一股清流,因为它不仅仅是“读取像素”。它会将文档压缩并理解为视觉语言任务,然后生成清晰易用的文本/Markdown格式文件。

DeepSeek-OCR是什么: DeepSeek 出品的3B 参数视觉语言 OCR 模型,可以将图像/PDF 页面转换为结构化的 Markdown 文本。它专为篇幅较长、内容杂乱的真实文档(表格、表单、屏幕截图)而设计。

**它的不同点是:它使用“上下文光学压缩”:**将文本表示为高分辨率图像,因此该模型可以处理更长的文档,但标记更少(据报道减少了 7-20 倍)。

它的创意

传统 OCR 的工作原理是:检测字符 → 组装单词 → 猜测结构。DeepSeek -OCR则反其道而行之:它将整个页面视为一个视觉上下文,然后根据布局感知生成文本/Markdown。这项研究称之为通过光学二维映射压缩长文本上下文,并报告称在保持高保真度的同时,可节省 7-20 倍的字符数。这就是为什么今天在这里我推荐它的原因。

模型预设

DeepSeek 的模型卡通过set_reflect_presetset_reflect_presetset_reflect_preset 公开了简单的推理预设。可以把它们想象成一种“模式”。

  • 微型base_size=512, image_size=512, crop_mode=False *适用场景:*速度优先于精度、快速浏览、低显存实例。
  • 小型640, 640, no-crop *适用场景:*不包含密集表格的普通页面。
  • 基础1024, 1024, no-crop *适用场景:*大多数 PDF/屏幕截图;质量/速度平衡良好。
  • 大号1280, 1280, no-crop *适用场景:*设计文档/图表/注重细节的小字体。
  • **“Gundam”**→base_size=1024, image_size=640, crop_mode=True

提示:先从基础模型开始。如果画面看起来不太理想,可以试试Gundam模式。如果显存不足,可以降级到小型或者微型模式。*

CPU vs GPU:哪个才是真正有效的?

  • **模型大小:**约 6-7 GB 内存(bf16)。虽然可以纯 CPU 运行,但通常速度太慢,无法满足生产需求。使用 NVIDIA GPU 是目前的最佳选择。
  • 显存容量建议: 8-12 GB 足以满足标准预设的需求;更大的显存容量有助于提高批处理吞吐量。我这里用的显卡支持30 亿个参数,默认使用bf16显存;目标平台为CUDA 11.8 + PyTorch 2.6
  • 生产环境提示:现在vLLM(撰写本文时为 nightly 版本)已支持此功能,可实现高效的服务/批处理。当您从笔记本迁移到微服务时,请使用此功能。

DeepSeek-OCR 的优势所在

  • 复杂表格 →后缀较少的 Markdown 表格。
  • 屏幕截图/表单,其中布局对含义至关重要。
  • 篇幅较长的PDF文件(例如政策文件、询价单、产品目录)通常会消耗大量的令牌。

Colab:运行端到端流程(上传 → PDF→ ZIP 下载)

以下是一个可以运行的干净的 Colab 单元格序列。它与模型中的依赖项版本匹配,并包含针对密集页面的快速路径和重试机制。Flash -Attention是可选的;如果不可用,它将自动回退。

它的功能:

  1. 安装依赖项(CUDA 兼容的 PyTorch、Transformers、pdf2image、poppler)
  2. 允许上传PDF文件
  3. 将页面转换为 PNG 格式
  4. 负载deepseek-ai/DeepSeek-OCR
  5. 将每一页推断为 Markdown 格式(对于内容密集的页面,可以重试)。
  6. 将所有输出文件(每页 MD 文件 + 合并 MD 文件 + timings.csv 文件)压缩成 zip 文件供下载。

1) GPU 及依赖项:为什么选择这些特定版本?

  • !nvidia-smi确认会确认 Colab 运行时已连接 GPU,并显示驱动程序/CUDA 版本。如果看不到 NVIDIA 显卡,请切换到运行时 → GPU。
  • PyTorch pins(torch==2.6.0+ cu118wheel)与 CUDA 11.8 匹配。这避免了经典的“CUDA 不匹配”崩溃。
  • transformers+tokenizers加载 DeepSeek-OCR 模型。einops是一些远程代码使用的轻量级实用程序。addict``easydict
  • flash-attn加速对支持的 GPU 的注意力机制。该组件确保即使 FlashAttention 无法构建,笔记本电脑也不会停止运行。
  • poppler-utils+pdf2image将 PDF 页面转换为 PNG 格式。没有 Poppler,pdf2image什么都做不了。

2)上传PDF文件

我上传了名为“Attention Is All You Need”的pdf文件。

from google.colab import files up = files.upload() assert  len (up) == 1 , "Upload exactly one PDF" pdf_path = list (up.keys())[ 0 ] print ( "PDF:" , pdf_path)

**用途:**用于在 Colab 表单中选择本地 PDF 文件。这assert是一个简单的不变式:只能选择一个文件。如果需要批量处理,请移除断言并循环遍历up.items()

**常见问题:**文件类型错误。添加快速检查:

assert pdf_path.lower().endswith(".pdf"), "Please upload a .pdf file"

3) PDF → 图片:DPI 决定图像质量

from pdf2image import convert_from_pathfrom pathlib import Pathimport osout_dir = Path("dpsk_ocr_outputs")img_dir = out_dir / "pages"md_dir  = out_dir / "markdown_pages"os.makedirs(img_dir, exist_ok=True)os.makedirs(md_dir,  exist_ok=True)IM_DPI = 180  # 160–200 is a good rangeimages = convert_from_path(pdf_path, dpi=IM_DPI, fmt="png",                           output_folder=str(img_dir),                           output_file="page",                           paths_only=True)images = sorted(images)print(f"Extracted {len(images)} page image(s) → {img_dir}")

原因: DeepSeek-OCR处理的是图像,而不是PDF。我们会预先渲染每一页。

DPI权衡:

  • 较低的 DPI(例如 150-180):速度更快,显存更小,可能无法显示小字体。
  • 更高的 DPI(例如 220-300):更清晰的表格/小字,更多的 GPU 内存和时间。

**提示:**如果要对包含小字的扫描件进行 OCR 识别,请尝试以下方法IM_DPI = 220。如果内存不足,请降低内存使用频率。

4) 加载 DeepSeek-OCR:trust_remote_code 和注意力回退

import torch, os from transformers import AutoModel, AutoTokenizer, GenerationConfig os.environ[ "CUDA_VISIBLE_DEVICES" ] = "0" torch.backends.cuda.matmul.allow_tf32 = True try :     torch.set_float32_matmul_precision( "high" ) except Exception:     pass model_id = "deepseek-ai/DeepSeek-OCR" attn_impl = "flash_attention_2" try :     import flash_attn   # noqa except Exception:     attn_impl = "eager" tok = AutoTokenizer.from_pretrained(model_id, trust_remote_code= True ) if tok.pad_token is  None  and tok.eos_token is  not  None :     tok.pad_token = tok.eos_token model = AutoModel.from_pretrained(     model_id,     trust_remote_code= True ,     _attn_implementation=attn_impl,     torch_dtype=torch.bfloat16,     use_safetensors= True ) .to( "cuda" ). eval ()

这里有一些需要理解的概念:

  • trust_remote_code=True允许模型从代码库加载自定义 Python 代码(此处需要,因为model.infer(...)它是自定义的)。出于安全考虑,请仅对信任的代码库启用此功能。
  • **注意:**我们优先使用FlashAttention 以提高速度,但如果导入失败,我们会明确地回退到“eager”模式。这就是为什么之前的安装可能会“失败”,但系统仍然可以继续运行的原因。
  • bfloat16**(bf16):**相比 fp32,内存占用减半,画质损失极小,广泛支持现代 NVIDIA 显卡。如果 GPU 出现问题,请尝试torch_dtype=torch.float16使用其他格式float32(速度较慢,但需要更多显存)。
  • TF32/更好的矩阵乘法: allow_tf32set_float32_matmul_precision("high")NVIDIA 使用张量核心进行某些操作;在 Ampere+ 上获得稳定的速度优势。

安全开关:

device = "cuda" if torch.cuda.is_available() else "cpu" model = AutoModel.from_pretrained(...).to(device).eval()

使用 CPU 运行速度会比较慢,但这可以保证没有 GPU 的读者也能使用这款笔记本电脑。

生成配置:为什么使用这些值?

# 如果模型没有默认配置,则设置我们的配置if  not  hasattr (model, "generation_config" ) or model.generation_config is  None :     model.generation_config = GenerationConfig() gc = model.generation_config gc.pad_token_id = tok.pad_token_id gc.eos_token_id = tok.eos_token_id gc.do_sample = False       # 确定性gc.num_beams = 1           # 禁用束搜索(速度更快)gc.top_p = 1.0 ; gc.temperature = Nonegc.max_new_tokens = 512    # 限制失控的生成次数gc.no_repeat_ngram_size = 6gc.repetition_penalty = 1.15gc.length_penalty = 0.9model.generation_config = gc
  • 确定性解码do_sample=False)使输出在运行过程中保持稳定——这对于 OCR 来说是完美的。
  • max_new_tokens=512防止页面“失控”。如果出现截断现象,请将分辨率调整为 768/1024,但要注意延迟。
  • 重复保护no_repeat_ngram_sizerepetition_penalty)减少 LLM 有时发出的那些奇怪的重复行。

5) 清洗通道:使用正则表达式去除检测标签

import reREF_DET_RE = re.compile(r"<\|(?:ref|det)\|>.*?<\|/(?:ref|det)\|>", re.DotAll)= re.compile(r"<\|(?:ref|det)\|>.*?<\|/(?:ref|det)\|>", re.DotAll)def clean_ocr_markdown(s: str) -> str:    s = REF_DET_RE.sub("", s or "")    lines, out, last, run = s.splitlines(), [], None, 0    for line in lines:        if line == last:            run += 1            if run < 4:                out.append(line)        else:            last, run = line, 1            out.append(line)    return "\n".join(out).strip()

它的功能:

  • 移除<|ref|> ... <|/ref|>模型可能添加的用于检测元数据的内部标签。
  • 合并意外重复的行(最多保留 3 个连续副本)。

**重要修正:**在 Python 中,该标志是re.DOTALL(全部大写)。如果使用re.DotAll,某些 Python 版本会报错。请使用:

re.compile(pattern, re.DOTALL)compile(pattern, re.DOTALL)

**为什么要在第 3 行进行行折叠?**这是一种折衷方案:既能去除明显的重复项,又不破坏合法的列表。

6)推理策略:先走快速路径,然后进行更智能的重试

prompt = (    "<image>\n"    "<|grounding|>Convert the document to clean, concise Markdown.\n"    "- Use Markdown tables (not HTML) for tabular data.\n"    "- Do not include detection tags like <|ref|> or <|det|>.\n")BASE_SIZE = 1024

**提示设计:**像产品需求一样思考:

  • 请明确说明Markdown 表格的格式(不要使用 HTML)。
  • 请尽量**避免使用检测标签,**这样我们以后就不用清理那么多东西了。

两阶段策略:

def  infer_once ( img_path, image_size, crop_mode, save_results ):     txt = model.infer(         tok,         prompt=prompt,         image_file= str (img_path),         output_path= str (md_dir),         base_size=BASE_SIZE,      # 全局画布缩放        image_size=image_size,    # 实际输入图像大小调整        crop_mode=crop_mode,      # 启用密集布局的区域缩放        save_results=save_results,         test_compress= False ,         eval_mode= True     )     return (txt or  "" ).strip() def  infer_with_retry ( img_path ):     # 1) 快速路径:快速且廉价    t0 = time.time()     txt = infer_once(img_path, image_size= 512 , crop_mode= False , save_results= False )     if  len (txt) >= 40 :    # 粗略指示我们得到了真实文本        返回txt,time.time()-t0,"512/no-crop"     # 2) 更智能的路径:放大并裁剪(非常适合表格/小字体)     txt2 = infer_once(img_path, image_size= 640 , crop_mode= True , save_results= True )     if  len (txt2) >= 40 :         return txt2,time.time()-t0,"640/crop"     # 3) 最后手段:如果辅助函数写入了 result.mmd,则使用它

为什么这种方法有效:

  • 第一阶段对于普通页面来说速度很快。
  • 第二阶段使用crop_mode(DeepSeek 的“高达”式行为)放大密集区域,对表格非常有用。
  • 我们对每个页面进行计时,并记录哪种模式成功。这便成为您数据集的一个小型基准。

**提示:**如果 PDF 文件中表格较多,请颠倒顺序(先尝试裁剪)。

吞吐量说明:

  • 你一次只能处理一页。为了提高速度,你可以使用多个 GPU 或进程进行批量处理,但在 Colab 中最好保持简单。

7) 持久化结果:每页结果、汇总结果和计时 CSV 文件

combined_md_path = out_dir / (Path(pdf_path).stem + "_combined.md")timing_csv_path  = out_dir / "timings.csv"with open(combined_md_path, "w", encoding="utf-8") as mdout, \     open(timing_csv_path, "w", newline="", encoding="utf-8") as csvf:    writer = csv.writer(csvf)    writer.writerow(["page_index","image_name","seconds","mode","chars"])    for i, img_path in enumerate(images, 1):        txt, secs, mode = infer_with_retry(img_path)        cleaned = clean_ocr_markdown(txt)        # per-page MD        per_page_md = md_dir / f"page_{i:04d}.md"        with open(per_page_md, "w", encoding="utf-8") as f:            f.write((cleaned or "[EMPTY OCR OUTPUT]") + "\n")        # append to combined        mdout.write(f"\n\n<!-- Page {i} -->\n\n{cleaned or '[EMPTY OCR OUTPUT]'}\n")        # benchmarking breadcrumbs        writer.writerow([i, Path(img_path).name, f"{secs:.2f}", mode, len(cleaned)])        print(f"Page {i}/{len(images)} | {secs:.2f}s | mode={mode} | chars={len(cleaned)}")

输出:

Total time: 395.05 s for 11 pagesPer-page MDs: dpsk_ocr_outputs/markdown_pagesCombined MD: dpsk_ocr_outputs/NIPS-2017-attention-is-all-you-need-Paper_combined.mdTimings CSV: dpsk_ocr_outputs/timings.csv

这种结构的原因:

  • 按页处理功能**.md**允许稍后仅重新处理需要的页面。
  • 其中一个**combined.md**非常适合下游审查或用于 RAG 分块。
  • **timings.csv**这是性能调优的宝贵资源。按加载缓慢的页面排序,并检查哪些页面存在特殊问题,通常是字体太小或表格过于密集。

8) 打包输出:一键下载


原因: Colab 沙箱会消失。将所有内容压缩成 ZIP 文件意味着可以一次性获得pages/markdown_pages/combined.mdtimings.csv这几个文件。

硬件说明

  • 最低可行开发配置:8-12 GB 显存的 NVIDIA GPU 用于单页推理;预计每页耗时数秒,具体取决于预设/DPI。社区反馈显示,在高端 Ada/A100 显卡上速度更快。
  • 严肃批次处理:使用vLLM和单张 A100/L40S/A6000 级卡;通过将 PDF 文件分片到各个工作节点来实现扩展。HF 卡确认官方支持 vLLM。

​最后

我在一线科技企业深耕十二载,见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事,早已在效率与薪资上形成代际优势,我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。

我整理出这套 AI 大模型突围资料包:

  • ✅AI大模型学习路线图
  • ✅Agent行业报告
  • ✅100集大模型视频教程
  • ✅大模型书籍PDF
  • ✅DeepSeek教程
  • ✅AI产品经理入门资料

如果你也想通过学大模型技术去帮助自己升职和加薪,可以扫描下方链接【保证100%免费】👇👇
​​
在这里插入图片描述

为什么说现在普通人就业/升职加薪的首选是AI大模型?

人工智能技术的爆发式增长,正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议,到全国两会关于AI产业发展的政策聚焦,再到招聘会上排起的长队,AI的热度已从技术领域渗透到就业市场的每一个角落。

img
智联招聘的最新数据给出了最直观的印证:2025年2月,AI领域求职人数同比增幅突破200% ,远超其他行业平均水平;整个人工智能行业的求职增速达到33.4%,位居各行业榜首,其中人工智能工程师岗位的求职热度更是飙升69.6%。

AI产业的快速扩张,也让人才供需矛盾愈发突出。麦肯锡报告明确预测,到2030年中国AI专业人才需求将达600万人,人才缺口可能高达400万人,这一缺口不仅存在于核心技术领域,更蔓延至产业应用的各个环节。

在这里插入图片描述

​​
在这里插入图片描述

资料包有什么?

①从入门到精通的全套视频教程

包含提示词工程、RAG、Agent等技术点
在这里插入图片描述

② AI大模型学习路线图(还有视频解说)

全过程AI大模型学习路线

在这里插入图片描述

③学习电子书籍和技术文档

市面上的大模型书籍确实太多了,这些是我精选出来的

在这里插入图片描述

④各大厂大模型面试题目详解

在这里插入图片描述

⑤ 这些资料真的有用吗?

这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。

所有的视频教程由智泊AI老师录制,且资料与智泊AI共享,相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。

资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。

在这里插入图片描述
在这里插入图片描述

智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念‌,通过动态追踪大模型开发、数据标注伦理等前沿技术趋势‌,构建起"前沿课程+智能实训+精准就业"的高效培养体系。

课堂上不光教理论,还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

​​​​在这里插入图片描述
在这里插入图片描述

如果说你是以下人群中的其中一类,都可以来智泊AI学习人工智能,找到高薪工作,一次小小的“投资”换来的是终身受益!

应届毕业生‌:无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌:非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能 ‌突破瓶颈:传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓**

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值