已知问题【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto使用未初始化的Tensor问题现象描述使用pypto.tensor声明了一个Tensor误以为它与torch.empty类似。会申请一块未初始化的内存。在再次写入前直接读取它如使用 view会导致框架校验错误或精度问题。问题原因在PyPTO中除了使用pypto.full、pypto.zeros等显式包含初始化行为的Tensor声明外还可以使用pypto.tensor声明 Tensor但该接口不包含初始化行为。在PyPTO中每个Tensor必须先写后读即必须先有producer然后才能有consumer未初始化的Tensor不申请内存。框架中通常会校验直接使用no producer Tensor并报错但有时因校验遗漏可能会导致上板精度错误。处理步骤避免使用未经初始化的Tensor。同一个Tensor进行View和Assemble导致图成环报错问题现象描述示例代码如下pypto.frontend.jit def foo_kernel(x, y): pypto.set_vec_tile_shapes(16, 16) a pypto.zeros([32, 32]) b a[:16, :16] # 从a中view获取数据 a[16:, 16:] b.exp() # 计算后assemble写回a y[:] x a torch.npu.set_device(0) x torch.ones(32, 32, dtypetorch.float32) y torch.empty(32, 32, dtypetorch.float32) foo_kernel(pypto.from_torch(x), pypto.from_torch(y))执行时报错ASSERTION FAILEDERROR:root:Record function foo_kernel failed: ASSERTION FAILED: outDegree[opToIndex[op.get()]] 0详细报错如下ERROR:root:Record function foo_kernel failed: ASSERTION FAILED: outDegree[opToIndex[op.get()]] 0 Operation not fully processed: /* /home/pypto-dev/a.py:9 */ 32 x 32 x DT_FP32 / 32 x 32 x DT_FP32 %02#(-1)MEM_UNKNOWN::MEM_UNKNOWN !10000 VEC_DUP(g:-1, s:-1) #SCALAR{0.000000} #op_attr_shape{[32, 32]} #op_attr_validShape{[32,32]} , func GetSortedOperations, file function.cpp, line 1105 libtile_fwk_interface.so(npu::tile_fwk::Function::GetSortedOperations() const0xb3c) [0xffff9c2f6650] libtile_fwk_interface.so(npu::tile_fwk::Function::SortOperations()0x38) [0xffff9c2f6f28] libtile_fwk_interface.so(npu::tile_fwk::Function::EndFunction(std::shared_ptrnpu::tile_fwk::TensorSlotScope const)0x960) [0xffff9c31b8d0] libtile_fwk_interface.so(npu::tile_fwk::Program::FinishCurrentFunction(std::shared_ptrnpu::tile_fwk::TensorSlotScope const, bool)0x1b0) [0xffff9c532274] libtile_fwk_interface.so(npu::tile_fwk::Program::EndFunction(std::string const, bool)0x10c) [0xffff9c536dcc] libtile_fwk_interface.so(npu::tile_fwk::Program::EndHiddenLoop(npu::tile_fwk::Function*, bool)0xb0) [0xffff9c537384] libtile_fwk_interface.so(npu::tile_fwk::Program::EndFunction(std::string const, bool)0x5c) [0xffff9c536d1c] libtile_fwk_interface.so(npu::tile_fwk::RecordLoopFunc::IterationEnd()0x44) [0xffff9c5399c4] libtile_fwk_interface.so(npu::tile_fwk::RecordLoopFunc::Iterator::operator!(npu::tile_fwk::RecordLoopFunc::IteratorEnd const)0xfc) [0xffff9c539ea0]原因分析该报错的原因是内部在对基本算子做拓扑排序时发现存在环路的报错。这是由于数据从a中读取又写回a导致的。由于pypto描述的是一个图表达在读取和写入的时候当前认为a是一个整体因此创建的连接关系会形成一个环路即a-b-b.exp()-a而pypto不允许构造出的图内存在环路必须为DAG有向无环图所以才有这个报错。解决措施当前需要将读取和写入a的逻辑拆分成两个图去定义避免一个图内存在环路。后续等Assemble的SSA语义上线后使用该写法不会有问题。同一个算子多次执行时静态轴传入不同的运行时值或者动态轴缺少标注问题现象描述精度错误或者AI CPU/AI Core异常。可能原因由于编译时会针对静态轴进行固定大小的切分因此切分的数量也是固定的。这意味着一次编译后的代码只能处理一个特定的静态轴。如果传入的静态轴与首次编译时的不一致切分后访问的内存地址可能会超出实际传入的Tensor的大小导致内存访问错误或对其他Tensor造成干扰从而引发精度异常。处理步骤方案1针对每一次不同的静态值定义不同的算子。def handler(in): # 定义公共处理函数 return pypto.add(in, in) pypto.frontend.jit def adder_256(in_shape_256): # 定义处理in 轴大小是256的场景 return handler(in_shape_256) pypto.frontend.jit def adder_1024(in_shape_1024): # 定义处理 in 轴大小是 1024 的算子 return handler(in_shape_1024) adder_256(in_256) adder_1024(in_1024)方案2定义为动态轴pypto.frontend.jit def adder(in_shape): # 定义处理in 轴大小是256的场景 out Tensor(in_shape.shape[0]) for k in pypto.loop(in_shape.shape[0] / 256): out[k * 256: k *256 256] pypto.add( in[k * 256 : k * 256 256], in[k * 256 : k * 256 256]) return handler(in_shape_256)父循环内跨多个子循环的Tensor内存不支持在每次父循环迭代中分配问题现象描述两层或者两层以上循环嵌套下在父循环中定义了一个 tensor在一个子循环中写入该 tensor在另一个子循环中使用该 tensor 时存在精度错误。可能原因在该GM上的Tensor在父循环的多次迭代中每次迭代分配的内存地址相同导致不同迭代本应使用不同的临时内存来保存数据但实际上使用了相同的地址。由于不同循环迭代实际上是并行执行的因此当多个迭代同时进行时后执行的迭代会覆盖前一次迭代的临时内存从而导致精度问题。处理步骤在后一个子循环中添加submit_before_loop True以在启动该子循环前下发任务强制多次迭代串行运行从而避免并行执行时因内存覆盖和冲突导致的精度问题。for outer in pypto.loop(...): # 父循环执行至少两次如果只执行一次不存在多次并行覆盖的问题 t pypto.Tensor(...) # 定义一个临时tensor for inner0 in pypto.loop(...): # 第一个子循环对临时tensor t赋值 ... t[...] ... # 添加 submit_before_loop确保父循环多次迭代不在同一个并行执行块中 for inner1 in pypto.loop(..., submit_before_loopTrue): # 第二个子循环使用了临时 tensor t x[:] t[:] t[:]SymbolicScalar不支持循环内自增问题现象描述pypto.frontend.jit def add_kernel_1(a, b, c): count 0 for i in pypto.loop(20): count count 1当实际执行到i 1时count并不会像用户预期的那样从0依次增加到20。可能原因当前PyPTO框架仅捕获了用户的Tensor操作而未捕获用户的scalar操作因此不会将count处理为变量。目前只有循环变量能够实现自增。处理步骤使用循环变量来表达自增逻辑。已安装torch_npu但未安装cann时执行仿真异常问题现象描述在仿真环境中执行算子时出现失败报错信息如下。ImportError: libhccl.so: cannot open shared object file: No such file or directory问题原因当程序启动时torch版本2.5会自动加载所有名为“torch.backends”的扩展例如 torch npu。如果环境中已安装了torch_npu但未安装CANN由于找不到依赖项将会引发异常。处理步骤在执行算子之前添加以下环境变量可以避免上述异常。export TORCH_DEVICE_BACKEND_AUTOLOAD0【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考