Je voudrais installer des paquets dans plusieurs environnements Conda. Faire cela l'un après l'autre prend un certain temps, donc ce serait bien si je pouvais exécuter toutes les opérations de conda install
pour chaque environnement en parallèle. Cela serait-il possible ou y a-t-il des conflits (concernant les liens durs et les fichiers de verrouillage, éventuellement) lorsque l'on essaie d'exécuter conda en parallèle ?
Réponse
Trop de publicités?La réponse courte : Non, il ne doit pas être exécuté en même temps .
La majeure partie de la façon dont Conda gère la sécurité des transactions a été établie dans la version v4.3. Les notes de mise à jour de la v4.3.0 concernant les changements de verrous commentent explicitement l'exécution de processus multiples :
[Les utilisateurs sont avertis qu'un comportement non défini peut se produire lorsque conda est exécuté dans plusieurs processus et fonctionne sur les mêmes caches de paquets et/ou environnements.
Il semble que vous parlez d'environnements différents, donc cela ne devrait pas être un problème. Cependant, vous devez vous assurer que le ou les paquets à installer sont déjà téléchargés dans le cache des paquets, sinon ce n'est pas sûr.
Stratégie parallèle partielle
Il existe un --download-only
qui ajoutera seulement le paquet au cache des paquets (c'est-à-dire la partie qui ne peut pas être faite simultanément). Mais le problème est que cela doit toujours être fait pour chaque environnement, puisque différents environnements peuvent avoir différentes contraintes (par exemple, différentes versions de Python) qui nécessitent différentes constructions du paquet.
Je pense que le mieux que vous puissiez faire au CLI est
- Exécuter
conda install --download-only pkg
séquentiellement sur chaque env, puis - Exécuter
conda install pkg
en parallèle pour les envs.
Il ne s'agit toutefois pas d'une recommandation officielle, et des changements dans la façon dont Conda effectue les transactions pourraient faire en sorte que cela ne soit plus sûr. Je dirai également que je doute fort que cela vous fasse gagner beaucoup de temps ; en fait, cela pourrait même prendre plus de temps. Cette approche implique que chaque env doit résoudre et préparer les transactions deux fois, ce qui est généralement l'étape la plus exigeante en termes de calcul. La partie que vous finissez par paralléliser implique des transactions de disque, ce qui va être lié aux E/S, donc je doute un peu que vous gagniez du temps.
Des preuves que c'est sans danger
Bien que cela ne prouve pas positivement sa sécurité, nous pouvons examiner explicitement les transactions pour nous assurer que lorsque nous exécutons l'étape 2 ci-dessus, elle n'impliquera que des transactions LINK.
Pour tester cela, j'ai créé deux envs :
conda create -n foo -y python=3.6
conda create -n bar -y python=3.6
Ensuite, je vérifie la sortie de
conda install -n foo -d --json pandas
qui montre une liste des transactions FETCH et LINK. Les premières impliquent la manipulation du cache des paquets, tandis que les secondes ne concernent que l'environnement. Si je lance ensuite
conda install -n foo --download-only pandas
et vérifiez à nouveau,
conda install -n foo -d --json pandas
Je ne vois maintenant que les transactions LINK. Notamment, la même chose est maintenant vraie pour -n bar
ce qui devrait renforcer le fait que l'étape 1 doit être réalisée de manière séquentielle. L'avantage de cette méthode est qu'elle n'entraîne pas le retéléchargement du même paquet ; l'inconvénient est qu'elle implique une résolution dans chaque environnement. Dans un environnement plus hétérogène, nous pourrions nous attendre à ce qu'il y ait différentes opérations FETCH dans chaque env.
Enfin, je peux exécuter l'installation finale parallèle
conda install -n foo -y pandas & conda install -n bar -y pandas &
ce qui est sûr si nous pouvons supposer que les transactions LINK dans différents environnements sont sûres.