Skip to content

Conversation

@HeyDavid633
Copy link
Contributor

PR Category

Operator Mechanism

PR Types

Bug fixes

Description

Paddle文档中的介绍 paddle.linalg.slogdet(x) 计算批量矩阵 的 行列式值的符号值 和 行列式值绝对值的自然对数值
之前的修理PR #73706

x (Tensor):输入一个或批量矩阵。x 的形状应为 [*, M, M],其中 * 为零或更大的批次维度,数据类型支持 float32、float64。输出矩阵的行列式值 Shape 为 [2, *],

  • 行列式值 det(Determinant):对于一个矩阵 $A$,它的行列式值是一个标量,记作 $det(A)$
  • 行列式值的符号值(Sign of determinant):也就是 $det(A)$ 的正负号
  • 绝对值的自然对数值(Log of absolute value of determinant):即 $\log(\lvert\det(A)\rvert)$ ,取的是绝对值后再取自然对数
  • 特殊情况的处理:如果 $det(A) = 0$$\lvert\det(A)\rvert$$\log(0) = -inf$

主要修改:

  1. 分批次处理:在反向时,batch_size 大于 65536 会触发 "cublasMatInv does not support batch_size > 65536" ,故将 paddle.linalg.slogdet 的反向过程修改为分批次处理,每个批次最大为 65536
  2. 大Tensor时的精度问题:在 batch_size 不是很大时,如(65538, 5, 5),反向精度没有问题;输入张量整体 numel() 为大Tensor 时反向精度问题,实际上是计算错误,90%以上对不齐

分批次处理:

原始的(不分批的)处理,导致报错如下:

test begin: paddle.linalg.slogdet(Tensor([3, 30422686, 5, 5],"float32"), ) W0804 14:35:05.232035 31530 gpu_resources.cc:114] Please NOTE: device: 0, GPU Compute Capability: 8.0, Driver API Version: 12.0, Runtime API Version: 11.8 W0804 14:36:07.242725 31530 backward.cc:462] While running Node (SlogdetGradNode) raises an EnforceNotMet exception [paddle error] backward paddle.linalg.slogdet(Tensor([3, 30422686, 5, 5],"float32"), ) (Unimplemented) cublasMatInv does not support batch_size > 65536. Got 91268058. (at /daiwenhao/Paddle/paddle/phi/kernels/funcs/matrix_inverse.cu:40)

根本原因在于如下过程,求逆矩阵时 cublasMatInv 对 batch_size 有限制,故在 batch_size > 65536 时分多个批次串行的方式解决,而 batch_size <= 65536 时不作改变。

phi::funcs::MatrixInverseFunctor<Context, T> mat_inv; mat_inv(dev_ctx, x, &inverse_A);

大Tensor时的精度问题:

Torch 支持该 API 在大tensor计算的,在原测试case下数值在90%以上对不齐。经PaddleAPITest测试 输入张量过了一定数量级后就有错,是妥妥的 paddle big tensor 问题
但经由 PaddleAPITest 的近期 PR 和 Paddle 近期相关 MatrixInverseFunctorTranspose 的PR;使得问题得以解决,原测试case全部通过
1111

@paddle-bot
Copy link

paddle-bot bot commented Aug 11, 2025

你的PR提交成功,感谢你对开源项目的贡献!
请关注后续CI自动化测试结果,详情请参考Paddle-CI手册
Your PR has been submitted. Thanks for your contribution!
Please wait for the result of CI firstly. See Paddle CI Manual for details.

@paddle-bot paddle-bot bot added the contributor External developers label Aug 11, 2025
@wanghuancoder wanghuancoder merged commit c466f94 into PaddlePaddle:develop Aug 12, 2025
52 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

contributor External developers

3 participants