# 大语言模型
基于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` 或 `--omni` 可以启用对应算法以提升量化后的模型精度,一般建议增加`--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 中嵌入 `
` 或 `