近一段时间,尝试在 Java 中使用 gpu 资源,发现已经有人做过类似的工作,实现了一个java 的 llama.cpp 封装

我使用过一些 llama 的 runtime,llama.cpp 是我非常喜欢的。它性能足够好,对 MacOS 有很好的支持。基于 llama.cpp 的 ollama 项目,也是我非常常用的一个工具。我原本就计划在 llama.cpp 和 ggml 项目上下一些功夫。现在有了这个封装,自然要拿来试一试。

项目的结构不算复杂,因为我想要学习它对llama.cpp的封装,所以下载了源代码。按照文档的话,仅需要先执行一组构建工作:

mvn compile
mkdir build
cd build
cmake .. # add any other arguments for your backend
cmake --build . --config Release

即可编译使用。

我以前就构建过 llama.cpp,所以我的电脑上相关的依赖都是完整的,这部分除了必要的网络配置,也没有遇到什么问题。

但是我尝试执行单元测试时,提示错误信息:fatal error: 'ggml-common.h' file not found

一开始我以为是头文件的搜索问题,做了一些尝试没有成功————我也尝试修改cmake脚本,将项目构建过程中得到的llama-common.h 直接复制到resource中,仍然会提示找不到这个头文件————于是我去项目站提了 issue:fatal error: ‘ggml-common.h’ file not found

经作者指导,需要将 llama.cpp 编译为嵌入模式:

mvn compile
mkdir build
cd build
cmake .. -DLLAMA_METAL_EMBED_LIBRARY=ON # set project as embed mode
cmake --build . --config Release

然后就一切正常了。

我原本以为这个项目直接将llama.cpp的代码复制过来,后来看了一下 cmake 代码,原来是编译时从 github下载的。

#################### llama.cpp ####################

FetchContent_Declare(
	llama.cpp
	GIT_REPOSITORY https://github.com/ggerganov/llama.cpp.git
	GIT_TAG        b2797
)
FetchContent_MakeAvailable(llama.cpp)

根据作者的介绍,maven 仓库中的发布版本

<dependency>
    <groupId>de.kherud</groupId>
    <artifactId>llama</artifactId>
    <version>3.0.2</version>
</dependency>

就是一个完整的嵌入版本,不需要另外编译llama.cpp。但是从文档来看,这个版本应该是使用cpu资源,而自己编译的llama.cpp ,可以使用我们 需要的任意硬件,例如macos 的 metal 。