alibaba / MNN

MNN is a blazing fast, lightweight deep learning framework, battle-tested by business-critical use cases in Alibaba
http://www.mnn.zone/
8.47k stars 1.64k forks source link

MNN release 版本上编译LLM引擎libllm 和 llm_demo 出错 #2929

Open sunnyzhaohui opened 3 weeks ago

sunnyzhaohui commented 3 weeks ago

平台(如果交叉编译请再附上交叉编译目标平台):

Platform(Include target platform as well if cross-compiling):

Linux

Github版本:

Github Version:

https://github.com/alibaba/MNN/releases, MNN-LLM 正式合入2.9.0

编译方式:

  1. 完成了qwen/Qwen-1_8B-Chat 下载
  2. 在MNN仓库下,编译MNNConvert cd MNN mkdir build cd build cmake .. -DMNN_BUILD_CONVERTER=true -DMNN_SUPPORT_TRANSFORMER_FUSE=ON -DMNN_LOW_MEMORY=ON make 结果:编译正常
  3. 使用 MNN 目录下面的 transformers/llm/export/llm_export.py 进行模型导出,把 torch 模型转换成 onnx
  4. 使用如下命令把onnx 导出mnn
    ../build/MNNConvert -f ONNX --modelFile onnx/llm.onnx llm.mnn --weightQuantBits=4 --transformerFuse=1 --saveExternalData --MNNModel Qwen-1_8B-Chat.mnn 结果4个文件 :embeddings_bf16.bin Qwen-1_8B-Chat.mnn Qwen-1_8B-Chat.mnn.weight tokenizer.txt
  5. 编译MNN打开 MNN_BUILD_LLM 宏。 进入build 目录,cmake .. -DMNN_BUILD_LLM=ON 在build目录下, make

编译日志:

(base) cmdc2023@fxzs-ai-gpu:~/zhwang_workSpace/MNN/MNN/build$ cmake .. -DMNN_BUILD_LLM=ON

-- 3.19.0.0 -- Use Threadpool, forbid openmp -- >>>>>>>>>>>>> -- MNN BUILD INFO: -- System: Linux -- Processor: x86_64 -- Version: 2.9.1 -- Metal: OFF -- OpenCL: OFF -- OpenGL: OFF -- Vulkan: OFF -- ARM82: OFF -- oneDNN: OFF -- TensorRT: OFF -- CoreML: OFF -- NNAPI: OFF -- CUDA: OFF -- OpenMP: OFF -- BF16: OFF -- ThreadPool: ON -- Hidden: TRUE -- Build Path: /home/cmdc2023/zhwang_workSpace/MNN/MNN/build -- CUDA PROFILE: OFF -- WIN_USE_ASM: -- x86_64: Open SSE -- MNN_AVX512:OFF -- Onnx: -- Configuring done -- Generating done -- Build files have been written to: /home/cmdc2023/zhwang_workSpace/MNN/MNN/build (base) cmdc2023@fxzs-ai-gpu:~/zhwang_workSpace/MNN/MNN/build$ make Consolidate compiler generated dependencies of target MNNCore [ 2%] Built target MNNCore Consolidate compiler generated dependencies of target MNNCV [ 2%] Built target MNNCV Consolidate compiler generated dependencies of target MNNMath [ 3%] Built target MNNMath Consolidate compiler generated dependencies of target MNNTransform [ 17%] Built target MNNTransform Consolidate compiler generated dependencies of target MNNUtils [ 17%] Built target MNNUtils Consolidate compiler generated dependencies of target MNNCPU [ 29%] Built target MNNCPU Consolidate compiler generated dependencies of target MNNX8664 [ 29%] Built target MNNX8664 Scanning dependencies of target MNNAVX Consolidate compiler generated dependencies of target MNNAVX [ 31%] Built target MNNAVX Scanning dependencies of target MNNAVXFMA Consolidate compiler generated dependencies of target MNNAVXFMA [ 32%] Built target MNNAVXFMA Consolidate compiler generated dependencies of target MNNSSE [ 33%] Built target MNNSSE Consolidate compiler generated dependencies of target MNN [ 33%] Built target MNN Consolidate compiler generated dependencies of target MNN_Express [ 35%] Built target MNN_Express Consolidate compiler generated dependencies of target llm [ 35%] Building CXX object CMakeFiles/llm.dir/transformers/llm/engine/src/llm.cpp.o In file included from /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/llm.hpp:25, from /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/src/llm.cpp:17: /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:53: error: ‘string_view’ is not a member of ‘std’ 69 | using EncodeResult = std::vector<std::pair<std::string_view, int>>; | ^~~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:53: note: ‘std::string_view’ is only available from C++17 onwards /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:53: error: ‘string_view’ is not a member of ‘std’ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:53: note: ‘std::string_view’ is only available from C++17 onwards /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:66: error: template argument 1 is invalid 69 | using EncodeResult = std::vector<std::pair<std::string_view, int>>; | ^~~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:69: error: template argument 1 is invalid 69 | using EncodeResult = std::vector<std::pair<std::string_view, int>>; | ^~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:69:69: error: template argument 2 is invalid /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/tokenizer.hpp:89:5: error: ‘EncodeResult’ does not name a type 89 | EncodeResult bpe_encode(std::string_view str, float alpha = 0.f); | ^~~~ In file included from /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/src/llm.cpp:17: /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/llm.hpp: In member function ‘T rapid_json_wrapper::value(const char, const T&) const’: /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/llm.hpp:100:16: warning: ‘if constexpr’ only available with ‘-std=c++17’ or ‘-std=gnu++17’ 100 | if constexpr (std::is_same<T, int>::value) { | ^~~~~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/llm.hpp:102:23: warning: ‘if constexpr’ only available with ‘-std=c++17’ or ‘-std=gnu++17’ 102 | } else if constexpr (std::is_same<T, std::string>::value || std::is_same<T, const char>::value) { | ^~~~~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/llm.hpp:104:23: warning: ‘if constexpr’ only available with ‘-std=c++17’ or ‘-std=gnu++17’ 104 | } else if constexpr (std::is_same<T, bool>::value) { | ^~~~~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/include/llm.hpp:106:23: warning: ‘if constexpr’ only available with ‘-std=c++17’ or ‘-std=gnu++17’ 106 | } else if constexpr (std::is_same<T, std::vector>::value) { | ^~~~~ /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/src/llm.cpp: In member function ‘virtual MNN::Express::VARP Llm::embedding(const std::vector&)’: /home/cmdc2023/zhwang_workSpace/MNN/MNN/transformers/llm/engine/src/llm.cpp:402:14: warning: ignoring return value of ‘size_t fread(void, size_t, size_t, FILE)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 402 | fread(buffer.get(), 1, size, file); | ~^~~~~~~~~ make[2]: [CMakeFiles/llm.dir/build.make:76: CMakeFiles/llm.dir/transformers/llm/engine/src/llm.cpp.o] Error 1 make[1]: [CMakeFiles/Makefile2:505: CMakeFiles/llm.dir/all] Error 2 make: *** [Makefile:136: all] Error 2

结果,make 出错。

wangzhaode commented 2 weeks ago

是不是编译器不支持c++17

sunnyzhaohui commented 2 weeks ago

如果是译器不支持c++17问题,那我开始的 cmake .. -DMNN_BUILD_CONVERTER=true -DMNN_SUPPORT_TRANSFORMER_FUSE=ON -DMNN_LOW_MEMORY=ON make 应该也会不正常吧?现在是正常的。在正常的情况下,我 cmake .. -DMNN_BUILD_LLM=ON make 结果会出现上面的错误,奇怪

sunnyzhaohui commented 2 weeks ago

”编译MNN打开 MNN_BUILD_LLM 宏,编译 transformers/llm/engine 目录,产出 libllm 和 llm_demo“ 这句话是要单独编译 transformers/llm/engine 目录,怎么单独编译?

sunnyzhaohui commented 2 weeks ago

CMakeLists.txt里缺少指名用c++17 index 25778d51..f9de7ab3 100644 --- a/transformers/llm/engine/CMakeLists.txt +++ b/transformers/llm/engine/CMakeLists.txt @@ -1,4 +1,8 @@

include dir

+ +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED True) + include_directories(${CMAKE_CURRENT_LIST_DIR}/include/)