1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- package gemma3
- import (
- "fmt"
- "github.com/ollama/ollama/kvcache"
- "github.com/ollama/ollama/ml"
- "github.com/ollama/ollama/model"
- "github.com/ollama/ollama/model/input"
- )
- type Model struct {
- model.Base
- model.SentencePieceModel
- //*VisionModel `gguf:"v,vision"`
- *TextModel
- //Projector *nn.Linear `gguf:"mm.0"`
- ImageProcessor
- }
- func New(c ml.Config) (model.Model, error) {
- // Verify unified config
- if c.Uint("vision.block_count") == 0 {
- return nil, fmt.Errorf("non-unified vision model not supported")
- }
- m := Model{
- SentencePieceModel: model.NewSentencePieceModel(
- c.String("tokenizer.ggml.pretokenizer", `(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+`),
- &model.Vocabulary{
- Values: c.Strings("tokenizer.ggml.tokens"),
- Scores: c.Floats("tokenizer.ggml.scores"),
- Types: c.Uints("tokenizer.ggml.token_type"),
- BOS: int32(c.Uint("tokenizer.ggml.bos_token_id")),
- AddBOS: c.Bool("tokenizer.ggml.add_bos_token", true),
- EOS: int32(c.Uint("tokenizer.ggml.eos_token_id")),
- AddEOS: c.Bool("tokenizer.ggml.add_eos_token", false),
- },
- ),
- ImageProcessor: newImageProcessor(c),
- //VisionModel: newVisionModel(c),
- TextModel: newTextModel(c),
- }
- slidingWindowLen := int32(c.Uint("text.attention.sliding_window"))
- m.Cache = kvcache.NewWrapperCache(kvcache.NewSWACache(slidingWindowLen, m.Shift), kvcache.NewCausalCache(m.Shift))
- return &m, nil
- }
- func (m *Model) Forward(ctx ml.Context, opts input.Options) (ml.Tensor, error) {
- inputs, err := ctx.Input().FromIntSlice(opts.Inputs, len(opts.Inputs))
- if err != nil {
- return nil, err
- }
- positions, err := ctx.Input().FromIntSlice(opts.Positions, len(opts.Positions))
- if err != nil {
- return nil, err
- }
- outputs, err := ctx.Output().FromIntSlice(opts.Outputs, len(opts.Outputs))
- if err != nil {
- return nil, err
- }
- return m.TextModel.Forward(ctx, inputs, positions, outputs, m.Cache), nil
- }
- func init() {
- model.Register("gemma3", New)
- }
|