td-builder commited on
Commit
88ade47
·
verified ·
1 Parent(s): bfc6b74

Upload 148 files

Browse files
Files changed (1) hide show
  1. hugging/td_fuse/merge_klear.py +36 -14
hugging/td_fuse/merge_klear.py CHANGED
@@ -128,14 +128,18 @@ def direct_merge(target_model, source_state, alpha=0.3):
128
  """
129
  target_state = target_model.state_dict()
130
 
131
- # Check vocab sizes
132
  target_vocab = None
133
  source_vocab = None
134
- for key in ["model.embed_tokens.weight", "embed_tokens.weight"]:
135
- if key in target_state:
136
  target_vocab = target_state[key].shape[0]
137
- if key in source_state:
 
 
138
  source_vocab = source_state[key].shape[0]
 
 
139
  skip_embeddings = (target_vocab != source_vocab) if (target_vocab and source_vocab) else False
140
  if skip_embeddings:
141
  print(f"[merge6] Vocab mismatch ({target_vocab} vs {source_vocab}) — skipping embeddings")
@@ -146,6 +150,13 @@ def direct_merge(target_model, source_state, alpha=0.3):
146
  skipped = 0
147
  total = len(target_state)
148
 
 
 
 
 
 
 
 
149
  # Save original think token embeddings for restoration
150
  think_embeds = {}
151
  for key in target_state:
@@ -163,16 +174,27 @@ def direct_merge(target_model, source_state, alpha=0.3):
163
  skipped += 1
164
  continue
165
 
166
- # Find source key — same name for same architecture
167
- if target_key not in source_state:
168
- # Try without "model." prefix or with it
169
- alt_key = target_key.replace("model.", "", 1) if target_key.startswith("model.") else f"model.{target_key}"
170
- if alt_key not in source_state:
171
- skipped += 1
172
- continue
173
- source_key = alt_key
174
- else:
175
- source_key = target_key
 
 
 
 
 
 
 
 
 
 
 
176
 
177
  target_w = target_state[target_key]
178
  source_w = source_state[source_key]
 
128
  """
129
  target_state = target_model.state_dict()
130
 
131
+ # Check vocab sizes — try multiple key patterns
132
  target_vocab = None
133
  source_vocab = None
134
+ for key in target_state:
135
+ if "embed_tokens" in key:
136
  target_vocab = target_state[key].shape[0]
137
+ break
138
+ for key in source_state:
139
+ if "embed_tokens" in key:
140
  source_vocab = source_state[key].shape[0]
141
+ break
142
+ print(f"[merge6] Target vocab: {target_vocab}, Source vocab: {source_vocab}")
143
  skip_embeddings = (target_vocab != source_vocab) if (target_vocab and source_vocab) else False
144
  if skip_embeddings:
145
  print(f"[merge6] Vocab mismatch ({target_vocab} vs {source_vocab}) — skipping embeddings")
 
150
  skipped = 0
151
  total = len(target_state)
152
 
153
+ # Debug: show first 5 keys from each to verify naming
154
+ target_keys = list(target_state.keys())
155
+ source_keys = list(source_state.keys())
156
+ print(f"[merge6] Target has {len(target_keys)} params, Source has {len(source_keys)} params")
157
+ print(f"[merge6] Target first 5 keys: {target_keys[:5]}")
158
+ print(f"[merge6] Source first 5 keys: {source_keys[:5]}")
159
+
160
  # Save original think token embeddings for restoration
161
  think_embeds = {}
162
  for key in target_state:
 
174
  skipped += 1
175
  continue
176
 
177
+ # Find source key — handle Qwen3-VL prefix differences
178
+ # Qwen3-VL keys: model.language_model.layers.0... or model.model.layers.0...
179
+ # Klear keys: model.layers.0...
180
+ source_key = None
181
+ candidates = [
182
+ target_key, # exact match
183
+ target_key.replace("language_model.", ""), # strip language_model.
184
+ target_key.replace("model.model.", "model."), # model.model.X -> model.X
185
+ target_key.replace("model.", "", 1), # strip first model.
186
+ f"model.{target_key}", # add model. prefix
187
+ ]
188
+ for candidate in candidates:
189
+ if candidate in source_state:
190
+ source_key = candidate
191
+ break
192
+
193
+ if source_key is None:
194
+ skipped += 1
195
+ if skipped <= 10:
196
+ print(f" [skip] No source match: {target_key}")
197
+ continue
198
 
199
  target_w = target_state[target_key]
200
  source_w = source_state[source_key]