Compare commits

...

5 Commits

Author SHA1 Message Date
Roy Han
e210f8763f merge conflicts 2024-07-12 15:09:05 -07:00
royjhan
3971c2333f
Merge branch 'main' into royh-precision 2024-07-12 15:07:36 -07:00
Roy Han
c71698426c Separate Rounding Functions 2024-06-24 11:09:08 -07:00
Roy Han
f93cdfdfae Standardize with ollama.com 2024-06-24 10:53:15 -07:00
Roy Han
af370ac178 Parameter Precision 2024-06-20 10:38:31 -07:00
4 changed files with 64 additions and 6 deletions

View File

@ -657,7 +657,7 @@ func showInfo(resp *api.ShowResponse) {
modelData := [][]string{
{"arch", arch},
{"parameters", resp.Details.ParameterSize},
{"parameters", format.Parameters(uint64(resp.ModelInfo["general.parameter_count"].(float64)))},
{"quantization", resp.Details.QuantizationLevel},
{"context length", fmt.Sprintf("%v", resp.ModelInfo[fmt.Sprintf("%s.context_length", arch)].(float64))},
{"embedding length", fmt.Sprintf("%v", resp.ModelInfo[fmt.Sprintf("%s.embedding_length", arch)].(float64))},
@ -671,7 +671,7 @@ func showInfo(resp *api.ShowResponse) {
if resp.ProjectorInfo != nil {
projectorData := [][]string{
{"arch", "clip"},
{"parameters", format.HumanNumber(uint64(resp.ProjectorInfo["general.parameter_count"].(float64)))},
{"parameters", format.Parameters(uint64(resp.ProjectorInfo["general.parameter_count"].(float64)))},
}
if projectorType, ok := resp.ProjectorInfo["clip.projector_type"]; ok {

View File

@ -9,9 +9,10 @@ const (
Thousand = 1000
Million = Thousand * 1000
Billion = Million * 1000
Trillion = Billion * 1000
)
func HumanNumber(b uint64) string {
func RoundedParameter(b uint64) string {
switch {
case b >= Billion:
number := float64(b) / Billion
@ -31,3 +32,33 @@ func HumanNumber(b uint64) string {
return fmt.Sprintf("%d", b)
}
}
func Parameters(b uint64) string {
switch {
case b >= Trillion:
number := float64(b) / Trillion
return fmt.Sprintf("%sT", decimalPlace(number))
case b >= Billion:
number := float64(b) / Billion
return fmt.Sprintf("%sB", decimalPlace(number))
case b >= Million:
number := float64(b) / Million
return fmt.Sprintf("%sM", decimalPlace(number))
case b >= Thousand:
number := float64(b) / Thousand
return fmt.Sprintf("%sK", decimalPlace(number))
default:
return fmt.Sprintf("%d", b)
}
}
func decimalPlace(number float64) string {
switch {
case number >= 100:
return fmt.Sprintf("%.0f", number)
case number >= 10:
return fmt.Sprintf("%.1f", number)
default:
return fmt.Sprintf("%.2f", number)
}
}

View File

@ -4,7 +4,7 @@ import (
"testing"
)
func TestHumanNumber(t *testing.T) {
func TestRoundedParameter(t *testing.T) {
type testCase struct {
input uint64
expected string
@ -24,7 +24,34 @@ func TestHumanNumber(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.expected, func(t *testing.T) {
result := HumanNumber(tc.input)
result := RoundedParameter(tc.input)
if result != tc.expected {
t.Errorf("Expected %s, got %s", tc.expected, result)
}
})
}
}
func TestParameters(t *testing.T) {
type testCase struct {
input uint64
expected string
}
testCases := []testCase{
{26000000, "26.0M"},
{26000000000, "26.0B"},
{1000, "1.00K"},
{1000000, "1.00M"},
{1000000000, "1.00B"},
{1000000000000, "1.00T"},
{100, "100"},
{206000000, "206M"},
}
for _, tc := range testCases {
t.Run(tc.expected, func(t *testing.T) {
result := Parameters(tc.input)
if result != tc.expected {
t.Errorf("Expected %s, got %s", tc.expected, result)
}

View File

@ -466,7 +466,7 @@ func CreateModel(ctx context.Context, name model.Name, modelFileDir, quantizatio
if baseLayer.GGML != nil {
config.ModelFormat = cmp.Or(config.ModelFormat, baseLayer.GGML.Name())
config.ModelFamily = cmp.Or(config.ModelFamily, baseLayer.GGML.KV().Architecture())
config.ModelType = cmp.Or(config.ModelType, format.HumanNumber(baseLayer.GGML.KV().ParameterCount()))
config.ModelType = cmp.Or(config.ModelType, format.RoundedParameter(baseLayer.GGML.KV().ParameterCount()))
config.FileType = cmp.Or(config.FileType, baseLayer.GGML.KV().FileType().String())
config.ModelFamilies = append(config.ModelFamilies, baseLayer.GGML.KV().Architecture())
}