Ship portable CPU dispatch and verified shared runtime dependencies
This commit is contained in:
1 parent
278b09f82c
commit
0bba1a0aa7
19 files changed
+675
-17
No files matched your search
@@ -1,6 +1,7 @@
|
||||
// Local NDJSON helper around the pinned llama.cpp encoder. stdout is exclusively
|
||||
// protocol output; llama diagnostics go to stderr. No model download or HTTP.
|
||||
#include "llama.h"
|
||||
#include "ggml-backend.h"
|
||||
#include "mtmd.h"
|
||||
#include "nlohmann/json.hpp"
|
||||
#include <algorithm>
|
||||
@@ -14,6 +15,12 @@
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#ifdef SEARCHI_CPU_DISPATCH
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#define NOMINMAX
|
||||
#include <windows.h>
|
||||
#include <filesystem>
|
||||
#endif
|
||||
|
||||
using json = nlohmann::json;
|
||||
constexpr size_t max_request_bytes = 16 * 1024 * 1024;
|
||||
@@ -71,6 +78,8 @@ class Encoder {
|
||||
}
|
||||
public:
|
||||
std::string device;
|
||||
std::string cpu_backend_module;
|
||||
bool vulkan_module_loaded = false;
|
||||
int threads;
|
||||
Encoder(const std::string & path, int cpu_threads, bool want_gpu) : model_path(path),threads(cpu_threads) {
|
||||
llama_log_set([](ggml_log_level level, const char * text, void *) {
|
||||
@@ -79,6 +88,31 @@ public:
|
||||
mtmd_log_set([](ggml_log_level level, const char * text, void *) {
|
||||
if (level >= GGML_LOG_LEVEL_WARN) std::fputs(text,stderr);
|
||||
},nullptr);
|
||||
#ifdef SEARCHI_CPU_DISPATCH
|
||||
// Only load our adjacent modules: no current-directory or environment
|
||||
// plugin discovery. CPU-only startup never loads the Vulkan module.
|
||||
std::vector<wchar_t> executable(32768);
|
||||
DWORD length = GetModuleFileNameW(nullptr, executable.data(), DWORD(executable.size()));
|
||||
require(length > 0 && length < executable.size(), "Cannot locate packaged worker backends");
|
||||
const auto directory = std::filesystem::path(std::wstring(executable.data(), length)).parent_path().u8string();
|
||||
if (want_gpu) {
|
||||
ggml_backend_load_all_from_path(directory.c_str());
|
||||
} else {
|
||||
ggml_backend_load_cpu_only_from_path(directory.c_str());
|
||||
}
|
||||
require(ggml_backend_reg_by_name("CPU") != nullptr, "Cannot load compatible packaged CPU backend");
|
||||
const auto cpu_reg = ggml_backend_reg_by_name("CPU");
|
||||
const auto feature_proc = ggml_backend_reg_get_proc_address(cpu_reg, "ggml_backend_get_features");
|
||||
HMODULE cpu_module = nullptr;
|
||||
if (feature_proc && GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
|
||||
reinterpret_cast<LPCWSTR>(feature_proc), &cpu_module)) {
|
||||
DWORD module_length = GetModuleFileNameW(cpu_module, executable.data(), DWORD(executable.size()));
|
||||
if (module_length > 0 && module_length < executable.size()) {
|
||||
cpu_backend_module = std::filesystem::path(std::wstring(executable.data(), module_length)).filename().u8string();
|
||||
}
|
||||
}
|
||||
vulkan_module_loaded = GetModuleHandleW(L"ggml-vulkan.dll") != nullptr;
|
||||
#endif
|
||||
llama_backend_init();
|
||||
bool use_gpu = want_gpu && llama_supports_gpu_offload();
|
||||
require(open(use_gpu) || (use_gpu && open(false)),"Cannot initialize local EmbeddingGemma 2 model/context");
|
||||
@@ -335,14 +369,17 @@ int main(int argc, char ** argv) {
|
||||
// probing/enabling the Vulkan provider in the Windows VM.
|
||||
if (force_cpu || device == "cpu") {
|
||||
#ifdef _WIN32
|
||||
require(_putenv_s("GGML_CPU_ONLY", "1") == 0, "Cannot restrict CPU startup");
|
||||
require(_putenv_s("GGML_DISABLE_VULKAN", "1") == 0, "Cannot disable Vulkan for CPU startup");
|
||||
#else
|
||||
require(setenv("GGML_CPU_ONLY", "1", 1) == 0, "Cannot restrict CPU startup");
|
||||
require(setenv("GGML_DISABLE_VULKAN", "1", 1) == 0, "Cannot disable Vulkan for CPU startup");
|
||||
#endif
|
||||
}
|
||||
Encoder encoder(path,threads,device == "auto" && !force_cpu);
|
||||
std::cout << json({{"ready",true},{"model","google/embeddinggemma-2"},{"dimensions",dimensions},
|
||||
{"device",encoder.device},{"threads",threads},{"runtime",SEARCHI_LLAMA_TAG},{"media_supported",true},{"code_query_supported",true}}).dump() << '\n' << std::flush;
|
||||
{"device",encoder.device},{"threads",threads},{"runtime",SEARCHI_LLAMA_TAG},{"media_supported",true},{"code_query_supported",true},
|
||||
{"cpu_backend_module",encoder.cpu_backend_module},{"vulkan_module_loaded",encoder.vulkan_module_loaded}}).dump() << '\n' << std::flush;
|
||||
for (;;) {
|
||||
std::string line; char c;
|
||||
while (std::cin.get(c) && c != '\n') {
|
||||
|
||||
Reference in new issue
Block a user