diff --git a/python/cactus/convert/cactus_adapters/tensor_io.py b/python/cactus/convert/cactus_adapters/tensor_io.py index dc59d0aa8..8bfc632f1 100644 --- a/python/cactus/convert/cactus_adapters/tensor_io.py +++ b/python/cactus/convert/cactus_adapters/tensor_io.py @@ -292,7 +292,7 @@ def save_tensor_with_header(tensor, output_path, precision='INT8', transpose=Fal data = data * GEMMA4_WEIGHT_SCALE elif 'router_scale' in filename: data = data / GEMMA4_WEIGHT_SCALE - elif filename in ('token_embeddings.weights', 'output_weight.weights', 'embed_vision_embedding.weights', 'embed_vision_proj.weights'): + elif filename in ('token_embeddings.weights', 'output_weight.weights', 'embed_vision_proj.weights', 'embed_audio_proj.weights'): data = data / GEMMA4_WEIGHT_SCALE elif filename == 'output_norm.weights': data = data * GEMMA4_WEIGHT_SCALE diff --git a/python/cactus/convert/model_adapters/naming.py b/python/cactus/convert/model_adapters/naming.py index d854b1a02..e96f568fb 100644 --- a/python/cactus/convert/model_adapters/naming.py +++ b/python/cactus/convert/model_adapters/naming.py @@ -23,7 +23,6 @@ class NameMatch: GEMMA4_DIV_BASENAMES = { "token_embeddings", "output_weight", - "embed_vision_embedding", } diff --git a/python/cactus/transpile/model_adapters.py b/python/cactus/transpile/model_adapters.py index b09357e42..b6e2cee0d 100644 --- a/python/cactus/transpile/model_adapters.py +++ b/python/cactus/transpile/model_adapters.py @@ -1094,10 +1094,6 @@ def _gemma4_compute_native_like_audio_features( if not callable(getattr(embed_audio, "forward", None)): raise TypeError("Gemma4 audio embedder is not callable") projected = embed_audio(inputs_embeds=audio_encodings) - # Native Cactus Gemma4 scales audio soft tokens before merging them into - # the language stream. HF leaves this implicit in its fp16 path, but the - # quantized Cactus decoder expects the native-scaled representation. - projected = projected * (1.0 / 16.0) # The transpiled bundle is shape-specialized from representative media. # Native Gemma4 audio preprocessing emits an unpadded feature tensor for # that media, so the post-subsampling sequence is already the real token