Сборник «лучших практик» для проницательного специалиста по данным

В этой статье обсуждаются два подхода к управлению проектами по обработке данных на основе 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, то вы можете предпочесть «общесистемный» подход.