J'expérimente des options d'entraînement distribuées sur Cloud ML Engine et j'observe des résultats particuliers. J'ai fondamentalement modifié l'exemple de l'estimateur personnalisé du recensement pour qu'il contienne un modèle légèrement différent et que ma fonction de perte ait été modifiée par AdamOptimizer en tant que seuls véritables changements. D'après ce que j'ai compris, toute formation distribuée devrait être une formation asynchrone parallèle aux données, ce qui suggère «Si vous distribuez 10 000 lots parmi 10 nœuds travailleurs, chaque nœud fonctionne sur environ 1 000 lots». Dans mon expérience, j'ai ~ 650k exemples d'entraînement et je cours les expériences suivantes pour 1 époque avec une taille de lot de 128. Compte tenu des exemples d'entraînement 650k et une taille de lot de 128, je m'attendrais à des étapes ~ 5.1k dans un époque. Voici la performance que je vois pour différentes l »Formation distribuée avec tf.estimator entraînant plusieurs étapes de formation
--scale-tier
PAS DISTRIBUÉ
- BASIC: 8 étapes/s, 5.1k étapes, le temps de mur 11 minutes
- BASIC_GPU: 24 étapes/sec, 5.1k étapes, le temps de paroi de 3,5 minute
DISTRIBUE
STANDARD_1: 14.5 étapes/sec - 26k étapes (26k * 128 = ~ 3,3M qui est beaucoup plus que les échantillons d'apprentissage en fait dans les données), temps de paroi 29 min
CUSTOM - 5 travailleurs complex_model_m, 2 serveurs de paramètres large_model: 27 étapes/s, 31k étapes (128 * 31k = ~ 3,9M qui est beaucoup plus que les 650k échantillons de formation réellement dans les données), le temps de mur 20 minutes
Mon l'attente était que les données-parallèle sur la base de l'article était que la formation distribuée serait diviser les lots entre tous les travailleurs, donc si j'avais 5 travailleurs sur ~ 5k chauve-souris ches, alors chaque travailleur effectuerait ~ 1000 lots. Cependant, le comportement réel que j'observe est qu'il semble plus proche de CHACUN des 5 travailleurs effectuant 1 époque eux-mêmes. Quand on s'entraîne dans un environnement réparti, il y a 6 fois plus d'étapes que d'exemples d'entraînement - je sais que la vraie définition d'une étape est chaque fois que les gradients sont mis à jour, mais ma compréhension de l'entraînement parallèle est que cela diviserait simplement les lots de sorte qu'il devrait y avoir le même nombre de mises à jour de gradient - y a-t-il une raison pour laquelle ce comportement serait attendu? Serait-il sensé qu'il y ait plus d'étapes de formation nécessaires dans un environnement distribué d'entraînement asynchrone parallèle aux données? Quelqu'un peut-il expliquer le comportement que j'observe?
réponse incroyable! Cela ferait un excellent article de blog car il était très difficile de trouver cette information expliquée sur la documentation distribuée tensorflow disponible en ligne. Je suppose que ma seule préoccupation est que si je traite une donnée non équilibrée, je l'ai aimé l'utilisation des époques pour faire en sorte que je passe par tous les exemples des classes minoritaires et il semble que l'utilisation max_steps il n'y a vraiment aucune garantie (si si vous prenez assez de mesures, vous devriez échantillonner même dans les plus petites classes minoritaires). – reese0106
Ma compréhension des optimiseurs comme Adam est que l'on utilise généralement les taux d'apprentissage "out of the box" car ils ont été plus ou moins optimisés. Existe-t-il des heuristiques suggérées pour ajuster le taux d'apprentissage afin de traiter la plus grande taille de lot efficace? Je reconnais que l'expérimentation/tuning hyperparam'etre est probablement nécessaire, mais en espérant en savoir plus pour obtenir dans le bon ordre de grandeur – reese0106
, vous faites référence à max_steps aussi - serait-ce même que train_steps dans l'échantillon de recensement estimateur personnalisé à ce [en ligne] (https : //github.com/GoogleCloudPlatform/cloudml-samples/blob/master/census/customestimator/trainer/task.py#L201) ou est-ce un argument tout à fait différent? – reese0106