如果您一直在为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.cpp和chatglm.cpp(使用LLVM-MinGW)
MinGW是开源GCC编译器的移植,可以确保在Windows上进行C语言编程。您可以使用其头文件和调用库来构建Windows应用程序。下文显示了如何利用LLVM-MinGW来启用NEON和FMA_ARM功能:
1. 下载并安装工具。
- 下载LLVM-MinGW编译器工具链
- 将压缩文件解压到一个文件夹中,然后将该路径添加到您的Windows系统环境变量中。
- 下载最新版本的CMake Windows ARM64安装程序并安装该程序。
2. 请注意,不需要为llama.cpp和chatglm.cpp应用任何补丁。
3. 通过Windows命令提示符,进入包含“llama.cpp”或“chatglm.cpp”的代码路径,并执行以下命令构建二进制文件:
mkdir build
cd build
cmake .. -G "MinGW Makefiles"
cmake --build . --config Release
构建llama.cpp和chatglm.cpp(使用MSVC)
您也可以使用MSVC来构建高性能二进制文件,并启用NEON和FMA_ARM功能。
1. 下载并安装工具。
- 通过Download CMake下载最新版本的CMake Windows ARM64安装程序并安装该程序。
- 下载Visual Studio 2022并安装该程序。
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
