Koila résout
CUDA error: out of memory errorsans douleur. Corrigez-le avec une seule ligne de code et oubliez-le.

La branche principale est une rétructure complète du projet (qui est actuellement principalement vide car je n'ai pas assez de temps pour le terminer). Pour voir le code de travail, consultez la balise v0.1.1 pour une preuve de concept (qui n'a pas de support complet sur toutes les opérations et n'est pas adapté à la production). Pour l'utiliser, téléchargez la version V0.1.1 ici.
? Empêche CUDA error: out of memory error avec une seule ligne de code.
⚗️ accumule automatiquement les gradients lorsque la taille des lots est trop grande.
? Évalue paresseusement le code pytorch pour économiser la puissance de calcul.
✂️ se divise automatiquement le long de la dimension par lots à plus de nombres conviviaux GPU (2 pouvoirs) pour accélérer l'exécution.
? API minimale (envelopper toutes les entrées sera suffisant).
Toujours rencontré RuntimeError: CUDA error: out of memory ? Nous aimons tous PyTorch en raison de sa vitesse, de son efficacité et de sa transparence, mais cela signifie qu'il ne fait pas de choses supplémentaires. Des choses comme la prévention d'une erreur très courante qui dérange de nombreux utilisateurs depuis 2017.
Cette bibliothèque vise à empêcher cela en étant un wrapper léger sur PyTorch natif. Lorsqu'un tenseur est enveloppé, la bibliothèque calcule automatiquement la quantité de mémoire GPU restante et utilise la bonne taille de lot , ce qui empêche tout le monde d'avoir à affiner manuellement la taille du lot chaque fois qu'un modèle est utilisé.
De plus, la bibliothèque utilise automatiquement la bonne taille de lot en GPU. Saviez-vous que l'utilisation de lots plus gros ne s'accélère pas toujours le traitement? Il est également géré automatiquement dans cette bibliothèque.
Étant donné que le code Koila est du code PyTorch , car il exécute PyTorch sous le capot, vous pouvez utiliser les deux ensemble sans craindre la compatibilité.
Oh, et tout ça en 1 ligne de code! ?
Koila est disponible sur PYPI. Pour installer, exécutez la commande suivante.
pip install koila L'utilisation est morte simple. Par exemple, vous avez le code PyTorch suivant (copié à partir du tutoriel de PyTorch )
Définissez l'entrée, l'étiquette et le modèle:
# A batch of MNIST image
input = torch . randn ( 8 , 28 , 28 )
# A batch of labels
label = torch . randn ( 0 , 10 , [ 8 ])
class NeuralNetwork ( Module ):
def __init__ ( self ):
super ( NeuralNetwork , self ). __init__ ()
self . flatten = Flatten ()
self . linear_relu_stack = Sequential (
Linear ( 28 * 28 , 512 ),
ReLU (),
Linear ( 512 , 512 ),
ReLU (),
Linear ( 512 , 10 ),
)
def forward ( self , x ):
x = self . flatten ( x )
logits = self . linear_relu_stack ( x )
return logitsDéfinissez la fonction de perte, calculez la sortie et les pertes.
loss_fn = CrossEntropyLoss ()
# Calculate losses
out = nn ( t )
loss = loss_fn ( out , label )
# Backward pass
nn . zero_grad ()
loss . backward () D'accord. Comment adapter le code pour utiliser les fonctionnalités de Koila ?
Vous ajoutez cette ligne de code (à partir de v0.1.1):
# Wrap the input tensor and label tensor.
# If a batch argument is provided, that dimension of the tensor would be treated as the batch.
# In this case, the first dimension (dim=0) is used as batch's dimension.
( input , label ) = lazy ( input , label , batch = 0 )Fait. Vous ne manquerez plus de mémoire.
CUDA error: out of memory se produit généralement dans le pass avant, car les variables temporaires devront être enregistrées en mémoire.
Koila est une fine emballage autour de PyTorch . Il est inspiré de l'évaluation statique / paresseuse de Tensorflow. En construisant d'abord le graphique et en exécutant le modèle uniquement lorsque le modèle a nécessairement accès à toutes les informations pour déterminer la quantité de ressources qui a vraiment besoin de calculer le modèle.
En termes d'utilisation de la mémoire, seules les formes des variables temporaires sont nécessaires pour calculer l'utilisation de la mémoire de ces variables utilisées dans le modèle . Par exemple, + prend deux tenseurs avec des tailles égales, et sortira un tenseur avec une taille égale à la taille d'entrée, et log prend un tenseur, et sortira un autre tenseur avec la même forme. La diffusion le rend un peu plus compliqué que cela, mais les idées générales sont les mêmes. En suivant toutes ces formes, on pourrait facilement dire quelle quantité de mémoire est utilisée dans une passe avant. Et sélectionnez la taille optimale du lot en conséquence.
NON . En effet, le calcul des formes et le calcul de la taille et de l'utilisation de la mémoire ressemblent à beaucoup de travail. Cependant, gardez à l'esprit que même un modèle gigantesque comme GPT-3, qui a 96 couches, n'a que quelques centaines de nœuds dans son graphique informatique. Parce que les algorithmes de Koila fonctionnent en temps linéaire, tout ordinateur moderne pourra gérer un graphique comme celui-ci instantanément.
La plupart de l'informatique est dépensé pour calculer les tenseurs individuels et transférer des tenseurs sur les appareils. Et gardez à l'esprit que ces chèques se produisent de toute façon à Vanilla PyTorch . Donc non, pas du tout lent.
Ce projet a été initialement nommé Koala , les espèces les plus paresseuses du monde, et ce projet concerne l'évaluation paresseuse des tenseurs. Cependant, comme ce nom est pris sur PYPI, je n'avais pas d'autre choix que d'utiliser un autre nom. Koila est un mot composé par moi, prononcé de la même manière que le tour est joué (c'est un mot français), donc ça ressemble à du koala.
Si vous aimez ce que vous voyez, envisagez de donner cette étoile (★)!
Pourquoi ai-je traversé les ennuis et construit ce projet, malgré de nombreuses bibliothèques similaires sur Internet?
La recherche de taille par lots n'est pas nouvelle. En fait, le puissant foudre populaire l'a.
La recherche de taille par lots de Lightning est profondément intégrée dans son propre écosystème. Vous devez utiliser son DataLoader , sous-classe de leurs modèles et former vos modèles en conséquence. Bien que le refactorisation de superviser les tâches d'apprentissage à utiliser la foudre soit relativement facile, il est vraiment douloureux de faire de même avec une base de code d'apprentissage de renforcement, où l'interaction avec l'environnement est un must.
En comparaison, parce que Koila est un wrapper Pytorch super léger, il fonctionne lorsque Pytorch fonctionne, offrant ainsi une flexibilité maximale et des modifications minimales du code existant.
Cependant, notez que dans le cas où vous écrivez un nouveau code, la foudre est recommandée car elle applique un meilleur modèle de style de code, ce qui profiterait à la modularité à long terme.
De même, passer un tenseur vide pour construire un graphique de calcul (aka graphique statique ) n'est pas une nouvelle idée, mais complètement exploré dans la bibliothèque TensorFlow populaire, et une bibliothèque de wrapper PyTorch similaire KEOPS. Ces bibliothèques souffrent du fait que les programmes de débogage sont inutilement compliqués. Par exemple, TensorFlow était connu pour sa facilité de déploiement mais la douleur dans le développement, au point que les utilisateurs sont passés à PyTorch . Pendant le débogage, les gens aiment voir ce qu'il y a à l'intérieur d'une variable, pour voir s'il contient une valeur incorrecte. Cependant, comme les graphiques statiques ne définissent que les relations, les valeurs ne sont pas calculées, ce qui rend le débogage difficile.
Koila résout cela en évaluant avec impatience lorsqu'il est converti en chaînes, entiers ou toutes les valeurs Python. Cela permet un débogage transparent tout en conservant la possibilité d'effectuer une gestion de la mémoire qui n'est tout simplement pas disponible pour un programme PyTorch plus simple, qui alloue et libère de la mémoire dynamiquement (si nécessaire).
Tensor et LazyTensor S). Le code fonctionne sur de nombreux cas, mais c'est toujours un travail en cours. Ce n'est pas (encore) une bibliothèque compatible entièrement PyTorch en raison du temps limité. Évitez de l'utiliser dans des environnements de production!
L'ouverture et l'inclusivité sont prises très au sérieux. Le code est disponible sous la licence Apache. Veuillez suivre le code de conduite suivant.