You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibTorch中如何序列化读写嵌套map结构的torch::Tensor对象

最简实现方案

直接使用LibTorch内置的序列化接口即可,不需要引入任何第三方依赖。LibTorch底层基于cereal实现序列化,原生支持std::string、std::map、torch::Tensor的嵌套结构序列化,核心逻辑只需要两行代码。

完整实现代码

#include <torch/torch.h>
#include <map>
#include <string>

using namespace std;

void save_tensor_map(const map<string, map<string, torch::Tensor>>& m, const string& fp) {
    // 直接调用内置save接口序列化整个嵌套结构
    torch::save(m, fp);
}

map<string, map<string, torch::Tensor>> read_tensor_map(const string& fp) {
    map<string, map<string, torch::Tensor>> res;
    // 调用内置load接口反序列化到结果对象
    torch::load(res, fp);
    return res;
}

注:这里把原框架里的值传参改成了const引用传参,避免大map和Tensor的无意义拷贝,性能更好。

方案说明

  • 该方式自动处理torch::Tensor的所有属性:包括数据类型、设备位置(CPU/CUDA)、梯度状态、内存布局,不需要手动处理张量的底层数据拷贝,不会出现数据错漏。
  • 生成的序列化文件和Python端PyTorch的torch.save/torch.load完全兼容:Python端读取时会得到嵌套字典结构的Tensor对象,跨语言调用也不需要额外做格式适配。
  • 没必要引入protobuf、json等第三方序列化库:这类库要么不直接支持torch::Tensor类型,需要手动写大量张量和基础类型的转换逻辑,代码冗余且容易出bug,复杂度远高于内置接口。
  • 如果需要处理文件损坏、路径不存在等异常情况,只需要在torch::save和torch::load调用外层加try-catch捕获LibTorch抛出的异常即可,最简场景不需要额外逻辑。
  • 不要手动实现张量内存的二进制读写:不仅代码量大,还容易出现字节序、设备不匹配、张量元信息丢失等问题,远不如内置接口稳定。

内容的提问来源于stack exchange,提问作者IntegrateThis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 10:27:40