Myric commited on
Commit
1e9638b
·
verified ·
1 Parent(s): 8ff4d84

Upload generate_config.sh with huggingface_hub

Browse files
Files changed (1) hide show
  1. generate_config.sh +217 -0
generate_config.sh ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Vendored from localai-org/apex-quant @ a445a12 (MIT, (c) Ettore Di Giacinto).
2
+ # https://github.com/localai-org/apex-quant — see NOTICE. Unmodified.
3
+ #!/usr/bin/env bash
4
+ #
5
+ # generate_config.sh — Generate APEX tensor-type configuration files
6
+ #
7
+ # Creates a tensor-type file for llama-quantize's --tensor-type-file flag.
8
+ # Supports any number of layers and all APEX profiles.
9
+ #
10
+ # Usage:
11
+ # ./scripts/generate_config.sh --profile balanced --layers 40 > config.txt
12
+ # ./scripts/generate_config.sh --profile mini --layers 40 -o configs/my_config.txt
13
+ # ./scripts/generate_config.sh --custom --edge-exp Q6_K --mid-exp Q4_K \
14
+ # --shared Q8_0 --attn Q6_K --layers 40 > config.txt
15
+ #
16
+ # Profiles:
17
+ # quality Q6_K/Q5_K/IQ4_XS experts, Q8_0 shared, Q6_K attn
18
+ # i-quality Same as quality (use with --imatrix at quantize time)
19
+ # balanced Q6_K/Q5_K experts, Q8_0 shared, Q6_K attn
20
+ # i-balanced Same as balanced (use with --imatrix at quantize time)
21
+ # compact Q4_K/Q3_K experts, Q6_K shared, Q4_K attn
22
+ # i-compact Same as compact (use with --imatrix at quantize time)
23
+ # mini Q3_K edge / IQ2_S mid experts, Q5_K/Q4_K shared, Q4_K/Q3_K attn
24
+ # nano Q3_K edge / IQ2_S near / IQ2_XXS mid experts (2.06 bpw mid) — needs imatrix
25
+ # micro Q3_K edge / IQ2_XS near / IQ1_M mid experts (1.75 bpw mid) — needs imatrix, experimental
26
+ # custom Specify each type manually via flags
27
+ #
28
+ set -euo pipefail
29
+
30
+ # Defaults
31
+ PROFILE=""
32
+ LAYERS=40
33
+ OUTPUT=""
34
+ DENSE_LAYERS=0 # leading dense (non-MoE) FFN layers, e.g. LFM2-MoE
35
+ # Custom mode overrides
36
+ EDGE_EXP="" NEAR_EXP="" MID_EXP=""
37
+ EDGE_SHARED="" MID_SHARED=""
38
+ EDGE_ATTN="" MID_ATTN=""
39
+
40
+ show_help() {
41
+ sed -n '3,25p' "$0"
42
+ exit 0
43
+ }
44
+
45
+ while [ $# -gt 0 ]; do
46
+ case "$1" in
47
+ --profile|-p) PROFILE="$2"; shift 2 ;;
48
+ --layers|-l) LAYERS="$2"; shift 2 ;;
49
+ --dense-layers) DENSE_LAYERS="$2"; shift 2 ;;
50
+ --output|-o) OUTPUT="$2"; shift 2 ;;
51
+ --custom) PROFILE="custom"; shift ;;
52
+ --edge-exp) EDGE_EXP="$2"; shift 2 ;;
53
+ --near-exp) NEAR_EXP="$2"; shift 2 ;;
54
+ --mid-exp) MID_EXP="$2"; shift 2 ;;
55
+ --edge-shared) EDGE_SHARED="$2"; shift 2 ;;
56
+ --mid-shared) MID_SHARED="$2"; shift 2 ;;
57
+ --edge-attn) EDGE_ATTN="$2"; shift 2 ;;
58
+ --mid-attn) MID_ATTN="$2"; shift 2 ;;
59
+ --help|-h) show_help ;;
60
+ *) echo "Unknown option: $1" >&2; exit 1 ;;
61
+ esac
62
+ done
63
+
64
+ [ -z "$PROFILE" ] && { echo "Error: --profile required" >&2; exit 1; }
65
+
66
+ # Edge boundaries (first/last N layers get higher precision)
67
+ EDGE_HI=4 # L0..EDGE_HI
68
+ EDGE_LO=$(( LAYERS - 5 )) # EDGE_LO..LAYERS-1
69
+ NEAR_HI=9 # EDGE_HI+1..NEAR_HI
70
+ NEAR_LO=$(( LAYERS - 10 )) # NEAR_LO..EDGE_LO-1
71
+
72
+ # Set types per profile
73
+ case "$PROFILE" in
74
+ quality|i-quality)
75
+ EDGE_EXP="${EDGE_EXP:-Q6_K}"
76
+ NEAR_EXP="${NEAR_EXP:-Q5_K}"
77
+ MID_EXP="${MID_EXP:-iq4_xs}"
78
+ EDGE_SHARED="${EDGE_SHARED:-Q8_0}"
79
+ MID_SHARED="${MID_SHARED:-Q8_0}"
80
+ EDGE_ATTN="${EDGE_ATTN:-Q6_K}"
81
+ MID_ATTN="${MID_ATTN:-Q6_K}"
82
+ ;;
83
+ balanced|i-balanced)
84
+ EDGE_EXP="${EDGE_EXP:-Q6_K}"
85
+ NEAR_EXP="${NEAR_EXP:-Q5_K}"
86
+ MID_EXP="${MID_EXP:-Q5_K}"
87
+ EDGE_SHARED="${EDGE_SHARED:-Q8_0}"
88
+ MID_SHARED="${MID_SHARED:-Q8_0}"
89
+ EDGE_ATTN="${EDGE_ATTN:-Q6_K}"
90
+ MID_ATTN="${MID_ATTN:-Q6_K}"
91
+ ;;
92
+ compact|i-compact)
93
+ EDGE_EXP="${EDGE_EXP:-Q4_K}"
94
+ NEAR_EXP="${NEAR_EXP:-Q3_K}"
95
+ MID_EXP="${MID_EXP:-Q3_K}"
96
+ EDGE_SHARED="${EDGE_SHARED:-Q6_K}"
97
+ MID_SHARED="${MID_SHARED:-Q6_K}"
98
+ EDGE_ATTN="${EDGE_ATTN:-Q4_K}"
99
+ MID_ATTN="${MID_ATTN:-Q4_K}"
100
+ ;;
101
+ mini)
102
+ EDGE_EXP="${EDGE_EXP:-Q3_K}"
103
+ NEAR_EXP="${NEAR_EXP:-Q3_K}"
104
+ MID_EXP="${MID_EXP:-iq2_s}"
105
+ EDGE_SHARED="${EDGE_SHARED:-Q5_K}"
106
+ MID_SHARED="${MID_SHARED:-Q4_K}"
107
+ EDGE_ATTN="${EDGE_ATTN:-Q4_K}"
108
+ MID_ATTN="${MID_ATTN:-Q3_K}"
109
+ ;;
110
+ nano|i-nano)
111
+ # APEX Nano — aggressive mid-layer routed experts at IQ2_XXS (2.06 bpw)
112
+ # Target: ~25-30% smaller than Mini at modest quality cost. Requires imatrix.
113
+ EDGE_EXP="${EDGE_EXP:-Q3_K}"
114
+ NEAR_EXP="${NEAR_EXP:-iq2_s}"
115
+ MID_EXP="${MID_EXP:-iq2_xxs}"
116
+ EDGE_SHARED="${EDGE_SHARED:-Q5_K}"
117
+ MID_SHARED="${MID_SHARED:-Q4_K}"
118
+ EDGE_ATTN="${EDGE_ATTN:-Q4_K}"
119
+ MID_ATTN="${MID_ATTN:-Q3_K}"
120
+ ;;
121
+ micro|i-micro)
122
+ # APEX Micro — extreme mid-layer routed experts at IQ1_M (1.75 bpw)
123
+ # Only viable on MoE: sparse expert activation + shared expert kept high-precision
124
+ # softens per-token error. Quality drop expected — experimental tier. Requires imatrix.
125
+ EDGE_EXP="${EDGE_EXP:-Q3_K}"
126
+ NEAR_EXP="${NEAR_EXP:-iq2_xs}"
127
+ MID_EXP="${MID_EXP:-iq1_m}"
128
+ EDGE_SHARED="${EDGE_SHARED:-Q5_K}"
129
+ MID_SHARED="${MID_SHARED:-Q4_K}"
130
+ EDGE_ATTN="${EDGE_ATTN:-Q4_K}"
131
+ MID_ATTN="${MID_ATTN:-Q3_K}"
132
+ ;;
133
+ custom)
134
+ [ -z "$EDGE_EXP" ] && { echo "Error: --custom requires --edge-exp" >&2; exit 1; }
135
+ [ -z "$MID_EXP" ] && MID_EXP="$EDGE_EXP"
136
+ [ -z "$NEAR_EXP" ] && NEAR_EXP="$EDGE_EXP"
137
+ [ -z "$EDGE_SHARED" ] && EDGE_SHARED="Q8_0"
138
+ [ -z "$MID_SHARED" ] && MID_SHARED="$EDGE_SHARED"
139
+ [ -z "$EDGE_ATTN" ] && EDGE_ATTN="Q6_K"
140
+ [ -z "$MID_ATTN" ] && MID_ATTN="$EDGE_ATTN"
141
+ ;;
142
+ *)
143
+ echo "Error: unknown profile '$PROFILE'" >&2
144
+ echo "Available: quality, i-quality, balanced, i-balanced, compact, i-compact, mini, nano, i-nano, micro, i-micro, custom" >&2
145
+ exit 1
146
+ ;;
147
+ esac
148
+
149
+ # Generate config
150
+ generate() {
151
+ for (( i=0; i<LAYERS; i++ )); do
152
+ # Expert type based on layer position
153
+ if (( i <= EDGE_HI || i >= EDGE_LO )); then
154
+ exp_type="$EDGE_EXP"
155
+ elif (( i <= NEAR_HI || i >= NEAR_LO )); then
156
+ exp_type="$NEAR_EXP"
157
+ else
158
+ exp_type="$MID_EXP"
159
+ fi
160
+
161
+ # Shared type based on layer position
162
+ if (( i <= EDGE_HI || i >= EDGE_LO )); then
163
+ shared_type="$EDGE_SHARED"
164
+ else
165
+ shared_type="$MID_SHARED"
166
+ fi
167
+
168
+ # Attention type based on layer position
169
+ if (( i <= 2 || i >= LAYERS - 3 )); then
170
+ attn_type="$EDGE_ATTN"
171
+ else
172
+ attn_type="$MID_ATTN"
173
+ fi
174
+
175
+ if (( i < DENSE_LAYERS )); then
176
+ # Leading dense (non-MoE) FFN layers — keep at shared (edge) precision.
177
+ # ".weight" suffix prevents the regex from also matching ffn_*_exps/ffn_gate_inp.
178
+ echo "blk.${i}.ffn_gate.weight=${shared_type}"
179
+ echo "blk.${i}.ffn_up.weight=${shared_type}"
180
+ echo "blk.${i}.ffn_down.weight=${shared_type}"
181
+ else
182
+ # Routed expert tensors (dominant cost in MoE)
183
+ echo "blk.${i}.ffn_gate_exps=${exp_type}"
184
+ echo "blk.${i}.ffn_up_exps=${exp_type}"
185
+ echo "blk.${i}.ffn_down_exps=${exp_type}"
186
+ fi
187
+
188
+ # Shared expert tensors (archs with shared experts, e.g. Qwen3-MoE)
189
+ echo "blk.${i}.ffn_gate_shexp=${shared_type}"
190
+ echo "blk.${i}.ffn_up_shexp=${shared_type}"
191
+ echo "blk.${i}.ffn_down_shexp=${shared_type}"
192
+
193
+ # Attention tensors (attention layers)
194
+ echo "blk.${i}.attn_q=${attn_type}"
195
+ echo "blk.${i}.attn_k=${attn_type}"
196
+ echo "blk.${i}.attn_v=${attn_type}"
197
+ echo "blk.${i}.attn_output=${attn_type}"
198
+ echo "blk.${i}.attn_gate=${attn_type}"
199
+ echo "blk.${i}.attn_qkv=${attn_type}"
200
+
201
+ # Short-convolution mixing tensors (LFM2 conv layers — attention-equivalent)
202
+ echo "blk.${i}.shortconv.in_proj=${attn_type}"
203
+ echo "blk.${i}.shortconv.out_proj=${attn_type}"
204
+
205
+ # SSM tensors (Mamba/hybrid archs)
206
+ echo "blk.${i}.ssm_alpha=${attn_type}"
207
+ echo "blk.${i}.ssm_beta=${attn_type}"
208
+ echo "blk.${i}.ssm_out=${attn_type}"
209
+ done
210
+ }
211
+
212
+ if [ -n "$OUTPUT" ]; then
213
+ generate > "$OUTPUT"
214
+ echo "Config written to: $OUTPUT ($(wc -l < "$OUTPUT") lines, $LAYERS layers)" >&2
215
+ else
216
+ generate
217
+ fi