viva_tensor/sparsity

2:4 Structured Sparsity

NVIDIA Tensor Cores Structured Sparsity Ampere+ Architecture (RTX 3000/4000, A100, H100)

CONCEITO: Em cada grupo de 4 elementos, apenas 2 são não-zero = 50% dos elementos são zero, mas em padrão ESTRUTURADO

POR QUE ESTRUTURADO > ALEATÓRIO:

FORMATO DE ARMAZENAMENTO:

PERFORMANCE:

Types

Métricas de poda

pub type PruneMetrics {
  PruneMetrics(
    pruned_count: Int,
    total_count: Int,
    approximation_error: Float,
    kept_magnitude_mean: Float,
    pruned_magnitude_mean: Float,
  )
}

Constructors

  • PruneMetrics(
      pruned_count: Int,
      total_count: Int,
      approximation_error: Float,
      kept_magnitude_mean: Float,
      pruned_magnitude_mean: Float,
    )

    Arguments

    pruned_count

    Elementos podados (zerados)

    total_count

    Total de elementos

    approximation_error

    Erro de aproximação

    kept_magnitude_mean

    Magnitude média mantida

    pruned_magnitude_mean

    Magnitude média podada

Bloco 2:4 (4 elementos com 2 não-zeros)

pub type Sparse24Block {
  Sparse24Block(values: #(Float, Float), positions: #(Int, Int))
}

Constructors

  • Sparse24Block(values: #(Float, Float), positions: #(Int, Int))

    Arguments

    values

    Os 2 valores não-zero

    positions

    Máscara 2-bit indicando posições (0-3 para cada valor)

Tensor com esparsidade 2:4

pub type Sparse24Tensor {
  Sparse24Tensor(
    blocks: List(Sparse24Block),
    shape: List(Int),
    num_elements: Int,
    memory_bytes: Int,
    sparsity_percent: Float,
  )
}

Constructors

  • Sparse24Tensor(
      blocks: List(Sparse24Block),
      shape: List(Int),
      num_elements: Int,
      memory_bytes: Int,
      sparsity_percent: Float,
    )

    Arguments

    blocks

    Blocos 2:4

    shape

    Shape original

    num_elements

    Número de elementos originais

    memory_bytes

    Memória em bytes

    sparsity_percent

    Sparsity real (%)

Values

pub fn benchmark_sparsity() -> Nil
pub fn compute_metrics(
  original: tensor.Tensor,
  sparse: Sparse24Tensor,
) -> PruneMetrics

Calcula métricas de poda

pub fn decompress(sparse: Sparse24Tensor) -> tensor.Tensor

Reconstrói tensor denso a partir de 2:4 sparse

pub fn main() -> Nil
pub fn prune_24_gradient(
  weights: tensor.Tensor,
  gradients: tensor.Tensor,
) -> Sparse24Tensor

Poda baseada em gradiente (para treinamento) Mantém elementos com maior |valor × gradiente|

pub fn prune_24_magnitude(t: tensor.Tensor) -> Sparse24Tensor

Aplica poda 2:4: mantém os 2 maiores em cada grupo de 4 Estratégia: magnitude (abs) - padrão da NVIDIA

pub fn sparse_matmul(
  sparse_a: Sparse24Tensor,
  dense_b: tensor.Tensor,
) -> #(tensor.Tensor, Float)

Matmul com matriz esparsa 2:4 Em hardware real (Tensor Cores), isso é 2x mais rápido!

Search Document