Skip to content

Commit a8d0d8f

Browse files
committed
feat(ui, backends): Add individual backend logging
Signed-off-by: Richard Palethorpe <io@richiejp.com>
1 parent 3089c69 commit a8d0d8f

36 files changed

Lines changed: 970 additions & 19 deletions

core/application/startup.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,8 @@ func New(opts ...config.AppOption) (*Application, error) {
136136
loadRuntimeSettingsFromFile(options)
137137
}
138138

139+
application.ModelLoader().SetBackendLoggingEnabled(options.EnableBackendLogging)
140+
139141
// turn off any process that was started by GRPC if the context is canceled
140142
go func() {
141143
<-options.Context.Done()
@@ -382,6 +384,12 @@ func loadRuntimeSettingsFromFile(options *config.ApplicationConfig) {
382384
}
383385
}
384386

387+
if settings.EnableBackendLogging != nil {
388+
if !options.EnableBackendLogging {
389+
options.EnableBackendLogging = *settings.EnableBackendLogging
390+
}
391+
}
392+
385393
xlog.Debug("Runtime settings loaded from runtime_settings.json")
386394
}
387395

core/backend/detection.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package backend
33
import (
44
"context"
55
"fmt"
6+
"time"
67

78
"github.com/mudler/LocalAI/core/config"
9+
"github.com/mudler/LocalAI/core/trace"
810
"github.com/mudler/LocalAI/pkg/grpc/proto"
911
"github.com/mudler/LocalAI/pkg/model"
1012
)
@@ -18,16 +20,43 @@ func Detection(
1820
opts := ModelOptions(modelConfig, appConfig)
1921
detectionModel, err := loader.Load(opts...)
2022
if err != nil {
23+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
2124
return nil, err
2225
}
2326

2427
if detectionModel == nil {
2528
return nil, fmt.Errorf("could not load detection model")
2629
}
2730

31+
var startTime time.Time
32+
if appConfig.EnableTracing {
33+
trace.InitBackendTracingIfEnabled(appConfig.TracingMaxItems)
34+
startTime = time.Now()
35+
}
36+
2837
res, err := detectionModel.Detect(context.Background(), &proto.DetectOptions{
2938
Src: sourceFile,
3039
})
3140

41+
if appConfig.EnableTracing {
42+
errStr := ""
43+
if err != nil {
44+
errStr = err.Error()
45+
}
46+
47+
trace.RecordBackendTrace(trace.BackendTrace{
48+
Timestamp: startTime,
49+
Duration: time.Since(startTime),
50+
Type: trace.BackendTraceDetection,
51+
ModelName: modelConfig.Name,
52+
Backend: modelConfig.Backend,
53+
Summary: trace.TruncateString(sourceFile, 200),
54+
Error: errStr,
55+
Data: map[string]any{
56+
"source_file": sourceFile,
57+
},
58+
})
59+
}
60+
3261
return res, err
3362
}

core/backend/embeddings.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func ModelEmbedding(s string, tokens []int, loader *model.ModelLoader, modelConf
1717

1818
inferenceModel, err := loader.Load(opts...)
1919
if err != nil {
20+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
2021
return nil, err
2122
}
2223

core/backend/image.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func ImageGeneration(height, width, step, seed int, positive_prompt, negative_pr
1717
opts...,
1818
)
1919
if err != nil {
20+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
2021
return nil, err
2122
}
2223

core/backend/llm.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ func ModelInference(ctx context.Context, s string, messages schema.Messages, ima
6565
opts := ModelOptions(*c, o)
6666
inferenceModel, err := loader.Load(opts...)
6767
if err != nil {
68+
recordModelLoadFailure(o, c.Name, c.Backend, err, map[string]any{"model_file": modelFile})
6869
return nil, err
6970
}
7071

core/backend/options.go

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,36 @@
11
package backend
22

33
import (
4-
"strings"
54
"math/rand"
65
"os"
76
"path/filepath"
7+
"strings"
8+
"time"
89

910
"github.com/mudler/LocalAI/core/config"
11+
"github.com/mudler/LocalAI/core/trace"
1012
pb "github.com/mudler/LocalAI/pkg/grpc/proto"
1113
"github.com/mudler/LocalAI/pkg/model"
1214
"github.com/mudler/xlog"
1315
)
1416

17+
// recordModelLoadFailure records a backend trace when model loading fails.
18+
func recordModelLoadFailure(appConfig *config.ApplicationConfig, modelName, backend string, err error, data map[string]any) {
19+
if !appConfig.EnableTracing {
20+
return
21+
}
22+
trace.InitBackendTracingIfEnabled(appConfig.TracingMaxItems)
23+
trace.RecordBackendTrace(trace.BackendTrace{
24+
Timestamp: time.Now(),
25+
Type: trace.BackendTraceModelLoad,
26+
ModelName: modelName,
27+
Backend: backend,
28+
Summary: "Model load failed",
29+
Error: err.Error(),
30+
Data: data,
31+
})
32+
}
33+
1534
func ModelOptions(c config.ModelConfig, so *config.ApplicationConfig, opts ...model.Option) []model.Option {
1635
name := c.Name
1736
if name == "" {

core/backend/rerank.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ func Rerank(request *proto.RerankRequest, loader *model.ModelLoader, appConfig *
1515
opts := ModelOptions(modelConfig, appConfig)
1616
rerankModel, err := loader.Load(opts...)
1717
if err != nil {
18+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
1819
return nil, err
1920
}
2021

core/backend/soundgeneration.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ func SoundGeneration(
3737
opts := ModelOptions(modelConfig, appConfig)
3838
soundGenModel, err := loader.Load(opts...)
3939
if err != nil {
40+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
4041
return "", nil, err
4142
}
4243

core/backend/token_metrics.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func TokenMetrics(
1818
opts := ModelOptions(modelConfig, appConfig, model.WithModel(modelFile))
1919
model, err := loader.Load(opts...)
2020
if err != nil {
21+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
2122
return nil, err
2223
}
2324

core/backend/tokenize.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ func ModelTokenize(s string, loader *model.ModelLoader, modelConfig config.Model
1818
opts := ModelOptions(modelConfig, appConfig)
1919
inferenceModel, err = loader.Load(opts...)
2020
if err != nil {
21+
recordModelLoadFailure(appConfig, modelConfig.Name, modelConfig.Backend, err, nil)
2122
return schema.TokenizeResponse{}, err
2223
}
2324

0 commit comments

Comments
 (0)