From cb86b0c82c6f0ddf2a42c677d44f31e5da41751b Mon Sep 17 00:00:00 2001 From: Laurent Mazare Date: Sun, 18 Feb 2024 19:33:55 +0100 Subject: [PATCH] Fix float unpickling. (#1730) --- candle-core/src/pickle.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/candle-core/src/pickle.rs b/candle-core/src/pickle.rs index e3f1f81d4e..08335257c6 100644 --- a/candle-core/src/pickle.rs +++ b/candle-core/src/pickle.rs @@ -42,7 +42,7 @@ pub enum OpCode { Stop = b'.', NewObj = 0x81, EmptyList = b']', - BinFloat = b'g', + BinFloat = b'G', Append = b'a', Appends = b'e', } @@ -462,7 +462,10 @@ impl Stack { self.push(Object::Int(arg)) } OpCode::BinFloat => { - let arg = r.read_f64::()?; + // Somehow floats are encoded using BigEndian whereas int types use LittleEndian. + // https://github.com/python/cpython/blob/0c80da4c14d904a367968955544dd6ae58c8101c/Lib/pickletools.py#L855 + // https://github.com/pytorch/pytorch/blob/372d078f361e726bb4ac0884ac334b04c58179ef/torch/_weights_only_unpickler.py#L243 + let arg = r.read_f64::()?; self.push(Object::Float(arg)) } OpCode::BinUnicode => {