From e12fff8810e37bfabe4416f7f41902387ff3aae1 Mon Sep 17 00:00:00 2001 From: Daniel Hiltgen Date: Mon, 15 Jul 2024 09:25:56 -0700 Subject: [PATCH] Enable windows error dialog for subprocess startup Make sure if something goes wrong spawning the process, the user gets enough info to be able to try to self correct, or at least file a bug with details so we can fix it. Once the process starts, we immediately change back to the recommended setting to prevent the blocking dialog. This ensures if the model fails to load (OOM, unsupported model type, etc.) the process will exit quickly and we can scan the stdout/stderr of the subprocess for the reason to report via API. --- llm/ext_server/server.cpp | 4 ++++ llm/llm_darwin_amd64.go | 3 +++ llm/llm_darwin_arm64.go | 3 +++ llm/llm_linux.go | 7 ++++++- llm/llm_windows.go | 16 +++++++++++++++- llm/server.go | 1 + 6 files changed, 32 insertions(+), 2 deletions(-) diff --git a/llm/ext_server/server.cpp b/llm/ext_server/server.cpp index e8a076c4..14d921c0 100644 --- a/llm/ext_server/server.cpp +++ b/llm/ext_server/server.cpp @@ -41,6 +41,7 @@ #if defined(_WIN32) #include +#include #endif #include @@ -2737,6 +2738,9 @@ int wmain(int argc, wchar_t **wargv) { for (int i = 0; i < argc; ++i) { argv[i] = wchar_to_char(wargv[i]); } + + // Adjust error mode to avoid error dialog after we start. + SetErrorMode(SEM_FAILCRITICALERRORS); #else int main(int argc, char **argv) { #endif diff --git a/llm/llm_darwin_amd64.go b/llm/llm_darwin_amd64.go index 3093e1ad..60eed719 100644 --- a/llm/llm_darwin_amd64.go +++ b/llm/llm_darwin_amd64.go @@ -2,7 +2,10 @@ package llm import ( "embed" + "syscall" ) //go:embed build/darwin/x86_64/*/bin/* var libEmbed embed.FS + +var LlamaServerSysProcAttr = &syscall.SysProcAttr{} diff --git a/llm/llm_darwin_arm64.go b/llm/llm_darwin_arm64.go index 928f0b82..20ce8552 100644 --- a/llm/llm_darwin_arm64.go +++ b/llm/llm_darwin_arm64.go @@ -2,7 +2,10 @@ package llm import ( "embed" + "syscall" ) //go:embed build/darwin/arm64/*/bin/* var libEmbed embed.FS + +var LlamaServerSysProcAttr = &syscall.SysProcAttr{} diff --git a/llm/llm_linux.go b/llm/llm_linux.go index c2c5c4cb..928b4e79 100644 --- a/llm/llm_linux.go +++ b/llm/llm_linux.go @@ -1,6 +1,11 @@ package llm -import "embed" +import ( + "embed" + "syscall" +) //go:embed build/linux/*/*/bin/* var libEmbed embed.FS + +var LlamaServerSysProcAttr = &syscall.SysProcAttr{} diff --git a/llm/llm_windows.go b/llm/llm_windows.go index e44f4b95..763cccf9 100644 --- a/llm/llm_windows.go +++ b/llm/llm_windows.go @@ -1,6 +1,20 @@ package llm -import "embed" +import ( + "embed" + "syscall" +) // unused on windows var libEmbed embed.FS + +const CREATE_DEFAULT_ERROR_MODE = 0x04000000 + +var LlamaServerSysProcAttr = &syscall.SysProcAttr{ + // Wire up the default error handling logic If for some reason a DLL is + // missing in the path this will pop up a GUI Dialog explaining the fault so + // the user can either fix their PATH, or report a bug. Without this + // setting, the process exits immediately with a generic exit status but no + // way to (easily) figure out what the actual missing DLL was. + CreationFlags: CREATE_DEFAULT_ERROR_MODE, +} diff --git a/llm/server.go b/llm/server.go index 08463ef0..55732773 100644 --- a/llm/server.go +++ b/llm/server.go @@ -346,6 +346,7 @@ func NewLlamaServer(gpus gpu.GpuInfoList, model string, ggml *GGML, adapters, pr s.cmd.Env = os.Environ() s.cmd.Stdout = os.Stdout s.cmd.Stderr = s.status + s.cmd.SysProcAttr = LlamaServerSysProcAttr envWorkarounds := [][2]string{} for _, gpu := range gpus {