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

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
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants