54 lines
899 B
Go
54 lines
899 B
Go
|
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
|
||
|
}
|