AI 开放平台

提供适配不同硬件平台的AI模型,探索更多端侧场景应用

在此芯P1上基于MNN进行大模型推理

此芯: P1

MNN(Mobile Neural Network)是一个高性能、通用的深度学习框架,支持在移动端、PC端、服务端、嵌入式等各种设备上高效运行。MNN利用设备的CPU、GPU能力,充分“榨干”设备的硬件资源,来进行深度学习的高性能部署。

基于MNN开发的LLM推理引擎,支持目前主流的开源LLM模型。该功能分为2部分:

  • 模型导出:将Torch模型导出为ONNX,然后转换为MNN模型;导出tokenizer文件,embedding等文件;
  • 模型推理:支持导出的模型推理,支持LLM模型的文本生成;

请首先从Github克隆MNN源码。

git clone https://github.com/alibaba/MNN.git

模型导出

llmexport是一个LLM模型导出工具,能够将LLM模型导出为 onnxmnn 模型。

安装依赖软件包

cd ./transformers/llm/export
pip install -r requirements.txt

llmexport使用方法及参数说明

usage: llmexport.py [-h] --path PATH [--type TYPE] [--lora_path LORA_PATH] [--dst_path DST_PATH] [--test TEST] [--export EXPORT]
                    [--quant_bit QUANT_BIT] [--quant_block QUANT_BLOCK] [--lm_quant_bit LM_QUANT_BIT]
                    [--mnnconvert MNNCONVERT]

options:
  -h, --help            show this help message and exit
  --path PATH           path(`str` or `os.PathLike`):
                        Can be either:
                            - A string, the *model id* of a pretrained model like `THUDM/chatglm-6b`. [TODO]
                            - A path to a *directory* clone from repo like `../chatglm-6b`.
  --type TYPE           type(`str`, *optional*):
                            The pretrain llm model type.
  --lora_path LORA_PATH
                        lora path, defaut is `None` mean not apply lora.
  --dst_path DST_PATH   export onnx/mnn model to path, defaut is `./model`.
  --test TEST           test model inference with query `TEST`.
  --export EXPORT       export model to an onnx/mnn model.
  --quant_bit QUANT_BIT
                        mnn quant bit, 4 or 8, default is 4.
  --quant_block QUANT_BLOCK
                        mnn quant block, default is 0 mean channle-wise.
  --lm_quant_bit LM_QUANT_BIT
                        mnn lm_head quant bit, 4 or 8, default is `quant_bit`.
  --mnnconvert MNNCONVERT
                        local mnnconvert path, if invalid, using pymnn.

特别注意这些参数的设定:

  • 支持对模型进行对话测试,使用--test $query会返回llm的回复内容
  • 支持合并lora权重后导出,指定lora权重的目录使用--lora_path
  • 制定量化bit数使用--quant_bit;量化的block大小使用--quant_block
  • 使用--lm_quant_bit来制定lm_head层权重的量化bit数,不指定则使用--quant_bit的量化bit数

模型导出案例说明

  1. 将需要导出的LLM项目clone到本地,如:DeepSeek-R1-Distill-Qwen-1.5B

    git lfs install
    git clone https://www.modelscope.cn/deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B.git

clone 后检查一下模型大小,有可能因为lfs没安装导致下载的是空模型

  1. 执行llmexport.py导出模型
cd ./transformers/llm/export
# 导出模型,tokenizer和embedding,并导出对应的mnn模型
python llmexport.py \
        --path /path/to/DeepSeek-R1-Distill-Qwen-1.5B \
        --export mnn
  1. 导出产物

导出产物为:

  • config.json: 模型运行时的配置,可手动修改;
  • embeddings_bf16.bin: 模型的embedding权重二进制文件,推理时使用;
  • llm.mnn: 模型的mnn文件,推理时使用;
  • llm.mnn.json: mnn模型对应的json文件,apply_lora或者gptq量化权重时使用;
  • llm.mnn.weight: 模型的mnn权重,推理时使用;
  • llm.onnx: 模型的onnx文件,不包含权重,推理时不使用;
  • llm_config.json: 模型的配置信息,推理时使用;
  • tokenizer.txt: 模型的tokenzier文件,推理时使用;

目录结构如下所示:

.
└── model
     ├── config.json
     ├── embeddings_bf16.bin
     ├── llm.mnn
     ├── llm.mnn.json
     ├── llm.mnn.weight
     ├── onnx/
          ├──llm.onnx
          ├──llm.onnx.data
     ├── llm_config.json
     └── tokenizer.txt

特别说明

  • 直接转为mnn模型,使用--export mnn,注意,你需要先安装pymnn或者通过--mnnconvert选项指定MNNConvert工具的地址,两种条件必须满足其中一个。如果没有安装pymnn并且没有通过--mnnconvert指定MNNConvert工具的地址,那么llmexport.py脚本会在目录../../../build/下寻找MNNConvert工具,需保证该目录下存在MNNConvert文件。此方案目前支持导出4bit和8bit模型
  • 如果直接转为mnn模型遇到问题,或者需要其他bits数的量化(如5bit/6bit),可以先将模型先转为onnx模型,使用--export onnx,然后使用./MNNConvert工具将onnx模型转为mnn模型:
./MNNConvert --modelFile ../transformers/llm/export/model/onnx/llm.onnx --MNNModel llm.mnn --keepInputFormat --weightQuantBits=4 --weightQuantBlock=128 -f ONNX --transformerFuse=1 --allowCustomOp --saveExternalData

模型推理

ModelScope也提供了转换好的模型,可以直接下载后运行推理。

git clone https://www.modelscope.cn/MNN/DeepSeek-R1-1.5B-Qwen-MNN.git

编译MNN

编译时需要增加必需编译宏,详细的编译宏介绍,请查看MNN官方文档

# 编译
cd MNN
mkdir build && cd build
cmake .. \
 -DCMAKE_BUILD_TYPE=Release\
 -DMNN_LOW_MEMORY=ON\
 -DMNN_CPU_WEIGHT_DEQUANT_GEMM=ON\
 -DMNN_BUILD_LLM=ON\
 -DMNN_SUPPORT_TRANSFORMER_FUSE=ON\
 -DMNN_BUILD_SHARED_LIBS=OFF\
 -DMNN_BUILD_TEST=ON\
 -DMNN_BUILD_BENCHMARK=ON
make -j8

运行LLM推理

./llm_demo /path/to/DeepSeek-R1-1.5B-Qwen-MNN/config.json prompt.txt

# 模型运行时间
prompt tokens num = 9
decode tokens num = 512
 vision time = 0.00 s
  audio time = 0.00 s
prefill time = 0.29 s
 decode time = 19.84 s
 sample time = 0.15 s
prefill speed = 30.86 tok/s
 decode speed = 25.81 tok/s