mirror of
https://github.com/ollama/ollama.git
synced 2025-06-28 07:01:12 +02:00
ml/backend/ggml: consolidate system info logging
- output backend system info when initializing the backend. this ensures this information is always present without needing to be called explicitly - convert to structured logging - enumerate devices rather than backends since devices are ordered - track device indices grouped by device name
This commit is contained in:
parent
8fe6f69f28
commit
05a01fdecb
@ -34,7 +34,6 @@ import (
|
|||||||
"github.com/ollama/ollama/api"
|
"github.com/ollama/ollama/api"
|
||||||
"github.com/ollama/ollama/envconfig"
|
"github.com/ollama/ollama/envconfig"
|
||||||
"github.com/ollama/ollama/format"
|
"github.com/ollama/ollama/format"
|
||||||
"github.com/ollama/ollama/llama"
|
|
||||||
"github.com/ollama/ollama/parser"
|
"github.com/ollama/ollama/parser"
|
||||||
"github.com/ollama/ollama/progress"
|
"github.com/ollama/ollama/progress"
|
||||||
"github.com/ollama/ollama/runner"
|
"github.com/ollama/ollama/runner"
|
||||||
@ -1281,7 +1280,6 @@ func NewCLI() *cobra.Command {
|
|||||||
|
|
||||||
runnerCmd := &cobra.Command{
|
runnerCmd := &cobra.Command{
|
||||||
Use: "runner",
|
Use: "runner",
|
||||||
Short: llama.PrintSystemInfo(),
|
|
||||||
Hidden: true,
|
Hidden: true,
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
RunE: func(cmd *cobra.Command, args []string) error {
|
||||||
return runner.Execute(os.Args[1:])
|
return runner.Execute(os.Args[1:])
|
||||||
|
@ -21,18 +21,6 @@ package llama
|
|||||||
|
|
||||||
extern bool llamaProgressCallback(float progress, void *user_data);
|
extern bool llamaProgressCallback(float progress, void *user_data);
|
||||||
extern void llamaLog(int level, char* text, void* user_data);
|
extern void llamaLog(int level, char* text, void* user_data);
|
||||||
|
|
||||||
typedef enum {COMP_UNKNOWN,COMP_GCC,COMP_CLANG} COMPILER;
|
|
||||||
COMPILER inline get_compiler() {
|
|
||||||
#if defined(__clang__)
|
|
||||||
return COMP_CLANG;
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
return COMP_GCC;
|
|
||||||
#else
|
|
||||||
return UNKNOWN_COMPILER;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
@ -72,19 +60,6 @@ func BackendInit() {
|
|||||||
C.llama_backend_init()
|
C.llama_backend_init()
|
||||||
}
|
}
|
||||||
|
|
||||||
func PrintSystemInfo() string {
|
|
||||||
var compiler string
|
|
||||||
switch C.get_compiler() {
|
|
||||||
case C.COMP_UNKNOWN:
|
|
||||||
compiler = "cgo(unknown_compiler)"
|
|
||||||
case C.COMP_GCC:
|
|
||||||
compiler = "cgo(gcc)"
|
|
||||||
case C.COMP_CLANG:
|
|
||||||
compiler = "cgo(clang)"
|
|
||||||
}
|
|
||||||
return C.GoString(C.llama_print_system_info()) + compiler
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetModelArch(modelPath string) (string, error) {
|
func GetModelArch(modelPath string) (string, error) {
|
||||||
mp := C.CString(modelPath)
|
mp := C.CString(modelPath)
|
||||||
defer C.free(unsafe.Pointer(mp))
|
defer C.free(unsafe.Pointer(mp))
|
||||||
|
@ -24,7 +24,6 @@ type Backend interface {
|
|||||||
Config() Config
|
Config() Config
|
||||||
Get(name string) Tensor
|
Get(name string) Tensor
|
||||||
NewContext() Context
|
NewContext() Context
|
||||||
SystemInfo() string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// BackendCacheConfig should be implemented by backends that need special output
|
// BackendCacheConfig should be implemented by backends that need special output
|
||||||
|
@ -1,27 +1,11 @@
|
|||||||
package ggml
|
package ggml
|
||||||
|
|
||||||
/*
|
// #cgo CPPFLAGS: -I${SRCDIR}/ggml/include
|
||||||
#cgo CPPFLAGS: -I${SRCDIR}/ggml/include
|
// #include <stdlib.h>
|
||||||
#include <stdlib.h>
|
// #include <stdint.h>
|
||||||
#include <stdint.h>
|
// #include "ggml.h"
|
||||||
#include "ggml.h"
|
// #include "ggml-cpu.h"
|
||||||
#include "ggml-cpu.h"
|
// #include "ggml-backend.h"
|
||||||
#include "ggml-backend.h"
|
|
||||||
static struct ggml_backend_feature * getBackendFeatures(void *fp, ggml_backend_reg_t reg) {return ((ggml_backend_get_features_t)(fp))(reg);}
|
|
||||||
static struct ggml_backend_feature * getNextBackendFeatures(struct ggml_backend_feature * feature) { return &feature[1];}
|
|
||||||
|
|
||||||
typedef enum {COMP_UNKNOWN,COMP_GCC,COMP_CLANG} COMPILER;
|
|
||||||
COMPILER inline get_compiler() {
|
|
||||||
#if defined(__clang__)
|
|
||||||
return COMP_CLANG;
|
|
||||||
#elif defined(__GNUC__)
|
|
||||||
return COMP_GCC;
|
|
||||||
#else
|
|
||||||
return UNKNOWN_COMPILER;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
*/
|
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -729,34 +713,3 @@ func (t *Tensor) ScaledDotProductAttention(ctx ml.Context, key, value, mask ml.T
|
|||||||
return kqv.Permute(ctx, 0, 2, 1, 3).Contiguous(ctx)
|
return kqv.Permute(ctx, 0, 2, 1, 3).Contiguous(ctx)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Backend) SystemInfo() string {
|
|
||||||
var compiler string
|
|
||||||
switch C.get_compiler() {
|
|
||||||
case C.COMP_UNKNOWN:
|
|
||||||
compiler = "cgo(unknown_compiler)"
|
|
||||||
case C.COMP_GCC:
|
|
||||||
compiler = "cgo(gcc)"
|
|
||||||
case C.COMP_CLANG:
|
|
||||||
compiler = "cgo(clang)"
|
|
||||||
}
|
|
||||||
|
|
||||||
var s string
|
|
||||||
for i := range C.ggml_backend_reg_count() {
|
|
||||||
reg := C.ggml_backend_reg_get(i)
|
|
||||||
fName := C.CString("ggml_backend_get_features")
|
|
||||||
defer C.free(unsafe.Pointer(fName))
|
|
||||||
get_features_fn := C.ggml_backend_reg_get_proc_address(reg, fName)
|
|
||||||
if get_features_fn != nil {
|
|
||||||
s += C.GoString(C.ggml_backend_reg_name(reg))
|
|
||||||
s += " : "
|
|
||||||
for features := C.getBackendFeatures(get_features_fn, reg); features.name != nil; features = C.getNextBackendFeatures(features) {
|
|
||||||
s += C.GoString(features.name)
|
|
||||||
s += " = "
|
|
||||||
s += C.GoString(features.value)
|
|
||||||
s += " | "
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return s + compiler
|
|
||||||
}
|
|
||||||
|
@ -7,6 +7,20 @@ package ggml
|
|||||||
// #include <stdlib.h>
|
// #include <stdlib.h>
|
||||||
// #include "ggml-backend.h"
|
// #include "ggml-backend.h"
|
||||||
// extern void sink(int level, char *text, void *user_data);
|
// extern void sink(int level, char *text, void *user_data);
|
||||||
|
// static struct ggml_backend_feature * first_feature(ggml_backend_get_features_t fp, ggml_backend_reg_t reg) { return fp(reg); }
|
||||||
|
// static struct ggml_backend_feature * next_feature(struct ggml_backend_feature * feature) { return &feature[1]; }
|
||||||
|
/*
|
||||||
|
typedef enum { COMPILER_CLANG, COMPILER_GNUC, COMPILER_UNKNOWN } COMPILER;
|
||||||
|
static COMPILER compiler_name(void) {
|
||||||
|
#if defined(__clang__)
|
||||||
|
return COMPILER_CLANG;
|
||||||
|
#elif defined(__GNUC__)
|
||||||
|
return COMPILER_GNUC;
|
||||||
|
#else
|
||||||
|
return COMPILER_UNKNOWN;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -16,6 +30,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
@ -90,4 +105,43 @@ var OnceLoad = sync.OnceFunc(func() {
|
|||||||
visited[abspath] = struct{}{}
|
visited[abspath] = struct{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
slog.Info("system", "", system{})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
type system struct{}
|
||||||
|
|
||||||
|
func (system) LogValue() slog.Value {
|
||||||
|
var attrs []slog.Attr
|
||||||
|
names := make(map[string]int)
|
||||||
|
for i := range C.ggml_backend_dev_count() {
|
||||||
|
r := C.ggml_backend_dev_backend_reg(C.ggml_backend_dev_get(i))
|
||||||
|
|
||||||
|
func() {
|
||||||
|
fName := C.CString("ggml_backend_get_features")
|
||||||
|
defer C.free(unsafe.Pointer(fName))
|
||||||
|
|
||||||
|
if fn := C.ggml_backend_reg_get_proc_address(r, fName); fn != nil {
|
||||||
|
var features []any
|
||||||
|
for f := C.first_feature(C.ggml_backend_get_features_t(fn), r); f.name != nil; f = C.next_feature(f) {
|
||||||
|
features = append(features, C.GoString(f.name), C.GoString(f.value))
|
||||||
|
}
|
||||||
|
|
||||||
|
name := C.GoString(C.ggml_backend_reg_name(r))
|
||||||
|
attrs = append(attrs, slog.Group(name+"."+strconv.Itoa(names[name]), features...))
|
||||||
|
names[name] += 1
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
switch C.compiler_name() {
|
||||||
|
case C.COMPILER_CLANG:
|
||||||
|
attrs = append(attrs, slog.String("compiler", "cgo(clang)"))
|
||||||
|
case C.COMPILER_GNUC:
|
||||||
|
attrs = append(attrs, slog.String("compiler", "cgo(gcc)"))
|
||||||
|
default:
|
||||||
|
attrs = append(attrs, slog.String("compiler", "cgo(unknown)"))
|
||||||
|
}
|
||||||
|
|
||||||
|
return slog.GroupValue(attrs...)
|
||||||
|
}
|
||||||
|
@ -931,7 +931,6 @@ func Execute(args []string) error {
|
|||||||
slog.Info("starting go runner")
|
slog.Info("starting go runner")
|
||||||
|
|
||||||
llama.BackendInit()
|
llama.BackendInit()
|
||||||
slog.Info("system", "info", llama.PrintSystemInfo(), "threads", *threads)
|
|
||||||
|
|
||||||
server := &Server{
|
server := &Server{
|
||||||
batchSize: *batchSize,
|
batchSize: *batchSize,
|
||||||
|
@ -786,8 +786,6 @@ func (s *Server) loadModel(
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
slog.Info("system", "info", s.model.Backend().SystemInfo(), "threads", params.NumThreads)
|
|
||||||
|
|
||||||
// TODO(jessegross): LoRA loading
|
// TODO(jessegross): LoRA loading
|
||||||
if lpath.String() != "" {
|
if lpath.String() != "" {
|
||||||
panic("loras are not yet implemented")
|
panic("loras are not yet implemented")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user