Skip to content

Commit 1951b6b

Browse files
committed
llama.cpp: use the latest llama.cpp
GitHub: fix pgroonga/pgroonga#642 It can build backends as libraries: ggml-org/llama.cpp#10256 The current bundled llama.cpp uses some AVX operations in static variables. So we can't load libgroonga.so on CPU without AVX. With the backends as libraries feature, we can really lazy AVX operations. Reported by Yuki Shira. Thanks!!!
1 parent f5921b8 commit 1951b6b

File tree

8 files changed

+90
-3
lines changed

8 files changed

+90
-3
lines changed

CMakeLists.txt

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,10 @@ set(GRN_RELATIVE_PLUGINS_DIR
214214
"${CMAKE_INSTALL_LIBDIR}/${GRN_PROJECT_NAME}/plugins")
215215
set(GRN_PLUGINS_DIR "${CMAKE_INSTALL_PREFIX}/${GRN_RELATIVE_PLUGINS_DIR}")
216216
set(GRN_PLUGIN_SUFFIX "${CMAKE_SHARED_MODULE_SUFFIX}")
217+
set(GRN_RELATIVE_GGML_BACKENDS_DIR
218+
"${CMAKE_INSTALL_LIBDIR}/${GRN_PROJECT_NAME}/ggml")
219+
set(GRN_GGML_BACKENDS_DIR
220+
"${CMAKE_INSTALL_PREFIX}/${GRN_RELATIVE_GGML_BACKENDS_DIR}")
217221
set(GRN_DLL_FILENAME "libgroonga${CMAKE_SHARED_LIBRARY_SUFFIX}")
218222
set(GRN_QUERY_EXPANDER_TSV_RELATIVE_SYNONYMS_FILE
219223
"${GRN_CONFIG_DIR}/synonyms.tsv")
@@ -1506,9 +1510,9 @@ else()
15061510
set(GRN_WITH_H3 FALSE)
15071511
endif()
15081512

1509-
set(GRN_LLAMA_CPP_BUNDLED_VERSION "b3861")
1513+
set(GRN_LLAMA_CPP_BUNDLED_VERSION "b4397")
15101514
set(GRN_LLAMA_CPP_BUNDLED_SHA256
1511-
"53fe4caa810979a1b9ab92cd0d6d3f2fc34337b507f4e0e8a7c9bd106a47413c")
1515+
"51e5ac9b5c18756cf46ebc0659dcd57542800dc6582bbdf737dee064aaebfa34")
15121516
set(GRN_WITH_LLAMA_CPP
15131517
"auto"
15141518
CACHE STRING "Use llama.cpp for LLM.")
@@ -1548,20 +1552,43 @@ if(NOT "${GRN_WITH_LLAMA_CPP}" STREQUAL "no")
15481552
URL ${LLAMA_CPP_SOURCE_URL}
15491553
URL_HASH "SHA256=${GRN_LLAMA_CPP_BUNDLED_SHA256}")
15501554
grn_prepare_fetchcontent()
1555+
set(BUILD_SHARED_LIBS ON)
1556+
set(BUILD_STATIC_LIBS OFF)
1557+
set(GGML_BACKEND_DL ON)
1558+
set(GGML_CPU_ALL_VARIANTS ON)
1559+
set(GGML_LLAMAFILE ON)
15511560
set(LLAMA_ALL_WARNINGS OFF)
15521561
fetchcontent_makeavailable(llama_cpp)
15531562
if(CMAKE_VERSION VERSION_LESS 3.28)
15541563
set_property(DIRECTORY ${llama_cpp_SOURCE_DIR} PROPERTY EXCLUDE_FROM_ALL
15551564
TRUE)
15561565
endif()
1566+
set_target_properties(llama PROPERTIES OUTPUT_NAME "groonga-llama")
1567+
set_target_properties(ggml-base PROPERTIES OUTPUT_NAME
1568+
"groonga-ggml-base")
1569+
set_target_properties(ggml PROPERTIES OUTPUT_NAME "groonga-ggml")
1570+
# If llama.cpp set version, we can remove this.
1571+
set_target_properties(llama PROPERTIES VERSION "0.0.0" SOVERSION "0")
1572+
set_target_properties(ggml-base PROPERTIES VERSION "0.0.0" SOVERSION "0")
1573+
set_target_properties(ggml PROPERTIES VERSION "0.0.0" SOVERSION "0")
15571574
install(
15581575
FILES "${llama_cpp_SOURCE_DIR}/AUTHORS"
15591576
"${llama_cpp_SOURCE_DIR}/LICENSE"
15601577
"${llama_cpp_SOURCE_DIR}/README.md"
15611578
DESTINATION "${GRN_DATA_DIR}/llama.cpp")
1579+
install(TARGETS llama ggml-base ggml PUBLIC_HEADER EXCLUDE_FROM_ALL)
1580+
foreach(GGML_BACKEND
1581+
ggml-cpu-sandybridge ggml-cpu-haswell ggml-cpu-skylakex
1582+
ggml-cpu-icelake ggml-cpu-alderlake ggml-cpu-sapphirerapids)
1583+
install(TARGETS ${GGML_BACKEND}
1584+
LIBRARY DESTINATION "${GRN_RELATIVE_GGML_BACKENDS_DIR}")
1585+
endforeach()
15621586
endfunction()
15631587
grn_build_llama_cpp()
15641588
target_link_libraries(grn_dependencies INTERFACE llama)
1589+
add_library(Groonga::ggml-base ALIAS ggml-base)
1590+
add_library(Groonga::ggml ALIAS ggml)
1591+
add_library(Groonga::llama ALIAS llama)
15651592
set(GRN_WITH_LLAMA_CPP_BUNDLED TRUE)
15661593
message(STATUS "llama.cpp: bundled")
15671594
else()

config.h.cmake.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@
3737
#define GRN_PLUGINS_DIR "${GRN_PLUGINS_DIR}"
3838
#define GRN_PLUGIN_SUFFIX "${GRN_PLUGIN_SUFFIX}"
3939

40+
#define GRN_RELATIVE_GGML_BACKENDS_DIR \
41+
"${GRN_RELATIVE_GGML_BACKENDS_DIR}"
42+
#define GRN_GGML_BACKENDS_DIR "${GRN_GGML_BACKENDS_DIR}"
43+
4044
#define GRN_QUERY_EXPANDER_TSV_RELATIVE_SYNONYMS_FILE "${GRN_QUERY_EXPANDER_TSV_RELATIVE_SYNONYMS_FILE}"
4145
#define GRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE "${GRN_QUERY_EXPANDER_TSV_SYNONYMS_FILE}"
4246

lib/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,13 @@ if(GRN_WITH_MESSAGE_PACK)
187187
target_link_libraries(libgroonga INTERFACE Groonga::msgpackc)
188188
endif()
189189
endif()
190+
if(GRN_WITH_LLAMA_CPP)
191+
target_link_libraries(libgroonga
192+
INTERFACE "$<BUILD_INTERFACE:Groonga::llama>")
193+
target_link_libraries(libgroonga INTERFACE "$<BUILD_INTERFACE:Groonga::ggml>")
194+
target_link_libraries(libgroonga
195+
INTERFACE "$<BUILD_INTERFACE:Groonga::ggml-base>")
196+
endif()
190197
if(NOT WASI)
191198
target_link_libraries(libgroonga PRIVATE Threads::Threads ${CMAKE_DL_LIBS})
192199
endif()

lib/language_model.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "groonga/smart_obj.hpp"
2323

2424
#ifdef GRN_WITH_LLAMA_CPP
25+
# include <ggml-backend.h>
2526
# include <llama.h>
2627
#endif
2728

@@ -92,11 +93,15 @@ namespace grn {
9293
} // namespace
9394
#endif
9495

96+
static char ggml_backends_dir[GRN_ENV_BUFFER_SIZE];
9597
static char language_models_dir[GRN_ENV_BUFFER_SIZE];
9698

9799
void
98100
init_from_env(void)
99101
{
102+
grn_getenv("GRN_GGML_BACKENDS_DIR",
103+
ggml_backends_dir,
104+
GRN_ENV_BUFFER_SIZE);
100105
grn_getenv("GRN_LANGUAGE_MODELS_DIR",
101106
language_models_dir,
102107
GRN_ENV_BUFFER_SIZE);
@@ -142,10 +147,47 @@ namespace grn {
142147
static std::once_flag initialize_once;
143148

144149
namespace {
150+
# ifdef _WIN32
151+
const char *
152+
get_default_ggml_backends_dir(void)
153+
{
154+
static char *windows_ggml_backends_dir = nullptr;
155+
static char windows_ggml_backends_dir_buffer[PATH_MAX];
156+
if (!windows_ggml_backends_dir) {
157+
auto base_dir = grn_windows_base_dir();
158+
auto base_dir_length = strlen(base_dir);
159+
grn_strcpy(windows_ggml_backends_dir_buffer, PATH_MAX, base_dir);
160+
grn_strcat(windows_ggml_backends_dir_buffer, PATH_MAX, "/");
161+
grn_strcat(windows_ggml_backends_dir_buffer,
162+
PATH_MAX,
163+
GRN_RELATIVE_GGML_BACKENDS_DIR);
164+
windows_ggml_backends_dir = windows_ggml_backends_dir_buffer;
165+
}
166+
return windows_ggml_backends_dir;
167+
}
168+
# else
169+
const char *
170+
get_default_ggml_backends_dir(void)
171+
{
172+
return GRN_GGML_BACKENDS_DIR;
173+
}
174+
# endif
175+
176+
const char *
177+
get_ggml_backends_dir(void)
178+
{
179+
if (ggml_backends_dir[0]) {
180+
return ggml_backends_dir;
181+
} else {
182+
return get_default_ggml_backends_dir();
183+
}
184+
}
185+
145186
void
146187
init_external_libraries(void)
147188
{
148189
llama_log_set(log_callback, &grn_gctx);
190+
ggml_backend_load_all_from_path(get_ggml_backends_dir());
149191
llama_backend_init();
150192
initialized = true;
151193
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
usr/include/groonga/*
22
usr/lib/*/cmake/*
3-
usr/lib/*/libgroonga.so
3+
usr/lib/*/libgroonga*.so
44
usr/lib/*/pkgconfig/*

packages/debian/libgroonga0.install

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
usr/lib/*/libgroonga*.so.*
2+
usr/lib/*/groonga/ggml/*
23
usr/lib/*/groonga/plugins/functions/index_column.*
4+
usr/lib/*/groonga/plugins/functions/language_model.*
35
usr/lib/*/groonga/plugins/functions/math.*
46
usr/lib/*/groonga/plugins/functions/number.*
57
usr/lib/*/groonga/plugins/functions/string.*

packages/yum/groonga.spec.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@ exit 0
335335
%doc README.md COPYING
336336
%{_libdir}/*.so.*
337337
%dir %{_libdir}/groonga
338+
%dir %{_libdir}/groonga/ggml/
338339
%dir %{_libdir}/groonga/plugins
339340
%dir %{_libdir}/groonga/plugins/functions
340341
%dir %{_libdir}/groonga/plugins/tokenizers
@@ -351,6 +352,7 @@ exit 0
351352
%dir %{_libdir}/groonga/scripts/ruby/initialize
352353
%dir %{_libdir}/groonga/scripts/ruby/logger
353354
%dir %{_libdir}/groonga/scripts/ruby/query_logger
355+
%{_libdir}/groonga/ggml/*.so
354356
%{_libdir}/groonga/plugins/functions/index_column.so
355357
%{_libdir}/groonga/plugins/functions/language_model.so
356358
%{_libdir}/groonga/plugins/functions/math.so

test/command/run-test.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ fi
4141

4242
. "${build_top_dir}/config.sh"
4343

44+
GRN_GGML_BACKENDS_DIR="$build_top_dir/bin"
45+
export GRN_GGML_BACKENDS_DIR
46+
4447
GRN_PLUGINS_DIR="$source_top_dir/plugins"
4548
GRN_PLUGINS_PATH="$build_top_dir/plugins"
4649
export GRN_PLUGINS_DIR

0 commit comments

Comments
 (0)