@@ -1163,11 +1163,13 @@ namespace chatllm
11631163 }
11641164
11651165 size_t TensorInfo::read_tensor_data (tokenizer::DataReader *reader, size_t read_offset, size_t write_offset, size_t data_size,
1166- ggml::type target_type)
1166+ ggml::type target_type, ggml::tensor *src_tensor )
11671167 {
11681168 CHATLLM_CHECK (data) << " backend buffer still not allocated!" ;
11691169 CHATLLM_CHECK (target_type == ggml::type_of (tensor)) << " tensor type mismatch!" ;
1170- CHATLLM_CHECK (data->get_size () >= write_offset + data_size) << " read_tensor_data(" << ggml::get_name (&tensor) << " ): write data exceeds tensor data size" ;
1170+
1171+ const ggml::type original_type = src_tensor ? ggml::type_of (src_tensor) : this ->original_type ;
1172+ if (nullptr == src_tensor) src_tensor = &tensor;
11711173
11721174 reader->seek (aligned_data_start (read_offset), SEEK_SET);
11731175
@@ -1185,7 +1187,7 @@ namespace chatllm
11851187 std::vector<uint8_t > buf_q;
11861188
11871189 ggml::tensor t;
1188- ggml::init_tensor (&t, ggml::type::GGML_TYPE_F32, 4 , tensor. ne );
1190+ ggml::init_tensor (&t, ggml::type::GGML_TYPE_F32, 4 , src_tensor-> ne );
11891191 buf.resize (ggml::nbytes (&t));
11901192
11911193 if (ggml::type::GGML_TYPE_F32 == original_type)
@@ -1194,18 +1196,19 @@ namespace chatllm
11941196 }
11951197 else
11961198 {
1197- ggml::init_tensor (&t, original_type, 4 , tensor. ne );
1199+ ggml::init_tensor (&t, original_type, 4 , src_tensor-> ne );
11981200 buf_q.resize (ggml::nbytes (&t));
11991201 reader->read_buffer (buf_q.data (), buf_q.size ());
12001202
12011203 ggml::to_float (original_type, buf_q.data (), (float *)buf.data (), ggml::get_dim (&t, 0 ), ggml::nrows (&t));
12021204 }
12031205
1204- ggml::init_tensor (&t, target_type, 4 , tensor. ne );
1206+ ggml::init_tensor (&t, target_type, 4 , src_tensor-> ne );
12051207 buf_q.resize (ggml::nbytes (&t));
12061208 ggml::from_float (target_type, (const float *)buf.data (), (void *)buf_q.data (), ggml::get_dim (&t, 0 ), ggml::nrows (&t));
12071209
1208- CHATLLM_CHECK (buf_q.size () == data_size) << " size mismatch? " << buf_q.size () << " : " << data_size;
1210+ if (data_size < buf_q.size ())
1211+ CHATLLM_CHECK (buf_q.size () == data_size) << " size mismatch? " << buf_q.size () << " : " << data_size;
12091212
12101213 alloc->get_backend ()->write_tensor_data (&tensor, buf_q.data (), write_offset, buf_q.size ());
12111214
@@ -1530,12 +1533,14 @@ namespace chatllm
15301533 }
15311534
15321535 size_t size = search->second .get_nbytes ();
1533- t.read_tensor_data (_file.get (), search->second ._offset , write_offset, size, tensor->type );
1536+ size = t.read_tensor_data (_file.get (), search->second ._offset , write_offset, size, tensor->type , &search->second .tensor );
1537+
1538+ CHATLLM_CHECK (total_size >= size) << " tensor " << name << " too much data: " << total_size << " > " << size;
15341539
15351540 write_offset += size;
15361541 total_size -= size;
15371542 }
1538- CHATLLM_CHECK (total_size == 0 ) << " tensor " << name << " not fully loaded. " ;
1543+ CHATLLM_CHECK (total_size == 0 ) << " tensor " << name << " not fully loaded, remain = " << total_size ;
15391544
15401545 t.assign_to (tensor);
15411546 }
0 commit comments