Question

de travail sur ce qui pourrait souvent être appelé « données moyen » projets, j'ai été en mesure de paralléliser mon code (surtout pour la modélisation et la prévision en Python) sur un seul système à travers partout de 4 à 32 cœurs. Maintenant, je suis à la recherche à l'échelle jusqu'à clusters sur EC2 (probablement avec StarCluster / IPython, mais ouvert à d'autres suggestions aussi bien), et ont été intrigués par la façon de concilier la répartition du travail entre noyaux sur un cas par exemple vs sur un cluster.

Est-il même pratique de paralléliser à travers les instances ainsi que dans les noyaux sur chaque instance? Si oui, quelqu'un peut-il donner un rapide aperçu des avantages + les inconvénients de l'exécution de nombreux cas avec quelques noyaux chacun par rapport à quelques cas avec de nombreux noyaux? Y at-il une règle de base pour choisir le bon ratio d'instances à noyaux par exemple?

La bande passante et la RAM sont des préoccupations non négligeables dans mes projets, mais il est facile de repérer quand ce sont les goulots d'étranglement et régler à nouveau. Il est beaucoup plus difficile, je pense, de comparer la bonne combinaison de noyaux à des instances sans des tests répétés, et mes projets varient trop pour un test simple à appliquer à toutes les circonstances. Merci à l'avance, et si je viens à Google échoué celui-ci correctement, ne hésitez pas à me pointer vers la bonne réponse quelque part ailleurs!

Était-ce utile?

La solution

Lorsque vous utilisez IPython, vous presque ne pas se inquiéter à ce sujet (au détriment d'une certaine perte d'efficacité / plus les frais généraux de communication). Le plugin IPython parallèle StarCluster sera par défaut démarrer un moteur par noyau physique sur chaque nœud (je crois que ce qui est configurable, mais ne savez pas où). Vous venez d'exécuter tout ce que vous voulez à travers tous les moteurs en utilisant le api DirectView (map_sync, apply_sync, ...) ou les commandes% magiques px. Si vous utilisez déjà IPython en parallèle sur une machine, l'utiliser sur un cluster est pas différent.

Répondre à certaines de vos questions spécifiques:

« comment concilier la répartition du travail entre noyaux sur un cas par exemple vs sur un cluster » - Vous obtenez un moteur par cœur (au moins); le travail est distribué automatiquement dans tous les cœurs et dans tous les cas.

« Est-il même pratique de paralléliser à travers les instances ainsi que dans les noyaux sur chaque instance? » - Oui :) Si le code que vous utilisez est parallèle honteusement (exactement le même algo sur des ensembles de données multiples) vous pouvez ignorer la plupart du temps où fonctionne un moteur particulier. Si le noyau nécessite beaucoup de communication entre les moteurs, alors bien sûr vous avez besoin de le structurer afin que les moteurs communiquent principalement avec d'autres moteurs sur la même machine physique; mais ce genre de problème n'est pas idéal pour IPython, je pense.

"Si oui, quelqu'un peut-il donner un rapide aperçu des avantages + les inconvénients de l'exécution de nombreux cas avec quelques noyaux chacun par rapport à un petit nombre de cas avec de nombreux noyaux? Y at-il une règle de base pour choisir le bon ratio d'instances à noyaux par exemple? » - Utilisez les plus grandes instances Les c3 pour compute-bound, et le plus petit pour les problèmes liés-mémoire à bande passante; pour des problèmes liés passage de messages, utiliser aussi les plus grandes instances mais essayez de diviser le problème afin que chaque partition exécute sur une machine physique et le passage le plus de messages est dans la même partition. Les problèmes qui courraient beaucoup plus lent sur N quadruple cas c3 que sur 2N doubles c3 sont rares (un exemple artificiel peut être exécuté plusieurs filtres simples sur un grand nombre d'images, où vous passez par toutes les images pour chaque filtre plutôt que tous les filtres pour la même image). En utilisant plus des cas est une bonne règle.

Autres conseils

Une règle générale est de ne pas distribuer jusqu'à ce que vous devez. Il est généralement plus efficace d'avoir N serveurs d'une certaine capacité de 2N serveurs de la moitié de cette capacité. Plus de l'accès aux données seront locales, et donc rapide en mémoire par rapport lent à travers le réseau.

À un certain moment, l'intensification d'une machine devient non rentable parce que le coût des échelles de ressources supplémentaires plus de façon linéaire. Cependant ce point est encore étonnamment élevé.

Sur Amazon en particulier si, les aspects économiques de chaque type d'instance peut varier beaucoup si vous utilisez des instances du marché au comptant. La valeur par défaut le prix moyen plus ou moins que le même montant des frais de ressources sur la même quel que soit le type d'instance, qui peut varier beaucoup; grandes instances peuvent être moins chers que les petits ou petits N instances peuvent être beaucoup moins cher que d'une grande machine avec des ressources équivalentes.

Une considération massive est ici que le paradigme de calcul peut changer beaucoup lorsque vous passez d'une machine à plusieurs machines. Les compromis que la communication peut vous induisent en tête la force, par exemple, adopter un paradigme parallèle des données à l'échelle. Cela signifie un choix différent d'outils et de l'algorithme. Par exemple, SGD semble tout à fait différente en mémoire et en Python que sur MapReduce. Donc, vous devez considérer ceci avant parallélisation.

Vous pouvez choisir de répartir le travail sur un cluster, même si un seul nœud et paradigmes non distribués travaillent pour vous, pour la fiabilité. Si un seul nœud échoue, vous perdez tout le calcul; un calcul distribué peut potentiellement récupérer et terminer seulement la partie du calcul qui a été perdu.

Toutes choses égales par ailleurs (coût, PERF CPU, etc.), vous pouvez choisir l'instance la plus petite qui peut contenir tout mon jeu de données en mémoire et sur l'échelle. De cette façon,

  • vous assurez-vous de ne pas induire les latences inutiles en raison de communications réseau et
  • vous avez tendance à maximiser la bande passante mémoire disponible pour l'ensemble de vos processus.

En supposant que vous utilisez une sorte de système de validation croisée optimiser certains méta paramètre de votre modèle, attribuer à chaque noyau une valeur à tester et choisir un nombre cas au besoin pour couvrir tout l'espace des paramètres en tant que quelques tours comme bon vous semble.

Si vos données ne rentre pas dans la mémoire d'un système, bien sûr, vous aurez besoin de distribuer à travers les instances. Ensuite, il est une question d'équilibre entre la latence de la mémoire (mieux avec de nombreux cas) avec une latence réseau (mieux avec des cas moins), mais étant donné la nature de EC2 je serais prêt à parier que vous aurez souvent préfèrent travailler avec peu de cas de graisse.

Licencié sous: CC-BY-SA avec attribution
scroll top