使用coremltools转换PyTorch模型遇len算子未实现的问题咨询
问题1:为什么Python内置len会被识别为待转换的PyTorch算子
你在转换前调用了torch.jit.script对模型做序列化,TorchScript的作用是把动态的Python模型逻辑转换为静态的计算图表示,所有作用在torch.Tensor上的Python内置操作都会被映射为对应的PyTorch ATen算子,其中作用于张量的len(x)调用会被直接映射为aten::len算子,而非保留Python原生函数逻辑。coremltools的PyTorch转换器解析的就是TorchScript输出的计算图,因此会把len当作需要转换的算子来处理,当前版本的coremltools没有内置该算子的转换实现,因此会抛出缺失报错。
问题2:解决方案相关
你可以选择通过register_torch_op实现自定义转换器来修复该错误,但更推荐优先使用更简单的原生算子替换方案规避问题:
- 最优规避方案:直接把
len(x)替换为x.shape[0],二者对一维张量的输出完全一致,且shape相关算子属于coremltools默认支持的算子列表,不需要额外开发自定义转换逻辑,改一行代码即可解决问题。 - 自定义转换器方案:如果场景限制不能替换
len调用,可以通过coremltools提供的自定义算子注册接口实现len算子的转换逻辑,只需要在转换前注册该算子,逻辑为取输入张量的第一维长度输出即可。
内容的提问来源于stack exchange,提问作者Alexander Karpov
相关产品推荐
相关产品推荐

