diff --git a/convert/convert.go b/convert/convert.go index 26bc72cc2..f6c7f3a55 100644 --- a/convert/convert.go +++ b/convert/convert.go @@ -7,6 +7,7 @@ import ( "io" "io/fs" "log/slog" + "slices" "strings" "github.com/ollama/ollama/fs/ggml" @@ -84,14 +85,6 @@ func (ModelParameters) specialTokenTypes() []string { } } -func (ModelParameters) writeFile(ws io.WriteSeeker, kv ggml.KV, ts []ggml.Tensor) error { - return ggml.WriteGGUF(ws, kv, ts) -} - -func (AdapterParameters) writeFile(ws io.WriteSeeker, kv ggml.KV, ts []ggml.Tensor) error { - return ggml.WriteGGUF(ws, kv, ts) -} - type ModelConverter interface { // KV maps parameters to LLM key-values KV(*Tokenizer) ggml.KV @@ -103,8 +96,6 @@ type ModelConverter interface { // specialTokenTypes returns any special token types the model uses specialTokenTypes() []string - // writeFile writes the model to the provided io.WriteSeeker - writeFile(io.WriteSeeker, ggml.KV, []ggml.Tensor) error } type moreParser interface { @@ -119,8 +110,6 @@ type AdapterConverter interface { // Replacements returns a list of string pairs to replace in tensor names. // See [strings.Replacer](https://pkg.go.dev/strings#Replacer) for details Replacements() []string - - writeFile(io.WriteSeeker, ggml.KV, []ggml.Tensor) error } func ConvertAdapter(fsys fs.FS, ws io.WriteSeeker, baseKV ggml.KV) error { @@ -158,7 +147,7 @@ func ConvertAdapter(fsys fs.FS, ws io.WriteSeeker, baseKV ggml.KV) error { return err } - return conv.writeFile(ws, conv.KV(baseKV), conv.Tensors(ts)) + return writeFile(ws, conv.KV(baseKV), conv.Tensors(ts)) } // Convert writes an Ollama compatible model to the provided io.WriteSeeker based on configurations @@ -248,5 +237,13 @@ func ConvertModel(fsys fs.FS, ws io.WriteSeeker) error { return err } - return conv.writeFile(ws, conv.KV(t), conv.Tensors(ts)) + return writeFile(ws, conv.KV(t), conv.Tensors(ts)) +} + +func writeFile(ws io.WriteSeeker, kv ggml.KV, ts []ggml.Tensor) error { + for i := range ts { + ts[i].Shape = slices.Clone(ts[i].Shape) + slices.Reverse(ts[i].Shape) + } + return ggml.WriteGGUF(ws, kv, ts) } diff --git a/fs/ggml/gguf.go b/fs/ggml/gguf.go index 0c6a8eb2c..28e89c18a 100644 --- a/fs/ggml/gguf.go +++ b/fs/ggml/gguf.go @@ -627,8 +627,8 @@ func ggufWriteTensorInfo(ws io.WriteSeeker, t Tensor) error { return err } - for i := range len(t.Shape) { - if err := binary.Write(ws, binary.LittleEndian, t.Shape[len(t.Shape)-i-1]); err != nil { + for _, n := range t.Shape { + if err := binary.Write(ws, binary.LittleEndian, n); err != nil { return err } }