|
@@ -54,53 +54,42 @@ func (s weighted) Sample(logits []float32) (int32, error) {
|
|
if idx, ok := w.Take(); ok {
|
|
if idx, ok := w.Take(); ok {
|
|
return int32(indices[idx]), nil
|
|
return int32(indices[idx]), nil
|
|
}
|
|
}
|
|
- return -1, errors.New("weighed sampler failed, no valid token found")
|
|
|
|
|
|
+ return -1, errors.New("weighted sampler failed, no valid token found")
|
|
}
|
|
}
|
|
|
|
|
|
-type greedy struct {
|
|
|
|
- transforms []Transform
|
|
|
|
-}
|
|
|
|
|
|
+type greedy struct{}
|
|
|
|
|
|
-func Greedy(transforms ...Transform) Sampler {
|
|
|
|
- return greedy{transforms: transforms}
|
|
|
|
|
|
+func Greedy() Sampler {
|
|
|
|
+ return greedy{}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// Sample returns the index of the maximum value in logits.
|
|
func (s greedy) Sample(logits []float32) (int32, error) {
|
|
func (s greedy) Sample(logits []float32) (int32, error) {
|
|
- logits64 := make([]float64, len(logits))
|
|
|
|
- for i, v := range logits {
|
|
|
|
- logits64[i] = float64(v)
|
|
|
|
|
|
+ if len(logits) == 0 {
|
|
|
|
+ return -1, errors.New("no logits provided for greedy sampling")
|
|
}
|
|
}
|
|
|
|
|
|
- for _, t := range s.transforms {
|
|
|
|
- logits64 = t.Apply(logits64)
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- var maxIdx int
|
|
|
|
- var maxLogit float64
|
|
|
|
- for i, logit := range logits64 {
|
|
|
|
- if logit > maxLogit {
|
|
|
|
- maxLogit = logit
|
|
|
|
|
|
+ maxIdx := 0
|
|
|
|
+ for i := range logits {
|
|
|
|
+ if logits[i] > logits[maxIdx] {
|
|
maxIdx = i
|
|
maxIdx = i
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if maxLogit == math.Inf(-1) {
|
|
|
|
- return -1, errors.New("no valid logits found for greedy sampling")
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return int32(maxIdx), nil
|
|
return int32(maxIdx), nil
|
|
}
|
|
}
|
|
|
|
|
|
// TODO(parthsareen): update sampler interface to use json unmarshal https://github.com/ollama/ollama/issues/9278
|
|
// TODO(parthsareen): update sampler interface to use json unmarshal https://github.com/ollama/ollama/issues/9278
|
|
func NewSampler(temperature float32, topK int, topP float32, minP float32, seed int) (Sampler, error) {
|
|
func NewSampler(temperature float32, topK int, topP float32, minP float32, seed int) (Sampler, error) {
|
|
- transforms := []Transform{}
|
|
|
|
|
|
+ if temperature == 0 {
|
|
|
|
+ return Greedy(), nil
|
|
|
|
+ }
|
|
|
|
+
|
|
if temperature < 0 || temperature > 2 {
|
|
if temperature < 0 || temperature > 2 {
|
|
return nil, errors.New("temperature must be between 0 and 2")
|
|
return nil, errors.New("temperature must be between 0 and 2")
|
|
}
|
|
}
|
|
|
|
|
|
- if temperature != 0 {
|
|
|
|
- transforms = append(transforms, Temperature(temperature))
|
|
|
|
- }
|
|
|
|
|
|
+ transforms := []Transform{Temperature(temperature)}
|
|
|
|
|
|
if topK != 0 {
|
|
if topK != 0 {
|
|
if topK <= 0 {
|
|
if topK <= 0 {
|
|
@@ -123,15 +112,7 @@ func NewSampler(temperature float32, topK int, topP float32, minP float32, seed
|
|
transforms = append(transforms, MinP(minP))
|
|
transforms = append(transforms, MinP(minP))
|
|
}
|
|
}
|
|
|
|
|
|
- if len(transforms) == 0 {
|
|
|
|
- return nil, errors.New("at least one transform is required")
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if temperature == 0 {
|
|
|
|
- return Greedy(transforms...), nil
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- if seed != 0 {
|
|
|
|
|
|
+ if seed >= 0 {
|
|
seed64 := uint64(seed)
|
|
seed64 := uint64(seed)
|
|
return Weighted(&seed64, transforms...), nil
|
|
return Weighted(&seed64, transforms...), nil
|
|
}
|
|
}
|