config.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Package quant provides quantization configuration and functions
  2. package quant
  3. import (
  4. "path/filepath"
  5. "strings"
  6. "makarna/pkg/loader"
  7. )
  8. // QuantType represents a quantization type
  9. type QuantType string
  10. const (
  11. TypeF32 QuantType = "f32"
  12. TypeF16 QuantType = "f16"
  13. TypeQ2K QuantType = "q2_k"
  14. TypeQ3K QuantType = "q3_k"
  15. TypeQ4K QuantType = "q4_k"
  16. TypeQ5K QuantType = "q5_k"
  17. TypeQ6K QuantType = "q6_k"
  18. TypeQ8K QuantType = "q8_k"
  19. )
  20. // Rule defines a pattern-based quantization rule
  21. type Rule struct {
  22. Pattern string
  23. QuantType QuantType
  24. }
  25. // ApplyRules determines the quant type for a tensor based on an ordered rule list.
  26. // First match wins; if no match, returns baseQuant.
  27. func ApplyRules(tensorName string, baseQuant QuantType, rules []Rule) QuantType {
  28. for _, rule := range rules {
  29. if matchPattern(tensorName, rule.Pattern) {
  30. return rule.QuantType
  31. }
  32. }
  33. return baseQuant
  34. }
  35. // ToDType converts QuantType to loader.DType
  36. func (q QuantType) ToDType() loader.DType {
  37. switch q {
  38. case TypeF32:
  39. return loader.F32
  40. case TypeF16:
  41. return loader.F16
  42. case TypeQ2K:
  43. return loader.Q2_K
  44. case TypeQ3K:
  45. return loader.Q3_K
  46. case TypeQ4K:
  47. return loader.Q4_K
  48. case TypeQ5K:
  49. return loader.Q5_K
  50. case TypeQ6K:
  51. return loader.Q6_K
  52. case TypeQ8K:
  53. return loader.Q8_K
  54. default:
  55. return loader.F32
  56. }
  57. }
  58. // matchPattern matches a tensor name against a glob-like pattern
  59. func matchPattern(name, pattern string) bool {
  60. pattern = strings.ToLower(pattern)
  61. name = strings.ToLower(name)
  62. // Handle *something* pattern (contains)
  63. if strings.HasPrefix(pattern, "*") && strings.HasSuffix(pattern, "*") {
  64. inner := pattern[1 : len(pattern)-1]
  65. return strings.Contains(name, inner)
  66. }
  67. // Try filepath.Match
  68. if matched, _ := filepath.Match(pattern, name); matched {
  69. return true
  70. }
  71. // Fallback: check if pattern (without wildcards) is contained
  72. cleanPattern := strings.ReplaceAll(pattern, "*", "")
  73. if cleanPattern != "" && strings.Contains(name, cleanPattern) {
  74. return true
  75. }
  76. return false
  77. }