【mllm】——qnn后端解读

llm, qnn, qualcomm
源码:https://github.com/UbiquitousLearning/mllm

1.qnn后端的接入

这里只是给一个核心的思路,不涉及具体的代码实现。

前言:

  • qualcomm htp后端,因为支持的数据类型有限,int8/int16/float16,如果要用int数据类型加速,需要对模型进行量化。mllm中使用的是int8,但是不是整个整个网络使用int8,而是部分使用,同时qnn npu推理时是cpu+npu混合的。

实现:

  • 因为qualcomm sdk使用方式的限制,没有单独使用qualcomm op进行计算的方式,需要构建graph。所以mllm中将decoder部分拆成几个qnn graph。具体代码如下:
Backend::global_backends[device_]->onSetUpStart(inputs_vec, outputs_vec, getUinqueName());

                // for xnnpack currently
                for (auto &i : inputs) {
                    i.uuid() = inputs[0].module()->activation_tensors[i.name()]->uuid();
                }

                auto outputs = Forward(inputs, anyArgs);
                for (auto &output : outputs) {
                    outputs_vec.push_back(inputs[0].module()->activation_tensors[output.name()]);
                }
                Backend::global_backends[device_]->onSetUpEnd(inputs_vec, outputs_vec, getUinqueName());

qnnbackend.onsetupstart中会初始化QnnModel

qnnModels_.push_back(qnn_wrapper_api::QnnModel());
    // create qnn context, assign context to qnn memory manager
    if (StatusCode::SUCCESS != this->createContext()) {
        this->reportError("Context Creation failure");
    }
#ifdef QNN_ARM
    auto qnnMM = std::static_pointer_cast<QNNMemoryManager>(mem_manager_);
    qnnMM->setQnnInterfaceAndContext(m_context);
#endif

    // initialize qnn graph info, set graph info, graph count
    // NOTE: currently not using it
    QnnHtpGraph_CustomConfig_t customConfig;
    // customConfig.option = QNN_HTP_GRAPH_CONFIG_OPTION_NUM_HVX_THREADS;
    // customConfig.numHvxThreads = 4; // set a number. MAX = number of HVX HW blocks for that SoC
    customConfig.option = QNN_HTP_GRAPH_CONFIG_OPTION_VTCM_SIZE;
    customConfig.vtcmSizeInMB = 8;

    QnnGraph_Config_t graphConfig;
    graphConfig.option = QNN_GRAPH_CONFIG_OPTION_CUSTOM;
    graphConfig.customConfig = &customConfig;

    const QnnGraph_Config_t *pGraphConfig[] = {&graphConfig, NULL};

    const QnnGraph_Config_t **graphConfigs = pGraphConfig;

    m_graphConfigsInfoCount = 1;

    qnn_wrapper_api::ModelError_t err = qnn_wrapper_api::getQnnGraphConfigFromInfo(
        graphName.c_str(), (const qnn_wrapper_api::GraphConfigInfo_t **)m_graphConfigsInfo, m_graphConfigsInfoCount, graphConfigs);
    if (err != qnn_wrapper_api::MODEL_NO_ERROR) {
        this->reportError("Graph Config Info failure");
    }

    err = qnnModels_[qnnModelIndex_].initialize(m_backendHandle,
                                                m_qnnFunctionPointers.qnnInterface,
                                                m_context,
                                                graphName.c_str(),
                                                m_debug,
                                                DO_GRAPH_NODE_VALIDATIONS,
                                                graphConfigs);
    if (err != qnn_wrapper_api::MODEL_NO_ERROR) {
        this->reportError("Graph Initialization failure: " + graphName);
    }

后续再通过op.setup方法往QnnModel中添加tensor和op,如QNNLinearINT8

graphAddNode(name() + ".linearint8", "Conv2d", {inputs[0]->name(), weight_.name()}, matmulOut, params_InceptionV3_InceptionV3_Conv2d_1a_3x3_Conv2D);

2. other

这都是qualcomm sdk中op不支持单op后端支持,必须要构建model来调用。不友好。

03-25
<think>好的,我现在需要回答用户关于MLLM的问题。首先,用户询问的是MLLM的全称和应用。根据用户提供的引用资料,尤其是引用[5],里面提到mllm的全称是多模态LLM推理引擎,并且详细说明了它的应用场景和技术特点。我需要先确认这些信息是否准确,并确保引用正确。 接下来,我要整理MLLM的定义。全称是“多模态LLM推理引擎”,这里的LLM可能指的是“Large Language Model”(大语言模型)。多模态意味着它能够处理多种类型的数据输入,比如文本、图像等。根据引用[5],MLLM使用纯C/C++实现,没有依赖项,适合手机和边缘设备,这说明它的高效和轻量化。同时,它支持硬件加速指令,如ARM NEON和x86 AVX2,这对性能优化很重要。另外,它还支持4位和6位的整数量化技术,这有助于减少模型体积同时保持性能。 然后,关于应用场景,引用[5]提到MLLM是处理复杂AI任务的得力助手,特别是在手机和边缘设备上。这意味着它可以用于需要实时处理和多模态输入的场合,比如智能助手、图像识别、自动驾驶中的边缘计算等。可能还需要结合其他引用,比如引用[4]提到的LLaVA-UHD框架处理高分辨率图像,但用户的问题集中在MLLM上,所以重点应放在引用[5]。 需要确保回答结构清晰,分点说明全称、技术特点和应用场景。同时,要检查是否符合用户提供的格式要求:行内数学公式用$...$,独立公式单独成段,但这里可能不需要数学公式。引用标识要正确添加,比如引用[5]在相关段落末尾。 最后,生成相关问题时要围绕MLLM的技术、优化、应用场景等方面提问,确保问题相关且有助于用户进一步了解。例如,询问MLLM的技术优势、在边缘计算中的作用,或者与其他多模态模型的区别。 现在需要将这些整理成自然的中文回答,符合格式要求,正确引用,并生成相关问题。</think>### MLLM 的定义及应用 **MLLM** 全称为 **多模态LLM推理引擎**(Multimodal LLM Inference Engine),是一种专为多模态大模型设计的轻量化推理框架。其核心目标是高效运行多模态任务(如结合文本、图像等输入),尤其在资源受限的设备(如手机、边缘设备)上实现低延迟、高性能的推理[^5]。 #### 技术特点 1. **高效轻量化** MLLM 使用纯 **C/C++** 实现,无需依赖第三方库,显著减少资源占用。通过 **4位/6位整数量化技术**,进一步压缩模型体积,同时保持推理精度。 2. **硬件加速优化** 支持 **ARM NEON** 和 **x86 AVX2** 等指令集,充分利用现代计算硬件的并行能力,提升运算效率。 3. **多模态支持** 可适配如 **Fuyu-8B** 等多模态大模型,处理图像、文本等混合输入的任务,例如图像描述生成、视觉问答等。 #### 应用场景 - **移动端AI助手**:在手机端实时运行复杂的多模态模型(如结合摄像头输入与自然语言交互)。 - **边缘计算**:在物联网设备或自动驾驶系统中,快速处理传感器数据(如图像、语音)并生成决策。 - **工业检测**:通过轻量化部署,在工厂设备上实现高精度视觉缺陷检测与文本报告生成。 ```cpp // 示例:MLLM 的量化处理逻辑(简化) void quantize_tensor(float* input, int8_t* output, int size, float scale) { for (int i = 0; i < size; i++) { output[i] = static_cast<int8_t>(input[i] * scale); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值