TorchFix est un outil d'analyse statique de code Python - un linter avec des capacités Autofix - pour les utilisateurs de Pytorch. Il peut être utilisé pour trouver et résoudre des problèmes comme l'utilisation des fonctions Pytorch obsolètes et des symboles non publiques, et pour adopter les meilleures pratiques de Pytorch en général.
TorchFix est construit sur https://github.com/instagram/libcst - une bibliothèque pour manipuler des arbres de syntaxe en béton Python. LIBCST permet des "Codemod" (Autofixes) en plus des problèmes de rapport.
TorchFix peut être utilisé comme plugin Flake8 (libelting uniquement) ou comme programme autonome (avec Autofix disponible pour un sous-ensemble des violations de charpie).
Avertissement
Actuellement, TorchFix est dans une étape de version bêta , donc il y a encore beaucoup de bords rugueux et beaucoup de choses peuvent et changeront.
Pour installer le dernier code de GitHub, clone / télécharger https://github.com/pytorch-labs/torchfix et exécuter pip install . à l'intérieur du répertoire.
Pour installer une version de version de PYPI, exécutez pip install torchfix .
Après l'installation, TorchFix sera disponible en tant que plugin Flake8, donc l'exécution de Flake8 exécutera normalement le TorchFix Linter.
Pour ne voir que des avertissements de torchfix sans le reste des liners Flake8, vous pouvez exécuter flake8 --isolated --select=TOR0,TOR1,TOR2
TorchFix peut également être exécuté en tant que programme autonome: torchfix . Ajouter --fix Paramètre pour essayer d' --show-stderr certains des problèmes (les fichiers seront écrasés!)
Prudence
Veuillez garder à l'esprit qu'AutoFix est un mécanisme le mieux effectif. Compte tenu de la nature dynamique de Python, et en particulier de l'état de la version bêta de TorchFix, il est très difficile d'avoir une certitude lors des modifications du code, même pour les correctifs apparemment triviaux.
Les avertissements pour les problèmes avec les codes commençant par Tor0, Tor1 et Tor2 sont activés par défaut. Les avertissements avec d'autres codes peuvent être trop bruyants, donc non activés par défaut. Pour les activer, utilisez des options de configuration Flake8 standard pour le mode plugin ou utilisez torchfix --select=ALL . pour le mode autonome.
Si vous rencontrez un bug ou un autre problème avec TorchFix, veuillez déposer un problème sur https://github.com/pytorch-labs/torchfix/issues.
De nouveaux codes de règle sont affectés de manière progressive dans les catégories suivantes:
torch à usage général.pytorch/pytorch , les autres utilisateurs ne devraient pas les utiliser.Tor0, Tor1 et Tor2 sont activés par défaut.
Cette fonction a été obsolète depuis Pytorch version 1.9 et est maintenant supprimée.
torch.solve est obsolète en faveur de torch.linalg.solve . torch.linalg.solve a ses arguments inversés et ne renvoie pas la factorisation LU.
Pour obtenir la factorisation LU, voir torch.lu , qui peut être utilisé avec torch.lu_solve ou torch.lu_unpack .
X = torch.solve(B, A).solution doit être remplacé par X = torch.linalg.solve(A, B) .
Cette fonction a été obsolète depuis Pytorch version 1.9 et est maintenant supprimée.
torch.symeig est obsolète en faveur de torch.linalg.eigh .
Le comportement par défaut a changé de l'utilisation de la partie triangulaire supérieure de la matrice par défaut en utilisant la partie triangulaire inférieure.
L , _ = torch . symeig ( A , upper = upper )devrait être remplacé par
L = torch . linalg . eigvalsh ( A , UPLO = 'U' if upper else 'L' )et
L , V = torch . symeig ( A , eigenvectors = True )devrait être remplacé par
L , V = torch . linalg . eigh ( A , UPLO = 'U' if upper else 'L' )require_grad en affectation. Vouliez-vous dire requires_grad ?Il s'agit d'une mal orthographe commune qui peut entraîner des problèmes de performances silencieuses.
use_reentrant explicitement au checkpoint La valeur par défaut du paramètre use_reentrant dans torch.utils.checkpoint est en cours de changement de True en False . En attendant, la valeur doit être transmise explicitement.
Voir ce message du forum pour plus de détails.
Voir TOR001 .
Cette fonction est obsolète. Utilisez torch.nn.utils.parametrizations.weight_norm qui utilise l'API de paramétrisation moderne. Le nouveau weight_norm est compatible avec state_dict généré à partir d'ancien weight_norm .
Guide de migration:
La magnitude ( weight_g ) et la direction ( weight_v ) sont désormais exprimées en parametrizations.weight.original0 et parametrizations.weight.original1 respectivement.
Pour éliminer la réparamétrisation de la normalisation du poids, utilisez torch.nn.utils.parametrize.remove_parametrizations .
Le poids n'est plus recomputé une fois au module vers l'avant; Au lieu de cela, il sera recalculé sur chaque accès. Pour restaurer l'ancien comportement, utilisez torch.nn.utils.parametrize.cached avant d'appeler le module en question.
Cette fonction est obsolète. Utilisez plutôt le torch.nn.attention.sdpa_kernel , le gestionnaire de contexte.
Guide de migration: chaque paramètre d'entrée booléen (défaut vers True sauf si spécifié) de sdp_kernel correspond à un SDPBackened . Si le paramètre d'entrée est vrai, le backend correspondant doit être ajouté à la liste d'entrée de sdpa_kernel .
Cette fonction est obsolète en faveur de torch.linalg.multi_dot .
Guide de migration: multi_dot accepte une liste de deux tenseurs ou plus tandis que chain_matmul a accepté plusieurs tenseurs comme arguments d'entrée. Pour la migration, convertissez les tenseurs multiples en argument de chain_matmul en une liste de deux tenseurs ou plus pour multi_dot .
Exemple: Remplacez torch.chain_matmul(a, b, c) par torch.linalg.multi_dot([a, b, c]) .
torch.cholesky() est déprécié en faveur de torch.linalg.cholesky() .
Guide de migration:
L = torch.cholesky(A) doit être remplacé par L = torch.linalg.cholesky(A) .L = torch.cholesky(A, upper=True) doit être remplacé par L = torch.linalg.cholesky(A).mH torch.qr() est obsolète en faveur de torch.linalg.qr() .
Guide de migration:
Q, R = torch.qr(A) doit être remplacée par Q, R = torch.linalg.qr(A) .some de torch.qr est remplacée par un mode de paramètre de chaîne dans torch.linalg.qr . Le changement d'utilisation correspondant est de Q, R = torch.qr(A, some=False) à Q, R = torch.linalg.qr(A, mode="complete") . La fonction torch.range() est obsolète car son utilisation est incompatible avec la gamme intégrée de Python. Au lieu de cela, utilisez torch.arange() car il produit des valeurs dans [start, end) .
Guide de migration:
torch.range(start, end) produit des valeurs dans la plage de [start, end] . Mais torch.arange(start, end) produit des valeurs dans [start, end) . Pour une taille de pas de 1, migrez l'utilisation de torch.range(start, end, 1) à torch.arange(start, end+1, 1) .torch.load SANS weights_only Le paramètre est dangereux. Définissez explicitement weights_only sur FAUX uniquement si vous faites confiance aux données que vous chargez et que la fonctionnalité complète des cornichons est nécessaire, sinon définissez weights_only=True .
Voir TOR101 .
TorchFix est une licence BSD sous licence, comme le montre le fichier de licence.