Browse Source

Merge pull request #1785 from dhiltgen/win_native_cli

Load dynamic cpu lib on windows
Daniel Hiltgen 1 year ago
parent
commit
b5939008a1
4 changed files with 16 additions and 8 deletions
  1. 1 4
      llm/ext_server_windows.go
  2. 3 0
      llm/llama.cpp/gen_windows.ps1
  3. 2 1
      llm/llm.go
  4. 10 3
      llm/shim_ext_server_windows.go

+ 1 - 4
llm/ext_server_windows.go

@@ -1,8 +1,6 @@
 package llm
 package llm
 
 
 import (
 import (
-	"fmt"
-
 	"github.com/jmorganca/ollama/api"
 	"github.com/jmorganca/ollama/api"
 )
 )
 
 
@@ -10,6 +8,5 @@ func newDefaultExtServer(model string, adapters, projectors []string, numLayers
 	// On windows we always load the llama.cpp libraries dynamically to avoid startup DLL dependencies
 	// On windows we always load the llama.cpp libraries dynamically to avoid startup DLL dependencies
 	// This ensures we can update the PATH at runtime to get everything loaded
 	// This ensures we can update the PATH at runtime to get everything loaded
 
 
-	// Should not happen
-	return nil, fmt.Errorf("no default impl on windows - all dynamic")
+	return newDynamicShimExtServer(AvailableShims["cpu"], model, adapters, projectors, numLayers, opts)
 }
 }

+ 3 - 0
llm/llama.cpp/gen_windows.ps1

@@ -49,6 +49,9 @@ function install {
     md "${script:buildDir}/lib" -ea 0 > $null
     md "${script:buildDir}/lib" -ea 0 > $null
     cp "${script:buildDir}/bin/${script:config}/ext_server_shared.dll" "${script:buildDir}/lib"
     cp "${script:buildDir}/bin/${script:config}/ext_server_shared.dll" "${script:buildDir}/lib"
     cp "${script:buildDir}/bin/${script:config}/llama.dll" "${script:buildDir}/lib"
     cp "${script:buildDir}/bin/${script:config}/llama.dll" "${script:buildDir}/lib"
+
+    # Display the dll dependencies in the build log
+    dumpbin /dependents "${script:buildDir}/bin/${script:config}/ext_server_shared.dll" | select-string ".dll"
 }
 }
 
 
 function cleanup {
 function cleanup {

+ 2 - 1
llm/llm.go

@@ -87,7 +87,8 @@ func newLlmServer(library, model string, adapters, projectors []string, numLayer
 		if err == nil {
 		if err == nil {
 			return srv, nil
 			return srv, nil
 		}
 		}
-		log.Printf("Failed to load dynamic library - falling back to CPU mode %s", err)
+		log.Printf("Failed to load dynamic library %s - falling back to CPU mode %s", library, err)
+		// TODO - update some state to indicate we were unable to load the GPU library for future "info" ux
 	}
 	}
 
 
 	return newDefaultExtServer(model, adapters, projectors, numLayers, opts)
 	return newDefaultExtServer(model, adapters, projectors, numLayers, opts)

+ 10 - 3
llm/shim_ext_server_windows.go

@@ -4,6 +4,7 @@ import (
 	"embed"
 	"embed"
 	"log"
 	"log"
 	"os"
 	"os"
+	"path/filepath"
 	"strings"
 	"strings"
 )
 )
 
 
@@ -11,14 +12,20 @@ import (
 var libEmbed embed.FS
 var libEmbed embed.FS
 
 
 func updatePath(dir string) {
 func updatePath(dir string) {
+	tmpDir := filepath.Dir(dir)
 	pathComponents := strings.Split(os.Getenv("PATH"), ";")
 	pathComponents := strings.Split(os.Getenv("PATH"), ";")
+	i := 0
 	for _, comp := range pathComponents {
 	for _, comp := range pathComponents {
-		// Case incensitive
-		if strings.ToLower(comp) == strings.ToLower(dir) {
+		if strings.EqualFold(comp, dir) {
 			return
 			return
 		}
 		}
+		// Remove any other prior paths to our temp dir
+		if !strings.HasPrefix(strings.ToLower(comp), strings.ToLower(tmpDir)) {
+			pathComponents[i] = comp
+			i++
+		}
 	}
 	}
-	newPath := strings.Join(append(pathComponents, dir), ";")
+	newPath := strings.Join(append([]string{dir}, pathComponents...), ";")
 	log.Printf("Updating PATH to %s", newPath)
 	log.Printf("Updating PATH to %s", newPath)
 	os.Setenv("PATH", newPath)
 	os.Setenv("PATH", newPath)
 }
 }