如何在 AI Platform 上的自定义 Docker 图像中装载 GCS 存储桶?
How can I mount a GCS bucket in a custom Docker image on AI Platform?
我正在使用 Google 的 AI 平台使用自定义 Docker 图像训练机器学习模型。对于 运行 未经修改的现有代码,我想在容器内安装一个 GCS 存储桶。
我认为实现此目的的一种方法是安装 gcloud
以进行身份验证,并安装 gcsfuse
以安装在容器中。我的 Docker 文件如下所示:
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 进行身份验证?如果没有,我怎样才能使当前挂起的线路自动化?
不要使用主要用于 human/user 身份验证的 gcloud auth login
,而是考虑使用 gcloud auth activate-service-account
并提供密钥文件。详情请看这里:
https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account
我建议不要将密钥文件放在图像中,而是在外部提供。另一种选择是认识到身份验证可以通过环境变量隐含。因此,遵循云原生实践,让环境提供所需的凭据,并且根本不要尝试在您的环境中进行身份验证。如果您计划 运行 您的容器在 GCP Compute Engine 或 GKE 中,您可以隐式地从容器外部向容器提供服务帐户。
如果default service account meets your needs, you can configure your container to use it like this. You may also be able to give it what it needs by .
如果您想使用自己的服务帐户,您需要通过以下方式验证为服务帐户:
gcloud auth activate-service-account --key-file=somekey.json
这样容器就不会在要求您通过浏览器进行身份验证时挂起。所以显而易见的下一个问题是:
How do I insert my service account's key into the container?
策略
首先,您需要generate a key file为您想要使用的任何服务帐户。
将凭据存储在 docker 图像中不是一个好主意,因此我将密钥放入脚本中,然后将其放入存储桶中。因此容器下载并 运行s 脚本,它将配置的身份切换到我选择的服务帐户。
入口点
# runs as the default service account
gsutil cp "" /run/cmd
chmod +x /run/cmd
/run/cmd
运行 脚本(存储桶中)
cat << EOF!! > /dev/shm/sa_key
THE KEY FILE CONTENTS GO HERE
EOF!!
gcloud auth activate-service-account --key-file=/dev/shm/sa_key
# commands below this line are performed with the specified identity
默认服务帐户可以访问其项目中的存储桶,因此上面的脚本必须放在这样的存储桶中。确保该存储桶受到适当保护,任何有权访问它的人都可以假定其包含其密钥的服务帐户的身份。
本地测试
docker run -v "/home/me/.config/gcloud:/root/.config/gcloud" \
theimagename gs://my-project_job1/run_script
这将使用您用户的活动 gcloud 信用来下载脚本,然后切换到服务帐户。完成后,您主机的 gcloud 将配置为使用服务帐户——因此您可能需要将其切换回您自己的 vi gcloud auth login
。为避免这种情况,您可以挂载该目录的副本,这样原始文件保持不变。
运行宁在 GCP
gcloud ai-platform jobs submit training job1 \
--region us-west2 \
--master-image-uri us.gcr.io/my-project/theimagename:latest \
-- gs://my-project_job1/run_script
我对此进行了一些改动,以删除对我项目中与此处无关的部分的引用,因此这可能不会 运行 原样,但我认为这显示了我的要点一直在使用它:
https://gist.github.com/MatrixManAtYrService/737cb408e5a27c2aaa19576b0f6ec18a
我正在使用 Google 的 AI 平台使用自定义 Docker 图像训练机器学习模型。对于 运行 未经修改的现有代码,我想在容器内安装一个 GCS 存储桶。
我认为实现此目的的一种方法是安装 gcloud
以进行身份验证,并安装 gcsfuse
以安装在容器中。我的 Docker 文件如下所示:
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 进行身份验证?如果没有,我怎样才能使当前挂起的线路自动化?
不要使用主要用于 human/user 身份验证的 gcloud auth login
,而是考虑使用 gcloud auth activate-service-account
并提供密钥文件。详情请看这里:
https://cloud.google.com/sdk/gcloud/reference/auth/activate-service-account
我建议不要将密钥文件放在图像中,而是在外部提供。另一种选择是认识到身份验证可以通过环境变量隐含。因此,遵循云原生实践,让环境提供所需的凭据,并且根本不要尝试在您的环境中进行身份验证。如果您计划 运行 您的容器在 GCP Compute Engine 或 GKE 中,您可以隐式地从容器外部向容器提供服务帐户。
如果default service account meets your needs, you can configure your container to use it like this. You may also be able to give it what it needs by
如果您想使用自己的服务帐户,您需要通过以下方式验证为服务帐户:
gcloud auth activate-service-account --key-file=somekey.json
这样容器就不会在要求您通过浏览器进行身份验证时挂起。所以显而易见的下一个问题是:
How do I insert my service account's key into the container?
策略
首先,您需要generate a key file为您想要使用的任何服务帐户。
将凭据存储在 docker 图像中不是一个好主意,因此我将密钥放入脚本中,然后将其放入存储桶中。因此容器下载并 运行s 脚本,它将配置的身份切换到我选择的服务帐户。
入口点
# runs as the default service account
gsutil cp "" /run/cmd
chmod +x /run/cmd
/run/cmd
运行 脚本(存储桶中)
cat << EOF!! > /dev/shm/sa_key
THE KEY FILE CONTENTS GO HERE
EOF!!
gcloud auth activate-service-account --key-file=/dev/shm/sa_key
# commands below this line are performed with the specified identity
默认服务帐户可以访问其项目中的存储桶,因此上面的脚本必须放在这样的存储桶中。确保该存储桶受到适当保护,任何有权访问它的人都可以假定其包含其密钥的服务帐户的身份。
本地测试
docker run -v "/home/me/.config/gcloud:/root/.config/gcloud" \
theimagename gs://my-project_job1/run_script
这将使用您用户的活动 gcloud 信用来下载脚本,然后切换到服务帐户。完成后,您主机的 gcloud 将配置为使用服务帐户——因此您可能需要将其切换回您自己的 vi gcloud auth login
。为避免这种情况,您可以挂载该目录的副本,这样原始文件保持不变。
运行宁在 GCP
gcloud ai-platform jobs submit training job1 \
--region us-west2 \
--master-image-uri us.gcr.io/my-project/theimagename:latest \
-- gs://my-project_job1/run_script
我对此进行了一些改动,以删除对我项目中与此处无关的部分的引用,因此这可能不会 运行 原样,但我认为这显示了我的要点一直在使用它:
https://gist.github.com/MatrixManAtYrService/737cb408e5a27c2aaa19576b0f6ec18a