@ -104,13 +104,14 @@ func rocmDynLibPresent() bool {
}
func nativeInit ( ) error {
slog . Info ( "Extracting dynamic libraries..." )
assetsDir , err := gpu . AssetsDir ( )
payloadsDir , err := gpu . PayloadsDir ( )
if err != nil {
return err
}
slog . Info ( fmt . Sprintf ( "Extracting dynamic libraries to %s ..." , payloadsDir ) )
if runtime . GOOS == "darwin" {
err := extractPayloadFiles ( assetsDir , "llama.cpp/ggml-metal.metal" )
err := extractPayloadFiles ( payload sDir, "llama.cpp/ggml-metal.metal" )
if err != nil {
if err == payloadMissing {
// TODO perhaps consider this a hard failure on arm macs?
@ -119,10 +120,10 @@ func nativeInit() error {
}
return err
}
os . Setenv ( "GGML_METAL_PATH_RESOURCES" , asset sDir)
os . Setenv ( "GGML_METAL_PATH_RESOURCES" , payload sDir)
}
libs , err := extractDynamicLibs ( asset sDir, "llama.cpp/build/*/*/*/lib/*" )
libs , err := extractDynamicLibs ( payload sDir, "llama.cpp/build/*/*/*/lib/*" )
if err != nil {
if err == payloadMissing {
slog . Info ( fmt . Sprintf ( "%s" , payloadMissing ) )
@ -153,7 +154,7 @@ func nativeInit() error {
return nil
}
func extractDynamicLibs ( asset sDir, glob string ) ( [ ] string , error ) {
func extractDynamicLibs ( payload sDir, glob string ) ( [ ] string , error ) {
files , err := fs . Glob ( libEmbed , glob )
if err != nil || len ( files ) == 0 {
return nil , payloadMissing
@ -172,14 +173,14 @@ func extractDynamicLibs(assetsDir, glob string) ([]string, error) {
g . Go ( func ( ) error {
// llama.cpp/build/$OS/$GOARCH/$VARIANT/lib/$LIBRARY
// Include the variant in the path to avoid conflicts between multiple server libs
targetDir := filepath . Join ( asset sDir, pathComps [ pathComponentCount - 3 ] )
targetDir := filepath . Join ( payload sDir, pathComps [ pathComponentCount - 3 ] )
srcFile , err := libEmbed . Open ( file )
if err != nil {
return fmt . Errorf ( "read payload %s: %v" , file , err )
}
defer srcFile . Close ( )
if err := os . MkdirAll ( targetDir , 0 o755 ) ; err != nil {
return fmt . Errorf ( "create payload lib dir %s: %v" , asset sDir, err )
return fmt . Errorf ( "create payload lib dir %s: %v" , payload sDir, err )
}
src := io . Reader ( srcFile )
filename := file
@ -210,7 +211,7 @@ func extractDynamicLibs(assetsDir, glob string) ([]string, error) {
return libs , g . Wait ( )
}
func extractPayloadFiles ( asset sDir, glob string ) error {
func extractPayloadFiles ( payload sDir, glob string ) error {
files , err := fs . Glob ( libEmbed , glob )
if err != nil || len ( files ) == 0 {
return payloadMissing
@ -222,8 +223,8 @@ func extractPayloadFiles(assetsDir, glob string) error {
return fmt . Errorf ( "read payload %s: %v" , file , err )
}
defer srcFile . Close ( )
if err := os . MkdirAll ( asset sDir, 0 o755 ) ; err != nil {
return fmt . Errorf ( "create payload lib dir %s: %v" , asset sDir, err )
if err := os . MkdirAll ( payload sDir, 0 o755 ) ; err != nil {
return fmt . Errorf ( "create payload lib dir %s: %v" , payload sDir, err )
}
src := io . Reader ( srcFile )
filename := file
@ -235,22 +236,14 @@ func extractPayloadFiles(assetsDir, glob string) error {
filename = strings . TrimSuffix ( filename , ".gz" )
}
destFile := filepath . Join ( assetsDir , filepath . Base ( filename ) )
_ , err = os . Stat ( destFile )
switch {
case errors . Is ( err , os . ErrNotExist ) :
destFp , err := os . OpenFile ( destFile , os . O_WRONLY | os . O_CREATE | os . O_TRUNC , 0 o755 )
if err != nil {
return fmt . Errorf ( "write payload %s: %v" , file , err )
}
defer destFp . Close ( )
if _ , err := io . Copy ( destFp , src ) ; err != nil {
return fmt . Errorf ( "copy payload %s: %v" , file , err )
}
case err != nil :
return fmt . Errorf ( "stat payload %s: %v" , file , err )
case err == nil :
slog . Debug ( "payload already exists: " + destFile )
destFile := filepath . Join ( payloadsDir , filepath . Base ( filename ) )
destFp , err := os . OpenFile ( destFile , os . O_WRONLY | os . O_CREATE | os . O_TRUNC , 0 o755 )
if err != nil {
return fmt . Errorf ( "write payload %s: %v" , file , err )
}
defer destFp . Close ( )
if _ , err := io . Copy ( destFp , src ) ; err != nil {
return fmt . Errorf ( "copy payload %s: %v" , file , err )
}
}
return nil