16
votes

Comment utiliser plusieurs GPU dans pytorch?

J'apprends pytorch et suis ce tutoriel: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html

J'utilise cette commande pour utiliser un GPU.

device = torch.device("**cuda:0,1**" if torch.cuda.is_available() else "cpu")

Mais, je veux utiliser deux GPU dans jupyter , comme ceci:

device = torch.device("**cuda:0**" if torch.cuda.is_available() else "cpu")

Bien sûr, c'est faux. Alors, comment puis-je faire ça?


0 commentaires

3 Réponses :


15
votes

L'utilisation de multi-GPU est aussi simple que d' DataParallel un modèle dans DataParallel et d'augmenter la taille du lot. Consultez ces deux didacticiels pour un démarrage rapide:


3 commentaires

Je sais quelque chose des sites Web. Peut-être qu'il n'y a pas de moyen plus simple d'utiliser plusieurs GPU pour moi. J'essaierais encore. Merci.


@MLXu De quoi parlez-vous? Il s'agit simplement d'ajouter 1 à 2 lignes de code au code d'origine!


Peut-être que je devrais installer la version parallèle de CUDA. Unitl maintenant, je n'ai pas essayé d'utiliser plusieurs GPU en même temps. Parce qu'à chaque fois que j'essayais d'utiliser plusieurs GPU, rien ne se passait et mes programmes se fissuraient après plusieurs heures. Merci pour votre réponse.



0
votes

Une autre option serait d'utiliser des bibliothèques d'assistance pour PyTorch:

Formation GPU distribuée à la bibliothèque PyTorch Ignite

Il y a là un concept de gestionnaire de contexte pour la configuration distribuée sur:

  • nccl - configuration distribuée native torche sur plusieurs GPU
  • xla-tpu - Configuration distribuée des TPU

Formation multi-GPU PyTorch Lightning

C'est probablement la meilleure option à mon humble avis pour s'entraîner sur CPU / GPU / TPU sans changer votre code PyTorch d'origine.

Cela vaut la peine de consulter Catalyst pour des options de GPU distribuées similaires.


0 commentaires

1
votes

En supposant que vous souhaitiez distribuer les données sur les GPU disponibles (si vous avez une taille de lot de 16 et 2 GPU, vous pourriez chercher à fournir les 8 échantillons à chacun des GPU), et ne pas vraiment répartir les parties des modèles sur différence de GPU. Cela peut être fait comme suit:

Si vous souhaitez utiliser tous les GPU disponibles:

X.to(device)
y.to(device)

Si vous souhaitez utiliser des GPU spécifiques: (par exemple, en utilisant 2 GPU sur 4)

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model = CreateModel()

model= nn.DataParallel(model)
model.to(device)

Pour utiliser les GPU spécifiques en définissant la variable d'environnement du système d'exploitation:

Avant d'exécuter le programme, définissez la variable CUDA_VISIBLE_DEVICES comme suit:

export CUDA_VISIBLE_DEVICES=1,3 (en supposant que vous souhaitiez sélectionner le 2ème et le 4ème GPU)

Ensuite, dans le programme, vous pouvez simplement utiliser DataParallel() comme si vous vouliez utiliser tous les GPU. (similaire au 1er cas). Ici, les GPU disponibles pour le programme sont limités par la variable d'environnement du système d'exploitation.

device = torch.device("cuda:1,3" if torch.cuda.is_available() else "cpu") ## specify the GPU id's, GPU id's start from 0.

model = CreateModel()

model= nn.DataParallel(model,device_ids = [1, 3])
model.to(device)

Dans tous ces cas, les données doivent être mappées sur l'appareil.

Si X et y sont les données:

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

model = CreateModel()

model= nn.DataParallel(model)
model.to(device)


0 commentaires