PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
21.63k stars 5.44k forks source link

使用其他op实现2.3中的cumprod算子 #63900

Closed VVJY closed 1 week ago

VVJY commented 1 week ago

请提出你的问题 Please ask your question

在线使用的paddle版本为2.0不支持cumprod算子,为了模型尽快上线,想要在paddle2.0版本下使用其他op实现cumprod功能,应该怎样高效实现呢? 直接for循环计算累乘,代码如下,这样功能和性能上ok么? def manual_cumprod(tensor, axis=0, name_t):

获取张量的形状

    shape = tensor.shape
    # 获取累积乘积的维度大小
    cumprod_dim_size = shape[axis]

    # 初始化累积乘积的结果张量,与输入张量形状相同,数据类型一致
    cumprod_tensor = paddle.zeros_like(tensor, name = name_t)

    # 沿着指定维度进行循环,计算累积乘积
    for i in range(cumprod_dim_size):
        # 如果是第一次循环,直接将当前位置的元素复制到结果张量中
        if i == 0:
            cumprod_tensor = tensor.slice(axis=axis, start=i, end=i+1)
        else:
            # 否则,将当前位置的元素与之前的累积乘积相乘,并更新结果张量
            prev_cumprod = cumprod_tensor.slice(axis=axis, start=i-1, end=i)
            curr_element = tensor.slice(axis=axis, start=i, end=i+1)
            curr_cumprod = prev_cumprod * curr_element
            # 更新结果张量中当前位置及之后位置的元素
            cumprod_tensor.slice_assign(curr_cumprod, axis=axis, start=i)
    return cumprod_tensor
BiynXu commented 1 week ago

这种方式组网大概率性能会比较差。 建议升级paddle版本到2.6,paddle2.3以上有cumprod算子的实现。 或者考虑自定义算子。