mirror of
https://github.com/ollama/ollama.git
synced 2025-05-11 10:26:53 +02:00
feat: add new Ollama engine using ggml through cgo This change introduces a new way to run pretrained models. It introduces 3 high level interfaces and a bunch of smaller helper interfaces to facilitate this. - `model.Model` defines the interface for a model architecture. Models such as `llama` and `mllama`, which are provided as examples, can implement the model's forward propagation in the `Forward` method. This method will be called to generate completions. This interface can be found in `model/model.go` - `ml.Backend` defines the interface for a backend tensor library, in this case `ggml`. Among other things, a Backend is responsible for loading a pretrained model into hardware (GPU, CPU, etc) and providing an interface for Models to access loaded tensors. This interface can be found in `ml/backend.go` - `ml.Tensor` defines the interface for a tensor and tensor operations This is the first implementation of the new engine. Follow up PRs will implement more features: - non-greedy sampling (#8410) - integration with Ollama and KV caching (#8301) - more model support (#9080) with more coming soon Co-authored-by: Bruce MacDonald <brucewmacdonald@gmail.com>
64 lines
1.1 KiB
Go
64 lines
1.1 KiB
Go
package bufioutil
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestBufferedSeeker(t *testing.T) {
|
|
const alphabet = "abcdefghijklmnopqrstuvwxyz"
|
|
|
|
bs := NewBufferedSeeker(strings.NewReader(alphabet), 0) // minReadBufferSize = 16
|
|
|
|
checkRead := func(buf []byte, expected string) {
|
|
t.Helper()
|
|
_, err := bs.Read(buf)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !bytes.Equal(buf, []byte(expected)) {
|
|
t.Fatalf("expected %s, got %s", expected, buf)
|
|
}
|
|
}
|
|
|
|
// Read the first 5 bytes
|
|
buf := make([]byte, 5)
|
|
|
|
checkRead(buf, "abcde")
|
|
|
|
// Seek back to the beginning
|
|
_, err := bs.Seek(0, io.SeekStart)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
// read 'a'
|
|
checkRead(buf[:1], "a")
|
|
|
|
if bs.br.Buffered() == 0 {
|
|
t.Fatalf("totally unexpected sanity check failed")
|
|
}
|
|
|
|
// Seek past 'b'
|
|
_, err = bs.Seek(1, io.SeekCurrent)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
checkRead(buf, "cdefg")
|
|
|
|
// Seek back to the beginning
|
|
_, err = bs.Seek(0, io.SeekStart)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
checkRead(buf, "abcde")
|
|
|
|
// Seek to the end
|
|
_, err = bs.Seek(-5, io.SeekEnd)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
checkRead(buf, "vwxyz")
|
|
}
|