跳转到主要内容

火炬修复 - 支持自动修复的PyTorch使用代码的代码检查工具

项目描述

火炬修复 - 支持自动修复的PyTorch使用代码的代码检查工具

PyPI

火炬修复是一个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.solvetorch.linalg.solve 的参数顺序相反,并且不返回 LU 分解。

要获取 LU 分解,请参阅 torch.lu,它可以与 torch.lu_solvetorch.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_reentrantcheckpoint

torch.utils.checkpointuse_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.original0parametrizations.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的布尔参数sometorch.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.loadweights_only参数是不安全的。

仅当您信任加载的数据并且需要完整的pickle功能时,才显式将weights_only设置为False,否则设置为weights_only=True

TOR103 导入已弃用函数

参见TOR101

许可证

TorchFix遵循BSD许可证,如LICENSE文件所示。

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。

源分布

torchfix-0.6.0.tar.gz (22.2 kB 查看哈希值)

上传时间

构建分布

TorchFix-0.6.0-py3-none-any.whl (28.9 kB 查看哈希值)

上传时间 Python 3

由以下支持