Сделайте свою среду Python воспроизводимой, используя распространенные методы создания, обновления и блокировки вашей среды с помощью файла YAML.

В серии статей я начал со статьи «Начало работы со средой Conda [Часть-1]», где я описал первые шаги по использованию conda для создайте свою среду Python, поэтому всем, кто только начинает работать с conda, следует сначала ознакомиться с предыдущей статьей. затем в другой статье «Еще один шаг к улучшению среды Conda — реализация Numpy[Часть-2]»я показал, как повысить производительность среды conda и что реализация BLAS NumPy изменяет размер среды.

В этом руководстве мы сделаем следующий шаг для поддержки нашей среды с помощью файла YAML, чтобы отслеживать, какие пакеты установлены в нашей среде и какие версии являются пакетами.

Использование файлов YAML делает вашу среду легко воспроизводимой и является очень профессиональным способом поделиться своим блокнотом по науке о данных с другими.

Содержание статьи организовано следующим образом

  • Создайте среду
  • Окружающая среда.yml
  • Обновите среду из environment.yml
  • Изменения среды Conda
  • Менеджер пакетов Мамба
  • Создайте файл environment.yml
  • Заблокируйте свою среду
  • Резюме

Итак, начнем

Создайте среду

conda create -n hapi python=3.9
  • Будет установлен следующий список пакетов по умолчанию, вам может потребоваться нажать «y», чтобы согласиться на установку перечисленных пакетов.

  • Теперь активируйте среду hapi
conda activate hapi

Окружающая среда.yml

Во-первых, нам нужно знать, что такое файл yaml.

  • Файл YAML — это файл, который используется для указания информации или данных о конфигурации. Он обычно используется для файлов конфигурации, но может использоваться для любого обычного текстового файла, в котором необходимо указать данные в структурированном виде.

  • Файлы YAML разработаны так, чтобы их было легко читать и писать, и они используют простой синтаксис, похожий на языки программирования, такие как Python. Они используют отступы для указания структуры данных и используют пары ключ-значение для представления элементов данных. Вот пример простого файла YAML:
name: John
age: 30
location: New York
  • Теперь в нашем контексте YAML используется в качестве конфигурации для указания пакетов, которые мы хотим установить.
  • Содержимое файла выглядит следующим образом.
channels:
  - conda-forge
dependencies:
  - python >=3.9,<3.11
  - numpy >=1.23.5
  - pip
  - pyramids >=0.2.10
  - geostatista
  - digitalearth >=0.1.9
  - pip:
    - cleopatra
  • Мы не будем углубляться в синтаксис файла YAML, а единственное, что нам нужно знать, это элемент Dictionary. чтобы создать словарь, вам нужно сделать отступ для всех ключей и значений под именем словаря. поэтому для приведенного выше файла у нас есть словарь канала и словарь зависимостей.
  • В канале вы можете перечислить все каналы conda, с которых вы хотите загружать пакеты, например, conda-forge.
  • В словаре зависимостей перечислите все пакеты, которые вы хотите установить из conda (предположительно, из перечисленных выше каналов), вы можете указать номер версии (как у пирамид и пакетов digitalearth), а можете оставить без номера версии (например, пакеты pip и geostatista).
  • указание ограничений номера версии conda при попытке разрешить конфликты между пакетами и их зависимостями может привести к тому, что conda займет больше времени для разрешения конфликта.
  • Если вы хотите установить пакет из pip в своей среде, вы не можете определить pip как отдельный словарь, а включить его в зависимости, а затем отступить пакеты pip ниже в форме списка.
dependencies:
-...
...
- pip:
    - cleopatra
    - pytest >=7.1.3
  • Если вы хотите скомпилировать пакет из определенного репозитория GitHub, вы также можете включить его ниже pip, получить ссылку https на репозиторий git, а затем добавить «git+» в начале.
dependencies:
-...
...
- pip:
    - git+https://github.com/Serapieum-of-alex/cleopatra.git
  • Теперь у нас есть файл YAML со всеми пакетами, которые нам нужно установить в нашей среде.
  • Для получения дополнительной информации о синтаксисе файла YAML вы можете посетить этот веб-сайт [Ссылка].

Обновите среду из environment.yml

  • Итак, теперь, когда у нас уже создана среда, в которой есть только python.
  • теперь я перешел в каталог, где у меня есть файл environment.yml выше

  • Чтобы проверить содержимое файла environment.yml, вы можете использовать команду cat в Linux.

Конда

  • Теперь используйте следующую команду, чтобы обновить среду «hapi» с помощью файла environment.yml.

conda env update -n hapi --file environment.yml
  • Теперь conda попытается найти версии, соответствующие ограничениям всех пакетов зависимостей, иногда этот шаг занимает пару минут, а иногда и больше, хорошая практика, позволяющая минимизировать это время, — указать версию для каждого пакета.
  • Как только список пакетов, которые будут загружены, отображается в вашем терминале, это означает, что conda удалось решить зависимость всех пакетов, и это вопрос времени, прежде чем просто загрузить пакеты для их установки.

  • Теперь, когда мы успешно обновили нашу среду с помощью файла environment.yml, иногда, когда список пакетов длинный, этот шаг обновления занимает много времени.
  • прежде чем мы начнем с замещающего менеджера пакетов, который решит предыдущую проблему, нам нужно вернуться к состоянию среды, когда был установлен только python (с пакетом по умолчанию)
  • Один из способов сделать это — удалить пакеты из файла environment.yml, однако этот способ нецелесообразен, если у вас длинный список пакетов.
  • Другой способ — использовать опцию ревизий в средах conda.

Изменения среды Conda

  • Чтобы проверить версии среды, снова активируйте среду hapi и используйте следующую команду.
conda list --revision 

  • версия нашей среды hapi после того, как мы обновили среду с помощью environment.yml, имеет гораздо больше пакетов, чем вы видите в этой «rev 0»
  • Нет, мы хотим снова установить эту версию 0.
conda install --revision 0
  • Команда сначала отобразит пакеты, которые были установлены после этой версии, и будут удалены, чтобы вернуться к той среде, которая была непосредственно перед этим.

  • Затем команда отобразит все пакеты, которые будут удалены (предыдущий пакет в файле environment.yml, а также их зависимости)

  • Теперь, чтобы убедиться, что у нас нет пакетов из файла environment.yml в нашей среде, перечислите установленные пакеты.
conda list

Менеджер пакетов Мамба

  • Теперь мы вернулись к основной проблеме: conda долго решает проблему зависимости между пакетами.
  • К счастью, есть еще один менеджер пакетов от conda, который может сэкономить нам время ожидания, Mambaэто еще один менеджер пакетов, который устраняет зависимость пакетов (для получения дополнительной информации о mamba см. сайт [здесь])

  • Теперь, чтобы использовать mamba, мы должны установить ее в нашей базовой среде.

  • Мы будем использовать ту же команду env update, но с mamba, а не с conda.
mamba env update -n hapi --file environment.yml

Создайте файл environment.yml

  • Теперь, когда мы создали среду с нуля и обновили ее из environment.yml, а как насчет среды, которую мы использовали в течение длительного времени, мы установили и удалили множество пакетов, которые сделают использование команды conda list для создания файл yml вручную кошмар.
  • Вы можете просто использовать команду «env export», чтобы экспортировать все пакеты в файл yml.
conda env export > export-environment.yml
  • если вы проверили сгенерированный export-environment.yml, вы обнаружите, что он сильно отличается от исходного environment.yml, который мы использовали для обновления среды (они должны быть похожими, за исключением части python, которую мы использовали в команде создания, а не в файле), и что он имеет все зависимости всех пакетов, перечисленных в файл не только наших пакетов, вот всего несколько строк из начала файла export-environment.yml
name: hapi
channels:
  - conda-forge
  - defaults
dependencies:
  - _libgcc_mutex=0.1=conda_forge
  - _openmp_mutex=4.5=2_kmp_llvm
  - affine=2.3.1=pyhd8ed1ab_0
  - alsa-lib=1.2.8=h166bdaf_0
  - attr=2.5.1=h166bdaf_1
  - attrs=22.2.0=pyh71513ae_0
  - blosc=1.21.3=hafa529b_0
  - boost-cpp=1.78.0=h75c5d50_1
  - branca=0.6.0=pyhd8ed1ab_0
  - brotli=1.0.9=h166bdaf_8
  - brotli-bin=1.0.9=h166bdaf_8
  - brotlipy=0.7.0=py39hb9d737c_1005
prefix: /mnt/c/MyComputer/miniconda3/envs/hapi

Заблокируйте свою среду

  • Еще один способ сделать вашу среду воспроизводимой — это использовать файлы блокировки.
  • Файл блокировки — это файл, содержащий список зависимостей и их точные номера версий для конкретной среды. Файл блокировки используется для обеспечения возможности воссоздания среды в будущем, даже если зависимости или их версии больше не доступны.

  • Чтобы создать файл блокировки для существующей среды conda, вы можете создать файл .yml, как указано ранее. Затем вы можете использовать флаг --lock для создания файла блокировки из файла .yml.
  • Чтобы установить пакет conda-lock в вашей базовой среде
conda install -c conda-forge conda-lock
  • Создайте файл блокировки из файла environment.yml
conda lock
  • Сгенерированный файл блокировки будет выглядеть следующим образом (это не весь файл, а только начало).
# This lock file was generated by conda-lock (https://github.com/conda-incubator/conda-lock). DO NOT EDIT!
#
# A “lock file” contains a concrete list of package versions (with checksums) to be installed. Unlike
# e.g. `conda env create`, the resulting environment will not change as new package versions become
# available, unless you explicitly update the lock file.
# Install this environment as "YOURENV" with:
#     conda-lock install -n YOURENV --file conda-lock.yml
# To update a single package to the latest version compatible with the version constraints in the source:
#     conda-lock lock --lockfile conda-lock.yml --update PACKAGE
# To re-solve the entire environment, e.g. after changing a version constraint in the source file:
#     conda-lock -f environment.yml -f C:\MyComputer\01Algorithms\Hydrology\Hapi\environment.yml -f C:\gdrive\01Algorithms\Hydrology\Hapi\environment.yml --lockfile conda-lock.yml
metadata:
  channels:
  - url: conda-forge
    used_env_vars: []
  content_hash:
    linux-64: d4b46d10f102c3e9a7033c8db747d07f4a0ee3426bec22abfc6d19e9199d4d63
    osx-64: 4a9aa6665c96f4ed9c279ec5ade21be588522b9cbca202624ff236b934b45452
    win-64: f818812b5bfc669eec625ff88f57dfecb70e3164cd6fddf4b5c5412081737616
  platforms:
  - linux-64
  - osx-64
  - win-64
  sources:
  - environment.yml
  - C:\MyComputer\01Algorithms\Hydrology\Hapi\environment.yml
  - C:\gdrive\01Algorithms\Hydrology\Hapi\environment.yml

Резюме

  • Итак, теперь мы создали среду с нуля, обновили ее с помощью файла environment.yml, заблокировали ее с помощью блокировки conda и создали файл блокировки, мы также использовали mamba вместо conda для обновления среды на случай, если вас что-то не устраивает. Конда производительность.