From 686178b6c57336124b1c9b1cee87afe8c2864de2 Mon Sep 17 00:00:00 2001 From: Patrick Devine Date: Wed, 24 Apr 2024 18:53:00 -0700 Subject: [PATCH] show ggml modelinfo through the show api --- api/types.go | 1 + llm/ggml.go | 2 +- server/routes.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/api/types.go b/api/types.go index 7fe2b4e4..59af9173 100644 --- a/api/types.go +++ b/api/types.go @@ -207,6 +207,7 @@ type ShowResponse struct { System string `json:"system,omitempty"` Details ModelDetails `json:"details,omitempty"` Messages []Message `json:"messages,omitempty"` + ModelInfo string `json:"modelinfo,omitempty"` } type CopyRequest struct { diff --git a/llm/ggml.go b/llm/ggml.go index 1b094027..e26b655a 100644 --- a/llm/ggml.go +++ b/llm/ggml.go @@ -191,7 +191,7 @@ func (l Layer) size() (size uint64) { type Tensor struct { Name string `json:"name"` Kind uint32 `json:"kind"` - Offset uint64 `json:"-"` + Offset uint64 `json:"offset"` // Shape is the number of elements in each dimension Shape []uint64 `json:"shape"` diff --git a/server/routes.go b/server/routes.go index 016deb34..f09df517 100644 --- a/server/routes.go +++ b/server/routes.go @@ -721,12 +721,61 @@ func GetModelInfo(req api.ShowRequest) (*api.ShowResponse, error) { if err != nil { return nil, err } - resp.Modelfile = mf + ggmlData, err := getGGMLData(model) + if err != nil { + return nil, err + } + resp.ModelInfo = string(ggmlData) + return resp, nil } +func getGGMLData(model *Model) ([]byte, error) { + f, err := os.Open(model.ModelPath) + if err != nil { + return nil, err + } + + ggml, _, err := llm.DecodeGGML(f) + if err != nil { + return nil, err + } + + kv := ggml.KV() + var keys []string + for k := range kv { + keys = append(keys, k) + } + + kvMap := make(map[string]any) + + for _, k := range keys { + v := kv[k] + + switch v.(type) { + case []interface{}: + if len(v.([]interface{})) > 5 { + kvMap[k] = []string{} + continue + } + } + kvMap[k] = v + } + + ggmlMap := make(map[string]any) + ggmlMap["kv"] = kvMap + ggmlMap["tensors"] = ggml.Tensors() + + ggmlJson, err := json.Marshal(ggmlMap) + if err != nil { + return nil, err + } + + return ggmlJson, nil +} + func (s *Server) ListModelsHandler(c *gin.Context) { models := make([]api.ModelResponse, 0) manifestsPath, err := GetManifestPath()