Feature Extraction
Transformers
Safetensors
hubert
hr16 commited on
Commit
1e8c52f
·
verified ·
1 Parent(s): 1cd6512

Update README.md

Browse files
Files changed (1) hide show
  1. README.md +329 -0
README.md CHANGED
@@ -8,6 +8,7 @@ base_model:
8
  ---
9
 
10
  Multilingual speaker-invariant speech content encoder based on [SPIN method](https://arxiv.org/abs/2305.11072) taken from [FreeSVC](https://huggingface.co/alefiury/free-svc), converted to transformers library format.
 
11
  ```py
12
  from transformers import AutoProcessor, HubertModel
13
  processor = AutoProcessor.from_pretrained("hr16/multilingual_spin")
@@ -19,4 +20,332 @@ with torch.no_grad():
19
  outputs = model(**inputs)
20
 
21
  print(outputs.last_hidden_state.shape)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  ```
 
8
  ---
9
 
10
  Multilingual speaker-invariant speech content encoder based on [SPIN method](https://arxiv.org/abs/2305.11072) taken from [FreeSVC](https://huggingface.co/alefiury/free-svc), converted to transformers library format.
11
+ Usage:
12
  ```py
13
  from transformers import AutoProcessor, HubertModel
14
  processor = AutoProcessor.from_pretrained("hr16/multilingual_spin")
 
20
  outputs = model(**inputs)
21
 
22
  print(outputs.last_hidden_state.shape)
23
+ ```
24
+
25
+ Conversion code:
26
+ ```py
27
+ import re
28
+ import torch
29
+ def convert_hubert_s3prl_to_transformers(model, checkpoint_path: str):
30
+ # 1. Load checkpoint
31
+ state_dict = torch.load(checkpoint_path, map_location="cpu", weights_only=False)
32
+ if "model" in state_dict:
33
+ state_dict = state_dict["model"]
34
+ elif "state_dict" in state_dict:
35
+ state_dict = state_dict["state_dict"]
36
+
37
+ hf_state_dict = {}
38
+
39
+ # 2. Map weights
40
+ for key, value in state_dict.items():
41
+ # Skip unused pretraining components
42
+ if (
43
+ key.startswith("pred_head")
44
+ or key.startswith("loss_module")
45
+ or "label_embs_concat" in key
46
+ ):
47
+ continue
48
+
49
+ # Mask embedding
50
+ if key == "encoder.model.mask_emb":
51
+ hf_state_dict["masked_spec_embed"] = value
52
+ continue
53
+
54
+ # Feature extractor group norm / conv layers
55
+ if "feature_extractor.conv_layers" in key:
56
+ # e.g.: encoder.model.feature_extractor.conv_layers.0.0.weight -> feature_extractor.conv_layers.0.conv.weight
57
+ # e.g.: encoder.model.feature_extractor.conv_layers.0.2.weight -> feature_extractor.conv_layers.0.layer_norm.weight
58
+ match = re.search(r"conv_layers\.(\d+)\.(\d+)\.(weight|bias)", key)
59
+ if match:
60
+ layer_idx, sub_idx, param_name = match.groups()
61
+ if sub_idx == "0":
62
+ hf_key = f"feature_extractor.conv_layers.{layer_idx}.conv.{param_name}"
63
+ elif sub_idx == "2":
64
+ hf_key = f"feature_extractor.conv_layers.{layer_idx}.layer_norm.{param_name}"
65
+ hf_state_dict[hf_key] = value
66
+ continue
67
+
68
+ # Feature projection layer norm
69
+ if key in ("encoder.model.layer_norm.weight", "encoder.model.layer_norm.bias"):
70
+ param_name = key.split(".")[-1]
71
+ hf_state_dict[f"feature_projection.layer_norm.{param_name}"] = value
72
+ continue
73
+
74
+ # Feature projection linear layer
75
+ if "post_extract_proj" in key:
76
+ param_name = key.split(".")[-1]
77
+ hf_state_dict[f"feature_projection.projection.{param_name}"] = value
78
+ continue
79
+
80
+ # Positional Convolution Embedding
81
+ if "pos_conv.0" in key:
82
+ param_name = key.split(".")[-1]
83
+ # Handles weight_v, weight_g, bias
84
+ hf_state_dict[f"encoder.pos_conv_embed.conv.{param_name}"] = value
85
+ continue
86
+
87
+ # Encoder pre-LayerNorm
88
+ if key in (
89
+ "encoder.model.encoder.layer_norm.weight",
90
+ "encoder.model.encoder.layer_norm.bias",
91
+ ):
92
+ param_name = key.split(".")[-1]
93
+ hf_state_dict[f"encoder.layer_norm.{param_name}"] = value
94
+ continue
95
+
96
+ # Encoder Transformer Layers
97
+ if "encoder.model.encoder.layers." in key:
98
+ # Map layer components
99
+ m = re.match(
100
+ r"encoder\.model\.encoder\.layers\.(\d+)\.(.+)", key
101
+ )
102
+ if m:
103
+ layer_idx, rest = m.groups()
104
+ prefix = f"encoder.layers.{layer_idx}"
105
+
106
+ if "self_attn." in rest:
107
+ # self_attn.{q,k,v,out}_proj.{weight,bias}
108
+ attn_component = rest.replace("self_attn.", "attention.")
109
+ hf_state_dict[f"{prefix}.{attn_component}"] = value
110
+ elif "self_attn_layer_norm." in rest:
111
+ param_name = rest.split(".")[-1]
112
+ hf_state_dict[f"{prefix}.layer_norm.{param_name}"] = value
113
+ elif "fc1." in rest:
114
+ param_name = rest.split(".")[-1]
115
+ hf_state_dict[
116
+ f"{prefix}.feed_forward.intermediate_dense.{param_name}"
117
+ ] = value
118
+ elif "fc2." in rest:
119
+ param_name = rest.split(".")[-1]
120
+ hf_state_dict[
121
+ f"{prefix}.feed_forward.output_dense.{param_name}"
122
+ ] = value
123
+ elif "final_layer_norm." in rest:
124
+ param_name = rest.split(".")[-1]
125
+ hf_state_dict[f"{prefix}.final_layer_norm.{param_name}"] = value
126
+ continue
127
+
128
+ print(f"Unmapped key: {key}")
129
+ model.load_state_dict(hf_state_dict)
130
+ return model
131
+
132
+ from transformers import HubertModel
133
+ orig_hubert = HubertModel.from_pretrained("facebook/hubert-base-ls960")
134
+ spin = convert_hubert_s3prl_to_transformers(HubertModel.from_pretrained("facebook/hubert-base-ls960"), "spin.ckpt")
135
+ spin.push_to_hub("hr16/multilingual_spin")
136
+ ```
137
+
138
+ State dict mean-square differences:
139
+ ```
140
+ masked_spec_embed diff: 0.0
141
+ feature_extractor.conv_layers.0.conv.weight diff: 0.0
142
+ feature_extractor.conv_layers.0.layer_norm.weight diff: 0.0
143
+ feature_extractor.conv_layers.0.layer_norm.bias diff: 0.0
144
+ feature_extractor.conv_layers.1.conv.weight diff: 0.0
145
+ feature_extractor.conv_layers.2.conv.weight diff: 0.0
146
+ feature_extractor.conv_layers.3.conv.weight diff: 0.0
147
+ feature_extractor.conv_layers.4.conv.weight diff: 0.0
148
+ feature_extractor.conv_layers.5.conv.weight diff: 0.0
149
+ feature_extractor.conv_layers.6.conv.weight diff: 0.0
150
+ feature_projection.layer_norm.weight diff: 0.0
151
+ feature_projection.layer_norm.bias diff: 0.0
152
+ feature_projection.projection.weight diff: 0.0
153
+ feature_projection.projection.bias diff: 0.0
154
+ encoder.pos_conv_embed.conv.bias diff: 0.0
155
+ encoder.pos_conv_embed.conv.parametrizations.weight.original0 diff: 0.0
156
+ encoder.pos_conv_embed.conv.parametrizations.weight.original1 diff: 0.0
157
+ encoder.layer_norm.weight diff: 0.0
158
+ encoder.layer_norm.bias diff: 0.0
159
+ encoder.layers.0.attention.k_proj.weight diff: 0.0
160
+ encoder.layers.0.attention.k_proj.bias diff: 0.0
161
+ encoder.layers.0.attention.v_proj.weight diff: 0.0
162
+ encoder.layers.0.attention.v_proj.bias diff: 0.0
163
+ encoder.layers.0.attention.q_proj.weight diff: 0.0
164
+ encoder.layers.0.attention.q_proj.bias diff: 0.0
165
+ encoder.layers.0.attention.out_proj.weight diff: 0.0
166
+ encoder.layers.0.attention.out_proj.bias diff: 0.0
167
+ encoder.layers.0.layer_norm.weight diff: 0.0
168
+ encoder.layers.0.layer_norm.bias diff: 0.0
169
+ encoder.layers.0.feed_forward.intermediate_dense.weight diff: 0.0
170
+ encoder.layers.0.feed_forward.intermediate_dense.bias diff: 0.0
171
+ encoder.layers.0.feed_forward.output_dense.weight diff: 0.0
172
+ encoder.layers.0.feed_forward.output_dense.bias diff: 0.0
173
+ encoder.layers.0.final_layer_norm.weight diff: 0.0
174
+ encoder.layers.0.final_layer_norm.bias diff: 0.0
175
+ encoder.layers.1.attention.k_proj.weight diff: 0.0
176
+ encoder.layers.1.attention.k_proj.bias diff: 0.0
177
+ encoder.layers.1.attention.v_proj.weight diff: 0.0
178
+ encoder.layers.1.attention.v_proj.bias diff: 0.0
179
+ encoder.layers.1.attention.q_proj.weight diff: 0.0
180
+ encoder.layers.1.attention.q_proj.bias diff: 0.0
181
+ encoder.layers.1.attention.out_proj.weight diff: 0.0
182
+ encoder.layers.1.attention.out_proj.bias diff: 0.0
183
+ encoder.layers.1.layer_norm.weight diff: 0.0
184
+ encoder.layers.1.layer_norm.bias diff: 0.0
185
+ encoder.layers.1.feed_forward.intermediate_dense.weight diff: 0.0
186
+ encoder.layers.1.feed_forward.intermediate_dense.bias diff: 0.0
187
+ encoder.layers.1.feed_forward.output_dense.weight diff: 0.0
188
+ encoder.layers.1.feed_forward.output_dense.bias diff: 0.0
189
+ encoder.layers.1.final_layer_norm.weight diff: 0.0
190
+ encoder.layers.1.final_layer_norm.bias diff: 0.0
191
+ encoder.layers.2.attention.k_proj.weight diff: 0.0
192
+ encoder.layers.2.attention.k_proj.bias diff: 0.0
193
+ encoder.layers.2.attention.v_proj.weight diff: 0.0
194
+ encoder.layers.2.attention.v_proj.bias diff: 0.0
195
+ encoder.layers.2.attention.q_proj.weight diff: 0.0
196
+ encoder.layers.2.attention.q_proj.bias diff: 0.0
197
+ encoder.layers.2.attention.out_proj.weight diff: 0.0
198
+ encoder.layers.2.attention.out_proj.bias diff: 0.0
199
+ encoder.layers.2.layer_norm.weight diff: 0.0
200
+ encoder.layers.2.layer_norm.bias diff: 0.0
201
+ encoder.layers.2.feed_forward.intermediate_dense.weight diff: 0.0
202
+ encoder.layers.2.feed_forward.intermediate_dense.bias diff: 0.0
203
+ encoder.layers.2.feed_forward.output_dense.weight diff: 0.0
204
+ encoder.layers.2.feed_forward.output_dense.bias diff: 0.0
205
+ encoder.layers.2.final_layer_norm.weight diff: 0.0
206
+ encoder.layers.2.final_layer_norm.bias diff: 0.0
207
+ encoder.layers.3.attention.k_proj.weight diff: 0.0
208
+ encoder.layers.3.attention.k_proj.bias diff: 0.0
209
+ encoder.layers.3.attention.v_proj.weight diff: 0.0
210
+ encoder.layers.3.attention.v_proj.bias diff: 0.0
211
+ encoder.layers.3.attention.q_proj.weight diff: 0.0
212
+ encoder.layers.3.attention.q_proj.bias diff: 0.0
213
+ encoder.layers.3.attention.out_proj.weight diff: 0.0
214
+ encoder.layers.3.attention.out_proj.bias diff: 0.0
215
+ encoder.layers.3.layer_norm.weight diff: 0.0
216
+ encoder.layers.3.layer_norm.bias diff: 0.0
217
+ encoder.layers.3.feed_forward.intermediate_dense.weight diff: 0.0
218
+ encoder.layers.3.feed_forward.intermediate_dense.bias diff: 0.0
219
+ encoder.layers.3.feed_forward.output_dense.weight diff: 0.0
220
+ encoder.layers.3.feed_forward.output_dense.bias diff: 0.0
221
+ encoder.layers.3.final_layer_norm.weight diff: 0.0
222
+ encoder.layers.3.final_layer_norm.bias diff: 0.0
223
+ encoder.layers.4.attention.k_proj.weight diff: 0.0
224
+ encoder.layers.4.attention.k_proj.bias diff: 0.0
225
+ encoder.layers.4.attention.v_proj.weight diff: 0.0
226
+ encoder.layers.4.attention.v_proj.bias diff: 0.0
227
+ encoder.layers.4.attention.q_proj.weight diff: 0.0
228
+ encoder.layers.4.attention.q_proj.bias diff: 0.0
229
+ encoder.layers.4.attention.out_proj.weight diff: 0.0
230
+ encoder.layers.4.attention.out_proj.bias diff: 0.0
231
+ encoder.layers.4.layer_norm.weight diff: 0.0
232
+ encoder.layers.4.layer_norm.bias diff: 0.0
233
+ encoder.layers.4.feed_forward.intermediate_dense.weight diff: 0.0
234
+ encoder.layers.4.feed_forward.intermediate_dense.bias diff: 0.0
235
+ encoder.layers.4.feed_forward.output_dense.weight diff: 0.0
236
+ encoder.layers.4.feed_forward.output_dense.bias diff: 0.0
237
+ encoder.layers.4.final_layer_norm.weight diff: 0.0
238
+ encoder.layers.4.final_layer_norm.bias diff: 0.0
239
+ encoder.layers.5.attention.k_proj.weight diff: 0.0
240
+ encoder.layers.5.attention.k_proj.bias diff: 0.0
241
+ encoder.layers.5.attention.v_proj.weight diff: 0.0
242
+ encoder.layers.5.attention.v_proj.bias diff: 0.0
243
+ encoder.layers.5.attention.q_proj.weight diff: 0.0
244
+ encoder.layers.5.attention.q_proj.bias diff: 0.0
245
+ encoder.layers.5.attention.out_proj.weight diff: 0.0
246
+ encoder.layers.5.attention.out_proj.bias diff: 0.0
247
+ encoder.layers.5.layer_norm.weight diff: 0.0
248
+ encoder.layers.5.layer_norm.bias diff: 0.0
249
+ encoder.layers.5.feed_forward.intermediate_dense.weight diff: 0.0
250
+ encoder.layers.5.feed_forward.intermediate_dense.bias diff: 0.0
251
+ encoder.layers.5.feed_forward.output_dense.weight diff: 0.0
252
+ encoder.layers.5.feed_forward.output_dense.bias diff: 0.0
253
+ encoder.layers.5.final_layer_norm.weight diff: 0.0
254
+ encoder.layers.5.final_layer_norm.bias diff: 0.0
255
+ encoder.layers.6.attention.k_proj.weight diff: 0.0
256
+ encoder.layers.6.attention.k_proj.bias diff: 0.0
257
+ encoder.layers.6.attention.v_proj.weight diff: 0.0
258
+ encoder.layers.6.attention.v_proj.bias diff: 0.0
259
+ encoder.layers.6.attention.q_proj.weight diff: 0.0
260
+ encoder.layers.6.attention.q_proj.bias diff: 0.0
261
+ encoder.layers.6.attention.out_proj.weight diff: 0.0
262
+ encoder.layers.6.attention.out_proj.bias diff: 0.0
263
+ encoder.layers.6.layer_norm.weight diff: 0.0
264
+ encoder.layers.6.layer_norm.bias diff: 0.0
265
+ encoder.layers.6.feed_forward.intermediate_dense.weight diff: 0.0
266
+ encoder.layers.6.feed_forward.intermediate_dense.bias diff: 0.0
267
+ encoder.layers.6.feed_forward.output_dense.weight diff: 0.0
268
+ encoder.layers.6.feed_forward.output_dense.bias diff: 0.0
269
+ encoder.layers.6.final_layer_norm.weight diff: 0.0
270
+ encoder.layers.6.final_layer_norm.bias diff: 0.0
271
+ encoder.layers.7.attention.k_proj.weight diff: 0.0
272
+ encoder.layers.7.attention.k_proj.bias diff: 0.0
273
+ encoder.layers.7.attention.v_proj.weight diff: 0.0
274
+ encoder.layers.7.attention.v_proj.bias diff: 0.0
275
+ encoder.layers.7.attention.q_proj.weight diff: 0.0
276
+ encoder.layers.7.attention.q_proj.bias diff: 0.0
277
+ encoder.layers.7.attention.out_proj.weight diff: 0.0
278
+ encoder.layers.7.attention.out_proj.bias diff: 0.0
279
+ encoder.layers.7.layer_norm.weight diff: 0.0
280
+ encoder.layers.7.layer_norm.bias diff: 0.0
281
+ encoder.layers.7.feed_forward.intermediate_dense.weight diff: 0.0
282
+ encoder.layers.7.feed_forward.intermediate_dense.bias diff: 0.0
283
+ encoder.layers.7.feed_forward.output_dense.weight diff: 0.0
284
+ encoder.layers.7.feed_forward.output_dense.bias diff: 0.0
285
+ encoder.layers.7.final_layer_norm.weight diff: 0.0
286
+ encoder.layers.7.final_layer_norm.bias diff: 0.0
287
+ encoder.layers.8.attention.k_proj.weight diff: 0.0
288
+ encoder.layers.8.attention.k_proj.bias diff: 0.0
289
+ encoder.layers.8.attention.v_proj.weight diff: 0.0
290
+ encoder.layers.8.attention.v_proj.bias diff: 0.0
291
+ encoder.layers.8.attention.q_proj.weight diff: 0.0
292
+ encoder.layers.8.attention.q_proj.bias diff: 0.0
293
+ encoder.layers.8.attention.out_proj.weight diff: 0.0
294
+ encoder.layers.8.attention.out_proj.bias diff: 0.0
295
+ encoder.layers.8.layer_norm.weight diff: 0.0
296
+ encoder.layers.8.layer_norm.bias diff: 0.0
297
+ encoder.layers.8.feed_forward.intermediate_dense.weight diff: 0.0
298
+ encoder.layers.8.feed_forward.intermediate_dense.bias diff: 0.0
299
+ encoder.layers.8.feed_forward.output_dense.weight diff: 0.0
300
+ encoder.layers.8.feed_forward.output_dense.bias diff: 0.0
301
+ encoder.layers.8.final_layer_norm.weight diff: 0.0
302
+ encoder.layers.8.final_layer_norm.bias diff: 0.0
303
+ encoder.layers.9.attention.k_proj.weight diff: 0.0
304
+ encoder.layers.9.attention.k_proj.bias diff: 0.0
305
+ encoder.layers.9.attention.v_proj.weight diff: 0.0
306
+ encoder.layers.9.attention.v_proj.bias diff: 0.0
307
+ encoder.layers.9.attention.q_proj.weight diff: 0.0
308
+ encoder.layers.9.attention.q_proj.bias diff: 0.0
309
+ encoder.layers.9.attention.out_proj.weight diff: 0.0
310
+ encoder.layers.9.attention.out_proj.bias diff: 0.0
311
+ encoder.layers.9.layer_norm.weight diff: 0.0
312
+ encoder.layers.9.layer_norm.bias diff: 0.0
313
+ encoder.layers.9.feed_forward.intermediate_dense.weight diff: 0.0
314
+ encoder.layers.9.feed_forward.intermediate_dense.bias diff: 0.0
315
+ encoder.layers.9.feed_forward.output_dense.weight diff: 0.0
316
+ encoder.layers.9.feed_forward.output_dense.bias diff: 0.0
317
+ encoder.layers.9.final_layer_norm.weight diff: 0.0
318
+ encoder.layers.9.final_layer_norm.bias diff: 0.0
319
+ encoder.layers.10.attention.k_proj.weight diff: 0.0026198839768767357
320
+ encoder.layers.10.attention.k_proj.bias diff: 0.0010964443208649755
321
+ encoder.layers.10.attention.v_proj.weight diff: 0.001084218267351389
322
+ encoder.layers.10.attention.v_proj.bias diff: 8.861951209837571e-05
323
+ encoder.layers.10.attention.q_proj.weight diff: 0.002644478576257825
324
+ encoder.layers.10.attention.q_proj.bias diff: 0.0009331119363196194
325
+ encoder.layers.10.attention.out_proj.weight diff: 0.0009169431868940592
326
+ encoder.layers.10.attention.out_proj.bias diff: 0.00011753084982046857
327
+ encoder.layers.10.layer_norm.weight diff: 0.004704533610492945
328
+ encoder.layers.10.layer_norm.bias diff: 0.00040463244658894837
329
+ encoder.layers.10.feed_forward.intermediate_dense.weight diff: 0.002256407169625163
330
+ encoder.layers.10.feed_forward.intermediate_dense.bias diff: 8.606249321019277e-05
331
+ encoder.layers.10.feed_forward.output_dense.weight diff: 0.0017423474928364158
332
+ encoder.layers.10.feed_forward.output_dense.bias diff: 7.794254634063691e-05
333
+ encoder.layers.10.final_layer_norm.weight diff: 0.003364397445693612
334
+ encoder.layers.10.final_layer_norm.bias diff: 0.000663460697978735
335
+ encoder.layers.11.attention.k_proj.weight diff: 0.0019817741122096777
336
+ encoder.layers.11.attention.k_proj.bias diff: 0.032148730009794235
337
+ encoder.layers.11.attention.v_proj.weight diff: 0.0010857016313821077
338
+ encoder.layers.11.attention.v_proj.bias diff: 0.00020938993839081377
339
+ encoder.layers.11.attention.q_proj.weight diff: 0.002357392804697156
340
+ encoder.layers.11.attention.q_proj.bias diff: 0.0008044671267271042
341
+ encoder.layers.11.attention.out_proj.weight diff: 0.0011331378482282162
342
+ encoder.layers.11.attention.out_proj.bias diff: 0.00014901244139764458
343
+ encoder.layers.11.layer_norm.weight diff: 0.0027753293979912996
344
+ encoder.layers.11.layer_norm.bias diff: 0.0056587993167340755
345
+ encoder.layers.11.feed_forward.intermediate_dense.weight diff: 0.0032594590447843075
346
+ encoder.layers.11.feed_forward.intermediate_dense.bias diff: 0.0002475830551702529
347
+ encoder.layers.11.feed_forward.output_dense.weight diff: 0.002621536375954747
348
+ encoder.layers.11.feed_forward.output_dense.bias diff: 2.9405724490061402e-05
349
+ encoder.layers.11.final_layer_norm.weight diff: 0.002755063585937023
350
+ encoder.layers.11.final_layer_norm.bias diff: 0.00021274278697092086
351
  ```