From 04950140ec1c62ea48450845354a9a28f905425e Mon Sep 17 00:00:00 2001 From: Bruce MacDonald Date: Wed, 9 Apr 2025 09:33:33 -0700 Subject: [PATCH] server: do not attempt to parse offset file as gguf This logic was causing issues for me when importing a gguf that had some padding at the end of the file. The valid gguf would be read, but then it would try to read the offset as a different gguf file. This does not seem right. --- server/create.go | 60 ++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 33 deletions(-) diff --git a/server/create.go b/server/create.go index 4294554be..1a3609cf6 100644 --- a/server/create.go +++ b/server/create.go @@ -497,43 +497,37 @@ func ggufLayers(digest string, fn func(resp api.ProgressResponse)) ([]*layerGGML return nil, err } - var offset int64 - for offset < stat.Size() { - f, n, err := ggml.Decode(blob, 0) - if errors.Is(err, io.EOF) { - break - } else if err != nil { + f, n, err := ggml.Decode(blob, 0) + if err != nil { + return nil, err + } + + mediatype := "application/vnd.ollama.image.model" + if f.KV().Kind() == "adapter" { + mediatype = "application/vnd.ollama.image.adapter" + } else if _, ok := f.KV()[fmt.Sprintf("%s.vision.block_count", f.KV().Architecture())]; ok || f.KV().Kind() == "projector" { + mediatype = "application/vnd.ollama.image.projector" + } + + var layer Layer + if digest != "" && n == stat.Size() { + layer, err = NewLayerFromLayer(digest, mediatype, blob.Name()) + if err != nil { + slog.Debug("could not create new layer from layer", "error", err) return nil, err } - - mediatype := "application/vnd.ollama.image.model" - if f.KV().Kind() == "adapter" { - mediatype = "application/vnd.ollama.image.adapter" - } else if _, ok := f.KV()[fmt.Sprintf("%s.vision.block_count", f.KV().Architecture())]; ok || f.KV().Kind() == "projector" { - mediatype = "application/vnd.ollama.image.projector" - } - - var layer Layer - if digest != "" && n == stat.Size() && offset == 0 { - layer, err = NewLayerFromLayer(digest, mediatype, blob.Name()) - if err != nil { - slog.Debug("could not create new layer from layer", "error", err) - return nil, err - } - } - - // Fallback to creating layer from file copy (either NewLayerFromLayer failed, or digest empty/n != stat.Size()) - if layer.Digest == "" { - layer, err = NewLayer(io.NewSectionReader(blob, offset, n), mediatype) - if err != nil { - return nil, err - } - } - - layers = append(layers, &layerGGML{layer, f}) - offset = n } + // Fallback to creating layer from file copy (either NewLayerFromLayer failed, or digest empty/n != stat.Size()) + if layer.Digest == "" { + layer, err = NewLayer(io.NewSectionReader(blob, 0, n), mediatype) + if err != nil { + return nil, err + } + } + + layers = append(layers, &layerGGML{layer, f}) + return detectChatTemplate(layers) }