2017-09-28 6 views
0

en utilisant MXNet modèle à finetune Resnet sur jeu de données Caltech 256 de l'exemple suivant:Je MXNet précision la formation distribuée

https://mxnet.incubator.apache.org/how_to/finetune.html

que je fais avant tout pour un POC pour tester la formation distribuée (que je utilisation ultérieure dans mon projet actuel).

D'abord, j'ai couru cet exemple sur une seule machine avec 2 GPU pour 8 époques. J'ai pris environ 20 minutes et la précision de validation finale était de 0.809072.

Ensuite, je l'ai couru sur 2 machines (identiques, chacune avec 2 GPU) avec un paramètre distribué et partitionné les données d'entraînement de moitié pour ces deux machines (en utilisant num_parts et part_index).

8 époques ont pris seulement 10 minutes, mais la précision de validation finale était seulement 0,772847 (le plus élevé des deux). Même lorsque j'ai utilisé 16 époques, je n'ai réussi qu'à atteindre 0,797006.

Donc, ma question est que c'est normal? Je veux principalement utiliser une formation distribuée pour réduire le temps de formation. Mais si cela prend deux fois ou plus pour atteindre la même précision, alors quel est l'avantage? Peut-être qu'il me manque quelque chose.

Je peux poster mon code et exécuter la commande si nécessaire.

Merci

EDIT

Un peu plus d'informations pour aider à la réponse:

Version MXNet: 0.11.0

Topologie: 2 travailleurs (chacun sur un séparé machine)

Code Promo:https://gist.github.com/reactivefuture/2a1f9dcd3b27c0fe8215b4e3d25056ce

commande pour démarrer:

python3 mxnet/tools/launch.py -n 2 -H hosts --sync-dst-dir /tmp/mxnet python3 training.py --kv-store dist_sync --gpus 0,1

Je l'ai utilisé un moyen hacky de faire le partitionnement (en utilisant des adresses IP) puisque je ne pouvais pas se rendre au travail kv.num_workers et kv.rank.

+0

Comment exécutez-vous la partition. Avez-vous fait le shuffle? Pouvez-vous poster le code, les commandes et les détails de configuration ici. – rgaut

Répondre

2

Donc, ma question est que c'est normal? Je veux principalement utiliser une formation distribuée pour réduire le temps de formation. Mais si cela prend deux fois ou plus pour atteindre la même précision, alors quel est l'avantage?

Non ce n'est pas normal, une formation distribuée, en effet, devrait être utilisée pour accélérer le processus de formation, pas pour le ralentir. Cependant, il y a plusieurs façons de le faire de manière incorrecte. Sur la base des données fournies, il semble que les travailleurs sont toujours en mode d'entraînement unique ('device'), ou peut-être que kv_store n'est pas créé correctement. Par conséquent, chaque travailleur ne fait que s'entraîner lui-même. Dans ce cas, vous devriez voir le résultat de la validation après 16 ans près de la machine unique avec 8 époques (simplement parce que dans le cluster vous séparez les données). Dans votre cas, c'est 0.797006 vs 0.809072.Cela dépend du nombre d'expériences que vous avez exécutées. Ces nombres peuvent être traités comme égaux. Je concentrerais mon enquête sur la façon dont le cluster s'amorce.

Si vous avez besoin de plonger plus profondément sur le sujet comment créer kv_store (ou qu'est-ce que c'est?) Et l'utiliser avec la formation distribuée, veuillez voir this article.

En général, afin de donner une meilleure réponse, à l'avenir pleace fournir au moins les informations suivantes:

  • quelle est la version de MXNet?
  • quelle est la topologie du cluster, les informations suivantes:
    • combien sont utilisés travailleurs logiques;
    • combien de serveurs sont utilisés (sont-ils sur les mêmes machines avec les travailleurs)?
  • comment voulez-vous commencer la formation (idéalement avec le code)
  • s'il est impossible de fournir le code, au moins préciser le type de kv_store
  • comment partitionner-vous des données entre le travailleur

EDIT

Même si l'appel qui commence la formation semble correcte:

python3 mxnet/tools/launch.py -n 2 -H hosts --sync-dst-dir /tmp/mxnet python3 training.py --kv-store dist_sync --gpus 0,1 

Il y a au moins un problème dans le fichier training.py lui-même. Si vous regardez here, cela ne respecte pas le type de kv-store de l'argument input et utilise simplement 'device'. Par conséquent, tous les travailleurs forment le modèle séparément (et non pas en grappe). Je crois que la réparation de cette ligne devrait aider.

Je recommande à nouveau de lire the article afin de vous familiariser avec le fonctionnement du cluster MXNet. De tels problèmes peuvent être facilement détectés en analysant les logs de débogage et en observant qu'il n'y a pas de kv-store créé et donc que cluster ne forme rien (seules les machines autonomes font quelque chose).

+0

Merci d'avoir répondu. J'ai ajouté les informations requises dans ma question. Faites-moi savoir si vous avez besoin d'autres informations. – Vikk