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
1861fbde
Unverified
Commit
1861fbde
authored
Apr 03, 2025
by
Michael Yang
Committed by
GitHub
Apr 03, 2025
Browse files
Merge pull request #9873 from ollama/mxyng/fs-config
fs: move ml.Config to fs package
parents
e53b3cbd
3b96a936
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
55 additions
and
40 deletions
+55
-40
fs/config.go
fs/config.go
+13
-0
kvcache/causal_test.go
kvcache/causal_test.go
+2
-1
ml/backend.go
ml/backend.go
+3
-13
ml/backend/ggml/ggml.go
ml/backend/ggml/ggml.go
+6
-5
model/model.go
model/model.go
+6
-5
model/model_test.go
model/model_test.go
+5
-4
model/models/gemma2/model.go
model/models/gemma2/model.go
+2
-1
model/models/gemma3/model.go
model/models/gemma3/model.go
+2
-1
model/models/gemma3/model_text.go
model/models/gemma3/model_text.go
+2
-1
model/models/gemma3/model_vision.go
model/models/gemma3/model_vision.go
+2
-1
model/models/gemma3/process_image.go
model/models/gemma3/process_image.go
+2
-2
model/models/llama/model.go
model/models/llama/model.go
+2
-1
model/models/mllama/model.go
model/models/mllama/model.go
+2
-1
model/models/mllama/model_text.go
model/models/mllama/model_text.go
+2
-1
model/models/mllama/model_vision.go
model/models/mllama/model_vision.go
+2
-1
model/models/mllama/process_image.go
model/models/mllama/process_image.go
+2
-2
No files found.
fs/config.go
0 → 100644
View file @
1861fbde
package
fs
type
Config
interface
{
Architecture
()
string
String
(
string
,
...
string
)
string
Uint
(
string
,
...
uint32
)
uint32
Float
(
string
,
...
float32
)
float32
Bool
(
string
,
...
bool
)
bool
Strings
(
string
,
...
[]
string
)
[]
string
Uints
(
string
,
...
[]
uint32
)
[]
uint32
Floats
(
string
,
...
[]
float32
)
[]
float32
}
kvcache/causal_test.go
View file @
1861fbde
...
...
@@ -5,6 +5,7 @@ import (
"slices"
"testing"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/model/input"
)
...
...
@@ -373,7 +374,7 @@ func TestCanResume(t *testing.T) {
type
testBackend
struct
{}
func
(
b
*
testBackend
)
Config
()
ml
.
Config
{
func
(
b
*
testBackend
)
Config
()
fs
.
Config
{
panic
(
"not implemented"
)
}
...
...
ml/backend.go
View file @
1861fbde
...
...
@@ -9,22 +9,12 @@ import (
"slices"
"strconv"
"strings"
)
type
Config
interface
{
Architecture
()
string
String
(
string
,
...
string
)
string
Uint
(
string
,
...
uint32
)
uint32
Float
(
string
,
...
float32
)
float32
Bool
(
string
,
...
bool
)
bool
Strings
(
string
,
...
[]
string
)
[]
string
Uints
(
string
,
...
[]
uint32
)
[]
uint32
Floats
(
string
,
...
[]
float32
)
[]
float32
}
"github.com/ollama/ollama/fs"
)
type
Backend
interface
{
Config
()
Config
Config
()
fs
.
Config
Get
(
name
string
)
Tensor
NewContext
()
Context
NewContextSize
(
size
int
)
Context
...
...
ml/backend/ggml/ggml.go
View file @
1861fbde
...
...
@@ -24,7 +24,8 @@ import (
"unsafe"
"github.com/ollama/ollama/format"
fs
"github.com/ollama/ollama/fs/ggml"
"github.com/ollama/ollama/fs"
fsggml
"github.com/ollama/ollama/fs/ggml"
"github.com/ollama/ollama/ml"
ggml
"github.com/ollama/ollama/ml/backend/ggml/ggml/src"
"golang.org/x/sync/errgroup"
...
...
@@ -41,7 +42,7 @@ func devices() []*C.struct_ggml_backend_device {
}
type
Backend
struct
{
meta
*
fs
.
GGML
meta
*
fs
ggml
.
GGML
sched
*
C
.
struct_ggml_backend_sched
tensors
map
[
string
]
*
C
.
struct_ggml_tensor
...
...
@@ -58,7 +59,7 @@ type Backend struct {
}
func
New
(
ctx
context
.
Context
,
r
*
os
.
File
,
params
ml
.
BackendParams
)
(
ml
.
Backend
,
error
)
{
meta
,
n
,
err
:=
fs
.
Decode
(
r
,
-
1
)
meta
,
n
,
err
:=
fs
ggml
.
Decode
(
r
,
-
1
)
if
err
!=
nil
{
return
nil
,
err
}
...
...
@@ -182,7 +183,7 @@ func New(ctx context.Context, r *os.File, params ml.BackendParams) (ml.Backend,
maxTensors
+=
blocks
*
2
type
tensor
struct
{
source
*
fs
.
Tensor
source
*
fs
ggml
.
Tensor
target
string
}
...
...
@@ -413,7 +414,7 @@ func init() {
ml
.
RegisterBackend
(
"ggml"
,
New
)
}
func
(
b
*
Backend
)
Config
()
ml
.
Config
{
func
(
b
*
Backend
)
Config
()
fs
.
Config
{
return
b
.
meta
.
KV
()
}
...
...
model/model.go
View file @
1861fbde
...
...
@@ -16,7 +16,8 @@ import (
_
"golang.org/x/image/tiff"
_
"golang.org/x/image/webp"
fs
"github.com/ollama/ollama/fs/ggml"
"github.com/ollama/ollama/fs"
fsggml
"github.com/ollama/ollama/fs/ggml"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
_
"github.com/ollama/ollama/ml/backend"
...
...
@@ -83,10 +84,10 @@ func (m *Base) Config() config {
return
m
.
config
}
var
models
=
make
(
map
[
string
]
func
(
ml
.
Config
)
(
Model
,
error
))
var
models
=
make
(
map
[
string
]
func
(
fs
.
Config
)
(
Model
,
error
))
// Register registers a model constructor for the given architecture
func
Register
(
name
string
,
f
func
(
ml
.
Config
)
(
Model
,
error
))
{
func
Register
(
name
string
,
f
func
(
fs
.
Config
)
(
Model
,
error
))
{
if
_
,
ok
:=
models
[
name
];
ok
{
panic
(
"model: model already registered"
)
}
...
...
@@ -131,14 +132,14 @@ func NewTextProcessor(s string) (TextProcessor, error) {
return
nil
,
err
}
defer
r
.
Close
()
meta
,
_
,
err
:=
fs
.
Decode
(
r
,
-
1
)
meta
,
_
,
err
:=
fs
ggml
.
Decode
(
r
,
-
1
)
if
err
!=
nil
{
return
nil
,
err
}
return
getTextProcessor
(
meta
.
KV
())
}
func
getTextProcessor
(
kv
fs
.
KV
)
(
TextProcessor
,
error
)
{
func
getTextProcessor
(
kv
fs
ggml
.
KV
)
(
TextProcessor
,
error
)
{
arch
:=
kv
.
Architecture
()
f
,
ok
:=
models
[
arch
]
if
!
ok
{
...
...
model/model_test.go
View file @
1861fbde
...
...
@@ -7,7 +7,8 @@ import (
"testing"
"github.com/google/go-cmp/cmp"
fs
"github.com/ollama/ollama/fs/ggml"
"github.com/ollama/ollama/fs"
fsggml
"github.com/ollama/ollama/fs/ggml"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/backend/ggml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -139,7 +140,7 @@ func TestPopulateFieldsAlternateName(t *testing.T) {
}
func
TestGetTextProcessor
(
t
*
testing
.
T
)
{
tp
,
err
:=
getTextProcessor
(
fs
.
KV
{})
tp
,
err
:=
getTextProcessor
(
fs
ggml
.
KV
{})
if
err
==
nil
{
t
.
Error
(
"expected error"
)
}
else
if
!
strings
.
Contains
(
err
.
Error
(),
"unsupported model architecture"
)
{
...
...
@@ -148,10 +149,10 @@ func TestGetTextProcessor(t *testing.T) {
t
.
Error
(
"expected nil tp"
)
}
models
[
"dummy"
]
=
func
(
ml
.
Config
)
(
Model
,
error
)
{
models
[
"dummy"
]
=
func
(
fs
.
Config
)
(
Model
,
error
)
{
return
notTextProcessorModel
{},
nil
}
tp
,
err
=
getTextProcessor
(
fs
.
KV
{
"general.architecture"
:
"dummy"
})
tp
,
err
=
getTextProcessor
(
fs
ggml
.
KV
{
"general.architecture"
:
"dummy"
})
if
err
==
nil
{
t
.
Error
(
"expected error"
)
}
else
if
!
strings
.
Contains
(
err
.
Error
(),
"not a TextProcessor"
)
{
...
...
model/models/gemma2/model.go
View file @
1861fbde
...
...
@@ -3,6 +3,7 @@ package gemma2
import
(
"math"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -35,7 +36,7 @@ const (
gemma27BLayerCount
=
46
)
func
New
(
c
ml
.
Config
)
(
model
.
Model
,
error
)
{
func
New
(
c
fs
.
Config
)
(
model
.
Model
,
error
)
{
m
:=
Model
{
SentencePieceModel
:
model
.
NewSentencePieceModel
(
&
model
.
Vocabulary
{
...
...
model/models/gemma3/model.go
View file @
1861fbde
...
...
@@ -6,6 +6,7 @@ import (
"math"
"slices"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -52,7 +53,7 @@ func (p *MultiModalProjector) Forward(ctx ml.Context, visionOutputs ml.Tensor, i
return
visionOutputs
}
func
New
(
c
ml
.
Config
)
(
model
.
Model
,
error
)
{
func
New
(
c
fs
.
Config
)
(
model
.
Model
,
error
)
{
m
:=
Model
{
SentencePieceModel
:
model
.
NewSentencePieceModel
(
&
model
.
Vocabulary
{
...
...
model/models/gemma3/model_text.go
View file @
1861fbde
...
...
@@ -3,6 +3,7 @@ package gemma3
import
(
"math"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -40,7 +41,7 @@ const (
cacheTypeCausal
)
func
newTextModel
(
c
ml
.
Config
)
*
TextModel
{
func
newTextModel
(
c
fs
.
Config
)
*
TextModel
{
numBlocks
:=
int
(
c
.
Uint
(
"block_count"
))
m
:=
TextModel
{
...
...
model/models/gemma3/model_vision.go
View file @
1861fbde
...
...
@@ -3,6 +3,7 @@ package gemma3
import
(
"math"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
)
...
...
@@ -111,7 +112,7 @@ func (m *VisionModel) Forward(ctx ml.Context, pixelValues ml.Tensor) ml.Tensor {
return
hiddenState
}
func
newVisionModel
(
c
ml
.
Config
)
*
VisionModel
{
func
newVisionModel
(
c
fs
.
Config
)
*
VisionModel
{
return
&
VisionModel
{
Layers
:
make
([]
VisionEncoderLayer
,
c
.
Uint
(
"vision.block_count"
)),
VisionModelOptions
:
&
VisionModelOptions
{
...
...
model/models/gemma3/process_image.go
View file @
1861fbde
...
...
@@ -3,7 +3,7 @@ package gemma3
import
(
"image"
"github.com/ollama/ollama/
ml
"
"github.com/ollama/ollama/
fs
"
"github.com/ollama/ollama/model/imageproc"
)
...
...
@@ -11,7 +11,7 @@ type ImageProcessor struct {
imageSize
,
patchSize
,
numChannels
int
}
func
newImageProcessor
(
c
ml
.
Config
)
ImageProcessor
{
func
newImageProcessor
(
c
fs
.
Config
)
ImageProcessor
{
return
ImageProcessor
{
imageSize
:
int
(
c
.
Uint
(
"vision.image_size"
)),
patchSize
:
int
(
c
.
Uint
(
"vision.patch_size"
)),
...
...
model/models/llama/model.go
View file @
1861fbde
...
...
@@ -5,6 +5,7 @@ import (
"math"
"strings"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -30,7 +31,7 @@ type Model struct {
*
Options
}
func
New
(
c
ml
.
Config
)
(
model
.
Model
,
error
)
{
func
New
(
c
fs
.
Config
)
(
model
.
Model
,
error
)
{
if
!
strings
.
EqualFold
(
c
.
String
(
"tokenizer.ggml.model"
),
"gpt2"
)
{
return
nil
,
fmt
.
Errorf
(
"tokenizer %s not yet supported"
,
c
.
String
(
"tokenizer.ggml.model"
))
}
...
...
model/models/mllama/model.go
View file @
1861fbde
...
...
@@ -8,6 +8,7 @@ import (
"image"
"slices"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -32,7 +33,7 @@ const (
selfAttentionLayer
)
func
New
(
c
ml
.
Config
)
(
model
.
Model
,
error
)
{
func
New
(
c
fs
.
Config
)
(
model
.
Model
,
error
)
{
// Verify unified config
if
c
.
Uint
(
"vision.block_count"
)
==
0
{
return
nil
,
fmt
.
Errorf
(
"non-unified vision model not supported"
)
...
...
model/models/mllama/model_text.go
View file @
1861fbde
...
...
@@ -4,6 +4,7 @@ import (
"math"
"slices"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/kvcache"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
...
...
@@ -220,7 +221,7 @@ func (m *TextModel) Forward(ctx ml.Context, inputIDs, positionIDs, outputs, mask
return
m
.
Output
.
Forward
(
ctx
,
hiddenState
)
}
func
newTextModel
(
c
ml
.
Config
)
*
TextModel
{
func
newTextModel
(
c
fs
.
Config
)
*
TextModel
{
var
decoderLayers
[]
TextDecoderLayer
for
i
:=
range
c
.
Uint
(
"block_count"
)
{
var
textDecoderLayer
TextDecoderLayer
...
...
model/models/mllama/model_vision.go
View file @
1861fbde
...
...
@@ -4,6 +4,7 @@ import (
"math"
"slices"
"github.com/ollama/ollama/fs"
"github.com/ollama/ollama/ml"
"github.com/ollama/ollama/ml/nn"
)
...
...
@@ -213,7 +214,7 @@ func (m *VisionModel) Forward(ctx ml.Context, pixelValues, positionIDs, aspectRa
return
hiddenState
.
Concat
(
ctx
,
hiddenStates
,
0
)
}
func
newVisionModel
(
c
ml
.
Config
)
*
VisionModel
{
func
newVisionModel
(
c
fs
.
Config
)
*
VisionModel
{
return
&
VisionModel
{
Transformer
:
&
VisionEncoder
{
Layers
:
make
([]
VisionEncoderLayer
,
c
.
Uint
(
"vision.block_count"
))},
GlobalTransformer
:
&
VisionEncoder
{
Layers
:
make
([]
VisionEncoderLayer
,
c
.
Uint
(
"vision.global.block_count"
))},
...
...
model/models/mllama/process_image.go
View file @
1861fbde
...
...
@@ -8,14 +8,14 @@ import (
"golang.org/x/image/draw"
"github.com/ollama/ollama/
ml
"
"github.com/ollama/ollama/
fs
"
)
type
ImageProcessor
struct
{
imageSize
,
numChannels
,
maxNumTiles
int
}
func
newImageProcessor
(
c
ml
.
Config
)
ImageProcessor
{
func
newImageProcessor
(
c
fs
.
Config
)
ImageProcessor
{
return
ImageProcessor
{
imageSize
:
int
(
c
.
Uint
(
"vision.image_size"
)),
numChannels
:
int
(
c
.
Uint
(
"vision.num_channels"
)),
...
...
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