MNN(Mobile Neural Network)是一个高性能、通用的深度学习框架,支持在移动端、PC端、服务端、嵌入式等各种设备上高效运行。MNN利用设备的CPU、GPU能力,充分“榨干”设备的硬件资源,来进行深度学习的高性能部署。
基于MNN开发的LLM推理引擎,支持目前主流的开源LLM模型。该功能分为2部分:
请首先从Github克隆MNN源码。
git clone https://github.com/alibaba/MNN.git
llmexport
是一个LLM模型导出工具,能够将LLM模型导出为 onnx 和 mnn 模型。
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_path
--quant_bit
;量化的block大小使用--quant_block
--lm_quant_bit
来制定lm_head层权重的量化bit数,不指定则使用--quant_bit
的量化bit数将需要导出的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没安装导致下载的是空模型
llmexport.py
导出模型cd ./transformers/llm/export
# 导出模型,tokenizer和embedding,并导出对应的mnn模型
python llmexport.py \
--path /path/to/DeepSeek-R1-Distill-Qwen-1.5B \
--export mnn
导出产物为:
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
--export mnn
,注意,你需要先安装pymnn或者通过--mnnconvert
选项指定MNNConvert工具的地址,两种条件必须满足其中一个。如果没有安装pymnn并且没有通过--mnnconvert
指定MNNConvert工具的地址,那么llmexport.py脚本会在目录../../../build/
下寻找MNNConvert工具,需保证该目录下存在MNNConvert文件。此方案目前支持导出4bit和8bit模型--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官方文档。
# 编译
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_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