Browse Source

Merge pull request #221 from jmorganca/embed-metal

embed ggml-metal.metal
Michael Yang 1 năm trước cách đây
mục cha
commit
e5b26c3aa2
3 tập tin đã thay đổi với 57 bổ sung1 xóa
  1. 0 1
      ggml-metal.metal
  2. 4 0
      llama/llama.go
  3. 53 0
      llama/llama_darwin.go

+ 0 - 1
ggml-metal.metal

@@ -1 +0,0 @@
-llama/ggml-metal.metal

+ 4 - 0
llama/llama.go

@@ -86,6 +86,7 @@ llama_token llama_sample(
 import "C"
 import (
 	"bytes"
+	"embed"
 	"errors"
 	"fmt"
 	"io"
@@ -99,6 +100,9 @@ import (
 	"github.com/jmorganca/ollama/api"
 )
 
+//go:embed ggml-metal.metal
+var fs embed.FS
+
 type LLM struct {
 	params *C.struct_llama_context_params
 	model  *C.struct_llama_model

+ 53 - 0
llama/llama_darwin.go

@@ -0,0 +1,53 @@
+package llama
+
+import (
+	"errors"
+	"io"
+	"log"
+	"os"
+	"path/filepath"
+)
+
+func init() {
+	if err := initBackend(); err != nil {
+		log.Printf("WARNING: GPU could not be initialized correctly: %v", err)
+		log.Printf("WARNING: falling back to CPU")
+	}
+}
+
+func initBackend() error {
+	exec, err := os.Executable()
+	if err != nil {
+		return err
+	}
+
+	exec, err = filepath.EvalSymlinks(exec)
+	if err != nil {
+		return err
+	}
+
+	metal := filepath.Join(filepath.Dir(exec), "ggml-metal.metal")
+	if _, err := os.Stat(metal); err != nil {
+		if !errors.Is(err, os.ErrNotExist) {
+			return err
+		}
+
+		dst, err := os.Create(filepath.Join(filepath.Dir(exec), "ggml-metal.metal"))
+		if err != nil {
+			return err
+		}
+		defer dst.Close()
+
+		src, err := fs.Open("ggml-metal.metal")
+		if err != nil {
+			return err
+		}
+		defer src.Close()
+
+		if _, err := io.Copy(dst, src); err != nil {
+			return err
+		}
+	}
+
+	return nil
+}