Jupyter Notebook — один из основных инструментов работы с данными, прежде всего на нашем флагманском курсе по Data Science. Именно поэтому мы регулярно освещаем события вокруг этой интерактивной среды, а сегодня рассказываем, как изменится JupyterLab. За подробностями, как всегда, приглашаем под кат.


Следующая основная версия JupyterLab значительно быстрее прошлых благодаря систематическому отслеживанию ошибок, а также за счёт значительных обновлений протокола передачи данных Jupyter и механизма визуализации документов.


1. Установление строгих показателей эффективности


Первый шаг к любому измеримому повышению производительности — систематизация самого измерения.


Сегодня в проекте JupyterLab есть инструмент анализа производительности — это Action на GitHub. Action может срабатывать в ответ на любой пул-реквест, он проверяет влияние изменений на производительность. Реализацию Action вы найдёте в репозитории.


Этот инструмент измеряет время на:


  • открытие тестового блокнота;
  • переход от такого блокнота к его копии в другой вкладке;
  • переход от тестового блокнота к редактору;
  • обратный переход;
  • поиск слова в тестовом блокноте и закрытие блокнота.

Несколько примеров блокнотов есть в тестовых пакетах. Результаты тестов публикуются как комментарии к пул-реквесту: #11494#issuecomment-976393815.


Пример отчёта нового аналитического инструмента


Пример бенчмарка нового аналитического инструмента

В примере отчёта нового аналитического инструмента распределение времени выполнения каждой частной задачи показано в виде «ящика с усами», он охватывает квартили 1–3, а белая линия соответствует медианным значениям.


Этот инструмент сразу же позволил оптимизировать скрытие блокнотов при переключении вкладок. Блокноты могут скрываться при добавлении класса CSS, который включает некоторое CSS-правило, или при принудительной установке параметра их отображения в значение none. В зависимости от браузера выбор того или иного способа скрытия содержимого может вызвать пересчёт всей страницы, поэтому мы сделали этот параметр настраиваемым в конфигурации JupyterLab.


Сравнительные тесты на GitHub провёл Фредерик Колонваль.


2. Обновление до CodeMirror 6


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


JupyterLab 4 включает обновление CodeMirror 5 до CodeMirror 6, которое влечёт за собой изменение всего текстового редактора. Эта работа отражена в #11638, #12877 и #12861. В кодовой базе JupyterLab изменились 150 файлов. Сравнительные тесты в аналитической программе показали, что для больших блокнотов коэффициент ускорения — между значениями 2 и 3.


Бенчмарк перехода на CodeMirror 6


Бенчмарк перехода на CodeMirror 6

CodeMirror 6 — это важный промежуточный шаг к доступности блокнотов Jupyter для людей, которым нужны экранные дикторы и другие подобные средства.


Обновление JupyterLab до CodeMirror 6 разработал Йохан Мабиль.


3. Виртуальная визуализация блокнотов


Блокнот в JupyterLab 4 визуализирует только части документа, которые видны в рабочем окне. Это значительно повышает скорость визуализации больших блокнотов. Вот основной пул-реквест с реализацией этой функции: #12554.


Этот пул-реквест потребовал значительной подготовки, особенно для реализации фичи поиска и оглавления. Обе они используют представление «блокнот» (notepad view), а не модель документа. Так сделано в #11689 и #12374, соответственно. Это позволило значительно ускорить визуализацию больших файлов блокнота: от 3 до 4, в дополнение к уже улучшенной производительности, благодаря миграции CodeMirror 6.


Бенчмарк визуализации блокнотов



Бенчмарк визуализации блокнотов

Виртуальную визуализацию блокнотов разработал Фредерик Колонваль.


4. Согласование протокола Jupyter


Сервер Jupyter служит активным узлом для связи между ядрами и фронтендами, такими как JupyterLab или блокнот. Связь сервер⇄ядро идёт через сокеты ZeroMQ с хорошо документированным протоколом ядра Jupyter, а связь сервер⇄клиент — через WebSockets.


К сожалению, до недавнего времени протоколы сервер⇄ядро (ZMQ) и сервер⇄клиент (WebSocket) несколько различались, и серверу приходилось разбирать каждое сообщение и повторно сортировать его в обоих направлениях. Затраты времени на обработку коротких сообщений, таких как запросы на выполнение и ответы, были невелики. Однако при работе с большими наборами данных, отправляемыми и получаемыми с внешнего интерфейса, такими как большие таблицы или сложный рендеринг mime-типов, времени требуется гораздо больше. Такое несоответствие протоколов ZMQ и WebSocket может стать узким местом.


В Jupyter Server 2 соединение WebSocket поддерживает новый «согласованный» протокол, в котором сообщения могут быть просто скопированы в поддерживаемые JupyterLab 4 сообщения ZeroMQ. Работа выполнена в #657 (jupyter-server), #154 (jupyverse) и #11841 (JupyterLab)). Этот протокол опционален и ожидается, что устаревшие фронтенды Jupyter по-прежнему будут работать с Jupyter Server 2.


Сравнительный анализ показал больший (как минимум на порядок, а для крупных сообщений и более) коэффициент ускорения производительности сервера Jupyter при отображении больших наборов данных в его виджетах. Но это не учитывается эталонными тестами JupyterLab, они сосредоточены на производительности визуализации.


Согласование протокола разработал Давид Брошар.


5. Обновление до Lumino 2


Фронтенд JupyterLab построен на основе фреймворка Lumino, который предусматривает утилиты для создания браузерных приложений, подобных десктопным. Он даёт основу для таких приложений и единую «обёртку» компонентов, которая управляет жизненным циклом и эффективно распространяет события фронтенда на всё приложение (например, события изменения размера, перетаскивания, расчёта макета). Lumino также содержит несколько высокопроизводительных компонентов, таких как перетаскиваемая док-панель (которая используется как оболочка приложения для JupyterLab) и лучший в своём классе компонент сетки данных.


JupyterLab 4 содержит крупное обновление Lumino. Основные изменения в Lumino 2 включают переход на ES2018, позволивший удалить значительную часть кодовой базы, необходимой для поддержки функций, доступных теперь в JavaScript, такие как нативные итераторы, удаление полифиллов для промисов и логики обработки особых случаев для устаревших браузеров, например IE. Это обновление повысило производительность всего фронтенда, хотя не для визуализации больших документов. Lumino 2 поддерживает фоновую обработку компонентов пользовательского интерфейса, когда приложение — в фоновой вкладке браузера. Данная функция может быть перенесена и в Lumino 1.x.


Обновление Lumino 2 и его интеграцию с JupyterLab разработал Афшин Дариан.


6. Ускоренная сетка данных Lumino


Оптимизация виджета сетки данных Lumino ускорила визуализацию при слиянии ячеек (PR #394). Сетка данных Lumino используется в разных элементах JupyterLab, например при реализации табличного представления для файлов CSV. Они также применяется в сторонних расширениях, например в виджете ipydatagrid, и при отображении таблиц BeakerX.


Сетку данных Lumino оптимизировал Мартен Рену.


Благодарности


Команда QuantStack работала над улучшением производительности JupyterLab вместе с Two Sigma. Некоторые пул-реквесты потребовали серьёзных изменений кодовой базы JupyterLab. Мы очень благодарны Two Sigma за столь глубокую поддержку разработки проекта Jupyter.


Об авторах


  • Фредерик Колонваль возглавлял работу по повышению производительности JupyterLab, технический директор QuantStack. Член основной рабочей группы JupyterLab, автор ряда расширений JupyterLab.
  • Йохан Мабиль — технический директор QuantStack, активно работает в рамках экосистемой Jupyter. Регулярно занимается JupyterLab, разработчик Xeus, фреймворка для создания ядер Jupyter.
  • Давид Брошар — разработчик программного обеспечения QuantStack, активно работает в рамках экосистемы Jupyter. Сопровождает проект Jupyter-server, главный автор Jupyverse. Участвует также в разработке стека для geo-science с открытым кодом на базе Jupyter.
  • Афшин Дариан — технический директор QuantStack, соучредитель проекта JupyterLab, над которым продолжает работать по сей день.

А мы научим работать с данными, чтобы вы прокачали карьеру или стали востребованным IT-специалистом:



Чтобы посмотреть все курсы, кликните по баннеру:



Комментарии (2)


  1. mrkaban
    27.10.2022 08:48

    эм... у SkillFactory есть вообще свои статьи? второй подряд перевод чужой статьи, вместо демонстрации способностей своих лекторов.


    1. vassabi
      27.10.2022 12:07

      эм ... гуглоперевод ? или с вычиткой жывыми людьми ?