利用Windows on Snapdragon大幅提升了llama.cpp和chatglm.cpp的性能
发表于 2024-04-23 16:31:39

如果您一直在为Windows on Snapdragon开发各种人工智能应用程序,您可能会发现llama.cpp和chatglm.cpp的性能低于标准水平。事实上,使用开源网页提供的构建命令,高通的工程师及原始设备制造商合作伙伴发现,在Windows on Snapdragon设备上每秒可以处理3个token。

但是,通过启用两项特性(NEON和FMA_ARM),并利用有关LLVM-MinGW和MSVC的两项新构建命令,可以加快进行此项处理。事实上,高通的工程师已经注意到了由此导致的显著性能改善,在配备了骁龙X精英计算机平台的设备上每秒最多可以处理20个token。

在本文中,您可以了解如何使用LLVM-MinGW和MSVC命令构建llama.cpp和chatglm.cpp,从而提高性能。

下载llama与chatglm的代码

llama.cpp

llama.cpp可以在本地设备上运行Meta公司的类GPT-3的大语言模型(LLM),即LLaMA,包括由Windows on Snapdragon驱动的设备。llama.cpp能够在各种各样的硬件上以最少的设置实现高性能。

chatglm.cpp

ChatGLM是一种在通用语言模型架构基础上,针对中文会话进行优化的开放式双语语言模型。chatglm.cpp可以在笔记本电脑上进行实时推理,例如由Windows on Snapdragon驱动的笔记本电脑。通过量化可以对其进行加速,在某种程度上与llama.cpp类似。

在拥有相关应用程序的代码后,你需要参考不用的流程,这取决于是采用LLVM-MinGW还是Microsoft Visual C/C++ (MSVC)进行构建。

构建llama.cppchatglm.cpp(使用LLVM-MinGW

MinGW是开源GCC编译器的移植,可以确保在Windows上进行C语言编程。您可以使用其头文件和调用库来构建Windows应用程序。下文显示了如何利用LLVM-MinGW来启用NEON和FMA_ARM功能:

1. 下载并安装工具。

2. 请注意,不需要为llama.cpp和chatglm.cpp应用任何补丁。

3. 通过Windows命令提示符,进入包含“llama.cpp”或“chatglm.cpp”的代码路径,并执行以下命令构建二进制文件:

mkdir build
cd build
cmake .. -G "MinGW Makefiles"
cmake --build . --config Release

构建llama.cppchatglm.cpp(使用MSVC)

您也可以使用MSVC来构建高性能二进制文件,并启用NEON和FMA_ARM功能。

1. 下载并安装工具。

2. 对于llama.cpp,不需要应用补丁;但对于chatglm.cpp,你需要应用以下补丁:

C:\chatglm.cpp\third_party\ggml>git diff
diff --git a/include/ggml/ggml.h b/include/ggml/ggml.h
index 4b16032..eaa6c79 100644
--- a/include/ggml/ggml.h
+++ b/include/ggml/ggml.h
@@ -286,7 +286,7 @@ extern "C" {

 #if defined(__ARM_NEON) && defined(__CUDACC__)
     typedef half ggml_fp16_t;
-#elif defined(__ARM_NEON)
+#elif defined(__ARM_NEON) && !defined(_MSC_VER)
     typedef __fp16 ggml_fp16_t;
 #else
     typedef uint16_t ggml_fp16_t;
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b225597..d1a1d66 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -41,8 +41,14 @@ endif()

 if (${CMAKE_SYSTEM_NAME} STREQUAL "Emscripten")
     message(STATUS "Emscripten detected")
-elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
+elseif ((${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm") OR (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64") OR (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ARM64"))
     message(STATUS "ARM detected")
+       if (MSVC)
+           add_compile_definitions(__ARM_NEON)
+           add_compile_definitions(__ARM_FEATURE_FMA)
+           add_compile_definitions(__ARM_FEATURE_DOTPROD)
+           add_compile_definitions(__aarch64__) # MSVC defines _M_ARM64 instead
+       endif()
     #set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mcpu=apple-m1")
 elseif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64le" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc64")
     message(STATUS "PPC64 detected"

3. 通过Windows命令提示符,进入包含“llama.cpp”或“chatglm.cpp”的代码路径,并执行以下命令构建二进制文件:

mkdir build
cd build
cmake .. -A ARM64
cmake --build . --config Release

现在该由您来建造

通过这些易于使用的工具和易于遵循的说明,您可以实现显著的性能提高。

请浏览本公司最新的 Windows on Snapdragon页面  – 您很容易获得各种资源,以便针对Windows on Snapdragon开发各种应用程序,并移植现有应用程序。其中包括开发工具完整文档支持选项以及本公司的开发人员博客

人工智能 机器学习 Windows on Snapdragon

在所发布内容中表达的观点仅为原作者的个人观点,并不代表高通公司或其子公司(以下简称为“高通公司”)的观点。所提供的内容仅供参考之用,而并不意味着高通公司或任何其他方的赞同或表述。本网站同样可以提供非高通公司网站和资源的链接或参考。高通公司对于可能通过本网站引用、访问、或链接的任何非高通公司网站或第三方资源并没有做出任何类型的任何声明、保证、或其他承诺。

骁龙与高通品牌产品均属于高通科技公司和/或其子公司产品。

About the Authors

Changgeng Zhong

Staff Engineer​​​​​

CSDN官方微信
扫描二维码,向CSDN吐槽
微信号:CSDNnews
微博关注
【免责声明:CSDN本栏目发布信息,目的在于传播更多信息,丰富网络文化,稿件仅代表作者个人观点,与CSDN无关。其原创性以及文中陈述文字和文字内容未经本网证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本网不做任何保证或者承诺,请读者仅作参考,并请自行核实相关内容。您若对该稿件有任何怀疑或质疑,请立即与CSDN联系,我们将迅速给您回应并做处理。】