Как ограничить версии пакетов в conda?

#anaconda #conda #tensorflow2.0

#python #anaconda #conda

Вопрос:

Я работаю в среде conda с предустановленной кучей пакетов (список conda содержит 360 пакетов, множество инструментов ML и некоторые bioconda). Иногда мне нужно добавить пакет; однако я нахожу, что conda install newpackage это часто происходит очень медленно (часы или дни, потраченные на «Решение среды»), и если он когда-нибудь заканчивается, он часто предлагает обновления для пакетов, которые я действительно не хочу трогать.

Я хотел бы закрепить текущие версии некоторых основных пакетов (python, numpy, scipy и т. Д.), Чтобы conda даже не считала возможным их изменение. Это как для скорости, так и для предотвращения любых непреднамеренных обновлений. Если это означает, что определенный пакет, который я хочу попробовать добавить, не может быть установлен, все в порядке! Я бы предпочел получить быстрый ответ типа «newpackage конфликтует с вашей версией numpy», чем никакого ответа. Затем я могу решить, хочу ли я игнорировать конфликт; создать простую среду только для этого одного пакета; локальная сборка conda или что-то еще.

Как мне это сделать?

Смотрите также: https://www.anaconda.com/blog/understanding-and-improving-condas-performance (что не решило проблему)

Комментарии:

1. conda install newpackage is often extremely slow (hours or days spent at "Solving environment"), and if it ever finishes, it often suggests updates to packages I really don't want to touch. — вы пробовали мамбу ? Это замена conda, и это действительно, очень быстро.

2. Используете ли вы единую среду для всех своих проектов? Для лучшей производительности и стабильности попробуйте создать env из файла environment.yml.

3. @AMC Я использую Amazon AMI, которые поставляются со средой; многие пакеты, похоже, являются пользовательскими сборками (и не совсем уверены, откуда они берутся). Я, конечно, всегда могу получить новую копию, создав новый экземпляр из AMI, но не обязательно создавать env из environment.yml

Ответ №1:

Закрепление пакетов

Пакеты могут быть привязаны к определенным версиям в зависимости от среды. Смотрите Документацию по закреплению пакетов. Например, предположим, что мы хотим привязать numpy and scipy к точным версиям, которые у нас есть в настоящее время в вызываемом env foo . Мы могли бы обработать вывод conda list , чтобы он соответствовал ожидаемому синтаксису спецификации закрепления Conda:

 conda activate foo
conda list "^(numpy|scipy)$" | tail -n 4 | awk '{ print $1 " ==" $2 }' > $CONDA_PREFIX/conda-meta/pinned
  

Здесь следует отметить несколько моментов:

  • conda list принимает регулярное выражение: используйте это в своих интересах
  • tail просто пропустить заголовок
  • это зависит от наличия в активированном env для определения $CONDA_PREFIX
  • это перезаписывает любой существующий pinned файл

Установлено замораживание

Менее трудоемкий способ сохранить все неизменным — использовать --freeze-installed флаг. Однако в более поздних версиях Conda это используется по умолчанию в первом раунде решения. Так что на самом деле все, что делает этот флаг сейчас, — это пропустить второй раунд решения, который позволяет обновлять пакеты, которые не являются частью явных спецификаций.

Пакеты PyPI

Пакеты PyPI, установленные Pip, требуют некоторой дополнительной настройки, чтобы заставить Conda закрепить их. В частности, в файле требуется следующий синтаксис envs/<env>/conda-meta/pinned :

 numpy=1.21.4=pypi*
  

То есть укажите, что pypi должно быть в строке сборки. И для того, чтобы это соблюдалось, необходимо включить совместимость с Pip и обеспечить гибкую приоритизацию каналов:

 ## settings only for this environment
conda activate foo
conda config --env --set pip_interop_enabled True
conda config --env --set channel_priority flexible
  

Включение этого позволяет Conda рассматривать пакеты PyPI как допустимые замены для решения зависимостей.

Лично я был бы осторожен, используя это, поскольку Conda является общим менеджером пакетов, и иногда пакеты, установленные через Pip (например, yaml или wget ), не соответствуют пакету Conda с тем же именем. Следовательно, почему я использую --env в примере только для включения этого параметра конфигурации в этой среде foo.