#![allow(non_camel_case_types)]
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum QuantFormat {
F32,
F16,
BF16,
Q4_0,
Q4_K,
Q5_K,
Q6_K,
Q8_0,
Gptq { bits: u8, group_size: u16 },
Awq { bits: u8 },
}
impl QuantFormat {
pub fn bits_per_weight(&self) -> f64 {
match self {
QuantFormat::F32 => 32.0,
QuantFormat::F16 => 16.0,
QuantFormat::BF16 => 16.0,
QuantFormat::Q4_0 => 4.5, QuantFormat::Q4_K => 4.5, QuantFormat::Q5_K => 5.5,
QuantFormat::Q6_K => 6.5,
QuantFormat::Q8_0 => 8.5, QuantFormat::Gptq { bits, .. } => *bits as f64 + 0.5,
QuantFormat::Awq { bits } => *bits as f64 + 0.5,
}
}
pub fn memory_ratio(&self) -> f64 {
self.bits_per_weight() / 16.0
}
pub fn expected_ppl_delta(&self) -> f64 {
match self {
QuantFormat::F32 => 0.0,
QuantFormat::F16 => 0.0,
QuantFormat::BF16 => 0.01,
QuantFormat::Q4_0 => 0.5,
QuantFormat::Q4_K => 0.3,
QuantFormat::Q5_K => 0.1,
QuantFormat::Q6_K => 0.05,
QuantFormat::Q8_0 => 0.01,
QuantFormat::Gptq { bits, .. } => match bits {
4 => 0.4,
8 => 0.02,
_ => 0.5,
},
QuantFormat::Awq { bits } => match bits {
4 => 0.2, _ => 0.3,
},
}
}
pub fn block_size(&self) -> usize {
match self {
QuantFormat::F32 | QuantFormat::F16 | QuantFormat::BF16 => 1,
QuantFormat::Q4_0 | QuantFormat::Q8_0 => 32,
QuantFormat::Q4_K | QuantFormat::Q5_K | QuantFormat::Q6_K => 256, QuantFormat::Gptq { group_size, .. } => *group_size as usize,
QuantFormat::Awq { .. } => 128,
}
}
pub fn bytes_per_block(&self) -> usize {
match self {
QuantFormat::F32 => 4,
QuantFormat::F16 | QuantFormat::BF16 => 2,
QuantFormat::Q4_0 => 18, QuantFormat::Q4_K => 144, QuantFormat::Q5_K => 176, QuantFormat::Q6_K => 210, QuantFormat::Q8_0 => 34, QuantFormat::Gptq { bits, group_size } => {
let data_bytes = (*group_size as usize * *bits as usize).div_ceil(8);
data_bytes + 4 }
QuantFormat::Awq { bits } => {
let data_bytes = (128 * *bits as usize).div_ceil(8);
data_bytes + 4
}
}
}
}
impl fmt::Display for QuantFormat {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
QuantFormat::F32 => write!(f, "F32"),
QuantFormat::F16 => write!(f, "F16"),
QuantFormat::BF16 => write!(f, "BF16"),
QuantFormat::Q4_0 => write!(f, "Q4_0"),
QuantFormat::Q4_K => write!(f, "Q4_K"),
QuantFormat::Q5_K => write!(f, "Q5_K"),
QuantFormat::Q6_K => write!(f, "Q6_K"),
QuantFormat::Q8_0 => write!(f, "Q8_0"),
QuantFormat::Gptq { bits, group_size } => {
write!(f, "GPTQ-{}bit-g{}", bits, group_size)
}
QuantFormat::Awq { bits } => write!(f, "AWQ-{}bit", bits),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DequantStrategy {
Fused,
Prefetch { lookahead_blocks: usize },
OnDemand,
}
impl Default for DequantStrategy {
fn default() -> Self {
DequantStrategy::Fused
}
}