我使用Amazon SageMaker训练并保存了一个模型,该模型以model.tar.gz
格式保存模型,当解压缩时,模型model_algo-1
是一个序列化的Apache MXNet对象。要在内存中加载模型,我需要反序列化模型。我尝试这样做:
import mxnet as mx
print(mx.ndarray.load('model_algo-1'))
摘自https://docs.aws.amazon.com/sagemaker/latest/dg/cdf-training.html
然而,这样做会产生以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.4/site-packages/mxnet/ndarray/utils.py", line
175, in load
ctypes.byref(names)))
File "/usr/local/lib/python3.4/site-packages/mxnet/base.py", line 146, in
check_call
raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: [19:06:25] src/ndarray/ndarray.cc:1112: Check failed:
header == kMXAPINDArrayListMagic Invalid NDArray file format
Stack trace returned 10 entries:
[bt] (0) /usr/local/lib/python3.4/site-packages/mxnet/libmxnet.so(+0x192112)
[0x7fe432bfa112]
[bt] (1) /usr/local/lib/python3.4/site-packages/mxnet/libmxnet.so(+0x192738)
[0x7fe432bfa738]
[bt] (2) /usr/local/lib/python3.4/site-
packages/mxnet/libmxnet.so(+0x24a5c44) [0x7fe434f0dc44]
[bt] (3) /usr/local/lib/python3.4/site-
packages/mxnet/libmxnet.so(MXNDArrayLoad+0x248) [0x7fe434d19ad8]
[bt] (4) /usr/lib64/libffi.so.6(ffi_call_unix64+0x4c) [0x7fe48c5bbcec]
[bt] (5) /usr/lib64/libffi.so.6(ffi_call+0x1f5) [0x7fe48c5bb615]
[bt] (6) /usr/lib64/python3.4/lib-dynload/_ctypes.cpython-
34m.so(_ctypes_callproc+0x2fb) [0x7fe48c7ce18b]
[bt] (7) /usr/lib64/python3.4/lib-dynload/_ctypes.cpython-34m.so(+0xa4cf)
[0x7fe48c7c84cf]
[bt] (8) /usr/lib64/libpython3.4m.so.1.0(PyObject_Call+0x8c)
[0x7fe4942fcb5c]
[bt] (9) /usr/lib64/libpython3.4m.so.1.0(PyEval_EvalFrameEx+0x36c5)
[0x7fe4943ac915]
有人可以建议如何解决这个问题吗?
答案 0 :(得分:2)
如果您的模型已正确序列化为存档,则至少应有2个文件:
因此,要重新加载模型,您需要:
以下是如何执行此操作的代码示例:
# sym_json - content of .json file
net = gluon.nn.SymbolBlock(
outputs=mx.sym.load_json(sym_json),
inputs=mx.sym.var('data'))
# params_filename - full path to parameters file
net.load_params(params_filename)
如果您还想检查模型的序列化,请查看this example。此示例显示如何在上传到SageMaker之前手动序列化经过训练的模型。
有关手动序列化和反序列化模型的更多详细信息,请参见here。
答案 1 :(得分:0)
我通过AWS Sagemaker训练了一个线性学习器算法。它在输出文件夹中创建一个名为model.tar.gz的模型对象。正如Vasanti所指出的那样,有些符号表示article
中的这些对象是mxnet对象。我知道我必须打开焦油包装,但我没有意识到是多少次。我从以下代码开始:
import subprocess
cmdline = ['tar','-xzvf','model.tar.gz']
subprocess.call(cmdline)
生成名为“ model_algo-1”的文件,该文件将我带到了此页面。但是,它仍然是打包文件。因此运行:
cmdline = ['tar','-xzvf','model_algo-1']
subprocess.call(cmdline)
这将产生:
从那里,您可以利用Sergei的帖子:
# load the json file
import json
sym_json = json.load(open('mx-mod-symbol.json'))
sym_json_string = json.dumps(sym_json)
# open model
import mxnet as mx
from mxnet import gluon
net = gluon.nn.SymbolBlock(
outputs=mx.sym.load_json(sym_json_string),
inputs=mx.sym.var('data'))
# params file
net.load_parameters('mx-mod-0000.params', allow_missing=True)
现在,如果我只知道如何处理此mxnet / gluon对象,则可以得到我真正想要的东西,这是某些模型可解释性的功能重要性等级顺序和权重。