【问题标题】:Error while deserializing the Apache MXNet object反序列化 Apache MXNet 对象时出错
【发布时间】:2018-04-04 19:21:07
【问题描述】:

我使用 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]

有人可以建议如何解决这个问题吗?

【问题讨论】:

  • 你是如何创建model.tar.gz的?您能否分享创建此文件的代码?
  • 您提供的链接说可以使用您使用的代码加载 k-means 模型。请注意,并非所有模型都可以保存/加载为 NDArray。你用的是什么型号?
  • @IndhuBharathi 我正在使用线性学习器模型。你能建议如何加载这个模型吗?此外,如果您能指出一些说明为每种算法加载模型的格式是什么的文档,那就太好了。

标签: mxnet amazon-sagemaker


【解决方案1】:

如果您的模型正确序列化为存档,那么应该至少有 2 个文件:

  1. model_name.json - 它包含模型的架构
  2. model_name.params - 它包含模型的参数

因此,要重新加载模型,您需要:

  1. 通过加载 json 文件恢复模型本身。
  2. 恢复模型参数(您不使用 mxnet nd.array,而是使用完整模型)。

下面是代码示例:

# 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找到。

【讨论】:

    【解决方案2】:

    我通过 AWS Sagemaker 训练了一个常用的线性学习器算法。它在输出文件夹中创建了一个名为 model.tar.gz 的模型对象。正如 Vasanti 所指出的,有一些符号表示这些对象是 article 中的 mxnet 对象

    我知道我必须解压 tar,但我没有意识到有多少次。我从这段代码开始:

    import subprocess  
    cmdline = ['tar','-xzvf','model.tar.gz'] 
    subprocess.call(cmdline)
    

    它产生了一个名为“model_algo-1”的文件,它把我带到了这个页面。但是,它仍然是一个打包文件。所以运行:

    cmdline = ['tar','-xzvf','model_algo-1'] 
    subprocess.call(cmdline)
    

    这会产生:

    • 附加参数.json
    • manifest.json
    • mx-mod-0000.params
    • mx-mod-symbol.json

    从那里,您可以利用 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 对象以获得我真正想要的东西,这是一个特征重要性等级顺序和某些模型可解释性的权重。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      相关资源
      最近更新 更多