腾讯HunyuanOCR开源端到端OCR-1B:本地部署与测试

腾讯HunyuanOCR开源端到端OCR-1B:本地部署与测试

腾讯混元 HunyuanOCR Huggingface 开源:https://huggingface.co/tencent/HunyuanOCR , 同时modelscope (https://www.modelscope.cn/models/Tencent-Hunyuan/HunyuanOCR)也可以下载了。

github地址: https://github.com/Tencent-Hunyuan/HunyuanOCR/blob/main/README_zh.md

本次在本地部署进行测试,看看实际效果。

1.简介

HunyuanOCR 是由腾讯开发的轻量级端到端OCR专家视觉语言模型(VLM),基于Hunyuan的原生多模态架构。该模型仅包含1B参数,却在多个行业基准测试中达到了最先进的水平,适用于复杂多语言文档解析、文本定位、开放字段信息提取、视频字幕提取和照片翻译等任务。

2.部署环境

官方环境要求:

  • 🖥️ 操作系统:Linux
  • 🐍 Python版本:3.12+(推荐)
  • ⚡ CUDA版本:12.9
  • 🔥 PyTorch版本:2.7.1
  • 🎮 GPU:支持CUDA的NVIDIA显卡
  • 🧠 GPU显存:20GB (for vLLM)
  • 💾 磁盘空间:6GB

实际环境:

环境版本
ubuntu-24.04.3 Serverrelease 10.0
Cuda12.8
显卡 RTX 2080 Ti 22G驱动 NVIDIA-Linux-x86_64-580.105.08
uv0.9.13
内存32G

3.下载

这里选择从modelscope 进行下载

pip install modelscope modelscope download --model Tencent-Hunyuan/HunyuanOCR --cache_dir '/home/qy/models/'

4.uv环境

# 安装UVcurl -LsSf https://astral.sh/uv/install.sh |sh# 查看python版本 uv python list # 创建虚拟环境,并指定python版本 uv venv hunyuanocr --python 3.12cd hunyuanocr # 激活环境, 激活后,括号中显示 hunyuanocr 表示已经切了环境source hunyuanocr/bin/activate # 配置PyPI仓库为国内源vim ~/.config/uv/uv.toml [registries.pypi] index ="https://mirrors.aliyun.com/pypi/simple/" default =true

5.下载推理源码

git clone https://github.com/Tencent-Hunyuan/HunyuanOCR.git cd /home/qy/hunyuan/HunyuanOCR-main uv pip install -r requirements.txt 

6.安装vLLM

uv pip install -U "aiohttp<4" uv pip install -U vllm --extra-index-url https://wheels.vllm.ai/nightly 
如果按照官方文档: uv pip install -U vllm --pre --extra-index-url https://wheels.vllm.ai/nightly执行,会报错:

安装报错:

这是因为 [email protected]在编译的时候,需要一个头文件,但是当前 conda环境中没有这个头文件。

longintrepr.hCPython 内部头文件,只存在于:

  • python-dev(Linux)
  • python3.X-devel(CentOS)

为什么pip 会出现这种编译行为?

因为使用了 nightly (--pre) 的 vllm:

uv pip install -U vllm --pre --extra-index-url https://wheels.vllm.ai/nightly 

vLLM nightly 依赖: aiohttp==4.0.0a1 这是一个 alpha 版,没有发布 wheel,需要从源码编译,所以会触发 C 扩展构建 → 然后失败。

采用下面办法处理:

强制安装 aiohttp 3.9.x(稳定版,有 wheel), 不再加 --pre, 因为 --pre 会允许 pip 随便升级所有依赖(包括 aiohttp),从而又去编译 aiohttp 4。

uv pip install -U "aiohttp<4" uv pip install -U vllm --extra-index-url https://wheels.vllm.ai/nightly 

7.安装cuda-compat

提供向后兼容能力,允许基于较新 CUDA 版本开发的应用程序在仅安装旧版 CUDA 驱动的环境中运行

下载地址: https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2404/x86_64/

下载文件:cuda-compat-12-9_575.57.08-0ubuntu1_amd64.deb

sudo dpkg -i cuda-compat-12-9_575.57.08-0ubuntu1_amd64.deb echo'export LD_LIBRARY_PATH=/usr/local/cuda-12.9/compat:$LD_LIBRARY_PATH'>> ~/.bashrc source ~/.bashrc # verify cuda-compat-12-9ls /usr/local/cuda-12.9/compat 

8.检查环境

nvcc --version Build cuda_12.8.r12.8/compiler.35583870_0 python Python 3.12.3 >>>import torch >>> print(torch.version.cuda)12.8>>> print(torch.cuda.is_available()) /home/qy/hunyuanocr/lib/python3.12/site-packages/torch/cuda/__init__.py:182: UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 803: system has unsupported display driver / cuda driver combination (Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:119.)return torch._C._cuda_getDeviceCount()>0 False 
如果是false,则说明 touch 不能使用 CUDA, 我们需要安装正确的touch
uv pip installtorch==2.9.0 torchvision==0.24.0 torchaudio==2.9.0 --index-url https://download.pytorch.org/whl/cu128 
再进行环境检查:print(torch.version) ==> 2.9.0+cu128 说明安装的就是 cuda 12.8 版本的 torchprint(torch.version.cuda)==> 12.8 说明cuda 版本也正确print(torch.cuda.is_available()) == False 还是 False

想到了,在先前的测试中,我安装了 cuda 12.9 版本,是不是环境变量有问题?echo $LD_LIBRARY_PATH ==> /usr/local/cuda-12.9/compat:/usr/local/cuda/lib64 果然是环境变量的问题

修改LD_LIBRARY_PATH 环境变量

一次检查几个文件:

  • ~/.bashrc
  • ~/.profile
  • /etc/profile

将错误的环境变量修改过来,我的配置在了 ~/.bashrc

vim ~/.bashrc ... exportLD_LIBRARY_PATH=/usr/local/cuda-12.8/compat:$LD_LIBRARY_PATH# 让环境变量生效source ~/.bashrc echo$LD_LIBRARY_PATH

9.启动vLLM服务

# export HF_ENDPOINT=https://hf-mirror.com vllm serve \ /home/qy/models/Tencent-Hunyuan/HunyuanOCR \ --served-model-name HunyuanOCR \ --host 0.0.0.0 \ --port 6688\ --no-enable-prefix-caching \ --mm-processor-cache-gb 0\ --gpu-memory-utilization 0.9
  • --no-enable-prefix-caching:禁用前缀缓存(提升OCR性能)
  • --mm-processor-cache-gb 0:关闭视觉处理器缓存
  • --max-num-batched-tokens:根据GPU显存调整批量处理大小
  • --gpu-memory-utilization显存使用,过小服务可能因为现存无法加载模型而无法启动
服务端启动后,会开启6688 端口,并提供兼容 OpenAI API服务。

10.客户端接入

因为服务端用 vLLM部署,它提供了兼容OpenAI API 服务,所以可以写代码接入,也可以用现成的客户端工具接入。

10.1 Cherry Studio 接入测试

官方推荐了提示词:

任务中文提示词英文提示词
文字检测识别检测并识别图片中的文字,将文本坐标格式化输出。Detect and recognize text in the image, and output the text coordinates in a formatted manner.
文档解析• 识别图片中的公式,用 LaTeX 格式表示。 • 把图中的表格解析为 HTML。 • 解析图中的图表,对于流程图使用 Mermaid 格式表示,其他图表使用 Markdown 格式表示。 • 提取文档图片中正文的所有信息用 markdown 格式表示,其中页眉、页脚部分忽略,表格用 html 格式表达,文档中公式用 latex 格式表示,按照阅读顺序组织进行解析。• Identify the formula in the image and represent it using LaTeX format. • Parse the table in the image into HTML. • Parse the chart in the image; use Mermaid format for flowcharts and Markdown for other charts. • Extract all information from the main body of the document image and represent it in markdown format, ignoring headers and footers. Tables should be expressed in HTML format, formulas in the document should be represented using LaTeX format, and the parsing should be organized according to the reading order.
通用文字提取• 提取图中的文字。• Extract the text in the image.
信息抽取• 输出 Key 的值。 • 提取图片中的: [‘key1’,‘key2’, …] 的字段内容,并按照 JSON 格式返回。 • 提取图片中的字幕。• Output the value of Key. • Extract the content of the fields: [‘key1’,‘key2’, …] from the image and return it in JSON format. • Extract the subtitles from the image.
翻译先提取文字,再将文字内容翻译为英文。若是文档,则其中页眉、页脚忽略。公式用latex格式表示,表格用html格式表示。First extract the text, then translate the text content into English. If it is a document, ignore the header and footer. Formulas should be represented in LaTeX format, and tables should be represented in HTML format.

10.2 python代码接入

前面使用 Cherrry Studio 接入,很多情况下会导致服务器崩溃,服务停止。所以最好使用代码来进行测试

github上提供了模板代码: https://github.com/Tencent-Hunyuan/HunyuanOCR , 可以下载代码自行测试。

其它语言只要按照兼容的 openAI API 规范接入即可使用。

Read more

Flutter for OpenHarmony: Flutter 三方库 directed_graph 在鸿蒙应用中优雅处理复杂的拓扑排序与依赖关系(算法级工具)

Flutter for OpenHarmony: Flutter 三方库 directed_graph 在鸿蒙应用中优雅处理复杂的拓扑排序与依赖关系(算法级工具)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net 前言 在进行 OpenHarmony 的复杂业务逻辑设计时,我们经常会遇到“依赖关联”问题。例如: 1. 任务调度:任务 A 依赖于任务 B 和 C,任务 B 依赖于 D。你应该按什么顺序运行它们? 2. 数据流建模:在鸿蒙分布式节点中,数据是如何从一个端点流向另一个端点的?是否存在循环引用(Cycle)? 3. 资源加载器:一个大型鸿蒙 HAP 包内的资源加载优先级排序。 directed_graph 是一款纯粹的、算法级别的 Dart 库。它提供了标准的数据结构模型,能帮你极其高效地处理这些复杂的拓扑(Topology)关系。 一、有向图逻辑模型 该库支持对图节点进行深度遍历、

By Ne0inhk
动态规划 路径类 DP 入门:3 道经典例题(最小路径和 + 迷雾森林 + 过河卒)全解析

动态规划 路径类 DP 入门:3 道经典例题(最小路径和 + 迷雾森林 + 过河卒)全解析

文章目录 * 矩阵的最小路径和 * 迷雾森林 * 过河卒 路径类 dp 是线性 dp 的⼀种,它是在⼀个 n × m 的矩阵中设置⼀个⾏⾛规则,研究从起点⾛到终点的 ⽅案数、最⼩路径和或者最⼤路径和等等的问题。 ⼊⻔阶段的《数字三⻆形》其实就是路径类 dp。 矩阵的最小路径和 题目描述 题目解析 1、状态表示 dp[i][j]表示从[1 1]格子走到[i j]格子时,所有方案下的最小路径和。 2、状态转移方程 我们还是以最后一步来推导状态转移方程,走到最后一个格子dp[n][m]

By Ne0inhk
数据结构:单链表(2)

数据结构:单链表(2)

目录 前言  一、实现单链表 介绍: 1.链表节点查找 2.链表在指定位置之前或之后插入元素 (1)链表在指定位置之前插入元素 举实例: (2)链表在指定位置之后插入元素 3.链表在指定位置删除或指定位置之后删除 (1)链表在指定位置删除 (2)链表在指定位置之后删除 三、举实例,测试代码(包括所有代码展现) 1.h 1.cpp main.cpp 四、链表的分类 按节点连接方向分类 按是否有头节点分类   总结 前言  上篇文章讲解了单链表的知识,包括:单链表的概念,单链表的结构、实现单链表(单链表的尾插、单链表的头插、单链表的尾删、单链表的头删)知识的相关内容,实现单链表其余的函数、链表的分类、单链表算法题知识的相关内容,为本章节知识的内容。

By Ne0inhk
【LeetCode经典题解】平衡二叉树高效判断:从O(n²)到O(n)优化

【LeetCode经典题解】平衡二叉树高效判断:从O(n²)到O(n)优化

🎁个人主页:User_芊芊君子 🎉欢迎大家点赞👍评论📝收藏⭐文章 🔍系列专栏:Java.数据结构 【前言】 在数据结构的知识体系里,平衡二叉树是确保二叉树各类操作高效执行的关键存在。力扣平台上“判断二叉树是否为平衡二叉树”这一经典问题,看似解法直观,实则能通过不同的解题思路,清晰展现出算法效率的天差地别,从最开始直观却低效的递归方式,到经过巧妙优化后的高效递归策略,背后蕴含着对平衡二叉树本质的深度剖析与精准把握。 这里写目录标题 * 一、平衡二叉树 * 二、思路分析 * 方法一:时间复杂度为O(n^2) * 方法二:时间复杂度为O(n) * 三、代码展示 * 四、总结 一、平衡二叉树 平衡二叉树又称AVL树:当一棵空树或者它的左右两棵字数的高度差的绝对值不超过一,并且两棵子树都是平衡二叉树 【注意】 任意节点的左右子树高度差不超过一;所以子树都满足平衡条件; 二、思路分析 方法一:时间复杂度为O(

By Ne0inhk