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
d355d202
Commit
d355d202
authored
May 08, 2024
by
Patrick Devine
Committed by
Michael Yang
May 20, 2024
Browse files
add fixes for llama
parent
c8cf0d94
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
55 additions
and
24 deletions
+55
-24
cmd/cmd.go
cmd/cmd.go
+1
-1
convert/convert.go
convert/convert.go
+1
-3
convert/llama.go
convert/llama.go
+19
-14
convert/safetensors.go
convert/safetensors.go
+2
-0
convert/torch.go
convert/torch.go
+32
-6
No files found.
cmd/cmd.go
View file @
d355d202
...
@@ -208,7 +208,7 @@ func tempZipFiles(path string) (string, error) {
...
@@ -208,7 +208,7 @@ func tempZipFiles(path string) (string, error) {
// pytorch files might also be unresolved git lfs references; skip if they are
// pytorch files might also be unresolved git lfs references; skip if they are
// covers pytorch_model-x-of-y.bin, pytorch_model.fp32-x-of-y.bin, pytorch_model.bin
// covers pytorch_model-x-of-y.bin, pytorch_model.fp32-x-of-y.bin, pytorch_model.bin
files
=
append
(
files
,
pt
...
)
files
=
append
(
files
,
pt
...
)
}
else
if
pt
,
_
:=
glob
(
filepath
.
Join
(
path
,
"consolidated*.pth"
),
"application/
octet-stream
"
);
len
(
pt
)
>
0
{
}
else
if
pt
,
_
:=
glob
(
filepath
.
Join
(
path
,
"consolidated*.pth"
),
"application/
zip
"
);
len
(
pt
)
>
0
{
// pytorch files might also be unresolved git lfs references; skip if they are
// pytorch files might also be unresolved git lfs references; skip if they are
// covers consolidated.x.pth, consolidated.pth
// covers consolidated.x.pth, consolidated.pth
files
=
append
(
files
,
pt
...
)
files
=
append
(
files
,
pt
...
)
...
...
convert/convert.go
View file @
d355d202
...
@@ -74,11 +74,9 @@ func GetModelFormat(dirname string) (ModelFormat, error) {
...
@@ -74,11 +74,9 @@ func GetModelFormat(dirname string) (ModelFormat, error) {
}
}
for
_
,
fn
:=
range
files
{
for
_
,
fn
:=
range
files
{
slog
.
Debug
(
fmt
.
Sprintf
(
"file = %s"
,
fn
))
if
strings
.
HasSuffix
(
fn
,
".safetensors"
)
{
if
strings
.
HasSuffix
(
fn
,
".safetensors"
)
{
return
&
SafetensorFormat
{},
nil
return
&
SafetensorFormat
{},
nil
//} else if strings.HasSuffix(fn, ".bin") {
}
else
if
strings
.
HasSuffix
(
fn
,
".bin"
)
||
strings
.
HasSuffix
(
fn
,
".pth"
)
{
}
else
if
strings
.
HasSuffix
(
fn
,
".pth"
)
{
slog
.
Debug
(
"model is torch"
)
slog
.
Debug
(
"model is torch"
)
return
&
TorchFormat
{},
nil
return
&
TorchFormat
{},
nil
}
}
...
...
convert/llama.go
View file @
d355d202
...
@@ -23,13 +23,25 @@ type LlamaModel struct {
...
@@ -23,13 +23,25 @@ type LlamaModel struct {
}
}
func
llamaTorchLayerHandler
(
w
io
.
Writer
,
r
torchWriterTo
)
error
{
func
llamaTorchLayerHandler
(
w
io
.
Writer
,
r
torchWriterTo
)
error
{
slog
.
Debug
(
fmt
.
Sprintf
(
"repacking layer '%s'"
,
r
.
t
.
Name
))
var
tData
[]
uint16
switch
r
.
storage
.
(
type
)
{
case
*
pytorch
.
HalfStorage
:
data
:=
r
.
storage
.
(
*
pytorch
.
HalfStorage
)
.
Data
data
:=
r
.
storage
.
(
*
pytorch
.
HalfStorage
)
.
Data
tData
:
=
make
([]
uint16
,
len
(
data
))
tData
=
make
([]
uint16
,
len
(
data
))
for
cnt
,
v
:=
range
data
{
for
cnt
,
v
:=
range
data
{
tData
[
cnt
]
=
uint16
(
float16
.
Fromfloat32
(
v
))
tData
[
cnt
]
=
uint16
(
float16
.
Fromfloat32
(
v
))
}
}
case
*
pytorch
.
BFloat16Storage
:
data
:=
r
.
storage
.
(
*
pytorch
.
BFloat16Storage
)
.
Data
tData
=
make
([]
uint16
,
len
(
data
))
for
cnt
,
v
:=
range
data
{
tData
[
cnt
]
=
uint16
(
float16
.
Fromfloat32
(
v
))
}
default
:
return
fmt
.
Errorf
(
"unknown storage type for torch"
)
}
var
err
error
var
err
error
var
heads
uint32
var
heads
uint32
...
@@ -44,8 +56,6 @@ func llamaTorchLayerHandler(w io.Writer, r torchWriterTo) error {
...
@@ -44,8 +56,6 @@ func llamaTorchLayerHandler(w io.Writer, r torchWriterTo) error {
return
fmt
.
Errorf
(
"unknown layer type"
)
return
fmt
.
Errorf
(
"unknown layer type"
)
}
}
slog
.
Debug
(
fmt
.
Sprintf
(
"heads = %d"
,
heads
))
tData
,
err
=
llamaRepack
(
tData
,
int
(
heads
),
r
.
t
.
Shape
)
tData
,
err
=
llamaRepack
(
tData
,
int
(
heads
),
r
.
t
.
Shape
)
if
err
!=
nil
{
if
err
!=
nil
{
return
err
return
err
...
@@ -106,7 +116,6 @@ func (m *LlamaModel) GetTensors() error {
...
@@ -106,7 +116,6 @@ func (m *LlamaModel) GetTensors() error {
for
_
,
l
:=
range
t
{
for
_
,
l
:=
range
t
{
matches
:=
re
.
FindAllStringSubmatch
(
l
.
Name
,
-
1
)
matches
:=
re
.
FindAllStringSubmatch
(
l
.
Name
,
-
1
)
if
len
(
matches
)
>
0
{
if
len
(
matches
)
>
0
{
slog
.
Debug
(
fmt
.
Sprintf
(
"setting handler for: %s"
,
l
.
Name
))
switch
m
.
Format
.
(
type
)
{
switch
m
.
Format
.
(
type
)
{
case
*
TorchFormat
:
case
*
TorchFormat
:
wt
:=
l
.
WriterTo
.
(
torchWriterTo
)
wt
:=
l
.
WriterTo
.
(
torchWriterTo
)
...
@@ -182,9 +191,7 @@ func (m *LlamaModel) WriteGGUF(ws io.WriteSeeker) error {
...
@@ -182,9 +191,7 @@ func (m *LlamaModel) WriteGGUF(ws io.WriteSeeker) error {
"llama.attention.head_count"
:
uint32
(
m
.
Params
.
AttentionHeads
),
"llama.attention.head_count"
:
uint32
(
m
.
Params
.
AttentionHeads
),
"llama.attention.head_count_kv"
:
uint32
(
m
.
Params
.
KeyValHeads
),
"llama.attention.head_count_kv"
:
uint32
(
m
.
Params
.
KeyValHeads
),
"llama.attention.layer_norm_rms_epsilon"
:
float32
(
m
.
Params
.
NormEPS
),
"llama.attention.layer_norm_rms_epsilon"
:
float32
(
m
.
Params
.
NormEPS
),
//"general.file_type": uint32(1),
"general.file_type"
:
uint32
(
2
),
"general.file_type"
:
uint32
(
2
),
//"tokenizer.ggml.model": "llama",
"tokenizer.ggml.model"
:
"gpt2"
,
"tokenizer.ggml.model"
:
"gpt2"
,
"tokenizer.ggml.tokens"
:
m
.
Vocab
.
Tokens
,
"tokenizer.ggml.tokens"
:
m
.
Vocab
.
Tokens
,
...
@@ -193,8 +200,6 @@ func (m *LlamaModel) WriteGGUF(ws io.WriteSeeker) error {
...
@@ -193,8 +200,6 @@ func (m *LlamaModel) WriteGGUF(ws io.WriteSeeker) error {
"tokenizer.ggml.bos_token_id"
:
uint32
(
m
.
Params
.
BoSTokenID
),
"tokenizer.ggml.bos_token_id"
:
uint32
(
m
.
Params
.
BoSTokenID
),
"tokenizer.ggml.eos_token_id"
:
uint32
(
m
.
Params
.
EoSTokenID
),
"tokenizer.ggml.eos_token_id"
:
uint32
(
m
.
Params
.
EoSTokenID
),
"tokenizer.ggml.unknown_token_id"
:
uint32
(
0
),
"tokenizer.ggml.unknown_token_id"
:
uint32
(
0
),
//"tokenizer.ggml.add_bos_token": true,
//"tokenizer.ggml.add_eos_token": false,
}
}
if
len
(
m
.
Vocab
.
Merges
)
>
0
{
if
len
(
m
.
Vocab
.
Merges
)
>
0
{
...
...
convert/safetensors.go
View file @
d355d202
...
@@ -131,6 +131,8 @@ func (m *SafetensorFormat) readTensors(fn string, offset uint64, params *Params)
...
@@ -131,6 +131,8 @@ func (m *SafetensorFormat) readTensors(fn string, offset uint64, params *Params)
shape
[
i
]
=
uint64
(
data
.
Shape
[
i
])
shape
[
i
]
=
uint64
(
data
.
Shape
[
i
])
}
}
slog
.
Debug
(
fmt
.
Sprintf
(
"'%45s': '%30s' %10d [%#v]"
,
k
,
ggufName
,
size
,
data
.
Shape
))
t
:=
llm
.
Tensor
{
t
:=
llm
.
Tensor
{
Name
:
ggufName
,
Name
:
ggufName
,
Kind
:
kind
,
Kind
:
kind
,
...
...
convert/torch.go
View file @
d355d202
...
@@ -33,12 +33,16 @@ type TorchFormat struct{}
...
@@ -33,12 +33,16 @@ type TorchFormat struct{}
func
(
tf
*
TorchFormat
)
GetTensors
(
dirpath
string
,
params
*
Params
)
([]
llm
.
Tensor
,
error
)
{
func
(
tf
*
TorchFormat
)
GetTensors
(
dirpath
string
,
params
*
Params
)
([]
llm
.
Tensor
,
error
)
{
slog
.
Debug
(
"getting torch tensors"
)
slog
.
Debug
(
"getting torch tensors"
)
//files, err := filepath.Glob(filepath.Join(dirpath, "pytorch_model-*.bin"))
var
files
[]
string
files
,
err
:=
filepath
.
Glob
(
filepath
.
Join
(
dirpath
,
"consolidatedr.*.pth"
))
var
err
error
files
,
err
=
filepath
.
Glob
(
filepath
.
Join
(
dirpath
,
"consolidated.*.pth"
))
if
err
!=
nil
{
files
,
err
=
filepath
.
Glob
(
filepath
.
Join
(
dirpath
,
"pytorch_model-*.bin"
))
if
err
!=
nil
{
if
err
!=
nil
{
slog
.
Error
(
"didn't find any torch files"
)
slog
.
Error
(
"didn't find any torch files"
)
return
nil
,
err
return
nil
,
err
}
}
}
var
offset
uint64
var
offset
uint64
...
@@ -78,7 +82,7 @@ func (tf *TorchFormat) GetTensors(dirpath string, params *Params) ([]llm.Tensor,
...
@@ -78,7 +82,7 @@ func (tf *TorchFormat) GetTensors(dirpath string, params *Params) ([]llm.Tensor,
slog
.
Error
(
err
.
Error
())
slog
.
Error
(
err
.
Error
())
return
nil
,
err
return
nil
,
err
}
}
slog
.
Debug
(
fmt
.
Sprintf
(
"
finding name for '%s' -> '%s'
"
,
k
.
(
string
),
ggufName
))
slog
.
Debug
(
fmt
.
Sprintf
(
"
'%35s': '%30s' %10d [%#v]
"
,
k
.
(
string
),
ggufName
,
size
,
tshape
))
shape
:=
[]
uint64
{
0
,
0
,
0
,
0
}
shape
:=
[]
uint64
{
0
,
0
,
0
,
0
}
for
i
:=
range
tshape
{
for
i
:=
range
tshape
{
...
@@ -236,7 +240,7 @@ func (r torchWriterTo) WriteTo(w io.Writer) (n int64, err error) {
...
@@ -236,7 +240,7 @@ func (r torchWriterTo) WriteTo(w io.Writer) (n int64, err error) {
return
0
,
r
.
handler
(
w
,
r
)
return
0
,
r
.
handler
(
w
,
r
)
}
}
switch
r
.
storage
.
(
type
)
{
switch
storage
:=
r
.
storage
.
(
type
)
{
case
*
pytorch
.
FloatStorage
:
case
*
pytorch
.
FloatStorage
:
slog
.
Warn
(
fmt
.
Sprintf
(
"unexpected storage found for layer '%s'; skipping"
,
r
.
t
.
Name
))
slog
.
Warn
(
fmt
.
Sprintf
(
"unexpected storage found for layer '%s'; skipping"
,
r
.
t
.
Name
))
return
0
,
nil
return
0
,
nil
...
@@ -259,6 +263,28 @@ func (r torchWriterTo) WriteTo(w io.Writer) (n int64, err error) {
...
@@ -259,6 +263,28 @@ func (r torchWriterTo) WriteTo(w io.Writer) (n int64, err error) {
return
0
,
err
return
0
,
err
}
}
}
}
case
*
pytorch
.
BFloat16Storage
:
data
:=
r
.
storage
.
(
*
pytorch
.
BFloat16Storage
)
.
Data
switch
r
.
t
.
Kind
{
case
0
:
if
err
=
binary
.
Write
(
w
,
r
.
bo
,
data
);
err
!=
nil
{
return
0
,
err
}
case
1
:
tData
:=
make
([]
uint16
,
len
(
data
))
for
cnt
,
v
:=
range
data
{
tData
[
cnt
]
=
uint16
(
float16
.
Fromfloat32
(
v
))
}
if
err
=
binary
.
Write
(
w
,
r
.
bo
,
tData
);
err
!=
nil
{
return
0
,
err
}
default
:
return
0
,
fmt
.
Errorf
(
"unknown storage kind: %d"
,
r
.
t
.
Kind
)
}
default
:
return
0
,
fmt
.
Errorf
(
"unknown storage type: %T"
,
storage
)
}
}
return
0
,
nil
return
0
,
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