MNN推理LLM

发布时间 2023-10-22 22:04:47作者: SheepHuan

LLM现在太火了,MNN也终于开源了一个MNN-LLM 项目支持

1 MNN-LLM 编译

1.1 android编译cli_demo

我们先去MNN那儿下载.so库和include/MNN。分别放入libs/和include上。
然后按照readme编译,我写了在windows上交叉编译的脚本。

  1. libs/ 结构

    (base) PS D:\code\llm-opt\mnn-llm\libs> tree /f
    卷 数据 的文件夹 PATH 列表
    卷序列号为 8681-1E02
    D:.
        .gitkeep
        libc++_shared.so
        libMNN.so
        libmnncore.so
        libMNNOpenCV.so
        libMNN_CL.so
        libMNN_Express.so
        libMNN_Vulkan.so
    
    没有子文件夹
    
  2. include/结构,复制MNN/到文件夹下

    (base) PS D:\code\llm-opt\mnn-llm\include> tree /f
    卷 数据 的文件夹 PATH 列表
    卷序列号为 8681-1E02
    D:.
    │  httplib.h
    │  llm.hpp
    │  tokenizer.hpp
    │
    └─MNN
        │  AutoTime.hpp
        │  ErrorCode.hpp
        │  HalideRuntime.h
        │  ImageProcess.hpp
        │  Interpreter.hpp
        │  Matrix.h
        │  MNNDefine.h
        │  MNNForwardType.h
        │  MNNSharedContext.h
        │  Rect.h
        │  Tensor.hpp
        │
        ├─expr
        │      Executor.hpp
        │      ExecutorScope.hpp
        │      Expr.hpp
        │      ExprCreator.hpp
        │      MathOp.hpp
        │      Module.hpp
        │      NeuralNetWorkOp.hpp
        │      Optimizer.hpp
        │      Scope.hpp
        │
        └─plugin
                PluginContext.hpp
                PluginKernel.hpp
                PluginShapeInference.hpp
    
  3. 交叉编译

    $ANDROID_NDK="D:/env_library/android_sdk/ndk/26.0.10792818" # 换成自己的路径
    # 4. build mnn-llm android
    mkdir android_build
    cd android_build
    cmake .. `
    -DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" `
    -DANDROID_STL=c++_static `
    -DANDROID_ABI="arm64-v8a" `
    -DANDROID_NATIVE_API_LEVEL=android-27  `
    -DCMAKE_BUILD_TYPE=Release `
    -DBUILD_FOR_ANDROID=ON `
    -G "Ninja"
    cmake --build .
    cd ..
    

这样就会在android_build目录下编译出cli_demo了。

1.2 NVIDIA Jetson AGX XAVIER编译

按照文档要求来,我是本地编译的,交叉编译麻烦了些。

我创建了一个docker进行编译

docker run -it --net=host --runtime nvidia --name mnn-llm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix/:/tmp/.X11-unix nvcr.io/nvidia/l4t-jetpack:r35.4.1 
  1. clone MNN 和 mnn-llm,这里注意下2.7.2版本的MNN编译有问题,要改成2.7.1就行了。

    git clone https://github.com/wangzhaode/mnn-llm.git
    
  2. 编译

    ./script/build.sh
    

2 llm-export 模型导出

自己按照文档先安装好环境即可。

  1. clone llm-export

    git clone https://github.com/wangzhaode/llm-export.git
    
  2. clone chatglm2-6b,在llm-export的上级目录下git clone

    git clone https://modelscope.cn/ZhipuAI/chatglm2-6b.git 
    
  3. 导出fp16模型,当模型导出到chatglm2-6b/

    mkdir chatglm2-6b_model/
    python llm_export.py --path ../chatglm2-6b --export_path chatglm2-6b_model/ --export_split --export_verbose --export_token
    
  4. onnx to mnn, mnnconvert命令是通过pip install MNN 安装获得的

    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_0.onnx --MNNModel chatglm2-6b_model_mnn/block_0.mnn --bizCode biz  --fp16 
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_1.onnx --MNNModel chatglm2-6b_model_mnn/block_1.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_2.onnx --MNNModel chatglm2-6b_model_mnn/block_2.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_3.onnx --MNNModel chatglm2-6b_model_mnn/block_3.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_4.onnx --MNNModel chatglm2-6b_model_mnn/block_4.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_5.onnx --MNNModel chatglm2-6b_model_mnn/block_5.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_6.onnx --MNNModel chatglm2-6b_model_mnn/block_6.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_7.onnx --MNNModel chatglm2-6b_model_mnn/block_7.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_8.onnx --MNNModel chatglm2-6b_model_mnn/block_8.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_9.onnx --MNNModel chatglm2-6b_model_mnn/block_9.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_10.onnx --MNNModel chatglm2-6b_model_mnn/block_10.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_11.onnx --MNNModel chatglm2-6b_model_mnn/block_11.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_12.onnx --MNNModel chatglm2-6b_model_mnn/block_12.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_13.onnx --MNNModel chatglm2-6b_model_mnn/block_13.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_14.onnx --MNNModel chatglm2-6b_model_mnn/block_14.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_15.onnx --MNNModel chatglm2-6b_model_mnn/block_15.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_16.onnx --MNNModel chatglm2-6b_model_mnn/block_16.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_17.onnx --MNNModel chatglm2-6b_model_mnn/block_17.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_18.onnx --MNNModel chatglm2-6b_model_mnn/block_18.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_19.onnx --MNNModel chatglm2-6b_model_mnn/block_19.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_20.onnx --MNNModel chatglm2-6b_model_mnn/block_20.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_21.onnx --MNNModel chatglm2-6b_model_mnn/block_21.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_22.onnx --MNNModel chatglm2-6b_model_mnn/block_22.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_23.onnx --MNNModel chatglm2-6b_model_mnn/block_23.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_24.onnx --MNNModel chatglm2-6b_model_mnn/block_24.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_25.onnx --MNNModel chatglm2-6b_model_mnn/block_25.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_26.onnx --MNNModel chatglm2-6b_model_mnn/block_26.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/block_27.onnx --MNNModel chatglm2-6b_model_mnn/block_27.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/embedding.onnx --MNNModel chatglm2-6b_model_mnn/embedding.mnn --bizCode biz  --fp16
    mnnconvert -f ONNX --modelFile chatglm2-6b_model/lm.onnx --MNNModel chatglm2-6b_model_mnn/lm.mnn --bizCode biz  --fp16
    

3 运行llm

3.1 android

adb shell mkdir -p /data/local/tmp/mnn-llm
# 上传cli_demo和库到手机
adb push libs /data/local/tmp/mnn-llm
adb push android_build/libllm.so /data/local/tmp/mnn-llm/libs
adb push android_build/cli_demo /data/local/tmp/mnn-llm
# 上传模型到手机
adb push chatglm2-6b/ /data/local/tmp/mnn-llm
# 执行
adb shell "cd /data/local/tmp/mnn-llm ; chmod +x cli_demo; export LD_LIBRARY_PATH=/data/local/tmp/mnn-llm/libs ; ./cli_demo -m /data/local/tmp/mnn-llm/chatglm2-6b -c 6"

3.2 Linux

chmod +x cli_demo
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/mnn-llm/libs
./cli_demo -m /root/mnn-llm/chatglm2-6b_model_mnn -c 6

1697983099948.png