Jupyter Notebook

В своей известной презентации “Я не люблю блокноты” (видео и слайды) Джоэль Грус критикует Jupyter Notebook — вероятно, самую популярную среду разработки для машинного обучения. Для меня эта презентация несёт поучительный характер: когда все думают, что продукт хорош, нужны люди, которые раскритикуют его, чтобы мы не останавливались на достигнутом. На самом деле, я думаю, что проблема не в самом блокноте, а в том, как он используется: как и любой другой инструмент, Jupyter Notebook может неправильно применяться, что и происходит.

По этой причине я хочу немного переиначить название презентации Груса и сказать: “Я не люблю беспорядочные, непонятные блокноты без названия и без комментариев или других пояснений”. Jupyter Notebook приспособлен для грамотного программирования — соединения кода, текста, результатов, изображений и пояснений в один цельный документ. Однако, я довольно часто вижу пренебрежение этим предназначением. Это заканчивается вот такими блокнотами, захламляющими репозитории на GitHub:

Не позволяйте таким документам попадать на GitHub

Проблемы достаточно очевидны:

  • Нет названия
  • Нет описания кода: как он работает и для чего предназначен
  • Ячейки расположены не в порядке запуска
  • Код работает с ошибками

Jupyter Notebook может быть невероятно мощным инструментом для обучения, исследований и общения (пример). Несмотря на это, встречаются и такие блокноты, как выше. В нём сложно разобраться, провести дебаггинг или даже понять, что делает код. Как минимум, каждый блокнот должен содержать понятное название, краткое вступление, описание и заключение; ячейки должны располагаться в порядке их запуска. К тому же, перед публикованием блокнота необходимо удостовериться в том, что код выполняется без ошибок.


Решение: использование расширений для Jupyter Notebook

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

  • Создаёт шаблон для документации
  • Импортирует часто используемые библиотеки
  • Просит ввести название блокнота
Расширение, которое запускается при открытии нового блокнота

Преимущества расширения в том, что оно меняет настройки блокнота, установленные по умолчанию. Так, например, новый блокнот в Jupyter Notebook не содержит ячеек с разметкой, назван как “Untitled” и в нём не импортирована ни одна библиотека. Мы знаем, что люди на удивление редко меняют настройки по умолчанию, так почему бы не сделать так, чтобы сами настройки заставляли людей делать блокноты лучше? Думайте об этом расширении как о пинке, который ненавязчиво подталкивает к созданию более удобных блокнотов.

Для использования этого расширения:

  1. Установите Jupyter Notebook Extensions
  2. Скачайте с GitHub папку setup (в ней должно быть 3 файла)
  3. Выполните команду pip show jupyter_contrib_nbextensions для того, чтобы узнать, где установлены расширения. У меня на Windows с установленным пакетом Anaconda их расположение таково:

C:\users\willk\anaconda3\lib\site-packages\jupyter_contrib_nbextensions 

При этом на Mac без Anaconda путь к расширениям такой:

/usr/local/lib/python3.6/site-packages/jupyter_contrib_nbextensions

4. Переместите папку setup в nbextensions/ :

5. Выполните команду jupyter contrib nbextensions install для установки нового расширения

6. Запустите Jupyter Notebook и включите Setup во вкладке nbextensions (если вы не можете найти эту вкладку, то откройте блокнот и зайдите в edit > nbextensions config)

Пункт Setup должен быть помечен галочкой

Теперь создайте новый блокнот и начинайте работу! Шаблон по умолчанию можно изменить в main.js. Шаблон по умолчанию довольно незамысловатый, но его можно персонализировать.

Шаблон и импортируемые библиотеки

Если вы откроете старый блокнот, то шаблон не появится, но каждый раз, когда вы будете запускать ячейку, среда будет просить изменить имя с Untitled:

Просьба изменить название будет появляться до тех пор, пока название блокнота не станет отличным от Untitled

Иногда настойчивость — ключ к успеху.

Напутственные размышления

Давайте с этого момента стараться создавать блокноты лучше. Это не требует большого количества времени или усилий, но при этом сделает лучше в будущем и вам, и тем, кто будет использовать ваш код. Вот несколько правил, которым стоит следовать при создании блокнотов:

  • Давайте название каждому блокноту. Это полезно, особенно, если у вас их десятки.
  • Давайте краткое и понятное объяснение тому, как код работает, что он делает, каковы результаты работы над ним и выводы из этого. Я использую это как шаблон для блокнота, чтобы выработать в вас эту привычку.
  • Перед публикацией блокнота запустите каждую ячейку заново, чтобы убедиться в том, что код выполняется без ошибок.

Расширение Setup, конечно же, не решит все проблемы с использованием Jupyter Notebook. Однако, оно даст основу для приобретения полезных привычек. Для выработки хорошей привычки требуется много времени, зато, выработавшись, они остаются надолго. Надеюсь, что благодаря этим усилиям следующая презентация о блокнотах будет называться “Мне нравятся качественные блокноты Jupyter”.


Перевод статьи Will Koehrsen: Set Your Jupyter Notebook up Right with this Extension