diff --git a/candle-core/src/quantized/gguf_file.rs b/candle-core/src/quantized/gguf_file.rs index 3a5f2030..620bc037 100644 --- a/candle-core/src/quantized/gguf_file.rs +++ b/candle-core/src/quantized/gguf_file.rs @@ -29,6 +29,7 @@ impl TryFrom for Magic { pub enum VersionedMagic { GgufV1, GgufV2, + GgufV3, } impl VersionedMagic { @@ -39,6 +40,7 @@ impl VersionedMagic { let versioned_magic = match (magic, version) { (Magic::Gguf, 1) => Self::GgufV1, (Magic::Gguf, 2) => Self::GgufV2, + (Magic::Gguf, 3) => Self::GgufV3, _ => crate::bail!("ggml: unsupported magic/version {magic:?}/{version}"), }; Ok(versioned_magic) @@ -84,7 +86,9 @@ pub struct Content { fn read_string(reader: &mut R, magic: &VersionedMagic) -> Result { let len = match magic { VersionedMagic::GgufV1 => reader.read_u32::()? as usize, - VersionedMagic::GgufV2 => reader.read_u64::()? as usize, + VersionedMagic::GgufV2 | VersionedMagic::GgufV3 => { + reader.read_u64::()? as usize + } }; let mut v = vec![0u8; len]; reader.read_exact(&mut v)?; @@ -284,7 +288,9 @@ impl Value { let value_type = ValueType::from_u32(value_type)?; let len = match magic { VersionedMagic::GgufV1 => reader.read_u32::()? as usize, - VersionedMagic::GgufV2 => reader.read_u64::()? as usize, + VersionedMagic::GgufV2 | VersionedMagic::GgufV3 => { + reader.read_u64::()? as usize + } }; let mut vs = Vec::with_capacity(len); for _ in 0..len { @@ -381,11 +387,15 @@ impl Content { let tensor_count = match magic { VersionedMagic::GgufV1 => reader.read_u32::()? as usize, - VersionedMagic::GgufV2 => reader.read_u64::()? as usize, + VersionedMagic::GgufV2 | VersionedMagic::GgufV3 => { + reader.read_u64::()? as usize + } }; let metadata_kv_count = match magic { VersionedMagic::GgufV1 => reader.read_u32::()? as usize, - VersionedMagic::GgufV2 => reader.read_u64::()? as usize, + VersionedMagic::GgufV2 | VersionedMagic::GgufV3 => { + reader.read_u64::()? as usize + } }; let mut metadata = HashMap::new(); @@ -407,7 +417,7 @@ impl Content { reader.read_u32_into::(&mut dimensions)?; dimensions.into_iter().map(|c| c as usize).collect() } - VersionedMagic::GgufV2 => { + VersionedMagic::GgufV2 | VersionedMagic::GgufV3 => { let mut dimensions = vec![0; n_dimensions as usize]; reader.read_u64_into::(&mut dimensions)?; dimensions.into_iter().map(|c| c as usize).collect()