在AI Platform Notebooks上,the UI可让您选择要启动的自定义图像。如果这样做,则会收到一个信息框,提示该容器“必须遵循某些技术要求”:
我认为这意味着它们具有必需的入口点,暴露的端口,jupyterlab启动命令或某物,但我找不到任何有关实际要求的文档>。
我一直在做逆向工程,但运气不佳。我nmap
创建了一个标准实例,并看到它打开了8080端口,但是将映像的CMD
设置为在0.0.0.0:8080
上运行Jupyter Lab并不能解决问题。当我在用户界面中点击“打开JupyterLab”时,我得到了504。
是否有人链接到相关文档,或者过去有这样做的经验?
答案 0 :(得分:3)
有两种创建自定义容器的方法:
如果您只需要安装其他软件包,则应该创建一个从标准映像之一派生的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上公开服务。
在VM上执行的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 Web预览,colab(请参阅此博客文章)和Cloud Notebooks服务代理。笔记本服务仅需要第三位;前两个支持备用访问模式。
答案 1 :(得分:0)
要完成 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