Combine sparse attention (25% of layers) and linear attention (75% of layers) via strategic layer placement to handle 1M-token contexts with 75% training cost reduction. Hybrid positional encoding preserves long-range information while maintaining position awareness.
Scanned 9/9/2026
Install to Claude Code
npx -y skills add ADu2021/skillXiv --skill minicpm-sala --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Minicpm Sala?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/adu2021-minicpm-sala)More formats (shields.io, HTML) on the badges page.
---
name: minicpm-sala
title: "MiniCPM-SALA: Hybridizing Sparse and Linear Attention for Efficient Long-Context Modeling"
version: 0.0.2
engine: skillxiv-v0.0.2-claude-opus-4.6
license: MIT
url: "https://arxiv.org/abs/2602.11761"
keywords: [Attention Mechanisms, Long Context, Hybrid Architecture, Training Efficiency, Token Scaling]
description: "Combine sparse attention (25% of layers) and linear attention (75% of layers) via strategic layer placement to handle 1M-token contexts with 75% training cost reduction. Hybrid positional encoding preserves long-range information while maintaining position awareness."
---
# MiniCPM-SALA: Hybrid Attention for Efficient Long-Context
## Problem Context
Standard Transformer attention faces two prohibitive bottlenecks: quadratic computational complexity O(N²) and linear KV-cache memory growth. For million-token contexts, these constraints make full-attention models impractical. Sparse attention alone sacrifices global information. Linear attention lacks fidelity for fine-grained dependencies. Training new models from scratch incurs enormous computational cost.
## Core Concept
MiniCPM-SALA achieves efficient long-context modeling through **strategic mixing of complementary attention mechanisms** in a 1:3 ratio. Rather than using uniform attention throughout, 25% of layers employ sparse attention (InfLLM-V2) for precise long-range modeling while 75% use linear attention (Lightning Attention) for O(N) efficiency.
The key insight: sparse and linear attention have complementary strengths. A learned layer selection mechanism determines optimal sparse placement, enabling continual training to convert pre-trained models instead of training from scratch (75% cost reduction).
## Architecture Overview
- **Hybrid Mixing Ratio**: 25% sparse attention (InfLLM-V2), 75% linear attention (Lightning Attention)
- **Layer Selection Algorithm**: Determines sparse placement rather than uniform interleaving
- **Hybrid Positional Encoding (HyPE)**: RoPE on linear layers only, removed from sparse layers
- **Architectural Stability**: First and last layers remain softmax attention
- **Five-Stage Training Pipeline**: HALO conversion → stable training → short-decay → long-decay → SFT
- **QK-Normalization and Output Gates**: Stabilize gradients and prevent attention sinks
## Implementation
The hybrid attention layer selection mechanism:
```python
def select_layer_types(num_layers, sparse_ratio=0.25):
"""
Determine which layers get sparse vs linear attention.
Uses strategic placement rather than uniform distribution.
"""
num_sparse = int(num_layers * sparse_ratio)
# Strategic placement: concentrate sparse layers where most useful
# (typically middle layers for long-range dependencies)
sparse_positions = []
for i in range(num_sparse):
pos = int((i + 1) * num_layers / (num_sparse + 1))
sparse_positions.append(pos)
layer_types = []
for i in range(num_layers):
if i in sparse_positions:
layer_types.append('sparse')
else:
layer_types.append('linear')
return layer_types
```
Hybrid Positional Encoding (HyPE) implementation:
```python
class HybridPositionalEncoding(nn.Module):
"""
Apply RoPE selectively based on attention type.
Linear layers get RoPE for position awareness.
Sparse layers skip RoPE to preserve long-range information.
"""
def __init__(self, dim, max_seq_len):
super().__init__()
self.rope = RotaryPositionEmbedding(dim, max_seq_len)
def apply_to_linear_layer(self, x, positions):
"""Apply RoPE to linear attention layers."""
return self.rope(x, positions)
def apply_to_sparse_layer(self, x, positions):
"""Skip RoPE for sparse layers—preserve long-range information."""
return x # No position encoding for sparse attention
```
Five-stage training pipeline:
```python
def continual_training_pipeline(pretrained_model, data_config):
"""
Convert pre-trained softmax model to hybrid architecture
with minimal training cost (75% reduction vs training from scratch).
"""
model = copy_and_convert_attention(pretrained_model, sparse_ratio=0.25)
stages = [
{
'name': 'HALO Conversion',
'tokens': 1.3e9,
'seq_length': 512,
'description': 'Initialize hybrid architecture'
},
{
'name': 'Stable Training',
'tokens': 314.6e9,
'seq_length': 4096,
'description': 'Coordinate hybrid components'
},
{
'name': 'Short-Decay Training',
'tokens': 1e12,
'seq_length': 4096,
'description': 'Learning rate decay with high-quality data'
},
{
'name': 'Long-Decay Training',
'tokens': 'variable',
'seq_length': '4K→520K progressive',
'description': 'Extend context progressively'
},
{
'name': 'Supervised Fine-Tuning',
'tokens': 'variable',
'seq_length': '64K-140K',
'description': 'Enhance reasoning capabilities'
}
]
for stage in stages:
print(f"Stage: {stage['name']}")
# Train with specified configuration
model = train_stage(
model,
tokens=stage['tokens'],
seq_length=stage['seq_length'],
data=data_config[stage['name'].lower()]
)
return model
```
Attention layer implementation with QK-Normalization:
```python
class HybridAttentionLayer(nn.Module):
def __init__(self, dim, attention_type='linear', num_heads=8):
super().__init__()
self.attention_type = attention_type
self.num_heads = num_heads
if attention_type == 'sparse':
self.attn = SparseAttention(dim, num_heads)
else:
self.attn = LinearAttention(dim, num_heads)
# QK-Normalization for stability
self.q_norm = nn.LayerNorm(dim)
self.k_norm = nn.LayerNorm(dim)
# Output gate for controlling information flow
self.output_gate = nn.Linear(dim, dim)
def forward(self, x):
# Normalize queries and keys
q = self.q_norm(x)
k = self.k_norm(x)
# Apply attention
attn_out = self.attn(q, k, x)
# Apply output gate
gate = torch.sigmoid(self.output_gate(attn_out))
output = attn_out * gate
return output
```
## Practical Guidance
**When to use**:
- Processing 100K+ token contexts
- Need inference speed improvements (3.5x reported)
- Converting existing pre-trained models
- Have compute budget for multi-stage training
**Key implementation decisions**:
1. **Sparse Ratio**: 25% sparse layers is optimal for most tasks. Test 15-30% for domain-specific tuning
2. **Layer Selection**: Strategic placement (middle layers) > uniform distribution
3. **Positional Encoding**: Always remove RoPE from sparse layers to preserve long-range
4. **Stability Measures**: QK-normalization critical for smooth training
5. **Training Cost**: Expect 75% cost reduction vs training from scratch
**Context extension schedule**:
- Start with 4K tokens (stable)
- Gradually increase to 520K over progressive stages
- Use learning rate decay as context extends
**Expected improvements**:
- 3.5x inference speedup
- 1M-token context support where full-attention fails
- 75% training cost reduction vs from-scratch training
- Maintains reasoning quality on reasoning-intensive tasks
**Debugging common issues**:
- Training instability → increase QK-norm, reduce learning rate
- Poor long-context performance → verify RoPE only on linear layers
- Attention sinks → enable output gates and increase gate regularization
## Reference
Hybrid attention through strategic sparse-linear mixing demonstrates that complementary mechanisms can be combined efficiently. Continual training from pre-trained models enables practical adoption without retraining from scratch, making 1M-token models feasible.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!