开启左侧

端侧初次支持Deepseek-OCR!

[复制链接]
TL;DR
    咱们正在 mllm 端侧拉理框架上撑持了 DeepSeek-OCR 模子 mllm框架是咱们今朝已经知的第一个撑持该模子的端侧框架 咱们对于 DeepSeek-OCR 模子的 LLM局部 干了 4bit 质化 正在 512x512输出 战Tiny方式 下,prefill: 19.32 tokens/s, decode: 60.37 tokens/s欢送 各人去使用 mllm,给 mllm 提一点儿倡议战 PR

话未几道,先去瞅下 mllm 上拉理 DeepSeek-OCR 的结果吧!

01
介绍

DeepSeek-OCR 测验考试颠末望觉 Tokens 来收缩少高低文,去处置年夜模子的少高低文的瓶颈成就。该模子由三个部门构成,SAM+CLIP二个组件处置望觉疑息,一个 3B 的 MoE基模。比拟于少高低文的处置计划上的根究,实在 3B 的 MoE关于 端侧拉理更有吸收力一面。未来端侧的模子有必然的趋势会晨着 MoE 标的目的演退,而且偏重正在 NPUMoE减速 上收力。咱们借着那个模子,将 mllm 中的 MoE局部 干了必然的完美。

端侧初度撑持Deepseek-OCR!w2.jpg

DeepSeek 供给了很多的分辩率Settings。正在MLLM的尝试中,咱们撑持了 Tiny,Small 战 Base。关于正在端侧的场景下,举荐使用 Tiny 树立,而且 resize以后 的图象到 512x512 去得到更佳的 TTFT。

颠末图象去收缩少文原是一个新奇的 Idea,DeepSeek 民间给出的尝试数据也十分的猛:文原Token收缩到10倍的情况下仍然有 97% 的精确率。正在端侧的场景上,少高低文的影象不竭是一个亟待处置的成就,deepseek-ocr 将 text tokens 收缩到 visual tokens 的办法干了一次很佳的测验考试。关于望觉模块那里戴去的 overhead,正在端侧反而是比力益处理的,因为那二个望觉模块的 Shape绝对 牢固,正在 NPU 上干快速完毕相对 LLM 来讲是轻快的。

受益于 MLLM 的 Eager 设想,咱们能够很快的撑持上一个崭新的模子构造,好比 SAM 模子里面的 Block:
class Block final : public nn::Module {  nn::LayerNorm norm1_;  nn::LayerNorm norm2_;  MLPBlock mlp_;  int window_size_; public:  Attention attn_;  int layer_idx_;  Block() = default;  Block(const std::string& name, int dim, int num_heads, float mlp_ratio, bool qkv_bias, bool use_rel_pos, int window_size,        std::optional<std::tuple<int, int>> input_size, const DpskOcrConfig& config)      : nn::Module(name) {    norm1_ = reg<nn::LayerNorm>("norm1", Tensor::shape_t{dim});    attn_ = reg<Attention>("attn", dim, num_heads, qkv_bias, use_rel_pos,                       window_size == 0 ? input_size : std::make_optional(std::make_tuple(window_size, window_size)), config);    norm2_ = reg<nn::LayerNorm>("norm2", Tensor::shape_t{dim});    mlp_ = reg<MLPBlock>("mlp", dim, (int)(dim * mlp_ratio), config);    window_size_ = window_size;  }  std::tuple<Tensor, std::tuple<int, int>> windowPartition(Tensor x, int window_size) {    auto B = x.size(0);    auto H = x.size(1);    auto W = x.size(2);    auto C = x.size(3);    auto pad_h = (window_size - H % window_size) % window_size;    auto pad_w = (window_size - W % window_size) % window_size;    if (pad_h > 0 || pad_w > 0) { x = nn::functional::pad(x, {0, 0, 0, pad_w, 0, pad_h}); }    auto Hp = H + pad_h;    auto Wp = W + pad_w;    x = x.view({B, Hp / window_size, window_size, Wp / window_size, window_size, C});    auto window = x.permute({0, 1, 3, 2, 4, 5}).view({-1, window_size, window_size, C});    return {window, {Hp, Wp}};  }  Tensor windowUnpartition(Tensor windows, int window_size, std::tuple<int, int> pad_wh, std::tuple<int, int> hw) {    auto [Hp, Wp] = pad_wh;    auto [H, W] = hw;    auto B = windows.size(0) / (Hp * Wp / window_size / window_size);    auto x = windows.view({B, Hp / window_size, Wp / window_size, window_size, window_size, -1});    x = x.permute({0, 1, 3, 2, 4, 5}).view({B, Hp, Wp, -1});    if (Hp > H || Wp > W) { x = x[{kAll, {kAll, H}, {kAll, W}, kAll}].contiguous(); }    return x;  }  std::vector<Tensor> forward(const std::vector<Tensor>& inputs, const std::vector<AnyValue>& args) override {    auto x = inputs[0];    auto shortcut = x;    x = norm1_(x);    // Window partition    int H = 0;    int W = 0;    std::tuple<int, int> pad_hw;    if (window_size_ > 0) {      H = x.size(1);      W = x.size(2);      std::tie(x, pad_hw) = windowPartition(x, window_size_);    }    x = attn_(x)[0];    // Reverse window partition    if (window_size_ > 0) { x = windowUnpartition(x, window_size_, pad_hw, {H, W}); }    x = shortcut + x;    x = x + mlp_(norm2_(x))[0];    return {x};  }};相较于鉴于固态图导出的计划,咱们的 Eager方式 正在面临露庞大掌握流的模子时,能够清楚加快本型迭代;共时,mllm 亦具备一键 Trace功用 ,可将静态图固化成固态图以退一步榨取功用,该链路今朝邪连续挨磨中。

02
怎样使用下载模子咱们使用了 4bit per-group 质化去质化了 DeepSeek-OCR 模子的 LLM局部 ,需要您的装备撑持 i8妹妹 以运行。咱们的模子能够正在 modelscope 仄台高低载:
https://www.modelscope.cn/models/mllmTeam/DeepSeek-OCR-w4a8-i8妹妹-kai
编译 MLLM 名目今朝仅撑持从源码编译 mllm 名目,咱们交下来会把模子上线到 pymllm 中。您能够使用上面的号令去施行:https://github.com/UbiquitousLearning/mllm
git checkout v2
git submodule update --init--recursive装置须要的依靠:pip install -r requirements.txt而后使用python剧本便可编译出可施行文献 mllm-deepseek-ocr-runner# For Android devices
python task.py tasks/build_android.yaml

# For MacOS
# python task.py tasks/build_osx_apple_sillion_accelerate.yaml越发具体的实质能够参照咱们的文档:https://ubiquitouslearning.github.io/mllm/

03
运行编译进去的文献正在build-*目次的bin上面,使用以下指令便可运行mllm-deepseek-ocr-runner -m model.mllm -c config.json -t tokenizer.json

04
理论表示咱们起首尝试Tiny mode下的表示,使用DeepSeek-OCR的论文尾页动作尝试图片,该图片缩搁为512x512。

端侧初度撑持Deepseek-OCR!w3.jpg

输出 Prompt:<image>\n<|grounding|>Convert the document to markdown. 咱们正在 Xiaomi 17 上干了尝试,输出的理论表示以下:
交着尝试Base mode下的表示,咱们使用mllm上DeepSeek-OCR的PR图片去动作尝试图片,图片巨细为1840x1426

输出Prompt为
<image>\n<|grounding|>Convert the document to markdown.
正在Xiaomi 17上干尝试,理论表示以下

05
未来事情1.减速 望觉模子(质化):
    对于 VL 模块干 int8 的 per-group 质化

    加快现有 conv2d 的完毕

    对于部门内乱存干脚工复用
2. 将 DeepSeek-OCR 散成到 pymllm packages 中3. NPU 上的 MoE减速

最初给咱们的端侧拉理框架 mllm 挨个告白。咱们团队的端侧多模态年夜模子拉理引擎mllm短期正在 GitHub 上突破了1.1k star。十分感谢社区对于名目的存眷取撑持!MLLM未来 将正在连续劣化 CPU功用 的共时,深度连接 QNN 取 Ascend 死态,力图成为端侧 NPU 拉理的尾选计划。mllm: https://github.com/UbiquitousLearning/mllmdoc: https://ubiquitouslearning.github.io/mllm/
您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )