concurrent load tensors
This commit is contained in:
parent
b7943d941d
commit
e699b8f5b9
@ -4,7 +4,7 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -24,9 +24,9 @@ type Backend interface {
|
|||||||
NewContext() Context
|
NewContext() Context
|
||||||
}
|
}
|
||||||
|
|
||||||
var backends = make(map[string]func(io.ReadSeeker) (Backend, error))
|
var backends = make(map[string]func(*os.File) (Backend, error))
|
||||||
|
|
||||||
func RegisterBackend(name string, f func(io.ReadSeeker) (Backend, error)) {
|
func RegisterBackend(name string, f func(*os.File) (Backend, error)) {
|
||||||
if _, ok := backends[name]; ok {
|
if _, ok := backends[name]; ok {
|
||||||
panic("backend: backend already registered")
|
panic("backend: backend already registered")
|
||||||
}
|
}
|
||||||
@ -34,9 +34,9 @@ func RegisterBackend(name string, f func(io.ReadSeeker) (Backend, error)) {
|
|||||||
backends[name] = f
|
backends[name] = f
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewBackend(r io.ReadSeeker) (Backend, error) {
|
func NewBackend(f *os.File) (Backend, error) {
|
||||||
if backend, ok := backends["ggml"]; ok {
|
if backend, ok := backends["ggml"]; ok {
|
||||||
return backend(r)
|
return backend(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil, fmt.Errorf("unsupported backend")
|
return nil, fmt.Errorf("unsupported backend")
|
||||||
|
@ -12,8 +12,11 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
|
"os"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
|
|
||||||
"github.com/ollama/ollama/format"
|
"github.com/ollama/ollama/format"
|
||||||
"github.com/ollama/ollama/fs/ggml"
|
"github.com/ollama/ollama/fs/ggml"
|
||||||
"github.com/ollama/ollama/ml"
|
"github.com/ollama/ollama/ml"
|
||||||
@ -28,7 +31,7 @@ type Backend struct {
|
|||||||
ggml.Tensors
|
ggml.Tensors
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(r io.ReadSeeker) (ml.Backend, error) {
|
func New(r *os.File) (ml.Backend, error) {
|
||||||
f, _, err := ggml.Decode(r, -1)
|
f, _, err := ggml.Decode(r, -1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -62,22 +65,20 @@ func New(r io.ReadSeeker) (ml.Backend, error) {
|
|||||||
|
|
||||||
b := newBackend()
|
b := newBackend()
|
||||||
bb := C.ggml_backend_alloc_ctx_tensors(c, b)
|
bb := C.ggml_backend_alloc_ctx_tensors(c, b)
|
||||||
|
|
||||||
|
var g errgroup.Group
|
||||||
for _, t := range f.Tensors().Items {
|
for _, t := range f.Tensors().Items {
|
||||||
if _, err := r.Seek(int64(f.Tensors().Offset+t.Offset), io.SeekStart); err != nil {
|
g.Go(func() error {
|
||||||
return nil, err
|
var b bytes.Buffer
|
||||||
}
|
n, err := io.Copy(&b, io.NewSectionReader(r, int64(f.Tensors().Offset+t.Offset), int64(t.Size())))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
var b bytes.Buffer
|
if n != int64(t.Size()) {
|
||||||
n, err := io.CopyN(&b, r, int64(t.Size()))
|
return fmt.Errorf("expected %d bytes, got %d", t.Size(), n)
|
||||||
if err != nil {
|
}
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if n != int64(t.Size()) {
|
|
||||||
return nil, fmt.Errorf("expected %d bytes, got %d", t.Size(), n)
|
|
||||||
}
|
|
||||||
|
|
||||||
func() {
|
|
||||||
cname := C.CString(t.Name)
|
cname := C.CString(t.Name)
|
||||||
defer C.free(unsafe.Pointer(cname))
|
defer C.free(unsafe.Pointer(cname))
|
||||||
|
|
||||||
@ -85,7 +86,12 @@ func New(r io.ReadSeeker) (ml.Backend, error) {
|
|||||||
defer C.free(cbytes)
|
defer C.free(cbytes)
|
||||||
|
|
||||||
C.ggml_backend_tensor_set(C.ggml_get_tensor(c, cname), cbytes, 0, C.size_t(n))
|
C.ggml_backend_tensor_set(C.ggml_get_tensor(c, cname), cbytes, 0, C.size_t(n))
|
||||||
}()
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := g.Wait(); err != nil {
|
||||||
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return &Backend{c, b, bb, f.KV(), f.Tensors()}, nil
|
return &Backend{c, b, bb, f.KV(), f.Tensors()}, nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user