Пошаговое руководство по настройке живой среды разработки, работающей на виртуальной машине, из вашей локальной IDE.

вступление

Любой, кто заинтересован в моделировании больших объемов данных или выполнении какой-либо работы по глубокому обучению, быстро достигнет пределов возможностей своего локального компьютера. После того, как вы написали код, выполнить его на виртуальной машине (ВМ) для разовых результатов или запланированных производственных целей относительно просто. Однако удаленная разработка и живые эксперименты с изменениями кода в виртуальной машине требуют нескольких шагов. Простое решение - работать в браузере через блокнот Jupyter или Google Colab, подключенный к удаленному компьютеру. Блокноты отлично подходят для быстрого одноразового анализа, но не предлагают многого с точки зрения передового опыта разработки программного обеспечения. В частности, надежные и воспроизводимые продукты или эксперименты машинного обучения требуют лучшей основы для написания кода производственного уровня, чем ноутбук.

Это приводит к простому желанию работать в выбранной интегрированной среде разработки (IDE), используя вычислительную мощность и ресурсы виртуальной машины. Я быстро обнаружил, что у RStudio и PyCham Professional есть возможности для удаленной разработки, и подумал, насколько это может быть сложно? Тем не менее, мне не удалось найти четкую сквозную запись требуемых фрагментов и фрагментов. Я решил задокументировать эти шаги для себя в будущем и надеюсь, что кто-то еще сочтет их полезными.

В этом примере я буду разрабатывать на Python, используя мой любимый взломанный редактор Atom на базе Hydrogen, работающий на машине на Google Cloud Platform (GCP). В приведенных ниже шагах для альтернативных настроек должно быть много общего. Если вы предпочитаете GCP с RStudio, PyCharm (или другим продуктом JetBrains), ваша жизнь немного проще.

Настроить виртуальную машину

Для связи с виртуальной машиной нам нужна какая-то форма аутентификации. Это можно сделать с помощью любого инструмента SSH. На Mac мы можем создать пару ключей SSH с включеннымssh-keygen через терминал:

$ cd ~/.ssh/
$ ssh-keygen -m PEM -t rsa -C "GCP_username"

Обязательно поместите его в логическое место (например, ~/.ssh), дайте ему имя файла и придумайте парольную фразу. Вы можете просмотреть сгенерированный открытый ключ SSH с помощью:

$ cat ~/.ssh/filename.pub

Раскрутите виртуальную машину с помощью сценария bash или команд терминала и убедитесь, что на машине установлен Jupyter:

$ pip install jupyter

Затем убедитесь, что виртуальная машина принимает аутентификацию. На локальном компьютере откройте браузер и перейдите в консоль GCP. Перейдите к своей виртуальной машине: Compute Engine → VM Instances → MetaData → SSH Keys. Нажмите «Изменить» и вставьте свой публичный SSH-ключ в поле, сохраните его.

Чтобы получить доступ к виртуальной машине с помощью внешнего SSH-соединения, нам необходимо назначить ей внешний IP-адрес. Щелкните имя вашей виртуальной машины → Изменить → Сетевые интерфейсы → Внешний IP-адрес. Не забудьте нажать кнопку Сохранить до конца внизу страницы.

Мы можем проверить, все ли в порядке с подключением и аутентификацией, подключив SSH к виртуальной машине с локального терминала:

$ ssh -i ~/.ssh/place_of_ssh_keys gcp_username@external_ip_address

Создание ядра Jupyter и туннеля SSH

При подключении к виртуальной машине в терминале запускайте ядро ​​Jupyter на выбранном вами порту, я использую 8888. Кроме того, отсутствие монитора означает, что нам не нужно запускать браузер на виртуальной машине;)

$ jupyter-notebook --no-browser --port=8888

Для связи с ядром Jupyter, работающим на виртуальной машине, мы используем переадресацию портов с нашего локального компьютера на виртуальную машину. Этого можно добиться, создав SSH-туннель. В новом окне локального терминала напишите:

ssh -i ~/.ssh/filename -N -L localhost:8888:localhost:8888 gcp_username@external_ip_address

В моем случае в терминале не отображаются сообщения, что, возможно, немного сбивает с толку, просто держите окно терминала открытым.

Подключиться к ядру из IDE

Откройте Atom и установите пакет Hydrogen. Перейдите в Предпочтения → Пакеты → Водород → Настройки и добавьте следующее в поле Kernel Gateways:

[{
  "name": "Jupyter Remote Kernel",
  "options": {"baseUrl": "http://localhost:8888"}
}]

В файле кода откройте палитру команд Atom (cmd+shift+p)Hydrogen: Connect to Remote Kernel. Должно появиться ваше удаленное ядро ​​Jupyter. Вы можете подключиться с помощью токена, отображаемого в вашем терминале, который отображается при запуске ядра Jupyter в виртуальной машине. Если вы работаете с многофайловыми проектами, вы можете просто подключить эти файлы к ядру с помощью Hydrogen: Connect to Existing Kernel. Вы можете запускать все виды ядер Jupyter для работы на вашем любимом языке, таком как R или JavaScript.

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

$ sudo chown -R gcp_username:gcp_username path/to/code/folder

Вы можете проверить владение и права всех папок и файлов в текущем каталоге с помощью:

ls -l

Настроить синхронизацию файлов

Чтобы разрабатывать локально и запускать код на виртуальной машине, нам нужно, чтобы изменения в коде отражались в реальном времени. Это можно сделать, настроив синхронизацию файлов SSH между нашим локальным компьютером и виртуальной машиной. Я использую пакет Atom packageRemote FTP, который отлично работает, но вы можете использовать любой другой пакет SSH или программное обеспечение по вашему выбору.

Настройте пакет для синхронизации, я использую в своем .ftpconfig файле следующие настройки:

{
    "protocol": "sftp",
    "host": "external_ip_address",
    "port": 22,
    "user": "gcp_username",
    "pass": "",
    "promptForPass": false,
    "remote": "path/to/remote/code/folder/on/vm",
    "local": "path/to/local/code/folder",
    "agent": "",
    "privatekey": "~/.ssh/filename",
    "passphrase": "your_passphrase",
    "hosthash": "",
    "ignorehost": true,
    "connTimeout": 10000,
    "keepalive": 10000,
    "keyboardInteractive": false,
    "keyboardInteractiveForPass": false,
    "remoteCommand": "",
    "remoteShell": "",
    "watch": [],
    "watchTimeout": 500
}

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

Вот и все, вам должно быть хорошо!

Разное

Вы можете облегчить себе жизнь и добавить несколько псевдонимов в свой ~/.bashrc файл, чтобы ускорить выполнение команд терминала, если вы хотите делать это чаще. Например:

alias gcp_ssh = 'ssh -i ~/.ssh/filename gcp_username@external_ip_address'
alias port_forward = 'ssh -i ~/.ssh/filename -N -L localhost:8888:localhost:8888 gcp_username@external_ip_address'
alias give_me_the_power = 'sudo chown -R gcp_username:gcp_username path/to/code/folder'

В случае ошибок аутентификации, связанных с аутентифицированными хостами после повторного запуска вашей виртуальной машины, вы можете регенерировать свой known_hosts файл, удалив его и снова подключив SSH к машине:

$ cd ~/.ssh/
$ rm -f known_hosts
$ ssh -i ~/.ssh/filename gcp_username@external_ip_address

Если вы хотите запустить свой проект Python как пакет или для импорта, вы можете установить локальный код через pip на виртуальную машину:

$ cd path/to/code/folder
$ python3 -m pip install -e .

Вы можете просматривать структуру папок на своей виртуальной машине через ядро ​​Jupyter на локальном компьютере, зайдя в localhost:8888 в своем браузере и войдя в систему, используя свой токен или пароль. Вы можете загружать папки и файлы с виртуальной машины обратно на локальный компьютер с помощью gcloud команд или любого клиента SSH.

Вы также можете загрузить на локальный компьютер из браузера Jupyter. Если вы хотите загружать целые папки, а не только файлы, вы можете запустить окно терминала. Новое → Терминал:

$ zip -r path/to/folder name_of_zipfile

Это создает zip-архив вашей папки, который вы можете выбрать и загрузить через интерфейс Notebook, как и любой другой файл.

Если у вас возникнут какие-либо проблемы, напишите мне сообщение!