MNN推理LLM
LLM现在太火了,MNN也终于开源了一个MNN-LLM 项目支持
1 MNN-LLM 编译
1.1 android编译cli_demo
我们先去MNN那儿下载.so库和include/MNN。分别放入libs/和include上。
然后按照readme编译,我写了在windows上交叉编译的脚本。
-
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 没有子文件夹
-
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
-
交叉编译
$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
-
clone MNN 和 mnn-llm,这里注意下2.7.2版本的MNN编译有问题,要改成2.7.1就行了。
git clone https://github.com/wangzhaode/mnn-llm.git
-
编译
./script/build.sh
2 llm-export 模型导出
自己按照文档先安装好环境即可。
-
clone
llm-export
git clone https://github.com/wangzhaode/llm-export.git
-
clone
chatglm2-6b
,在llm-export的上级目录下git clonegit clone https://modelscope.cn/ZhipuAI/chatglm2-6b.git
-
导出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
-
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 --sync 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"
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