Saturation Masks Test Fixtures
Pre-computed saturation masks for model benchmarking and integration testing.
Getting Started
- What: the saturation masks subtree inside Gnosis.
- Why: it keeps this local concern documented where readers will look before editing or using it.
- How: read this entry first, then follow the local commands, child links, or file list below.
- Next: go back to the parent README when you need the wider package context.
Structure
saturation_masks/
├── phi3-mini.masks.pkl # Phi-3-mini (32 layers, 3072 hidden)
├── qwen2.5-7b.masks.pkl # Qwen2.5-7B (28 layers, 4096 hidden)
├── gemma-9b.masks.pkl # Gemma-9b (42 layers, 3584 hidden)
├── llama-70b.masks.pkl # Llama-70B (80 layers, 8192 hidden)
│
├── phi3-mini.saturation.json # Metadata for Phi-3-mini
├── qwen2.5-7b.saturation.json # Metadata for Qwen2.5-7B
├── gemma-9b.saturation.json # Metadata for Gemma-9b
├── llama-70b.saturation.json # Metadata for Llama-70B
│
└── MASK_STATS.md # Summary statisticsFixture Generation
Generate pre-computed masks for a model:
python saturation_mask_encoder.py \
--model Qwen/Qwen2.5-7B \
--method variance_gradient \
--output masks.safetensors \
--num-samples 512 \
--save-pickle fixtures/saturation_masks/qwen2.5-7b.masks.pklGeneration Parameters
Phi-3-mini:
python saturation_mask_encoder.py \
--model microsoft/phi-3-mini-4k-instruct \
--method variance_gradient \
--variance-quantile 0.2 \
--num-samples 512 \
--save-pickle fixtures/saturation_masks/phi3-mini.masks.pklQwen2.5-7B:
python saturation_mask_encoder.py \
--model Qwen/Qwen2.5-7B \
--method variance_gradient \
--variance-quantile 0.2 \
--num-samples 512 \
--save-pickle fixtures/saturation_masks/qwen2.5-7b.masks.pklGemma-9b:
python saturation_mask_encoder.py \
--model google/gemma-2-9b \
--method statistical \
--variance-quantile 0.25 \
--num-samples 512 \
--save-pickle fixtures/saturation_masks/gemma-9b.masks.pklLlama-70B:
python saturation_mask_encoder.py \
--model meta-llama/Llama-2-70b-hf \
--method variance_gradient \
--variance-quantile 0.2 \
--num-samples 512 \
--save-pickle fixtures/saturation_masks/llama-70b.masks.pklUsing Fixtures in Tests
Python
import pickle
from pathlib import Path
# Load fixture
fixture_dir = Path(__file__).parent / "fixtures" / "saturation_masks"
with open(fixture_dir / "qwen2.5-7b.masks.pkl", "rb") as f:
masks = pickle.load(f)
# Use in tests
assert len(masks) == 28 # 28 layers
for layer_id, mask in masks.items():
assert mask.num_frozen() > 0Rust
// Load masks in rust tests
#[test]
fn test_saturation_mask_loading() {
let fixture_path = "fixtures/saturation_masks/qwen2.5-7b.masks.pkl";
let masks = load_saturation_masks_from_pickle(fixture_path)
.expect("Failed to load fixture");
assert_eq!(masks.len(), 28);
}Expected Statistics
Phi-3-mini
- Layers: 32
- Avg frozen %: 12.5%
- Method: variance_gradient
- Estimated speedup: 1.125x
- Blob size: 48 KB
Qwen2.5-7B
- Layers: 28
- Avg frozen %: 10.2%
- Method: variance_gradient
- Estimated speedup: 1.102x
- Blob size: 35 KB
Gemma-9b
- Layers: 42
- Avg frozen %: 8.1%
- Method: statistical
- Estimated speedup: 1.081x
- Blob size: 42 KB
Llama-70B
- Layers: 80
- Avg frozen %: 6.3%
- Method: variance_gradient
- Estimated speedup: 1.063x
- Blob size: 60 KB
Fixture Maintenance
Regenerating Fixtures
When updating saturation detection algorithms or calibration corpus:
# Regenerate all fixtures
for model in \
"microsoft/phi-3-mini-4k-instruct:phi3-mini" \
"Qwen/Qwen2.5-7B:qwen2.5-7b" \
"google/gemma-2-9b:gemma-9b" \
"meta-llama/Llama-2-70b-hf:llama-70b"
do
IFS=: read model_id fixture_name <<< "$model"
python saturation_mask_encoder.py \
--model "$model_id" \
--method variance_gradient \
--num-samples 512 \
--save-pickle "fixtures/saturation_masks/${fixture_name}.masks.pkl"
doneVerifying Fixture Integrity
python saturation_mask_decoder.py \
--model fixtures/saturation_masks/phi3-mini.masks.pkl \
--layer-summary \
--show-metadataKnown Issues
Memory Usage
Large models (Llama-70B) require significant VRAM to compute masks:
- Minimum: 40 GB VRAM (with activation offloading)
- Recommended: 80 GB VRAM
For constrained environments, use smaller --num-samples (256 instead of 512).
Reproducibility
Masks are deterministic for a given model, tokenizer, and random seed, but may vary slightly:
- Across torch versions (due to numerical precision)
- With different attention/normalization implementations
- If calibration corpus is shuffled differently
Difference tolerance: < 1% variation in frozen neuron counts across runs.
Citation
If using these saturation masks in research, cite:
@inproceedings{saturation_masks_2024,
title={Saturation Masks for Efficient Transformer Inference},
author={Forkjoin Contributors},
booktitle={Distributed Inference Systems},
year={2024}
}License
Saturation mask fixtures are available under the same license as the forkjoin.ai project (UNLICENSED / proprietary).
Model weights remain under their original licenses (Phi-3: Microsoft, Qwen: Alibaba, Gemma: Google, Llama: Meta).