Сделайте свою среду Python воспроизводимой, используя распространенные методы создания, обновления и блокировки вашей среды с помощью файла YAML.
В серии статей я начал со статьи «Начало работы со средой Conda [Часть-1]», где я описал первые шаги по использованию conda для создайте свою среду Python, поэтому всем, кто только начинает работать с conda, следует сначала ознакомиться с предыдущей статьей. затем в другой статье «Еще один шаг к улучшению среды Conda — реализация Numpy[Часть-2]»я показал, как повысить производительность среды conda и что реализация BLAS NumPy изменяет размер среды.
В этом руководстве мы сделаем следующий шаг для поддержки нашей среды с помощью файла YAML, чтобы отслеживать, какие пакеты установлены в нашей среде и какие версии являются пакетами.
Использование файлов YAML делает вашу среду легко воспроизводимой и является очень профессиональным способом поделиться своим блокнотом по науке о данных с другими.
Содержание статьи организовано следующим образом
- Создайте среду
- Окружающая среда.yml
- Обновите среду из environment.yml
- Изменения среды Conda
- Менеджер пакетов Мамба
- Создайте файл environment.yml
- Заблокируйте свою среду
- Резюме
Итак, начнем
Создайте среду
- В предыдущей статье я рассмотрел все, что вам нужно знать о conda, miniconda и anaconda Начало работы со средой Conda [Часть-1]», чтобы получить к этому моменту
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 для обновления среды на случай, если вас что-то не устраивает. Конда производительность.