Назад к статьям

Jupyter Notebook и Anaconda. Удаленная разработка на Ubuntu Server

05.08.2019

Jupyter Notebook и Anaconda для удаленной разработки на отдельном Ubuntu Server, нужны для облегчения себе жизни. А так же чтобы не таскать с места на место свои проектики или не работать с jupyter notebook через удалённый рабочий стол. Еще распространена ситуация, когда у вас дома, в офисе, на даче или в датацентре стоит мощная вычислительная нода, многопроцессорная, с профильными для машинного обучения картами. Доступ к ней напрямую по HTTPS всегда удобнее чем через какой-либо каскад графических удаленных рабочих столов.

Можно конечно всё поставить на масдай, но 1) нестабильно, 2) в случае работы в виртуальной среде еще и нарушает лицензию использования масдая. Ведь 99.9% желающих захотят запилить в виртуальную среду какую-нибудь обычную прошку да? А она даже с лицензионным валидным ключем — будет нарушать еулу. Собственно зачем жертвовать стабильностью работы, и нарушать лицензию, если этого можно избежать?

В данной статье не рассматриваются вопросы относительно проброса трафика из интернета до вашей ноды. Подразумевается что этот вопрос у вас уже решен и ваш трафик из интернета спокойно доходит до вашей ноды, хотя бы по одному TCP порту.

Что мы имеем?

Некий сервер, внутри нашей локальной сети, куда мы хотим запилить Ubuntu Server, на неё установить Anaconda и использовать идущей в комплекте Jupyter Notebook. Почему не голый Jupyter Notebook? Потому что у анаконды в комплекте куча еще всяких прочих плюшек.

Что нам надо?

Собственно только сервер (В моём случае виртуальная машина внутри бесплатного гипервизора ESXi). Чем мощнее тем лучшее, но всё зависит от того чем именно вы занимаетесь в Jupyter Notebook.

Я буду использовать виртмашину где:

  1. 4 vCPU от процессора Intel
  2. 8Gb Ram
  3. 16Gb Hdd
  4. IP 192.168.220.135 Вы свои параметры должны определить для себя самостоятельно

С чего стоит начать:

  • Установка Ubuntu Server 18.04

Что может пригодиться:

  • Ubuntu Server 18.04 — Установка статического IP
  • Ubuntu Server 18.04 — Изменение имени сервера

Обновляем сервер для Jupyter Notebook

bash
sudo apt update && sudo apt dist-upgrade -y

Скачиваем дистрибутив с официального сайта

bash
wget https://repo.anaconda.com/archive/Anaconda3-2019.07-Linux-x86_64.sh

Проверяем хеш скачанного файла

Открываем страницу с хешами, выбираем тип дистрибутива который качали, и там смотрим конкретную версию файла

Anaconda, Jupyter Notebook для удаленной разработки на Ubuntu Server - Смотрим хеш на сайте
Проверяем хеш на сайте
Anaconda, Jupyter Notebook для удаленной разработки на Ubuntu Server - Проверяем Hash с помощью md5sum
Проверяем хеш скачанного файла

В моём случае я скачивал в корень своей папки, поэтому у меня команда будет выглядеть так:

bash
md5sum ~/Anaconda3-2019.07-Linux-x86_64.sh

Устанавливаем Anaconda

Вводим команду bash ~/Anaconda3-2019.07-Linux-x86_64.sh , принимаем лицензионное соглашение введя yes и ожидаем окончания установки
В конце инсталлятор спросит

Anaconda, Jupyter Notebook для удаленной разработки на Ubuntu Server - Завершение установки
Anaconda, Jupyter Notebook для удаленной разработки на Ubuntu Server — Завершение установки

Вводим yes и вуаля! С установкой Anaconda мы закончили.
Для того чтобы изменения вступили в силу, необходимо перелогиниться завершив сессию с помощью exit или просто перезагрузить сервер с помощью sudo reboot -h now

Настраиваем Jupyter Notebook

Генерируем конфиг файл

bash
jupyter notebook --generate-config

Эта команда сгенерирует конфиг файл, в моём случае по следующему пути: /home/belfigor/.jupyter/jupyter_notebook_config.py

Генерируем ssl сертификат

bash
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem

Данная команда сгенерирует файлы сертификата в той же папке, которая была открыта в момент запуска. В моём случае это домашняя моя домашняя папка ~/ , полный путь выглядит как /home/belfigor

Изменяем конфигурацию Jupyter Notebook

Открываем на редактирование наш конфиг и ищим указанные ниже параметры

bash
nano /home/belfigor/.jupyter/jupyter_notebook_config.py

Искать параметры в nano можно с помощью комбинации клавишь Ctrl+W. Сохранить изменения с помощью Ctrl+O, а завершить редактирование с помощью Ctrl+X.

Находим следующие строки и прописываем там путь до файлов сертификатов

bash
c.NotebookApp.keyfile = '/home/belfigor/mykey.key'
c.NotebookApp.certfile = '/home/belfigor/mycert.pem'

Прописываем интерфейс на котором Jupyter Notebook будет принимать подключения

bash
c.NotebookApp.ip = '192.168.220.135'

Я указываю ip интерфейса, которым сервер смотрит в локальную сеть, откуда из интернета прокинут порт 35344, для доступа из вне.
Если у сервера больше одного интерфейса и мы хотим чтобы Jupyter обрабатывал входящие подключения со всех, можно указать «*»

Задаем порт на котором будут обрабатываться подключения

bash
c.NotebookApp.port = 35344

Отключаем автозапуск браузера

Так как у нас Ubuntu Server, обладающий лишь текстовой консолью, нам нет необходимости, чтобы он каждый раз пытался запустить браузер.

bash
c.NotebookApp.open_browser = False

Дополнительные настройки

Так же внутри конфиг файла есть огромная куча настроек, ненужных для личного использования, но которые могут оказаться полезными при более глубоком изучении инфраструктуры Jupyter и построении какой-то «своей особенной не такой как у других» инфраструктуры 🙂

Задаем пароль от веб интерфейса

bash
jupyter notebook password

Этой же командой его можно сбросить если он забыт.

Запускаем Jupyter Notebook

Т.к. в пункте 5.2 мы сгенерировали файла сертификата, а в пункте 5.3 указали путь к ним, чтобы запустить Jupyter Notebook с подключением по https, нам достаточно воспользоваться командой

bash
jupyter notebook

Так же, запустить сервер с использованием сертификатов можно без пункта 2, но тогда нам нужно будет прямо в ней указать расположение файлов сертификата

bash
jupyter notebook --certfile=mycert.pem --keyfile=mykey.key

Подключаемся к Jupyter Notebook

После запуска, в консоли мы увидим на каком ip и порту стартовал сервер:

bash
(base) belfigor@adminguide-ru:~$ jupyter notebook
[I 10:19:50.263 NotebookApp] JupyterLab extension loaded from /home/belfigor/anaconda3/lib/python3.7/site-packages/jupyterlab
[I 10:19:50.263 NotebookApp] JupyterLab application directory is /home/belfigor/anaconda3/share/jupyter/lab
[I 10:19:50.265 NotebookApp] Serving notebooks from local directory: /home/belfigor
[I 10:19:50.265 NotebookApp] The Jupyter Notebook is running at:
[I 10:19:50.265 NotebookApp] https://192.168.220.135:35344/
[I 10:19:50.266 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

Нам осталось только открыть браузер и подключиться по указанным реквизитам https://192.168.220.135:35344/ с другой машины внутри локальной сети и ввести пароль заданный в пункте 5.4 и уже можно приступать к работе.

Собственно если не терпится начать что-то запиливать, то можно всё бросать и набигать на jupyter notebook. Но если же есть еще лишние 5 минут, предлагаю сделать свою жизнь чуть лучше установив менеджер расширений для jupyter.

Устанавливаем Nbextensions

Если Jupyter Notebook сервер работает, завершаем его работу с помощью Ctrl+C => y и последовательно вводим команды:

bash
conda install -c conda-forge jupyter_contrib_nbextensions
conda install -c conda-forge jupyter_nbextensions_configurator
jupyter contrib nbextension install --user

Когда запрашивает подтверждение, вводим [y]
По окончании установки, зайдя в Jupyter Notebook мы увидим следующее:

Anaconda, Jupyter Notebook для удаленной разработки на Ubuntu Server - Nbextensions
Менеджер расширений Nbextensions

Скорее всего галочка disable configuration for… у вас стоит, снимаем её.
Теперь мы можем ставить представленные в списке расширения. Моё самое любимое — Table of Contents (2). Оно формирует из Markdown ячеек содержание, которе удобно использовать для быстрой навигации по проекту, когда счёт ячеек идёт на сотни.