Как я могу смонтировать ведро GCS в пользовательском образе Docker на платформе AI? - PullRequest
1 голос
/ 21 октября 2019

Я использую Google AI Platform для обучения моделей машинного обучения с использованием собственного образа Docker. Чтобы запустить существующий код без изменений, я бы хотел смонтировать контейнер GCS внутри контейнера.

Я думаю, что одним из способов достижения этого является установка gcloud для аутентификации и gcsfuse для монтирования в контейнере. Мой Dockerfile выглядит следующим образом:

FROM nvidia/cuda:10.1-cudnn7-runtime-ubuntu18.04

WORKDIR /root

# Install system packages.
RUN apt-get update
RUN apt-get install -y curl
# ...

# Install gcsfuse.
RUN echo "deb http://packages.cloud.google.com/apt gcsfuse-bionic main" | tee /etc/apt/sources.list.d/gcsfuse.list
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN apt-get update
RUN apt-get install -y gcsfuse

# Install gcloud.
RUN apt-get install -y apt-transport-https
RUN apt-get install -y ca-certificates
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add -
RUN apt-get update
RUN apt-get install -y google-cloud-sdk

# ...

ENTRYPOINT ["entrypoint.sh"]

Внутри сценария точки входа я затем пытаюсь пройти аутентификацию в облаке Google и смонтировать корзину. Мой entrypoint.sh выглядит следующим образом:

#!/bin/sh
set -e

gcloud auth login
gcsfuse my-bucket-name /root/output
python3 script.py --logdir /root/output/experiment

Затем я собираю контейнер и запускаю его либо локально для тестирования, либо удаленно на платформе AI для полного учебного прогона:

# Run locally for testing.
nvidia-docker build -t my-image-name .
nvidia-docker run -it --rm my-image-name

# Run on AI Platform for full training run.
nvidia-docker build -t my-image-name .
gcloud auth configure-docker
nvidia-docker push my-image-name
gcloud beta ai-platform jobs submit training --region us-west1 --scale-tier custom --master-machine-type standard_p100 --master-image-uri my-image-name

Как локально, так и на платформе AI скрипт entrypoint.sh висит на строке gcloud auth login, вероятно, потому, что он ожидает ввода данных пользователем. Есть ли лучший способ аутентификации в Google Cloud из контейнера? Если нет, то как я могу автоматизировать линию, которая в данный момент зависает?

1 Ответ

3 голосов
/ 21 октября 2019

Вместо использования gcloud auth login, который в первую очередь предназначен для аутентификации человека / пользователя, рассмотрите возможность использования gcloud auth activate-service-account и предоставления файла ключа. Подробности смотрите здесь:

https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account

Я бы не рекомендовал размещать файл ключей внутри изображения, а вместо этого предоставлять его снаружи. Другой альтернативой является осознание того, что аутентификация может подразумеваться через переменные среды. Таким образом, следуя нативным облачным методикам, обеспечьте, чтобы среда предоставляла необходимые учетные данные, и не пытайтесь проходить проверку подлинности в вашей среде вообще. Если вы планируете запускать свой контейнер в GCP Compute Engine или GKE, вы можете неявно предоставлять служебную учетную запись для контейнера извне контейнера.

...