websitelytics

Menu

Запускаем Jupyter notebook на GCP

Опубликовано: 21 фев 2021

Недавно возникла задача развернуть небольшую платформу для совместной работы с Jupyter-ноутбуками. Задача возникла потому, что на известных бесплатных платформах, в том числе Google Colab, не удалось подгрузить некоторые модули. Да и в целом хотелось попробовать создать внутреннее решение, в котором уже были бы предустановлены все необходимые библиотеки.

Ниже описан опыт запуска Jupyter notebook на Google Cloud Platform. Все оказалось достаточно просто с парой оговорок — проект не предполагал какой-то серьезной безопасности данных и задачи были несложными с точки зрения вычисляемой мощности. Один из юзкейсов, к примеру, это коллаборативное построение диаграмм с помощью библиотеки schemdraw.

Нужно также отметить, что непосредственно параллельная работа с ноутбукам таким образом невозможна, в Jupyter просто не реализован такой функционал, но для последовательной корректировки кода несколькими участниками - это вполне приемлемое решение.

Мы будем предполагать, что у вас уже есть какой-то опыт использования Google Cloud Platform и опустим описание создания аккаунта и проекта. Итак, нам нужен Compute Engine в котором мы создадим простую виртуальную машину, где и запустим Jupyter notebook.

Создаем VM

Заходим в раздел Compute Engine -> VM instances и жмем Create Instance. Далее задаем конфигурацию виртуальной машины. Мощность VM естественно выбираем согласно задачам. Для запуска ноутбуков в качестве загрузочного диска можно выбрать вариант "минимальной" операционной системы, например, Ubuntu 20.10 Minimal. Я бы рекомендовал выбирать последнюю версию OS.

Если вы хотите сохранить ноутбуки на диске и после удаления VM, нужно убрать галочку в соответствующем поле настройки диска. Мне пока не приходилось проверять работу данной галочки, в любом случае предпочитаю всегда копировать ноутбуки на Github.

В последствии этот параметр можно отредактировать в настройках VM:

Поскольку я привык работать с VM через SSH, я сразу задаю публичный ключ, чтобы иметь удобный доступ к терминалу VM.

SSH ключ также можно добавить и к существующие машине в ее настройках (VM instance details).

Делаем внешний IP-адрес статическим

Идем в раздел VPC Network -> External IP addresses и меняем тип адреса для нашей VM с Ephemeral на Static. Это позволит нам быть уверенным в том, что в случае перезагрузки VM значение IP адреса сохранится.

Указываем правила Firewall

Идем в раздел VPC Network -> Firewall и с помощью соответствующих установок открываем доступ к портам, которые обычно используются в Jupyter notebook:

Развертываем Jupyter notebook на VM

Я использую 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: