# 大语言模型 基于MNN开发的LLM推理引擎,支持目前主流的开源LLM模型。该功能分为2部分: - 模型导出:将torch模型导出为onnx,然后转换为mnn模型;导出tokenizer文件,embedding等文件; - 模型推理:支持导出的模型推理,支持LLM模型的文本生成; ## 快速开始 ### **第一步:模型导出 (Export)** 此步骤是将原始的 PyTorch 模型(如 Qwen2 系列)转换为 MNN 引擎可以加载和推理的格式。 1. **安装依赖**: 进入导出工具目录并安装必要的 Python 包。 ```bash cd ./transformers/llm/export pip install -r requirements.txt ``` 2. **准备原始模型**: 将需要部署的开源 LLM 模型(例如 `Qwen2-0.5B-Instruct`)克隆到本地。**务必确保 `git lfs` 已安装,以下载完整的模型文件**。 ```bash git lfs install git clone https://www.modelscope.cn/qwen/Qwen2-0.5B-Instruct.git ``` 3. **执行导出命令**: 运行 `llmexport.py` 脚本,将模型、Tokenizer、Embedding 等导出为 MNN 格式。 ```bash python llmexport.py \ --path /path/to/Qwen2-0.5B-Instruct \ --export mnn --hqq ``` * **关键产物**:脚本会生成一个包含 `llm.mnn`, `llm.mnn.weight`, `tokenizer.txt`, `embeddings_bf16.bin`【可能存在】, `llm_config.json`, `config.json` 等文件的模型目录。 4. **(可选)高级功能**: * **量化**:通过 `--quant_bit 4` 和 `--quant_block 128` 等参数可以调节量化的Bits数,默认为`4 bit , block size 64`。通过 `--hqq` 或 `--awq` 可以启用对应算法以提升量化后的模型精度,一般建议增加`--hqq` * **LoRA**:通过 `--lora_path` 合并或分离 LoRA 权重。 * **Embeding**:对于目前主流的8b以下模型,采用了`Tie-Embeding`技术,默认不会导出`embeddings_bf16.bin`,而是复用`llm.mnn.weight`中的`lm`权重,需要提升embed精度可以设置 `--seperate_embed` 分离出`embeddings_bf16.bin`。 * **GPTQ**:通过 `--gptq_path` 应用预量化好的 GPTQ 权重。 * **手动转换**:如果直接导出 `mnn` 失败,或者需要fp16/fp32精度的模型,可先导出 `onnx`,再用 `MNNConvert` 工具手动转换。 --- ### **第二步:引擎编译 (Compile)** 此步骤是编译 MNN 的 C++ 推理引擎,使其支持 LLM 推理功能。 1. **配置编译选项**: 在标准的 MNN 编译命令中,**必须添加 `-DMNN_BUILD_LLM=true`** 以启用 LLM 支持。 * **Omni 模型**:如果需要支持图像/音频输入,还需添加 `-DMNN_BUILD_LLM_OMNI=ON`。 * **平台优化**: * **x86 (Mac/Linux)**:可添加 `-DMNN_AVX512=true` 以利用 AVX512 指令集加速。 * **Android**:可添加 `-DMNN_OPENCL=true` 以利用 GPU 加速。 * **iOS**:可添加 `-DMNN_METAL=ON` 以利用 GPU 加速。 * **Web (WASM)**:使用 `emcmake` 并配置 `-DMNN_FORBID_MULTI_THREAD=ON` 等特定选项。 2. **执行编译**: 以 Linux/Mac 为例: ```bash mkdir build && cd build cmake .. -DMNN_BUILD_LLM=true -DMNN_AVX512=true # 根据平台调整选项 make -j16 ``` 编译完成后,会生成核心库文件(如 `libMNN.so`, `libllm.so`)。 --- ### **第三步:运行时配置与推理 (Inference)** 此步骤是配置模型运行参数并启动推理。 1. **准备模型目录**: 将第一步导出的所有文件(`llm.mnn`, `llm.mnn.weight`, `tokenizer.txt`, `embeddings_bf16.bin`, `llm_config.json`)放在同一个文件夹下。 2. **配置 `config.json`**: 编辑或使用自动生成的 `config.json` 文件,根据你的硬件和需求调整参数: * **硬件**:设置 `backend_type` (如 `"cpu"`, `"opencl"`) 和 `thread_num`。 * **性能**:设置 `precision` (如 `"low"` for fp16) 和 `memory` (如 `"low"` for runtime quant)。 * **生成**:设置 `max_new_tokens`, `sampler_type` (如 `"mixed"`), `temperature`, `topK`, `topP` 等。 * **高级**:设置 `reuse_kv` (多轮对话), `chunk` (内存分块) 等。 * **示例**: ```json { "backend_type": "cpu", "thread_num": 4, "precision": "low", "sampler_type": "mixed", "temperature": 0.7, "topP": 0.9, "reuse_kv": true } ``` 3. **运行推理 Demo**: 使用编译好的 `llm_demo` 工具进行推理。 * **交互式聊天**: ```bash ./llm_demo /path/to/model_dir/config.json ``` * **批量处理 Prompt**: ```bash ./llm_demo /path/to/model_dir/config.json /path/to/prompt.txt ``` * **多模态输入** (Omni 模型):在 Prompt 中嵌入 `` 或 `