这是一个延续这个线程,发布在这里,因为它太复杂,无法发表评论。
TL;DR
在 Vertex AI 用户管理笔记本中,如何通过重复的停止和启动周期保留存储在数据磁盘上的现有 venv(以及 conda,如果可能)环境的公开内核图标?
Details
我正在使用基于 Docker 映像构建的用户管理笔记本实例。启动笔记本后,我手动创建一个自定义环境。目前,我们假设这是一个 venv python 环境。环境运行良好,我可以公开内核,以便它在 Jupyter 实验室的启动器中显示为图标。如果我关闭实例并重新启动它,该图标就会消失。我一直在尝试创建一个重新公开内核的启动脚本,但它无法正常工作。我一直在尝试使用上面链接中@gogasca 提出的方法#2。在其他操作(正确执行)中,我的启动脚本包含以下内容:
cat << 'EOF' > /home/jupyter/logs/exposeKernel.sh
#!/bin/bash
set -x
if [ -d /home/jupyter/envs ]; then
# For each env creation file...
for i in /home/jupyter/envs/*.sh; do
tempName="${i##*/}"
envName=${tempName%.*}
# If there is a corresponding env directory, then expose the kernel
if [ -d /home/jupyter/envs/${envName} ]; then
/home/jupyter/envs/${envName}/bin/python3 -m ipykernel install --prefix=/root/.local --name $envName &>> /home/jupyter/logs/log.txt
echo -en "Kernel created for: $envName \n" &>> /home/jupyter/logs/log.txt
else
echo -en "No kernels can be exposed\n" &>> /home/jupyter/logs/log.txt
fi
done
fi
EOF
chown root /home/jupyter/logs/exposeKernel.sh
chmod a+r+w+x /home/jupyter/logs/exposeKernel.sh
su -c '/home/jupyter/logs/exposeKernel.sh' root
echo -en "Existing environment kernels have been exposed\n\n" &>> /home/jupyter/logs/log.txt
我正在尝试记录操作,并且在日志中看到内核已在与手动激活环境并从内部公开内核时创建的位置相同的位置成功创建。尽管日志中明显成功(至少没有错误),但内核图标并未出现。如果我使用以下命令从终端手动运行 hideKernel.sh 脚本su -c '/home/jupyter/logs/exposeKernel.sh' root
,它也工作得很好,内核is正确曝光。 @gogasca 对上述线程的评论表明我应该使用 jupyter 用户而不是 root,但重复的测试和日志记录表明 jupyter 用户无法执行代码,而 root 成功(尽管从一开始调用时都没有创建内核图标)脚本)。
问题:
(1) 我的目标是在启动时自动重新公开现有的环境内核。据推测,每次虚拟机停止和启动时它们都会消失,因为每次都会重建启动磁盘的某种链接。这里合适的策略是什么?有没有办法构建环境(对 conda 和 venv 都感兴趣),以便它们的内核图标在关闭时不会消失?
(2) 如果 (1) 的答案是否定的,那么为什么 EOF 创建的文件在从启动脚本调用时无法完成任务?
(3) 与此相关,我认为正确的是启动后脚本在初始 Notebook 实例创建过程中仅执行一次,而启动脚本或启动脚本 url每次笔记本启动时执行?