Closed
XPU 三方执行丢弃 self 名输入 #419
FishPotatoChenAdd on  21 days agoClosed at  17 days ago
FishPotatoChen
FishPotatoChenCollaborators
21 days ago Create

aten 命名惯例下,ACLNN 算子 C 接口的首个输入参数名多为 self(如 aclnnReal(aclTensor *self, aclTensor *out))。TTK 做 XPU 三方校验时,输入按参数名发给 xpu-server 按名绑定,但服务端把 self 当特殊名过滤掉了:类形式插件通路(bind_params)里,绑定 __call__ 的签名已无 self,池中 self 名输入本应经 *args 位置送达,却在 leftover 分发处被整体丢弃——既不进 **kwargs(防与实例位冲突,合理),也进不了 *args(与 docstring "use *args to receive it positionally" 的承诺矛盾);无插件的 api 自动解析通路(_invoke_function 三相位)同样全部过滤 self。结果凡输入参数名含 self 的算子(绝大多数 aclnn 算子),XPU 三方执行收不到输入、报 500,cross_check 一律 third_party unavailable,而 NPU 侧执行正常。修复后 self 名输入按普通输入对待:经 *args 按 C 头文件序位置送达,仅在与实例位冲突(绑定方法 / 未绑定 __init__ 的 **kwargs)时绕行,普通函数签名中的 self 形参视为真实参数名按名绑定。

likedislike
RuiWang_Collaborators
18 days ago Comments:

感谢反馈。当前 master(HEAD 127cec9)代码核对确认:XPU 三方执行两条通路均丢弃 self 名输入,与描述一致。

  • 类形式插件通路:_bind(ttk/remote/server/executor.py:534-548)→ bind_params(ttk/core_modules/common/xpu.py:297-366)。绑定后 __call__ 签名已无 self 形参,self 名输入在 leftover 分发处被 k != "self"(xpu.py:358)过滤,既不进 **kwargs 也不进 *args。
  • 无插件 api 自动解析通路:_invoke_function(executor.py:591-638)三相位全部过滤 self:kwargs 相位(executor.py:604)、位置相位(executor.py:613)、签名 zip 相位(executor.py:637)。
  • 后果:凡输入参数名含 self 的 aclnn 算子(如 aclnnReal 的 self),三方执行收不到输入报 500,cross_check 呈现 third_party unavailable,NPU 侧不受影响。

修复方向:self 名输入按普通输入对待,经 *args 按 C 头序送达;param_order 机制已支持按头序重排(executor.py:537-547),仅在与实例位冲突时绕行;普通函数签名中的 self 形参按真实参数名绑定。当前 master 无该修复。
环境说明:本机无 NPU,未做端到端三方实测,结论为代码路径核对。

likedislike
CANN-robotCANN-robotCollaborators
17 days ago Close issue
CANN-robotCANN-robotCollaborators
17 days ago Added label: resolved