Требования для запуска ноутбуков Google Cloud AI Platform с настраиваемым образом докера

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

Я предполагаю, что это означает, что у них есть необходимая точка входа, незащищенный порт, команда запуска jupyterlab или что-то еще, но я не могу найти документацию о том, каковы требования на самом деле.

Я пытался реконструировать его без особой удачи. я nmap Редактировал стандартный экземпляр и увидел, что у него открыт порт 8080, но установил мой образ CMD запустить Jupyter Lab 0.0.0.0:8080 не сделал трюк. Когда я нажимаю "Открыть JupyterLab" в пользовательском интерфейсе, я получаю 504.

У кого-нибудь есть ссылка на соответствующие документы или опыт работы с этим в прошлом?

2 ответа

Решение

Есть два способа создания пользовательских контейнеров:

Создание производного контейнера

Если вам нужно только установить дополнительные пакеты, создайте Dockerfile, полученный из одного из стандартных образов (например, FROM gcr.io/deeplearning-platform-release/tf-gpu.1-13:latest), затем добавьте RUN Команды для установки пакетов с использованием conda/pip/jupyter.

Базовая среда conda уже добавлена ​​в путь, поэтому нет необходимости активировать conda init/conda, если вам не нужно настраивать другую среду. Дополнительные сценарии / переменные динамической среды, которые необходимо запустить до запуска среды, можно добавить в /env.sh, который поставляется как часть точки входа.

Например, предположим, что у вас есть пользовательское колесо TensorFlow, которое вы хотите использовать вместо встроенного двоичного файла TensorFlow. Если вам не нужны дополнительные зависимости, ваш Dockerfile будет похож на:

Dockerfile.example

FROM gcr.io/deeplearning-platform-release/tf-gpu:latest
RUN pip uninstall -y tensorflow-gpu && \
    pip install -y /path/to/local/tensorflow.whl

Затем вам нужно будет создать и отправить его куда-нибудь, доступный вашей учетной записи службы GCE.

PROJECT="my-gcp-project"
docker build . -f Dockerfile.example -t "gcr.io/${PROJECT}/tf-custom:latest"
gcloud auth configure-docker
docker push "gcr.io/${PROJECT}/tf-custom:latest"

Строительный контейнер с нуля

Основное требование заключается в том, что контейнер должен предоставлять службу через порт 8080.

Прокси-агент sidecar, который выполняется на виртуальной машине, будет пересылать запросы только на этот порт.

При использовании Jupyter вы также должны убедиться, что ваш jupyter_notebook_config.py настроен так:

c.NotebookApp.token = ''
c.NotebookApp.password = ''
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.allow_origin_pat = (
'(^https://8080-dot-[0-9]+-dot-devshell\.appspot\.com$)|'
'(^https://colab\.research\.google\.com$)|'
'((https?://)?[0-9a-z]+-dot-datalab-vm[\-0-9a-z]*.googleusercontent.com)')
c.NotebookApp.allow_remote_access = True
c.NotebookApp.disable_check_xsrf = False
c.NotebookApp.notebook_dir = '/home'

Это отключает аутентификацию на основе токенов записной книжки (вместо этого аутентификация обрабатывается через oauth-логин на прокси-сервере) и разрешает перекрестные запросы из трех источников: веб-просмотр Cloud Shell, colab (см. Этот пост в блоге) и прокси-сервер сервиса Cloud Notebooks. Только третья требуется для обслуживания ноутбука; первые два поддерживают альтернативные шаблоны доступа.

Чтобы завершить ответ Zain, ниже вы можете найти минимальный пример с использованием официального изображения Jupyter, вдохновленного этим репо https://github.com/doitintl/AI-Platform-Notebook-Using-Custom-Container:

Dockerfile

      FROM jupyter/base-notebook:python-3.9.5

EXPOSE 8080

ENTRYPOINT ["jupyter", "lab", "--ip", "0.0.0.0", "--allow-root", "--config", "/etc/jupyter/jupyter_notebook_config.py"]

COPY jupyter_notebook_config.py /etc/jupyter/

jupyter_notebook_config.py

(почти то же самое, что и Zain, но с дополнительным шаблоном, обеспечивающим связь с ядром; без него связь не работала)

      c.NotebookApp.ip = '*'
c.NotebookApp.token = ''
c.NotebookApp.password = ''
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8080
c.NotebookApp.allow_origin_pat = '(^https://8080-dot-[0-9]+-dot-devshell\.appspot\.com$)|(^https://colab\.research\.google\.com$)|((https?://)?[0-9a-z]+-dot-datalab-vm[\-0-9a-z]*.googleusercontent.com)|((https?://)?[0-9a-z]+-dot-[\-0-9a-z]*.notebooks.googleusercontent.com)|((https?://)?[0-9a-z\-]+\.[0-9a-z\-]+\.cloudshell\.dev)|((https?://)ssh\.cloud\.google\.com/devshell)'
c.NotebookApp.allow_remote_access = True
c.NotebookApp.disable_check_xsrf = False
c.NotebookApp.notebook_dir = '/home'
c.Session.debug = True

И, наконец, подумайте об этой странице при устранении неполадок: https://cloud.google.com/notebooks/docs/troubleshooting