Сборник «лучших практик» для проницательного специалиста по данным
В этой статье обсуждаются два подхода к управлению проектами по обработке данных на основе JupyterLab с использованием Conda (+pip): общесистемный подход, при котором Conda (+pip) используется для управления одной установкой JupyterLab, которая используется во всех проектах, и проектный подход, при котором Conda (+pip) используется для управления отдельными установками JupyterLab для каждого проекта. После описания двух подходов я рассмотрю несколько примеров и обсужу соответствующие компромиссы.
«Общесистемная» установка JupyterLab
При «общесистемном» подходе к управлению JupyterLab Conda (+pip) используется для управления установкой JupyterLab, которая используется всеми или вашими проектами по обработке и анализу данных. У «системного» подхода есть несколько преимуществ.
- Общий набор расширений JupyterLab упрощает пользовательский интерфейс (UI) и взаимодействие с пользователем (UX).
- Позволяет быстрее запускать новые проекты, поскольку нет необходимости устанавливать (и создавать!) JupyterLab для каждого проекта.
- Простая низкоуровневая настройка JupyterLab с помощью файлов внутри каталога
~/.jupyter
в домашнем каталоге вашего пользователя.
Типичный Conda environment.yml для «общесистемной» установки
Ниже приведен файл-заглушка environment.yml
для общесистемной установки JupyterLab.
name: jupyterlab-base-env channels: — conda-forge — defaults dependencies: — jupyterlab — jupyterlab-git # provides git support — nodejs # required for building (some) extensions — pip — pip: — -r file:requirements.txt # extensions available via pip go here — python
Пара вещей, которые стоит отметить. Во-первых, вы должны включить любые расширения JupyterLab, доступные через Conda (обычно из канала conda-forge
) в качестве зависимостей в этом файле. Расширения JupyterLab, доступные через Pip, должны быть включены отдельно в файл requirements.txt
(обсуждается ниже). Во-вторых, я явно включаю nodejs
в качестве зависимости. Node.js требуется для пересборки JupyterLab (что может понадобиться в зависимости от вашей коллекции расширений). Наконец, я устанавливаю Pip и использую pip
для установки всех пакетов и расширений, включенных в отдельный файл requirements.txt
.
Типичные требования pip.txt для общесистемной установки
Ничего необычного в файле requirements.txt
. Вы просто перечисляете пакеты и расширения, которые хотите установить через pip
. Здесь я включаю расширение Jupyter Language Server Protocol, которое предоставляет полные возможности IDE, такие как навигация по коду, подсказки при наведении курсора, линтеры, автозаполнение и переименование в JupyterLab.
jupyter-lsp python-language-server[all]
Автоматизируйте сборку jupyterlab-base-env
с помощью скрипта Bash.
Поскольку процесс сборки среды для сред Conda (+pip) немного сложен (поскольку он включает в себя установку пакетов через Conda, установку пакетов через Pip, а затем, возможно, установку расширений и пересборку самого JupyterLab), рекомендуется автоматизировать сборку среды. с помощью Bash-скрипта.
#!/bin/bash --login set -e conda env create \ —-name jupyterlab-base-env \ —-file environment.yml \ —-force conda activate jupyterlab-base-env source postBuild # put jupyter labextension install commands here
Обратите внимание на использование флага --login
. Это гарантирует, что сценарий будет работать внутри оболочки входа в систему, которая будет правильно получать необходимые профили Bash, необходимые для того, чтобы команда conda activate
работала должным образом. Также обратите внимание на ссылку на файл postBuild
. Это сценарий Bash, который содержит все необходимые jupyter labextension install
команды, необходимые для включения этих расширений и перестроения JupyterLab. Я включил рабочий пример всех ссылок на файлы конфигурации выше на GitHub.
Держите свою jupyterlab-base-env
худой
Ваша среда jupyterlab-base-env
должна содержать только JupyterLab и все необходимые расширения (+зависимости). Не устанавливайте пакеты, которые вы будете использовать для проектов по науке о данных, в свой jupyterlab-base-env
. Вместо этого вам следует создать отдельные среды Conda (+pip) для каждого из ваших проектов, а затем создать собственные ядра Jupyter для каждой из сред Conda (+pip), специфичных для вашего проекта.
Создание ядер Jupyter для сред Conda
Создание собственного ядра Jupyter для каждой из сред Conda (+pip) вашего проекта — это то, что позволит вам запускать Jupyter Notebooks и консоли IPython из этих сред в рамках обычной установки JupyterLab. Вы даже можете автоматизировать процесс создания ядра для всех сред Conda (+pip) на вашем компьютере, используя расширение jupyter-conda
!
Однако вместо того, чтобы создавать собственные ядра для каждой среды Conda (+pip), я предпочитаю вручную создавать собственные ядра Jupyter для конкретных сред Conda (+pip), которые мне действительно нужны.
Как вручную создать собственное ядро Jupyter
Прежде чем вы сможете создать собственное ядро для вашей среды Conda (+pip), вам необходимо убедиться, что пакет ipykernel
установлен в вашей среде Conda, так как вам нужно будет использовать этот пакет для создания файла спецификации ядра.
conda activate $PROJECT_DIR/env # don’t forget to activate! python -m ipykernel install \ # requires ipykernel! --user \ —-name name-for-internal-use-only \ —-display-name “Name you will see in the JupyerLab launcher”
Установка JupyterLab на основе проекта
При «проектном» подходе к управлению JupyterLab Conda (+pip) используется для управления отдельными установками JupyterLab для каждого проекта. У «проектного» подхода есть несколько преимуществ.
- Более гибкий пользовательский интерфейс / UX, поскольку версия и расширения JupyterLab могут быть настроены для каждого проекта.
- Проще экспериментировать с передовыми функциями JupyterLab.
- Автоматически делает репозиторий проекта по науке о данных готовым к связыванию.
Типичный Conda environment.yml для «проектной» установки
Структура этого файла environment.yml
аналогична структуре «общесистемного» подхода. Отличие в том, что при «проектном» подходе вы должны добавить в этот файл все необходимые пакеты и расширения для вашего проекта, которые доступны через Conda; аналогично для Pip и файла requirements.txt
.
name: null channels: — conda-forge — defaults dependencies: — jupyterlab — jupyterlab-git # extensions available via conda go here - nodejs — pip — pip: — -r file:requirements.txt # packages available via pip go here — python
Автоматизируйте сборку среды проекта с помощью скрипта Bash
Опять же, вы должны автоматизировать сборку среды Conda (+pip), где это возможно. Единственная разница между этим сценарием и сценарием, используемым в общесистемном подходе, заключается в том, что я устанавливаю свою среду Conda (+pip) в подкаталог с именем env
каталога моего проекта. Это лучшая практика Conda (+pip)».
#!/bin/bash —-login set -e export ENV_PREFIX=$PROJECT_DIR/env conda env create \ —-prefix $ENV_PREFIX —-file environment.yml \ —-force conda activate $ENV_PREFIX source postBuild # put jupyter labextension install commands here
Примеры «проектной» установки JupyterLab
Как и было обещано, вот несколько примеров «проектного» подхода, который вы можете использовать в качестве вдохновения для своего следующего проекта по науке о данных.
- JupyterLab + Scikit Learn + Dask: среда для проектов по обработке и анализу данных на основе ЦП, которая объединяет JupyterLab с Scikit-learn и Dask (и друзья!). Включает в себя некоторые распространенные расширения JupyterLab.
- JupyterLab + PyTorch: стандартная среда для глубокого обучения с ускорением на GPU с помощью JupyterLab и PyTorch. Включает расширения JupyterLab для GPU и глубокого обучения, такие как jupyterlab-nvdashboard и jupyterlab-tensorboard.
- JupyterLab + NVIDIA RAPIDS + BlazingSQL + Dask: более сложная среда для машинного обучения с ускорением на GPU с JupyterLab, NVIDIA RAPIDS, BlazingSQL и Dask (и много друзей!). Включает некоторые распространенные расширения JupyterLab, а также некоторые специфичные для GPU расширения, такие как jupyterlab-nvdashboard.
Магические команды %conda и %pip
Любое обсуждение JupyterLab, Conda и pip было бы неполным без упоминания встроенных магических команд IPython для установки пакетов в активную среду/ядро через Conda (%conda
) или Pip (%pip
).
- Обе команды можно использовать из Jupyter Notebooks или консолей IPython.
- И
%conda
, и%pip
в основном полезны для прототипирования новых проектов. - Для «производства» предпочтительнее добавлять новые пакеты в файлы
environment.yml
илиrequirements.txt
(и перестраивать среду).
Резюме
Надеюсь, к этому моменту вы поймете разницу между «общесистемным» и «проектным» подходами к управлению установками JupyterLab с помощью Conda (+pip). Вы также видели несколько примеров обоих подходов, включая некоторый стартовый код, который вы можете использовать для своего следующего проекта по науке о данных.
В целом, я рекомендую «проектный» подход из-за его большей гибкости с минимальными дополнительными накладными расходами. Если вы работаете с графическими процессорами только в некоторых своих проектах, вы можете предпочесть «проектный» подход, поскольку есть несколько хороших расширений JupyterLab для проектов обработки данных с ускорением на графическом процессоре (которые вы не хотите устанавливать для проектов, использующих только ЦП). ). Однако если во всех ваших проектах используются только процессоры или вы почти всегда используете графические процессоры и всегда используете общий набор расширений JupyterLab, то вы можете предпочесть «общесистемный» подход.