火炬修复 - 支持自动修复的PyTorch使用代码的代码检查工具
项目描述
火炬修复 - 支持自动修复的PyTorch使用代码的代码检查工具
火炬修复是一个Python代码静态分析工具 - 具有自动修复功能的代码检查工具 - 专门为PyTorch用户设计。它可以用来查找和修复使用已弃用的PyTorch函数和非公共符号等问题,并在一般情况下采用PyTorch最佳实践。
火炬修复基于https://github.com/Instagram/LibCST - 一个用于操作Python具体语法树的库。LibCST除了报告问题之外,还支持“代码重构”(自动修复)。
火炬修复可以用作Flake8插件(仅限代码检查)或作为独立的程序(对部分代码检查违规提供自动修复)。
[!警告] 目前火炬修复处于 测试版 阶段,所以还有很多粗糙的边缘,很多事情可以,并且将会改变。
安装
要从GitHub安装最新代码,克隆/下载 https://github.com/pytorch-labs/torchfix 并在目录内运行 pip install .
。
要从PyPI安装发布版本,运行 pip install torchfix
。
使用
安装后,TorchFix 将作为 Flake8 插件可用,因此正常运行 Flake8 将运行 TorchFix 检查器。
要仅显示 TorchFix 警告而无需显示 Flake8 检查器的其余部分,可以运行 flake8 --isolated --select=TOR0,TOR1,TOR2
TorchFix 还可以作为独立程序运行:torchfix .
添加 --fix
参数尝试自动修复一些问题(文件将被覆盖!)要查看一些额外的调试信息,请添加 --show-stderr
参数。
[!注意] 请记住,自动修复是一个最佳努力机制。鉴于 Python 的动态特性,特别是 TorchFix 的测试版状态,更改代码时很难确定,即使是看似微不足道的修复。
默认启用对以 TOR0、TOR1 和 TOR2 开头的代码问题的警告。其他代码的警告可能太嘈杂,因此默认未启用。要启用它们,请使用标准 flake8 配置选项的插件模式或使用 torchfix --select=ALL .
的独立模式。
问题报告
如果您遇到 TorchFix 的错误或其他问题,请在此处提交问题 https://github.com/pytorch-labs/torchfix/issues。
规则代码分配策略
新规则代码按以下类别增量分配
- TOR0XX, TOR1XX:通用
torch
功能。 - TOR2XX:特定领域的规则,例如 TorchVision。
- TOR4XX:默认禁用的嘈杂规则。
- TOR9XX:针对
pytorch/pytorch
仓库的特定内部规则,其他用户不应使用这些。
TOR0、TOR1 和 TOR2 默认启用。
规则
TOR001 已删除函数的使用
torch.solve
此函数自 PyTorch 版本 1.9 起已弃用,现在已删除。
torch.solve
已弃用,并推荐使用 torch.linalg.solve
。 torch.linalg.solve
的参数顺序相反,并且不返回 LU 分解。
要获取 LU 分解,请参阅 torch.lu
,它可以与 torch.lu_solve
或 torch.lu_unpack
一起使用。
X = torch.solve(B, A).solution
应替换为 X = torch.linalg.solve(A, B)
。
torch.symeig
此函数自 PyTorch 版本 1.9 起已弃用,现在已删除。
torch.symeig
已弃用,并推荐使用 torch.linalg.eigh
。
默认行为已从默认使用矩阵的上三角部分更改为使用下三角部分。
L, _ = torch.symeig(A, upper=upper)
应替换为
L = torch.linalg.eigvalsh(A, UPLO='U' if upper else 'L')
和
L, V = torch.symeig(A, eigenvectors=True)
应替换为
L, V = torch.linalg.eigh(A, UPLO='U' if upper else 'L')
TOR002 在赋值中可能存在 require_grad
错误拼写。你是想写 requires_grad
吗?
这是一个常见的错误拼写,可能导致无声的性能问题。
请显式传递 use_reentrant
到 checkpoint
torch.utils.checkpoint
中 use_reentrant
参数的默认值正在从 True
更改为 False
。在此期间,需要显式传递该值。
有关详细信息,请参阅此 论坛帖子。
TOR004 已删除函数的导入
参见 TOR001
。
使用弃用函数
torch.nn.utils.weight_norm
此函数已弃用。使用 torch.nn.utils.parametrizations.weight_norm
,它使用现代参数化 API。新的 weight_norm
与由旧 weight_norm
生成的 state_dict
兼容。
迁移指南
-
大小(
weight_g
)和方向(weight_v
)现在分别表示为parametrizations.weight.original0
和parametrizations.weight.original1
。 -
要删除权重归一化重新参数化,请使用
torch.nn.utils.parametrize.remove_parametrizations
。 -
权重不再在模块正向传播时一次性重新计算;而是将在每次访问时重新计算。要恢复旧行为,请在调用相关模块之前使用
torch.nn.utils.parametrize.cached
。
torch.backends.cuda.sdp_kernel
此函数已弃用。请改用 torch.nn.attention.sdpa_kernel
上下文管理器。
迁移指南:每个布尔型输入参数(除非指定,否则默认为true)对应一个SDPBackened
。如果输入参数为true,则应将相应的后端添加到sdpa_kernel
的输入列表中。
torch.chain_matmul
此函数已弃用,建议使用torch.linalg.multi_dot
。
迁移指南:multi_dot
接受两个或更多张量的列表,而chain_matmul
接受多个张量作为输入参数。为了迁移,将chain_matmul
参数中的多个张量转换为两个或更多张量的列表用于multi_dot
。
示例:将torch.chain_matmul(a, b, c)
替换为torch.linalg.multi_dot([a, b, c])
。
torch.cholesky
torch.cholesky()
已弃用,建议使用torch.linalg.cholesky()
。
迁移指南
L = torch.cholesky(A)
应替换为L = torch.linalg.cholesky(A)
。L = torch.cholesky(A, upper=True)
应替换为L = torch.linalg.cholesky(A).mH
torch.qr
torch.qr()
已弃用,建议使用torch.linalg.qr()
。
迁移指南
- 使用
Q, R = torch.qr(A)
应替换为Q, R = torch.linalg.qr(A)
。 torch.qr
的布尔参数some
在torch.linalg.qr
中替换为字符串参数mode
。使用方法上的相应变化是从Q, R = torch.qr(A, some=False)
到Q, R = torch.linalg.qr(A, mode="complete")
。
torch.range
torch.range()
函数已弃用,因为它的用法与Python内置的range不兼容。相反,使用torch.arange()
,因为它产生[start, end)
范围内的值。
迁移指南
torch.range(start, end)
产生范围在[start, end]
内的值。但torch.arange(start, end)
产生范围在[start, end)
内的值。对于步长为1,从torch.range(start, end, 1)
迁移使用到torch.arange(start, end+1, 1)
。
TOR102 torch.load
无weights_only
参数是不安全的。
仅当您信任加载的数据并且需要完整的pickle功能时,才显式将weights_only
设置为False,否则设置为weights_only=True
。
TOR103 导入已弃用函数
参见TOR101
。
许可证
TorchFix遵循BSD许可证,如LICENSE文件所示。
项目详情
下载文件
下载适合您平台的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。