我无法加载我的模型,因为我无法放置 PosixPath
I can't load my model because I can't put a PosixPath
我正在设置一个脚本,我需要使用 fast-ai
包中的一些函数。事实是我在 Windows 上,当我定义我的路径时,fast-ai
中名为 load_learner
的函数无法加载模型。
我尝试将函数更改为程序包:
state = pickle.load(open(str(path) + '/' + str(fname), 'rb'))
而不是:
state = pickle.load(open(path/fname, 'rb'))
但我得到这个错误:
File "lib\site-packages\fastai\basic_train.py", line 462, in load_learner
state = pickle.load(open(path/fname, 'rb'))
File "\lib\pathlib.py", line 1006, in __new__
% (cls.__name__,))
NotImplementedError: cannot instantiate 'PosixPath' on your system
我的路径定义为:
folder_path = './models/model1'
fname = 'model.pkl'
我将该函数称为:
model = load_learner(folder_path, fname)
如何在此函数中使用 Windows 路径?
更新 1
发布的答案仅在 Linux 上是正确的。我在 Windows 上仍有问题。我没有找到在 Windows 上通过 PosixPath 的方法。我找到的唯一解决方案是从我的模块中更改内部包,但这不是解决此类问题的安全方法。
提前致谢。
根据提供的错误消息,您正在使用 pathlib
。所以你不需要在这里使用+ '/' +
:str(path) + '/' + str(fname)
/
作为路径分隔符适用于 Linux/Unix:
state = pickle.load(open(path / fname, 'rb'))
在 Windows 上使用 .joinpath()
代替:
state = pickle.load(open(path.joinpath(fname), 'rb'))
如果您不打算使用 pathlib
,请使用 os.path.join()
。它会自动 select 为您的 OS 设置正确的格式。
根据我自己的问题,我找到了一个方法:
from pathlib import Path
folder_path = Path('./models/model1')
更新 1
此解决方案仅适用于 Linux,适用于 Windows 我仍然遇到错误。
这里的问题与 Python 根据 OS 处理路径的方式不同有关:
PosixPath
- 在 Linux / Unix
WindowsPath
- 在 Windows
当在一个 OS 上使用 pickle
持久化对象时(比如说 Linux - 在这种情况下)关于类型的信息 / class 也会被持久化(这里: PosixPath
).
现在,当 pickle 文件被加载时 Python 假设它将能够根据它之前保存的类型信息重新创建对象。在这种情况下,它会尝试重新创建 PosixPath
类型的对象,该对象被 pathlib
库阻止并且无法在 Windows 上实例化。在 Windows 上应该使用 WindowsPath
,但是 pickle
模块不能很好地处理这种 OS 相关的逻辑,因此它无奈地抛出错误。
理论上您可以干预 pathlib
的代码以删除 OS 检查,但没有简单的解决方法,但要避免酸洗 OS 依赖的对象(例如,将路径存储为字符串 - 正如 os.path
所做的那样 - 肯定会解决这个问题)。
- 对路径对象使用独立于平台的 PurePosixPath
class。
我正在做同样的工作——将 fastai 模型部署为网络服务器,但遇到了同样的问题,这就是我所做的……
导出模型时使用 joblib 或 pickle 来 pickle 模型而不是使用 learn.export() 并在服务器中使用以下代码。
__model = pickle.load(open(os.path.join('./artifacts/saved_model.pkl'), 'rb'))
这样做可以解决路径问题,但由于模型是使用 GPU 训练的,因此会出现错误,要求将存储映射到 CPU
只需将 PosixPath
重定向到 WindowsPath
。
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
我也在加载 fastai
个模型,这个技巧很管用。
对于posix路径错误:
当您在 colab/gradient 上训练您的模型并下载它时,
然后对 Windows.
进行推理
只需将 PosixPath
重定向到 WindowsPath
:
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
在处理 Windows 时,您可以暂时将 pathlib.PosixPath
设置为 WindowsPath
。恢复到原始值很重要,尤其是在 pickle 加载过程中出现异常时。
一个简单的方法是 try / finally
:
posix_backup = pathlib.PosixPath
try:
pathlib.PosixPath = pathlib.WindowsPath
learn_inf = load_learner(EXPORT_PATH)
finally:
pathlib.PosixPath = posix_backup
如果你经常这样做,你可以使流程更顺畅,如下所示:
- 定义一个可以临时进行更改的函数
- 在
with
块中使用它
您可以将其添加到某处(如果您使用 Jupyter,则在脚本或专用单元格的顶部)。
from contextlib import contextmanager
import pathlib
@contextmanager
def set_posix_windows():
posix_backup = pathlib.PosixPath
try:
pathlib.PosixPath = pathlib.WindowsPath
yield
finally:
pathlib.PosixPath = posix_backup
然后,像这样使用它:
EXPORT_PATH = pathlib.Path("model.pkl")
with set_posix_windows():
learn_inf = load_learner(EXPORT_PATH)
...另外,检查 sophros 的答案:
我正在设置一个脚本,我需要使用 fast-ai
包中的一些函数。事实是我在 Windows 上,当我定义我的路径时,fast-ai
中名为 load_learner
的函数无法加载模型。
我尝试将函数更改为程序包:
state = pickle.load(open(str(path) + '/' + str(fname), 'rb'))
而不是:
state = pickle.load(open(path/fname, 'rb'))
但我得到这个错误:
File "lib\site-packages\fastai\basic_train.py", line 462, in load_learner
state = pickle.load(open(path/fname, 'rb'))
File "\lib\pathlib.py", line 1006, in __new__
% (cls.__name__,))
NotImplementedError: cannot instantiate 'PosixPath' on your system
我的路径定义为:
folder_path = './models/model1'
fname = 'model.pkl'
我将该函数称为:
model = load_learner(folder_path, fname)
如何在此函数中使用 Windows 路径?
更新 1
发布的答案仅在 Linux 上是正确的。我在 Windows 上仍有问题。我没有找到在 Windows 上通过 PosixPath 的方法。我找到的唯一解决方案是从我的模块中更改内部包,但这不是解决此类问题的安全方法。
提前致谢。
根据提供的错误消息,您正在使用 pathlib
。所以你不需要在这里使用+ '/' +
:str(path) + '/' + str(fname)
/
作为路径分隔符适用于 Linux/Unix:
state = pickle.load(open(path / fname, 'rb'))
在 Windows 上使用 .joinpath()
代替:
state = pickle.load(open(path.joinpath(fname), 'rb'))
如果您不打算使用 pathlib
,请使用 os.path.join()
。它会自动 select 为您的 OS 设置正确的格式。
根据我自己的问题,我找到了一个方法:
from pathlib import Path
folder_path = Path('./models/model1')
更新 1
此解决方案仅适用于 Linux,适用于 Windows 我仍然遇到错误。
这里的问题与 Python 根据 OS 处理路径的方式不同有关:
PosixPath
- 在 Linux / UnixWindowsPath
- 在 Windows
当在一个 OS 上使用 pickle
持久化对象时(比如说 Linux - 在这种情况下)关于类型的信息 / class 也会被持久化(这里: PosixPath
).
现在,当 pickle 文件被加载时 Python 假设它将能够根据它之前保存的类型信息重新创建对象。在这种情况下,它会尝试重新创建 PosixPath
类型的对象,该对象被 pathlib
库阻止并且无法在 Windows 上实例化。在 Windows 上应该使用 WindowsPath
,但是 pickle
模块不能很好地处理这种 OS 相关的逻辑,因此它无奈地抛出错误。
理论上您可以干预 pathlib
的代码以删除 OS 检查,但没有简单的解决方法,但要避免酸洗 OS 依赖的对象(例如,将路径存储为字符串 - 正如 os.path
所做的那样 - 肯定会解决这个问题)。
PurePosixPath
class。
我正在做同样的工作——将 fastai 模型部署为网络服务器,但遇到了同样的问题,这就是我所做的…… 导出模型时使用 joblib 或 pickle 来 pickle 模型而不是使用 learn.export() 并在服务器中使用以下代码。
__model = pickle.load(open(os.path.join('./artifacts/saved_model.pkl'), 'rb'))
这样做可以解决路径问题,但由于模型是使用 GPU 训练的,因此会出现错误,要求将存储映射到 CPU
只需将 PosixPath
重定向到 WindowsPath
。
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
我也在加载 fastai
个模型,这个技巧很管用。
对于posix路径错误: 当您在 colab/gradient 上训练您的模型并下载它时, 然后对 Windows.
进行推理只需将 PosixPath
重定向到 WindowsPath
:
import pathlib
temp = pathlib.PosixPath
pathlib.PosixPath = pathlib.WindowsPath
在处理 Windows 时,您可以暂时将 pathlib.PosixPath
设置为 WindowsPath
。恢复到原始值很重要,尤其是在 pickle 加载过程中出现异常时。
一个简单的方法是 try / finally
:
posix_backup = pathlib.PosixPath
try:
pathlib.PosixPath = pathlib.WindowsPath
learn_inf = load_learner(EXPORT_PATH)
finally:
pathlib.PosixPath = posix_backup
如果你经常这样做,你可以使流程更顺畅,如下所示:
- 定义一个可以临时进行更改的函数
- 在
with
块中使用它
您可以将其添加到某处(如果您使用 Jupyter,则在脚本或专用单元格的顶部)。
from contextlib import contextmanager
import pathlib
@contextmanager
def set_posix_windows():
posix_backup = pathlib.PosixPath
try:
pathlib.PosixPath = pathlib.WindowsPath
yield
finally:
pathlib.PosixPath = posix_backup
然后,像这样使用它:
EXPORT_PATH = pathlib.Path("model.pkl")
with set_posix_windows():
learn_inf = load_learner(EXPORT_PATH)
...另外,检查 sophros 的答案: