软件开放和网站开发,wordpress分类目录打不开,网站管理建设的总结,网站刚通过备案首先不得不佩服大模型的强大之处#xff0c;在算法移植过程中遇到einsum算子在ONNX中不支持#xff0c;因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法#xff0c;但是该方法会… 首先不得不佩服大模型的强大之处在算法移植过程中遇到einsum算子在ONNX中不支持因此需要使用普通算子替代。参考TensorRT - 使用torch普通算子组合替代torch.einsum爱因斯坦求和约定算子的一般性方法。可以写出简单的替换方法但是该方法会导致训练时还是推理都很慢并且会消耗大量显存造成显存溢出的问题。。因此采用提问文心一言没想到居然真的回答正确了。当然替换需要验证不是全对的。 1.einsum(delta, A, ‘b l d_in, d_in n - b l d_in n’) 的替换以下两个方法均可以
deltaA torch.exp(einsum(delta, A, b l d_in, d_in n - b l d_in n))
deltaA torch.exp(delta.unsqueeze(dim3)*A.unsqueeze(dim0).unsqueeze(dim0))
deltaA torch.exp(delta.unsqueeze(-1).repeat_interleave(A.shape[1], dim-1) * A)2.einsum(x, C[:, i, :], ‘b d_in n, b n - b d_in’)以下两个方法均可以 y einsum(x, C[:, i, :], b d_in n, b n - b d_in)y (x*C[:, i, :].unsqueeze(dim1)).sum(dim2)y torch.matmul(C[:, i, :], x.transpose(-1, -2)).squeeze(1)3.einsum(delta, B, u, ‘b l d_in, b l n, b l d_in - b l d_in n’)以下两个方法均可以
deltaB_u einsum(delta, B, u, b l d_in, b l n, b l d_in - b l d_in n)
deltaB_u1 delta.unsqueeze(dim3)*B.unsqueeze(dim2)*u.unsqueeze(dim3)下述方法是提问文心一言的办法注意需要将答案的结果和einsum的结果进行对比采用np.testing.assert_allclose(deltaB_u.numpy(),deltaB_u1.numpy(),rtol1e-05,atol1e-05)和print(deltaA.equal(deltaA_manual))均可以。
import torch
import numpy as np
from einops import rearrange, repeat, einsum
# 给定的张量
delta torch.ones([1, 3, 2])
A torch.ones([2, 4])
deltaA torch.exp(einsum(delta, A, b l d_in, d_in n - b l d_in n))
deltaA1 torch.exp(delta.unsqueeze(dim3)*A.unsqueeze(dim0).unsqueeze(dim0))
deltaA_manual torch.exp(delta.unsqueeze(-1).repeat_interleave(A.shape[1], dim-1) * A)
np.testing.assert_allclose(deltaA.numpy(),deltaA1.numpy(),rtol1e-05,atol1e-05)# 扩展 delta 的维度以便它可以与 A 进行广播broadcast
# 这里我们使用 unsqueeze 和 repeat_interleave 来扩展维度
delta_expanded delta.unsqueeze(-1).repeat_interleave(A.shape[1], dim-1)
# 执行逐元素的乘法然后取指数
deltaA_manual torch.exp(delta_expanded * A)# 注意deltaA_manual 的形状是 [1, 3, 2, 4]这与 einsum 的输出形状一致
print(deltaA.equal(deltaA_manual))
print(deltaA1.equal(deltaA_manual))