0

J'ai complété ce tutorial sur des expériences de flux tensoriel distribué dans une expérience ML Engine et je cherche à définir mon propre niveau personnalisé au lieu du niveau STANDARD_1 qu'ils utilisent dans leur fichier config.yaml. Si vous utilisez l'API tf.estimator.Estimator, y a-t-il des modifications de code supplémentaires nécessaires pour créer un niveau personnalisé de n'importe quelle taille? Par exemple, l'article suggère: «Si vous distribuez 10 000 lots parmi 10 nœuds de travail, chaque nœud fonctionne sur environ 1 000 lots. donc cela suggérerait le fichier config.yaml serait possible ci-dessousModifications de code nécessaires pour l'expérience personnalisée de moteur ML distribuée

trainingInput: 
    scaleTier: CUSTOM 
    masterType: complex_model_m 
    workerType: complex_model_m 
    parameterServerType: complex_model_m 
    workerCount: 10 
    parameterServerCount: 4 

de tout changement de code nécessaires pour le tutoriel mnist pour pouvoir utiliser cette configuration personnalisée? Cela répartirait-il le nombre X de lots parmi les 10 travailleurs comme le suggère le tutoriel serait possible? J'ai poussé autour de quelques-uns des autres échantillons ML moteur et a constaté que reddit_tft utilise la formation distribuée, mais ils semblent avoir défini leur propre runconfig.cluster_spec dans leur paquet formateur: task.py même si elles utilisent également l'API estimateur. Donc, y a-t-il une configuration supplémentaire nécessaire? Ma compréhension actuelle est que si vous utilisez l'API Estimator (même dans votre propre modèle défini), il ne devrait pas y avoir de changements supplémentaires.

Est-ce que tout de ce changement si le config.yaml spécifie en utilisant les GPU? Cette article suggère pour l'API estimateur « Aucun changement de code sont nécessaires aussi longtemps que votre ClusterSpec est correctement configuré. Si un cluster est un mélange d'unités centrales et processeurs graphiques, la carte le nom du travail ps pour les CPU et le nom de l'emploi des travailleurs aux processeurs graphiques. " Cependant, étant donné que config.yaml identifie spécifiquement le type de machine pour les serveurs de paramètres et les travailleurs, je m'attends à ce que dans ML-Engine, le ClusterSpec soit configuré correctement en fonction du fichier config.yaml. Cependant, je ne suis pas en mesure de trouver une documentation de moteur ml qui confirme qu'aucun changement n'est nécessaire pour tirer parti des GPU.

dernier, au sein de ML-Engine Je me demande s'il y a des façons d'identifier l'utilisation de configurations différentes? La ligne "Si vous distribuez 10 000 lots parmi 10 nœuds de travail, chaque nœud fonctionne sur environ 1 000 lots." suggère que l'utilisation de travailleurs supplémentaires serait à peu près linéaire, mais je n'ai aucune intuition sur la façon de déterminer si plus de serveurs de paramètres sont nécessaires? Que serait-il possible de vérifier (soit dans les tableaux de bord de cloud ou de tensorboard) pour déterminer s'ils ont un nombre suffisant de serveurs de paramètres?

Répondre

1

Y a-t-il d'autres modifications de code nécessaires pour créer un niveau personnalisé de toute taille?

No; il n'est pas nécessaire de modifier l'échantillon MNIST pour qu'il fonctionne avec un nombre ou un type de travailleur différent. Pour utiliser un tf.estimator.Estimator sur le moteur CloudML, votre programme doit appeler learn_runner.run, exemplified dans les exemples. Lorsque vous le faites, le cadre se lit dans les variables d'environnement TF_CONFIG et renseigne un objet RunConfig les informations pertinentes telles que le ClusterSpec. Il fera automatiquement la bonne chose sur les nœuds du serveur de paramètres et utilisera l'estimateur fourni pour commencer l'entraînement et l'évaluation.

La plupart de la magie se produit parce que tf.estimator.Estimator utilise automatiquement un poseur de dispositif qui distribue correctement ops. Cet accesseur de périphérique utilise les informations de cluster de l'objet RunConfig dont le constructeur utilise par défaut TF_CONFIG pour effectuer sa magie (par exemple here). Vous pouvez voir où le dispositif de réglage est utilisé here.

Tout cela signifie que vous pouvez simplement changer votre config.yaml en ajoutant/supprimant des travailleurs et/ou en changeant leurs types et les choses devraient généralement juste fonctionner.

Pour obtenir un exemple de code à l'aide d'un modèle personnalisé_fn, voir l'exemple census/customestimator. Cela dit, veuillez noter que lorsque vous ajoutez des travailleurs, vous augmentez votre taille de lot effective (ceci est vrai que vous utilisiez ou non tf.estimator). Autrement dit, si votre batch_size était de 50 et que vous utilisiez 10 travailleurs, cela signifie que chaque travailleur traite des lots de taille 50, pour une taille de lot efficace de 10 * 50 = 500. Ensuite, si vous augmentez le nombre de travailleurs à 20, votre taille de lot effectif devient 20 * 50 = 1000. Vous pouvez trouver que vous pourriez avoir besoin de diminuer votre taux d'apprentissage en conséquence (linéaire semble généralement bien fonctionner; ref).

J'ai poussé autour de quelques-uns des autres échantillons ML moteur et a constaté que reddit_tft utilise la formation distribuée, mais ils semblent avoir défini leur propre runconfig.cluster_spec dans leur paquet formateur: task.pyeven mais ils sont aussi en utilisant l'API Estimator. Donc, y a-t-il une configuration supplémentaire nécessaire?

Aucune configuration supplémentaire n'est requise. L'exemple reddit_tft instancie son propre RunConfig, cependant, le constructeur de RunConfig saisit toutes les propriétés non définies explicitement lors de l'instanciation en utilisant TF_CONFIG. Et cela ne sert qu'à faciliter le calcul du nombre de serveurs de paramètres et de travailleurs.

Est-ce que cela change si le fichier config.yaml spécifie l'utilisation de GPU?

Vous ne devriez pas avoir besoin de changer quoi que ce soit d'utiliser tf.estimator.Estimator avec processeurs graphiques, autre que peut-être besoin d'affecter manuellement ops au GPU (mais ce n'est pas spécifique à CloudML Engine); Voir this article pour plus d'informations. Je vais chercher à clarifier la documentation.

+0

Je comprends que l'exemple MNIST ne nécessite aucun changement de code. Cependant, que se passe-t-il si j'utilise 'tf.estimator.Estimator' et que je définis mon propre modèle_fn? Votre réponse continue à référencer 'tf.estimator' et il n'est pas clair si tout ceci s'applique aussi à tf.estimator.Estimator comme le demande ma question. Leur documentation suggère que "Le principal changement pour que la version distribuée fonctionne est l'utilisation de la variable d'environnement TF_CONFIG La variable d'environnement est générée à l'aide de gcloud et analysée pour créer une classe ClusterSpec." ce qui semble indiquer qu'il y a un changement nécessaire? – reese0106

+0

Mise à jour du message pour faire référence à tf.estimator.Estimator. Aussi ajouté des informations sur les setters de périphériques, car ils sont ce que font la magie et ils sont les consommateurs de RunConfig, qui à son tour est ce qui analyse la variable TF_CONFIG. – rhaertel80