Опубликовано: 21 фев 2021
Недавно возникла задача развернуть небольшую платформу для совместной работы с Jupyter-ноутбуками. Задача возникла потому, что на известных бесплатных платформах, в том числе Google Colab, не удалось подгрузить некоторые модули. Да и в целом хотелось попробовать создать внутреннее решение, в котором уже были бы предустановлены все необходимые библиотеки.
Ниже описан опыт запуска Jupyter notebook на Google Cloud Platform. Все оказалось достаточно просто с парой оговорок — проект не предполагал какой-то серьезной безопасности данных и задачи были несложными с точки зрения вычисляемой мощности. Один из юзкейсов, к примеру, это коллаборативное построение диаграмм с помощью библиотеки schemdraw
.
Нужно также отметить, что непосредственно параллельная работа с ноутбукам таким образом невозможна, в Jupyter просто не реализован такой функционал, но для последовательной корректировки кода несколькими участниками - это вполне приемлемое решение.
Мы будем предполагать, что у вас уже есть какой-то опыт использования Google Cloud Platform и опустим описание создания аккаунта и проекта. Итак, нам нужен Compute Engine в котором мы создадим простую виртуальную машину, где и запустим Jupyter notebook.
Заходим в раздел Compute Engine -> VM instances и жмем Create Instance. Далее задаем конфигурацию виртуальной машины. Мощность VM естественно выбираем согласно задачам. Для запуска ноутбуков в качестве загрузочного диска можно выбрать вариант "минимальной" операционной системы, например, Ubuntu 20.10 Minimal. Я бы рекомендовал выбирать последнюю версию OS.
Если вы хотите сохранить ноутбуки на диске и после удаления VM, нужно убрать галочку в соответствующем поле настройки диска. Мне пока не приходилось проверять работу данной галочки, в любом случае предпочитаю всегда копировать ноутбуки на Github.
В последствии этот параметр можно отредактировать в настройках VM:
Поскольку я привык работать с VM через SSH, я сразу задаю публичный ключ, чтобы иметь удобный доступ к терминалу VM.
SSH ключ также можно добавить и к существующие машине в ее настройках (VM instance details).
Идем в раздел VPC Network -> External IP addresses и меняем тип адреса для нашей VM с Ephemeral на Static. Это позволит нам быть уверенным в том, что в случае перезагрузки VM значение IP адреса сохранится.
Идем в раздел VPC Network -> Firewall и с помощью соответствующих установок открываем доступ к портам, которые обычно используются в Jupyter notebook:
Я использую Visual Studio Code в качестве редактора кода, который поддерживает работу с облачной VM через SSH, но в принципе подойдет любой способ запуска команд в терминале VM. В VSC обычно вы устанавливаете соединение с помощью пары шагов: 1. редактируете файл конфигурации SSH (разово), 2. выбираете удаленный хост в списке этой конфигурации и указываете пару дополнительных параметров по ходу соединения:
Первым делом нужно обновить файлы Ubuntu
sudo apt update
sudo apt -y upgrade
Затем устанавливаем необходимые библиотеки python для работы с виртуальным окружением:
sudo apt-get install python3-dev python3-pip python3-venv -y
Создаем директорию для ноутбуков, например:
mkdir notebooks
Чтобы мы могли создавать новые ноутбуки из веб интерфейса присваиваем директории соответствующие права, например:
sudo chmod g+rw /home/websitelytics/notebooks
Важное замечание: естественно такие права для директории это некая уязвимость в безопасности и определенный риск, но на мой взгляд для проектов где нужно протестировать какую-то идею, и где вы можете в любой момент выключить и включить виртуальную машину, это приемлемый вариант.
Подготавливаем Python3 окружение
cd notebooks
python3 -m venv .venv
Активируем виртуальное окружение:
source .venv/bin/activate
На этом этапе можно установить нужные вам дополнительные питоновские библиотеки.
Устанавливаем внутри нашего виртуального окружения Jupyter notebook:
pip install jupyter
Создаем файл конфигурации ноутбуков:
jupyter notebook --generate-config
Редактируем в нем строчку c.NotebookApp.ip
, заменяя localhost на 0.0.0.0
Генерируем пароль:
jupyter notebook password
Проверяем работу ноутбука:
jupyter notebook
Либо запускаем Jupyter notebook в фоновом режиме
nohup jupyter notebook &
Ноутбуки будут доступны по IP адресу вашей виртуальной машины и соответствующему порту: http://IP_ADDRESS:8888/
Важное замечание: не забывайте останавливать вашу VM, когда не планируете ее использовать. В биллинге за VM учитывается только время, когда она включена, вы не платите за выключенную VM. Если же вы решили удалить VM, и вам не нужен статический адрес, его также стоит удалить в соответствующем разделе, это можно сделать минут через пять после удаления VM. При работающей VM статический адрес всегда можно поменять обратно на эфемерный, хотя большого смысла в этом нет.
В GCP также есть возможность запускать собственный скрипт при старте VM. Для этого в настройках (VM instance details) вам нужно добавить в методанные VM параметр startup-script
и указать код скрипта в качестве его значения. Таким образом можно запускать Jupyter notebook автоматически при старте VM.
Поскольку в данном случае я все устанавливал из под определенного пользователя (websitelytics), в моем случае скрипт будет таким:
#! /bin/bash
sudo useradd -m websitelytics
sudo -u websitelytics bash -c 'cd ~/notebooks/; source .venv/bin/activate; nohup jupyter notebook &'
Логи запуска VM и стартового скрипта можно посмотреть в Cloud Logging: