我正在使用 Google 的 AI 平台使用自定义 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 Cloud 进行身份验证并挂载存储桶。我的 entrypoint.sh看起来像这样:

#!/bin/sh 
set -e 
 
gcloud auth login 
gcsfuse my-bucket-name /root/output 
python3 script.py --logdir /root/output/experiment 

然后我构建容器并在本地运行它以进行测试或在 AI Platform 上远程运行以进行完整的训练运行:

# 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 进行身份验证?如果没有,我该如何自动化当前挂起的线路?

请您参考如下方法:

而不是使用 gcloud auth login这主要用于人员/用户身份验证,请考虑使用 gcloud auth activate-service-account并提供 key 文件。详情请看这里:

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

我建议不要将 key 文件放在图像中,而是在外部提供。另一种选择是实现身份验证可以通过环境变量隐式。因此,遵循云原生实践,让环境提供所需的凭据,并且根本不要尝试在您的环境中进行身份验证。如果您计划在 GCP Compute Engine 或 GKE 内运行容器,则可以从容器外部向容器隐式提供服务帐号。


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!