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 — это важный промежуточный шаг к доступности блокнотов 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-специалистом:
Чтобы посмотреть все курсы, кликните по баннеру:
- Профессия Data Scientist
- Профессия Data Analyst
- Курс «Математика для Data Science»
- Курс «Математика и Machine Learning для Data Science»
- Курс по Data Engineering
- Курс «Machine Learning и Deep Learning»
- Курс по Machine Learning
Python, веб-разработка
- Профессия Fullstack-разработчик на Python
- Курс «Python для веб-разработки»
- Профессия Frontend-разработчик
- Профессия Веб-разработчик
Мобильная разработка
Java и C#
- Профессия Java-разработчик
- Профессия QA-инженер на JAVA
- Профессия C#-разработчик
- Профессия Разработчик игр на Unity
От основ — в глубину
А также
ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/693336/
Добавить комментарий