Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
ollama
Commits
00852979
Commit
00852979
authored
Mar 09, 2024
by
Michael Yang
Browse files
refactor readseeker
parent
f878e910
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
72 additions
and
70 deletions
+72
-70
llm/ggla.go
llm/ggla.go
+24
-14
llm/ggml.go
llm/ggml.go
+10
-28
llm/gguf.go
llm/gguf.go
+38
-28
No files found.
llm/ggla.go
View file @
00852979
...
@@ -15,8 +15,8 @@ func (c *ContainerGGLA) Name() string {
...
@@ -15,8 +15,8 @@ func (c *ContainerGGLA) Name() string {
return
"ggla"
return
"ggla"
}
}
func
(
c
*
ContainerGGLA
)
Decode
(
rs
o
*
r
eadSeek
Offset
)
(
model
,
error
)
{
func
(
c
*
ContainerGGLA
)
Decode
(
rs
io
.
R
eadSeek
er
)
(
model
,
error
)
{
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
c
.
version
)
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
c
.
version
)
switch
c
.
version
{
switch
c
.
version
{
case
1
:
case
1
:
...
@@ -25,7 +25,7 @@ func (c *ContainerGGLA) Decode(rso *readSeekOffset) (model, error) {
...
@@ -25,7 +25,7 @@ func (c *ContainerGGLA) Decode(rso *readSeekOffset) (model, error) {
}
}
model
:=
newModelGGLA
(
c
)
model
:=
newModelGGLA
(
c
)
err
:=
model
.
decode
(
rs
o
)
err
:=
model
.
decode
(
rs
)
return
model
,
err
return
model
,
err
}
}
...
@@ -43,39 +43,39 @@ func newModelGGLA(container *ContainerGGLA) *ModelGGLA {
...
@@ -43,39 +43,39 @@ func newModelGGLA(container *ContainerGGLA) *ModelGGLA {
}
}
}
}
func
(
m
*
ModelGGLA
)
decode
(
rs
o
*
r
eadSeek
Offset
)
error
{
func
(
m
*
ModelGGLA
)
decode
(
rs
io
.
R
eadSeek
er
)
error
{
var
r
uint32
var
r
uint32
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
r
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
r
);
err
!=
nil
{
return
err
return
err
}
}
m
.
kv
[
"r"
]
=
r
m
.
kv
[
"r"
]
=
r
var
alpha
uint32
var
alpha
uint32
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
alpha
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
alpha
);
err
!=
nil
{
return
err
return
err
}
}
m
.
kv
[
"alpha"
]
=
alpha
m
.
kv
[
"alpha"
]
=
alpha
for
{
for
{
var
dims
uint32
var
dims
uint32
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
dims
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
dims
);
err
!=
nil
{
return
err
return
err
}
}
var
namesize
uint32
var
namesize
uint32
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
namesize
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
namesize
);
err
!=
nil
{
return
err
return
err
}
}
var
t
Tensor
var
t
Tensor
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
t
.
Kind
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
t
.
Kind
);
err
!=
nil
{
return
err
return
err
}
}
t
.
Shape
=
make
([]
uint64
,
dims
)
t
.
Shape
=
make
([]
uint64
,
dims
)
for
i
:=
0
;
uint32
(
i
)
<
dims
;
i
++
{
for
i
:=
0
;
uint32
(
i
)
<
dims
;
i
++
{
var
shape32
uint32
var
shape32
uint32
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
shape32
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
shape32
);
err
!=
nil
{
return
err
return
err
}
}
...
@@ -87,19 +87,29 @@ func (m *ModelGGLA) decode(rso *readSeekOffset) error {
...
@@ -87,19 +87,29 @@ func (m *ModelGGLA) decode(rso *readSeekOffset) error {
slices
.
Reverse
(
t
.
Shape
)
slices
.
Reverse
(
t
.
Shape
)
name
:=
make
([]
byte
,
namesize
)
name
:=
make
([]
byte
,
namesize
)
if
err
:=
binary
.
Read
(
rs
o
,
binary
.
LittleEndian
,
&
name
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
name
);
err
!=
nil
{
return
err
return
err
}
}
t
.
Name
=
string
(
name
)
t
.
Name
=
string
(
name
)
if
_
,
err
:=
rso
.
Seek
((
rso
.
offset
+
31
)
&-
32
,
io
.
SeekStart
);
err
!=
nil
{
offset
,
err
:=
rs
.
Seek
(
0
,
io
.
SeekCurrent
)
if
err
!=
nil
{
return
err
return
err
}
}
t
.
Offset
=
uint64
(
rso
.
offset
)
if
_
,
err
:=
rs
.
Seek
((
offset
+
31
)
&-
32
,
io
.
SeekStart
);
err
!=
nil
{
return
err
}
offset
,
err
=
rs
.
Seek
(
0
,
io
.
SeekCurrent
)
if
err
!=
nil
{
return
err
}
t
.
Offset
=
uint64
(
offset
)
if
_
,
err
:=
rs
o
.
Seek
(
int64
(
t
.
Size
()),
io
.
SeekCurrent
);
err
!=
nil
{
if
_
,
err
:=
rs
.
Seek
(
int64
(
t
.
Size
()),
io
.
SeekCurrent
);
err
!=
nil
{
return
err
return
err
}
}
...
...
llm/ggml.go
View file @
00852979
...
@@ -103,7 +103,7 @@ type model interface {
...
@@ -103,7 +103,7 @@ type model interface {
type
container
interface
{
type
container
interface
{
Name
()
string
Name
()
string
Decode
(
*
r
eadSeek
Offset
)
(
model
,
error
)
Decode
(
io
.
R
eadSeek
er
)
(
model
,
error
)
}
}
const
(
const
(
...
@@ -122,11 +122,9 @@ const (
...
@@ -122,11 +122,9 @@ const (
var
ErrUnsupportedFormat
=
errors
.
New
(
"unsupported model format"
)
var
ErrUnsupportedFormat
=
errors
.
New
(
"unsupported model format"
)
func
DecodeGGML
(
r
io
.
ReadSeeker
)
(
*
GGML
,
error
)
{
func
DecodeGGML
(
rs
io
.
ReadSeeker
)
(
*
GGML
,
error
)
{
ro
:=
readSeekOffset
{
ReadSeeker
:
r
}
var
magic
uint32
var
magic
uint32
if
err
:=
binary
.
Read
(
&
ro
,
binary
.
LittleEndian
,
&
magic
);
err
!=
nil
{
if
err
:=
binary
.
Read
(
rs
,
binary
.
LittleEndian
,
&
magic
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -144,38 +142,22 @@ func DecodeGGML(r io.ReadSeeker) (*GGML, error) {
...
@@ -144,38 +142,22 @@ func DecodeGGML(r io.ReadSeeker) (*GGML, error) {
return
nil
,
errors
.
New
(
"invalid file magic"
)
return
nil
,
errors
.
New
(
"invalid file magic"
)
}
}
model
,
err
:=
c
.
Decode
(
&
ro
)
model
,
err
:=
c
.
Decode
(
rs
)
if
errors
.
Is
(
err
,
io
.
EOF
)
{
if
errors
.
Is
(
err
,
io
.
EOF
)
{
// noop
// noop
}
else
if
err
!=
nil
{
}
else
if
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
offset
,
err
:=
rs
.
Seek
(
0
,
io
.
SeekCurrent
)
if
err
!=
nil
{
return
nil
,
err
}
// final model type
// final model type
return
&
GGML
{
return
&
GGML
{
container
:
c
,
container
:
c
,
model
:
model
,
model
:
model
,
Size
:
ro
.
offset
,
Size
:
offset
,
},
nil
},
nil
}
}
type
readSeekOffset
struct
{
io
.
ReadSeeker
offset
int64
}
func
(
rso
*
readSeekOffset
)
Seek
(
offset
int64
,
whence
int
)
(
int64
,
error
)
{
offset
,
err
:=
rso
.
ReadSeeker
.
Seek
(
offset
,
whence
)
if
err
!=
nil
{
return
0
,
err
}
rso
.
offset
=
offset
return
offset
,
nil
}
func
(
rso
*
readSeekOffset
)
Read
(
p
[]
byte
)
(
int
,
error
)
{
n
,
err
:=
rso
.
ReadSeeker
.
Read
(
p
)
rso
.
offset
+=
int64
(
n
)
return
n
,
err
}
llm/gguf.go
View file @
00852979
...
@@ -42,18 +42,18 @@ func (c *ContainerGGUF) Name() string {
...
@@ -42,18 +42,18 @@ func (c *ContainerGGUF) Name() string {
return
"gguf"
return
"gguf"
}
}
func
(
c
*
ContainerGGUF
)
Decode
(
rs
o
*
r
eadSeek
Offset
)
(
model
,
error
)
{
func
(
c
*
ContainerGGUF
)
Decode
(
rs
io
.
R
eadSeek
er
)
(
model
,
error
)
{
binary
.
Read
(
rs
o
,
c
.
ByteOrder
,
&
c
.
Version
)
binary
.
Read
(
rs
,
c
.
ByteOrder
,
&
c
.
Version
)
switch
c
.
Version
{
switch
c
.
Version
{
case
1
:
case
1
:
binary
.
Read
(
rs
o
,
c
.
ByteOrder
,
&
c
.
V1
)
binary
.
Read
(
rs
,
c
.
ByteOrder
,
&
c
.
V1
)
default
:
default
:
binary
.
Read
(
rs
o
,
c
.
ByteOrder
,
&
c
.
V2
)
binary
.
Read
(
rs
,
c
.
ByteOrder
,
&
c
.
V2
)
}
}
model
:=
NewGGUFModel
(
c
)
model
:=
NewGGUFModel
(
c
)
if
err
:=
model
.
Decode
(
rs
o
);
err
!=
nil
{
if
err
:=
model
.
Decode
(
rs
);
err
!=
nil
{
return
nil
,
err
return
nil
,
err
}
}
...
@@ -633,49 +633,49 @@ func (llm *GGUFModel) writeString(f *os.File, s string) error {
...
@@ -633,49 +633,49 @@ func (llm *GGUFModel) writeString(f *os.File, s string) error {
return
nil
return
nil
}
}
func
(
llm
*
GGUFModel
)
Decode
(
rs
o
*
r
eadSeek
Offset
)
error
{
func
(
llm
*
GGUFModel
)
Decode
(
rs
io
.
R
eadSeek
er
)
error
{
// decode key-values
// decode key-values
for
i
:=
0
;
uint64
(
i
)
<
llm
.
NumKV
();
i
++
{
for
i
:=
0
;
uint64
(
i
)
<
llm
.
NumKV
();
i
++
{
k
,
err
:=
llm
.
readString
(
rs
o
)
k
,
err
:=
llm
.
readString
(
rs
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
vtype
:=
llm
.
readU32
(
rs
o
)
vtype
:=
llm
.
readU32
(
rs
)
var
v
any
var
v
any
switch
vtype
{
switch
vtype
{
case
GGUFTypeUint8
:
case
GGUFTypeUint8
:
v
=
llm
.
readU8
(
rs
o
)
v
=
llm
.
readU8
(
rs
)
case
GGUFTypeInt8
:
case
GGUFTypeInt8
:
v
=
llm
.
readI8
(
rs
o
)
v
=
llm
.
readI8
(
rs
)
case
GGUFTypeUint16
:
case
GGUFTypeUint16
:
v
=
llm
.
readU16
(
rs
o
)
v
=
llm
.
readU16
(
rs
)
case
GGUFTypeInt16
:
case
GGUFTypeInt16
:
v
=
llm
.
readI16
(
rs
o
)
v
=
llm
.
readI16
(
rs
)
case
GGUFTypeUint32
:
case
GGUFTypeUint32
:
v
=
llm
.
readU32
(
rs
o
)
v
=
llm
.
readU32
(
rs
)
case
GGUFTypeInt32
:
case
GGUFTypeInt32
:
v
=
llm
.
readI32
(
rs
o
)
v
=
llm
.
readI32
(
rs
)
case
GGUFTypeUint64
:
case
GGUFTypeUint64
:
v
=
llm
.
readU64
(
rs
o
)
v
=
llm
.
readU64
(
rs
)
case
GGUFTypeInt64
:
case
GGUFTypeInt64
:
v
=
llm
.
readI64
(
rs
o
)
v
=
llm
.
readI64
(
rs
)
case
GGUFTypeFloat32
:
case
GGUFTypeFloat32
:
v
=
llm
.
readF32
(
rs
o
)
v
=
llm
.
readF32
(
rs
)
case
GGUFTypeFloat64
:
case
GGUFTypeFloat64
:
v
=
llm
.
readF64
(
rs
o
)
v
=
llm
.
readF64
(
rs
)
case
GGUFTypeBool
:
case
GGUFTypeBool
:
v
=
llm
.
readBool
(
rs
o
)
v
=
llm
.
readBool
(
rs
)
case
GGUFTypeString
:
case
GGUFTypeString
:
s
,
err
:=
llm
.
readString
(
rs
o
)
s
,
err
:=
llm
.
readString
(
rs
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
v
=
s
v
=
s
case
GGUFTypeArray
:
case
GGUFTypeArray
:
a
,
err
:=
llm
.
readArray
(
rs
o
)
a
,
err
:=
llm
.
readArray
(
rs
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
...
@@ -690,23 +690,23 @@ func (llm *GGUFModel) Decode(rso *readSeekOffset) error {
...
@@ -690,23 +690,23 @@ func (llm *GGUFModel) Decode(rso *readSeekOffset) error {
// decode tensors
// decode tensors
for
i
:=
0
;
uint64
(
i
)
<
llm
.
NumTensor
();
i
++
{
for
i
:=
0
;
uint64
(
i
)
<
llm
.
NumTensor
();
i
++
{
name
,
err
:=
llm
.
readString
(
rs
o
)
name
,
err
:=
llm
.
readString
(
rs
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
}
}
// dims is the number of dimensions in the tensor
// dims is the number of dimensions in the tensor
dims
:=
llm
.
readU32
(
rs
o
)
dims
:=
llm
.
readU32
(
rs
)
shape
:=
[
4
]
uint64
{
1
,
1
,
1
,
1
}
shape
:=
[
4
]
uint64
{
1
,
1
,
1
,
1
}
for
i
:=
0
;
uint32
(
i
)
<
dims
;
i
++
{
for
i
:=
0
;
uint32
(
i
)
<
dims
;
i
++
{
shape
[
i
]
=
llm
.
readU64
(
rs
o
)
shape
[
i
]
=
llm
.
readU64
(
rs
)
}
}
tensor
:=
Tensor
{
tensor
:=
Tensor
{
Name
:
name
,
Name
:
name
,
Kind
:
llm
.
readU32
(
rs
o
),
Kind
:
llm
.
readU32
(
rs
),
Offset
:
llm
.
readU64
(
rs
o
),
Offset
:
llm
.
readU64
(
rs
),
Shape
:
shape
[
:
],
Shape
:
shape
[
:
],
}
}
...
@@ -719,10 +719,20 @@ func (llm *GGUFModel) Decode(rso *readSeekOffset) error {
...
@@ -719,10 +719,20 @@ func (llm *GGUFModel) Decode(rso *readSeekOffset) error {
alignment
=
32
alignment
=
32
}
}
rso
.
Seek
(
int64
(
alignment
)
-
rso
.
offset
%
int64
(
alignment
),
io
.
SeekCurrent
)
offset
,
err
:=
rs
.
Seek
(
0
,
io
.
SeekCurrent
)
if
err
!=
nil
{
return
err
}
if
_
,
err
:=
rs
.
Seek
(
int64
(
alignment
)
-
offset
%
int64
(
alignment
),
io
.
SeekCurrent
);
err
!=
nil
{
return
err
}
for
_
,
tensor
:=
range
llm
.
Tensors
{
for
_
,
tensor
:=
range
llm
.
Tensors
{
padded
:=
(
int64
(
tensor
.
Size
())
+
int64
(
alignment
)
-
1
)
&
^
(
int64
(
alignment
)
-
1
)
padded
:=
(
int64
(
tensor
.
Size
())
+
int64
(
alignment
)
-
1
)
&
^
(
int64
(
alignment
)
-
1
)
rso
.
Seek
(
padded
,
io
.
SeekCurrent
)
if
_
,
err
:=
rs
.
Seek
(
padded
,
io
.
SeekCurrent
);
err
!=
nil
{
return
err
}
}
}
return
nil
return
nil
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment