
深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载Apache MXNet 从 v1.7 版本起引入了自定义错误类型custom error type支持MXNetError继承自 Python 内置的RuntimeError开发者可以在 C 后端注册自定义错误类型并为其错误消息添加类型前缀从而在前端Python抛出对应类型的异常。本文将以transpose算子抛出ValueError为例完整讲解错误类型注册机制的工作原理、注册流程与底层实现。错误类型注册机制概览MXNet 的算子Operator核心实现在 C 后端而用户通常通过 Python 前端调用。当后端发生错误时需要将错误信息跨语言边界FFIForeign Function Interface传递到 Python 前端并抛出合适的 Python 异常。v1.7 起引入的机制如下后端的错误消息以错误类型名: 错误详情的格式通过CHECK/LOG(FATAL)宏输出C API 层通过MXGetLastError暴露最近一次的错误字符串见 c_api.hPython 前端解析错误字符串提取错误类型名在已注册的错误类型表中查找对应的异常类并抛出。这套机制使得transpose等算子可以精确抛出ValueError、TypeError等符合 NumPy 语义的异常而不是笼统的MXNetError便于上层代码进行针对性捕获。C 后端如何声明错误类型以 transpose 为例假设我们希望 C 后端定义的transpose算子在 Python 前端调用出错时抛出ValueError。实现方式是在 C 校验逻辑中加入带错误类型前缀的CHECK_EQ断言CHECK_EQ(axes_set.size(), axes.ndim()) ValueError: Repeated axis in transpose. param.axes param.axes;该代码位于 src/operator/numpy/np_matrix_op-inl.h 的InferShape函数中当用户传入的axes存在重复维度如(0, 0, 1)时axes_set.size()去重后的大小与axes.ndim()维度数不相等触发断言失败并在错误消息最前方输出ValueError:前缀。完整的错误触发路径在 Python 前端执行如下调用from mxnet import np dat np.random.normal(0, 1, (3, 4, 5)) dat.transpose((0, 0, 1))调用链如下dat.transpose((0, 0, 1))进入 python/mxnet/numpy/multiarray.py 的transpose方法最终调用_mx_np_op.transpose(self, axesaxes)转发到 python/mxnet/ndarray/register.py 中生成的transpose算子函数进入 python/mxnet/_ctypes/ndarray.py 的_imperative_invoke通过ctypes调用 C APIMXImperativeInvokeC 后端执行InferShape校验触发CHECK_EQ失败错误信息含ValueError:前缀被记录回到 Python 端 python/mxnet/base.py 的check_call发现返回值非 0调用get_last_ffi_error()将错误转换为对应的 Python 异常并抛出。最终产生如下 tracebackValueError Traceback (most recent call last) ipython-input-3-3ad259b4e371 in module ---- 1 dat.transpose((0, 0, 1)) ~/mxnet-distro/mxnet-build/python/mxnet/numpy/multiarray.py in transpose(self, *axes) 1460 elif axes[0] is None: 1461 axes None - 1462 return _mx_np_op.transpose(self, axesaxes) 1463 1464 def flip(self, *args, **kwargs): ~/mxnet-distro/mxnet-build/python/mxnet/ndarray/register.py in transpose(a, axes, out, name, **kwargs) ~/mxnet-distro/mxnet-build/python/mxnet/_ctypes/ndarray.py in _imperative_invoke(handle, ndargs, keys, vals, out, is_np_op, output_is_list) 105 c_str_array(keys), 106 c_str_array([str(s) for s in vals]), -- 107 ctypes.byref(out_stypes))) 108 109 create_ndarray_fn _np_ndarray_cls if is_np_op else _ndarray_cls 110 ~/mxnet-distro/mxnet-build/python/mxnet/base.py in check_call(ret) 271 272 if ret ! 0: -- 273 raise get_last_ffi_error() 274 275 ValueError: Traceback (most recent call last): File src/operator/numpy/np_matrix_op.cc, line 77 ValueError: Check failed: axes_set.size() axes.ndim() (2 vs. 3) : Repeated axis in transpose. param.axes [0,0,1]可以看到最终抛出的异常类型是ValueError错误消息中同时保留了 C 后端的断言详情Check failed: axes_set.size() axes.ndim() (2 vs. 3)与自定义描述Repeated axis in transpose. param.axes [0,0,1]。测试用例验证仓库测试 tests/python/unittest/test_numpy_op.py 对该行为做了验证use_np def test_np_transpose_error(): # Test for error raising dat np.random.normal(0, 1, (3, 4, 5), dtypenp.float32) pytest.raises(ValueError, lambda: dat.transpose((0, 0, 1))) pytest.raises(MXNetError, lambda: dat.transpose((0, 1, 3)))transpose((0, 0, 1))因存在重复轴断言抛出的异常是ValueErrortranspose((0, 1, 3))因轴超出维度范围非法轴索引抛出的则是默认的MXNetError。已支持的 Python 错误类型截至本文撰写时MXNet 官方注册的错误类型定义在 python/mxnet/error.py 中除了MXNetError本身外还包括错误类型说明ValueError数值/参数取值不合法如重复轴TypeError类型不匹配AttributeError属性访问错误IndexError索引越界NotImplementedError功能未实现InternalError系统内部错误带 MXNet hint 提示IOError输入输出错误FloatingPointError浮点运算错误RuntimeError运行时错误MXNetError的基类需要说明的是该文件中的完整注册列表比原文档列举的五个类型更丰富实际支持范围以 python/mxnet/error.py 为准。若未找到匹配的错误类型get_last_ffi_error会回退到默认的MXNetError。如何注册自定义错误类型Python 前端注册在 Python 前端可以通过mx.error.register装饰器注册自定义错误类型import mxnet as mx mx.error.register class MyError(mx.MXNetError): def __init__(self, msg): super().__init__(msg)mx.error.register实际上是base.py中register_error的别名见 python/mxnet/error.py。register_error的实现位于 python/mxnet/base.py若直接传入可调用对象类或函数则以该对象的__name__作为错误类型名错误类被存入全局字典error_typespython/mxnet/base.py键为错误类型名值为对应的异常类。C 后端引用注册完成后在 C 后端即可通过如下方式引用MyErrorLOG(FATAL) MyError: this is a custom error message当该日志被触发时Python 前端会解析出MyError:前缀在error_types字典中查找到自定义异常类并抛出。错误消息解析与异常转换的底层原理Python 前端负责将 C 后端的错误字符串转换为 Python 异常核心逻辑在 python/mxnet/base.py1._find_error_type提取错误类型名python/mxnet/base.py 从错误消息的第一行中取第一个冒号之前的部分作为错误类型名并通过_valid_error_namepython/mxnet/base.py仅允许字母数字及_、.校验其合法性。例如ValueError: Repeated axis in transpose.会提取出ValueError。2.c2pyerror整理错误消息python/mxnet/base.py 将 C 端的原始错误消息按行解析识别并逆序还原Stack trace部分构造 Python 风格的 traceback其余行作为消息正文同时返回检测到的错误类型名。3.get_last_ffi_error创建异常对象python/mxnet/base.py 通过MXGetLastErrorC API声明见 include/mxnet/c_api.h获取最近一次错误字符串调用c2pyerror解析后在error_types字典中查找错误类型名对应的异常类并实例化return error_types.get(err_type, MXNetError)(py_err_msg)若未找到注册类型则回退为默认的MXNetError。4.check_call统一抛出python/mxnet/base.py 中check_call(ret)在 C API 返回值非 0 时调用get_last_ffi_error()并抛出异常。所有 MXNet 的 Python API 调用均通过它来检查错误。底层依赖MXNetError 与 RuntimeError 的关系自定义错误类型的注册依赖MXNetError继承自RuntimeError见 python/mxnet/base.py。这使得所有由 MXNet 抛出的异常无论是否注册了自定义类型都天然是RuntimeError的子类上层代码可以只捕获RuntimeError或MXNetError来兜底处理 MXNet 的所有错误未指定错误类型前缀时错误会以默认的MXNetError抛出。实践建议为算子添加语义化错误类型在 C 后端的CHECK/LOG(FATAL)消息前加上ValueError:、TypeError:等前缀能让前端错误更贴近 NumPy/Python 语义便于用户针对性捕获与排查自定义业务错误类型若需要暴露领域相关的错误如数据格式错误可在 Python 前端用mx.error.register注册自定义类并在后端使用自定义类型名: 错误消息的格式输出注意错误类型名的合法性错误类型名只能包含字母数字及_、.否则无法被_find_error_type正确提取最终会回退为MXNetError保持前后端消息格式一致错误消息必须以错误类型名:开头冒号为英文半角这是前端解析的关键约定。总结Apache MXNet 的自定义错误类型机制通过「C 后端在错误消息前附加类型前缀 Python 前端按类型名查找注册表并实例化异常」的协作方式实现了跨语言边界的语义化异常传递。开发者既可以在不修改前端的情况下为后端算子声明ValueError、TypeError等标准错误也可以通过mx.error.register注册完全自定义的错误类型使 MXNet 的异常体系更贴合 Python 生态的使用习惯。/DSMLparameter /DSMLinvoke /DSMLtool_calls赞分享深度学习人工智能机器学习分布式训练【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址https://gitcode.com/gh_mirrors/mx/mxnet点击查看免费下载相关推荐MXNet 自定义错误类型与异常处理机制从 C 后端到 Python 前端的类型化错误传递MXNet 自定义错误类型与异常处理机制从 C 后端到 Python 前端的类型化错误传递 Apache MXNet 通过 FFIForeign Fun人工智能深度学习机器学习容器开发必备container30错误处理机制全解析容器开发必备container30错误处理机制全解析 container30作为一款专为Apple silicon优化的轻量级Linux容器工具其稳定运行离CLI虚拟化容器运行时云原生10分钟上手react-bluekit快速搭建React组件库与实时预览环境10分钟上手react bluekit快速搭建React组件库与实时预览环境 react bluekitBlueKit 是一款开源的 React 组件库自上一篇OpenVSCode Server离线使用终极指南在没有互联网环境下的完整配置方法下一篇gh_mirrors/awe/awesome-sre容量预测基于机器学习的资源规划终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考