torch.load#
- torch.load(f, map_location=None, pickle_module=pickle, *, weights_only=True, mmap=None, **pickle_load_args)[源]#
从文件中加载用
torch.save()
保存的对象。torch.load()
使用 Python 的反序列化功能,但对作为张量基础的存储器进行特殊处理。它们首先在 CPU 上反序列化,然后移动到保存它们的设备。如果此操作失败(例如,因为运行时系统没有某些设备),则会引发异常。然而,存储器可以使用map_location
参数动态重新映射到一组备用设备。如果
map_location
是可调用对象,则会为每个序列化存储器调用一次,并带有两个参数:存储器和位置。存储器参数将是存储器的初始反序列化,位于 CPU 上。每个序列化存储器都带有一个位置标签,用于标识保存它的设备,此标签是传递给map_location
的第二个参数。内置位置标签包括 CPU 张量的'cpu'
和 CUDA 张量的'cuda:device_id'
(例如'cuda:2'
)。map_location
应返回None
或一个存储器。如果map_location
返回一个存储器,则它将被用作最终反序列化对象,并已移动到正确的设备。否则,torch.load()
将退回到默认行为,就像未指定map_location
一样。如果
map_location
是torch.device
对象或包含设备标签的字符串,则它表示所有张量应加载到的位置。否则,如果
map_location
是字典,它将用于将文件中出现的位置标签(键)重新映射到指定存储位置的位置标签(值)。用户扩展可以使用
torch.serialization.register_package()
注册自己的位置标签以及标记和反序列化方法。有关操作检查点的更高级工具,请参阅 布局控制。
- 参数
f (Union[str, PathLike[str], IO[bytes]]) – 类文件对象(必须实现
read()
、readline()
、tell()
和seek()
),或包含文件名的字符串或 os.PathLike 对象map_location (Optional[Union[Callable[[Storage, str], Storage], device, str, dict[str, str]]]) – 一个函数、
torch.device
、字符串或字典,用于指定如何重新映射存储位置pickle_module (Optional[Any]) – 用于反序列化元数据和对象的模块(必须与用于序列化文件的
pickle_module
匹配)weights_only (Optional[bool]) – 指示反序列化器是否应仅限于加载张量、原始类型、字典以及通过
torch.serialization.add_safe_globals()
添加的任何类型。有关更多详细信息,请参见 torch.load with weights_only=True。mmap (Optional[bool]) – 指示文件是否应进行内存映射,而不是将所有存储加载到内存中。通常,文件中的张量存储将首先从磁盘移动到 CPU 内存,然后它们被移动到保存时标记的位置,或由
map_location
指定的位置。如果最终位置是 CPU,则第二步是空操作。当设置mmap
标志时,第一步不是将张量存储从磁盘复制到 CPU 内存,而是对f
进行内存映射,这意味着张量存储将在访问其数据时进行延迟加载。pickle_load_args (Any) – (仅限 Python 3)传递给
pickle_module.load()
和pickle_module.Unpickler()
的可选关键字参数,例如errors=...
。
- 返回类型
警告
torch.load()
除非将 weights_only 参数设置为 True,否则隐式使用pickle
模块,已知该模块不安全。可以构造恶意 pickle 数据,在反序列化期间执行任意代码。切勿在不安全模式下加载可能来自不受信任来源或可能已被篡改的数据。只加载您信任的数据。注意
当您对包含 GPU 张量的文件调用
torch.load()
时,这些张量默认会加载到 GPU。您可以调用torch.load(.., map_location='cpu')
,然后调用load_state_dict()
,以避免加载模型检查点时 GPU RAM 急剧增加。注意
默认情况下,我们将字节字符串解码为
utf-8
。这是为了避免在 Python 3 中加载 Python 2 保存的文件时常见的错误情况UnicodeDecodeError: 'ascii' codec can't decode byte 0x...
。如果此默认值不正确,您可以使用额外的encoding
关键字参数来指定如何加载这些对象,例如,encoding='latin1'
使用latin1
编码将其解码为字符串,而encoding='bytes'
将它们保留为字节数组,以后可以使用byte_array.decode(...)
进行解码。示例
>>> torch.load("tensors.pt", weights_only=True) # Load all tensors onto the CPU >>> torch.load( ... "tensors.pt", ... map_location=torch.device("cpu"), ... weights_only=True, ... ) # Load all tensors onto the CPU, using a function >>> torch.load( ... "tensors.pt", ... map_location=lambda storage, loc: storage, ... weights_only=True, ... ) # Load all tensors onto GPU 1 >>> torch.load( ... "tensors.pt", ... map_location=lambda storage, loc: storage.cuda(1), ... weights_only=True, ... ) # type: ignore[attr-defined] # Map tensors from GPU 1 to GPU 0 >>> torch.load( ... "tensors.pt", ... map_location={"cuda:1": "cuda:0"}, ... weights_only=True, ... ) # Load tensor from io.BytesIO object # Loading from a buffer setting weights_only=False, warning this can be unsafe >>> with open("tensor.pt", "rb") as f: ... buffer = io.BytesIO(f.read()) >>> torch.load(buffer, weights_only=False) # Load a module with 'ascii' encoding for unpickling # Loading from a module setting weights_only=False, warning this can be unsafe >>> torch.load("module.pt", encoding="ascii", weights_only=False)