فهرست منبع

Revert "Merge pull request #4938 from ollama/mxyng/fix-byte-order"

This reverts commit f5f245cc154580fa7b4052c001d2a7e3d771cfb8, reversing
changes made to 94d37fdcae30ddeb6c9f65c8707004f5ec9eaf33.

this change broke gguf v2 which is incorrectly detected as big endian
Michael Yang 10 ماه پیش
والد
کامیت
7bdcd1da94
2فایلهای تغییر یافته به همراه9 افزوده شده و 19 حذف شده
  1. 8 5
      llm/ggml.go
  2. 1 14
      llm/gguf.go

+ 8 - 5
llm/ggml.go

@@ -231,7 +231,8 @@ const (
 	// Magic constant for `ggla` files (LoRA adapter).
 	FILE_MAGIC_GGLA = 0x67676C61
 	// Magic constant for `gguf` files (versioned, gguf)
-	FILE_MAGIC_GGUF = 0x46554747
+	FILE_MAGIC_GGUF_LE = 0x46554747
+	FILE_MAGIC_GGUF_BE = 0x47475546
 )
 
 var ErrUnsupportedFormat = errors.New("unsupported model format")
@@ -246,7 +247,7 @@ func DetectGGMLType(b []byte) string {
 		return "ggjt"
 	case FILE_MAGIC_GGLA:
 		return "ggla"
-	case FILE_MAGIC_GGUF:
+	case FILE_MAGIC_GGUF_LE, FILE_MAGIC_GGUF_BE:
 		return "gguf"
 	default:
 		return ""
@@ -254,19 +255,21 @@ func DetectGGMLType(b []byte) string {
 }
 
 func DecodeGGML(rs io.ReadSeeker) (*GGML, int64, error) {
-	var magic [4]byte
+	var magic uint32
 	if err := binary.Read(rs, binary.LittleEndian, &magic); err != nil {
 		return nil, 0, err
 	}
 
 	var c container
-	switch binary.LittleEndian.Uint32(magic[:]) {
+	switch magic {
 	case FILE_MAGIC_GGML, FILE_MAGIC_GGMF, FILE_MAGIC_GGJT:
 		return nil, 0, ErrUnsupportedFormat
 	case FILE_MAGIC_GGLA:
 		c = &containerGGLA{}
-	case FILE_MAGIC_GGUF:
+	case FILE_MAGIC_GGUF_LE:
 		c = &containerGGUF{ByteOrder: binary.LittleEndian}
+	case FILE_MAGIC_GGUF_BE:
+		c = &containerGGUF{ByteOrder: binary.BigEndian}
 	default:
 		return nil, 0, errors.New("invalid file magic")
 	}

+ 1 - 14
llm/gguf.go

@@ -36,23 +36,10 @@ func (c *containerGGUF) Name() string {
 }
 
 func (c *containerGGUF) Decode(rs io.ReadSeeker) (model, error) {
-	var version [4]byte
-	if err := binary.Read(rs, c.ByteOrder, &version); err != nil {
+	if err := binary.Read(rs, c.ByteOrder, &c.Version); err != nil {
 		return nil, err
 	}
 
-	// if the lower 16 bits are 0, the byte order is probably wrong
-	if c.ByteOrder.Uint32(version[:])&1<<4 == 0 {
-		switch c.ByteOrder {
-		case binary.LittleEndian:
-			c.ByteOrder = binary.BigEndian
-		case binary.BigEndian:
-			c.ByteOrder = binary.LittleEndian
-		}
-	}
-
-	c.Version = c.ByteOrder.Uint32(version[:])
-
 	var err error
 	switch c.Version {
 	case 1: