TORCHFIX es una herramienta de análisis estático de código Python, un linter con capacidades de autofix, para los usuarios de Pytorch. Se puede utilizar para encontrar y solucionar problemas como el uso de funciones de Pytorch en desacuerdo y símbolos no públicos, y para adoptar las mejores prácticas de Pytorch en general.
Torchfix se basa en https://github.com/instagram/libcst - una biblioteca para manipular los árboles de sintaxis de concreto de Python. LibCST habilita "CodeMods" (autofijos) además de los problemas de informes.
TORCHFIX se puede usar como un complemento Flake8 (solo pelucas) o como un programa independiente (con Autofix disponible para un subconjunto de las violaciones de la pelusa).
Advertencia
Actualmente, TorchFix está en una etapa de versión beta , por lo que todavía hay muchos bordes ásperos y muchas cosas pueden y cambiarán.
Para instalar el último código de GitHub, clone/descargue https://github.com/pytorch-labs/torchfix y ejecute pip install . Dentro del directorio.
Para instalar una versión de lanzamiento desde PYPI, ejecute pip install torchfix .
Después de la instalación, TORCHFIX estará disponible como un complemento Flake8, por lo que ejecutar Flake8 normalmente ejecutará el enlace TorchFix.
Para ver solo advertencias de Corchfix sin el resto de las revestimientos Flake8, puede ejecutar flake8 --isolated --select=TOR0,TOR1,TOR2
TorchFix también se puede ejecutar como un programa independiente: torchfix . Agregue el parámetro --fix para tratar de autoifijo algunos de los problemas (¡los archivos se sobrescribirán!) Para ver información de depuración adicional, Agregar --show-stderr .
Precaución
Tenga en cuenta que Autofix es un mecanismo de mejor esfuerzo. Dada la naturaleza dinámica de Python, y especialmente el estado de la versión beta de TorchFix, es muy difícil tener certeza al hacer cambios en el código, incluso para las soluciones aparentemente triviales.
Las advertencias para problemas con códigos que comienzan con Tor0, Tor1 y Tor2 están habilitadas de forma predeterminada. Las advertencias con otros códigos pueden ser demasiado ruidosos, por lo que no habilitadas de forma predeterminada. Para habilitarlos, use opciones de configuración estándar de Flake8 para el modo de complemento o use torchfix --select=ALL . para el modo independiente.
Si encuentra un error o algún otro problema con TorchFix, presente un problema en https://github.com/pytorch-labs/torchfix/issues.
Los nuevos códigos de reglas se asignan de forma incremental en las siguientes categorías:
torch de uso general.pytorch/pytorch , otros usuarios no deben usarlas.Tor0, Tor1 y Tor2 están habilitados de forma predeterminada.
Esta función estaba en desuso desde la versión 1.9 de Pytorch y ahora se elimina.
torch.solve está en desuso a favor de torch.linalg.solve . torch.linalg.solve tiene sus argumentos revertidos y no devuelve la factorización LU.
Para obtener la factorización LU, consulte torch.lu , que se puede usar con torch.lu_solve o torch.lu_unpack .
X = torch.solve(B, A).solution X = torch.linalg.solve(A, B)
Esta función estaba en desuso desde la versión 1.9 de Pytorch y ahora se elimina.
torch.symeig está en desuso a favor de torch.linalg.eigh .
El comportamiento predeterminado ha cambiado al usar la parte triangular superior de la matriz de forma predeterminada para usar la porción triangular inferior.
L , _ = torch . symeig ( A , upper = upper )debe ser reemplazado con
L = torch . linalg . eigvalsh ( A , UPLO = 'U' if upper else 'L' )y
L , V = torch . symeig ( A , eigenvectors = True )debe ser reemplazado con
L , V = torch . linalg . eigh ( A , UPLO = 'U' if upper else 'L' )require_grad en la asignación. ¿Quiso decir que requires_grad ?Esta es una falta de ortografía común que puede conducir a problemas de rendimiento silencioso.
use_reentrant Explícitamente al checkpoint El valor predeterminado del parámetro use_reentrant en torch.utils.checkpoint se está cambiando de True a False . Mientras tanto, el valor debe aprobarse explícitamente.
Vea esta publicación del foro para más detalles.
Ver TOR001 .
Esta función está en desuso. Use torch.nn.utils.parametrizations.weight_norm que utiliza la API de parametrización moderna. El nuevo weight_norm es compatible con state_dict generado a partir de weight_norm .
Guía de migración:
La magnitud ( weight_g ) y la dirección ( weight_v ) ahora se expresan como parametrizations.weight.original0 y parametrizations.weight.original1 respectivamente.
Para eliminar la reparación de normalización de peso, use torch.nn.utils.parametrize.remove_parametrizations .
El peso ya no se recomputa una vez en el módulo hacia adelante; En cambio, se recomputará en cada acceso. Para restaurar el antiguo comportamiento, use torch.nn.utils.parametrize.cached antes de invocar el módulo en cuestión.
Esta función está en desuso. Utilice el gerente de contexto torch.nn.attention.sdpa_kernel .
Guía de migración: cada parámetro de entrada booleano (por defecto a verdadero a menos que se especifique) de sdp_kernel corresponde a un SDPBackened . Si el parámetro de entrada es verdadero, el backend correspondiente debe agregarse a la lista de entrada de sdpa_kernel .
Esta función está desaprobada a favor de torch.linalg.multi_dot .
Guía de migración: multi_dot acepta una lista de dos o más tensores, mientras que chain_matmul aceptó múltiples tensores como argumentos de entrada. Para la migración, convierta los múltiples tensores en el argumento de chain_matmul en una lista de dos o más tensores para multi_dot .
Ejemplo: reemplace torch.chain_matmul(a, b, c) con torch.linalg.multi_dot([a, b, c]) .
torch.cholesky() está desaprobado a favor de torch.linalg.cholesky() .
Guía de migración:
L = torch.cholesky(A) debe reemplazarse con L = torch.linalg.cholesky(A) .L = torch.cholesky(A, upper=True) debe reemplazarse con L = torch.linalg.cholesky(A).mH torch.qr() está en desuso a favor de torch.linalg.qr() .
Guía de migración:
Q, R = torch.qr(A) debe reemplazarse con Q, R = torch.linalg.qr(A) .some de torch.qr se reemplaza con un mode de parámetro de cadena en torch.linalg.qr . El cambio correspondiente en el uso es de Q, R = torch.qr(A, some=False) a Q, R = torch.linalg.qr(A, mode="complete") . La función torch.range() está en desuso ya que su uso es incompatible con la gama Builtin de Python. En su lugar, use torch.arange() como produce valores en [start, end) .
Guía de migración:
torch.range(start, end) produce valores en el rango de [start, end] . Pero torch.arange(start, end) produce valores en [start, end) . Para el tamaño del paso de 1, migre el uso de torch.range(start, end, 1) a torch.arange(start, end+1, 1) .torch.load sin weights_only el parámetro no es seguro. Establezca explícitamente weights_only en falso solo si confía en los datos que carga y se necesita la funcionalidad completa de Pickle, de lo contrario, establecer weights_only=True .
Ver TOR101 .
TorchFix tiene licencia BSD con licencia, como se encuentra en el archivo de licencia.