gguf_test.go 2.8 KB
Newer Older
1
2
3
4
package ggml

import (
	"bytes"
Michael Yang's avatar
Michael Yang committed
5
	"math/rand/v2"
6
	"os"
Michael Yang's avatar
Michael Yang committed
7
	"strings"
8
9
10
11
12
13
	"testing"

	"github.com/google/go-cmp/cmp"
)

func TestWriteGGUF(t *testing.T) {
14
	b := bytes.NewBuffer(make([]byte, 2*3))
Michael Yang's avatar
Michael Yang committed
15
16
17
	for range 8 {
		t.Run("shuffle", func(t *testing.T) {
			t.Parallel()
18

Michael Yang's avatar
Michael Yang committed
19
			ts := []*Tensor{
20
21
22
23
24
25
26
27
28
				{Name: "token_embd.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "blk.0.ffn_norm.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "blk.0.attn_norm.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "blk.1.ffn_up.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "blk.2.ffn_norm.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "blk.1.ffn_down.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "blk.0.attn_k.weight", Shape: []uint64{2, 3}, WriterTo: b},
				{Name: "output_norm.weight", Shape: []uint64{3, 2}, WriterTo: b},
				{Name: "output.weight", Shape: []uint64{3, 2}, WriterTo: b},
Michael Yang's avatar
Michael Yang committed
29
			}
30

31
			rand.Shuffle(len(ts), func(i, j int) {
Michael Yang's avatar
Michael Yang committed
32
33
				ts[i], ts[j] = ts[j], ts[i]
			})
34

Michael Yang's avatar
Michael Yang committed
35
36
37
38
39
40
41
			w, err := os.CreateTemp(t.TempDir(), strings.ReplaceAll(t.Name(), "/", "_")+"*.bin")
			if err != nil {
				t.Fatal(err)
			}
			defer w.Close()

			if err := WriteGGUF(w, KV{
42
43
44
45
46
47
				"general.architecture": "test",
				"general.alignment":    uint32(16),
				"test.key":             "value",
				"attention.key":        "value2",
				"tokenizer.key":        "value3",
				"adapter.key":          "value4",
Michael Yang's avatar
Michael Yang committed
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
			}, ts); err != nil {
				t.Fatal(err)
			}

			r, err := os.Open(w.Name())
			if err != nil {
				t.Fatal(err)
			}
			defer r.Close()

			ff, err := Decode(r, 0)
			if err != nil {
				t.Fatal(err)
			}

			if diff := cmp.Diff(KV{
64
				"general.architecture":    "test",
Michael Yang's avatar
Michael Yang committed
65
66
				"general.alignment":       uint32(16),
				"general.parameter_count": uint64(54),
67
68
69
70
				"test.key":                "value",
				"test.attention.key":      "value2",
				"tokenizer.key":           "value3",
				"adapter.key":             "value4",
Michael Yang's avatar
Michael Yang committed
71
72
73
			}, ff.KV()); diff != "" {
				t.Errorf("Mismatch (-want +got):\n%s", diff)
			}
74

Michael Yang's avatar
Michael Yang committed
75
			if diff := cmp.Diff(Tensors{
76
				Offset: 800,
Michael Yang's avatar
Michael Yang committed
77
				items: []*Tensor{
78
79
80
81
82
83
					{Name: "blk.0.attn_k.weight", Offset: 0, Shape: []uint64{2, 3}},
					{Name: "blk.0.attn_norm.weight", Offset: 32, Shape: []uint64{2, 3}},
					{Name: "blk.0.ffn_norm.weight", Offset: 64, Shape: []uint64{2, 3}},
					{Name: "blk.1.ffn_down.weight", Offset: 96, Shape: []uint64{2, 3}},
					{Name: "blk.1.ffn_up.weight", Offset: 128, Shape: []uint64{2, 3}},
					{Name: "blk.2.ffn_norm.weight", Offset: 160, Shape: []uint64{2, 3}},
Michael Yang's avatar
Michael Yang committed
84
85
86
87
88
89
90
91
					{Name: "output.weight", Offset: 192, Shape: []uint64{3, 2}},
					{Name: "output_norm.weight", Offset: 224, Shape: []uint64{3, 2}},
					{Name: "token_embd.weight", Offset: 256, Shape: []uint64{2, 3}},
				},
			}, ff.Tensors(), cmp.AllowUnexported(Tensors{})); diff != "" {
				t.Errorf("Mismatch (-want +got):\n%s", diff)
			}
		})
92
93
	}
}