27 static bool Save(
const NetworkType &net,
const std::string &filepath)
29 nlohmann::json header;
30 size_t current_offset = 0;
33 for (
const auto &layerPtr : net.GetLayers())
35 auto state_dict = layerPtr->GetStateDict();
37 for (
const auto &[name, tensor] : state_dict)
39 std::string key =
"layer_" + std::to_string(layer_idx) +
"." + name;
41 size_t num_elements = 1;
42 for (
size_t dim : tensor.shape)
46 size_t byte_size = num_elements *
sizeof(float);
50 {
"shape", tensor.shape},
51 {
"data_offsets", {current_offset, current_offset + byte_size}}};
52 current_offset += byte_size;
57 header[
"__metadata__"] = {{
"format",
"deepity_safetensors"}};
59 std::string header_str = header.dump();
60 uint64_t header_size = header_str.size();
62 std::ofstream out(filepath, std::ios::binary);
66 out.write(
reinterpret_cast<const char *
>(&header_size),
sizeof(uint64_t));
67 out.write(header_str.data(), header_size);
69 for (
const auto &layerPtr : net.GetLayers())
71 for (
const auto &[name, tensor] : layerPtr->GetStateDict())
73 size_t num_elements = 1;
74 for (
size_t dim : tensor.shape)
78 out.write(
reinterpret_cast<const char *
>(tensor.data), num_elements *
sizeof(
float));
90 static bool Load(NetworkType &net,
const std::string &filepath)
92 std::ifstream in(filepath, std::ios::binary);
97 in.read(
reinterpret_cast<char *
>(&header_size),
sizeof(uint64_t));
99 std::string header_str(header_size,
'\0');
100 in.read(&header_str[0], header_size);
102 auto header = nlohmann::json::parse(header_str);
103 size_t base_offset =
sizeof(uint64_t) + header_size;
106 for (
auto &layerPtr : net.GetLayers())
108 auto state_dict = layerPtr->GetStateDict();
109 for (
auto &[name, tensor] : state_dict)
111 std::string key =
"layer_" + std::to_string(layer_idx) +
"." + name;
113 if (header.contains(key))
115 size_t start_offset = header[key][
"data_offsets"][0];
116 size_t end_offset = header[key][
"data_offsets"][1];
117 size_t byte_size = end_offset - start_offset;
119 in.seekg(base_offset + start_offset, std::ios::beg);
120 in.read(
reinterpret_cast<char *
>(tensor.data), byte_size);