在SageMaker中加载自定义conda环境无法正常工作。

11

我已经在我的AWS SageMaker永久EBS实例上安装了miniconda。这是我的起始脚本:

#!/bin/bash

set -e

# OVERVIEW
# This script installs a custom, persistent installation of conda on the Notebook Instance's EBS volume, and ensures
# that these custom environments are available as kernels in Jupyter.
# 
# The on-start script uses the custom conda environment created in the on-create script and uses the ipykernel package
# to add that as a kernel in Jupyter.
#
# For another example, see:
# https://docs.aws.amazon.com/sagemaker/latest/dg/nbi-add-external.html#nbi-isolated-environment

sudo -u ec2-user -i <<'EOF'
unset SUDO_UID
WORKING_DIR=/home/ec2-user/SageMaker/

for env in $WORKING_DIR/miniconda/envs/*; do
    BASENAME=$(basename "$env")
    source "$WORKING_DIR/miniconda/bin/activate"
    source activate "$BASENAME"
    pip install ipykernel boto3
    python -m ipykernel install --user --name "$BASENAME" --display-name "Custom ($BASENAME)"
done
# Optionally, uncomment these lines to disable SageMaker-provided Conda functionality.
# echo "c.EnvironmentKernelSpecManager.use_conda_directly = False" >> /home/ec2-user/.jupyter/jupyter_notebook_config.py
# rm /home/ec2-user/.condarc
EOF

echo "Restarting the Jupyter server.."
restart jupyter-server

我使用这个方法来加载我的自定义环境。然而,当我访问JupyterLab界面时,即使我看到激活的内核是自定义的,但在我的笔记本内核中运行的Python版本只有/home/ec2-user/anaconda3/envs/JupyterSystemEnv/bin/python:

enter image description here

我还检查了CloudWatch日志,并看到此错误日志:Could not find conda environment: [custom_env]

但是,当我在JupyterLab终端中运行启动脚本的命令时,conda可以成功找到这些环境。那么问题来了:我漏掉了什么?

非常感谢。


1
我也遇到了同样的问题,但是当我使用%代替时,就没有这个问题了。然而,我仍然无法在Jupyter笔记本中运行通过conda安装的非Python包。 - Brad English
我已经安装了Miniconda,但输出显示Anaconda3已安装。如果系统先前已安装了Anaconda3,则安装Miniconda没有意义,并且多个Conda安装可能导致未定义的行为。 - merv
@merv 我按照推荐的方式完成了,你应该看一下这个 - Contestosis
1
@Contestosis,你解决了吗?我也遇到了同样的错误。有时它似乎可以工作... - B_Miner
现在我所做的是,在每次启动SageMaker时,重新安装我需要的软件包到已经存在的环境中。这并不需要太多时间,而且对于减轻心理负担来说更好 :) - Contestosis
6个回答

3

在jupyter单元格中使用!which python命令将始终使用默认的系统python。

但是,如果您在jupyter中选择了自定义内核,则幕后使用的Python就是正确的版本。您可以通过比较以下内容来验证:

!python --version

!/home/ec2-user/SageMaker/miniconda/envs/<YOUR_CUSTOM_ENV_NAME> --version


即使对我来说 !python --version 给出的是 JupyterSystemEnv 的 Python 版本,而不是我的自定义环境。 - Poornima Devi

2

我在JupyterLab界面中遇到了与自定义内核无法工作的相同问题。

然后我找到了这个解决方案:

  • 首先,在SageMaker终端中,使用以下命令创建自定义conda环境(您也可以指定Python版本),并安装依赖项:
conda create -n custom_kernel_name python=3.6
source activate custom_kernel_name
pip install ipykernel
  • 使用ipykernel安装您的内核
python -m ipykernel install --user --name custom_kernel_name --display-name "custom_kernel_display_name"
  • 后来我发现,kernel.json 出了问题(路径和启动命令错误),所以你需要更改它。前往其位置。
cd /home/ec2-user/.local/share/jupyter/kernels/custom_kernel_name
  • 打开 kernel.json 文件,例如使用 nano 命令
nano kernel.json
  • kernel.json 的内容更改为以下内容
{
  "argv": [
    "bash",
    "-c",
    "source \"/home/ec2-user/anaconda3/bin/activate\" \"/home/ec2-user/anaconda3/envs/custom_kernel_name\" && exec /home/ec2-user/anaconda3/envs/custom_kernel_name/bin/python -m ipykernel_launcher -f '{connection_file}' "
  ],
  "display_name": "custom_kernel_display_name",
  "language": "python",
  "metadata": {
    "debugger": true
  }
}

完成后,您将能够通过启动器(或文件 - 新建 - 笔记本电脑)使用自定义内核打开Jupyter Notebook。 在此笔记本中使用!python --version!which python以确保使用自定义内核设置。


2
我遇到了与此相同的问题,并且找不到解决方法。我尝试了一个简单而直接的解决方法(稍作修改),其中不使用python -m ipykernel install --user --name "$BASENAME" --display-name "Custom ($BASENAME)"命令注册内核,而是通过在已有的anaconda3环境中创建符号链接来使Conda内核持久存在。
请参考这个链接:https://medium.com/decathlontechnology/making-jupyter-kernels-remanent-in-aws-sagemaker-a130bc47eab7并自行尝试。谢谢。

2

1
谢谢,但我想知道的是为什么这个不能工作。 - Contestosis
2
在底部有一条注释,基本上解释了你的问题。我们无法保证软件包安装成功。在具有不兼容依赖项的环境中尝试安装软件包可能会导致失败......我建议采用自定义SageMaker镜像路线。 - Banjo Obayomi
非常感谢您的回答,但我无法给您悬赏,因为原始问题是:“为什么官方脚本不起作用?”以及:“如何使其起作用?” - Contestosis

1
我遇到了类似的问题。由于shell配置问题,Sagemaker无法切换Conda环境。以下是我遵循的步骤,它起作用了:
- 打开Jupyter Lab - 从启动器中打开一个终端,并运行以下命令:

enter image description here

bash # switch to bash
conda create -n your_kernel_name python=3.9.7 # any kernel name and python version you want
conda activate your_kernel_name
pip install ipykernel
python -m ipykernel install --user --name your_kernel_name --display-name your_kernel_display_name

完成了!新的your_kernel_display_name应该现在对所有笔记本都可用。


0

这是@Anastasiia Khil的答案,稍微抽象化并带有内联注释。你错过的关键部分是更新kernel.json,以便!jupyter cli在你的环境中。

#Set the internal & display names, pick your python
CKN=custom_kernel_name
CKNAME=$CKN
PYV=3.8
#create and activate the env
conda create -y -n $CKN python=$PYV
source activate $CKN
# Install ipykernel
pip install ipykernel
python -m ipykernel install --user --name $CKN --display-name $CKNAME
# Update kernel.json to match the others from SageMaker, which activate the env. 
cat >/home/ec2-user/.local/share/jupyter/kernels/$CKN/kernel.json <<EOL
{
  "argv": [
    "bash",
    "-c",
    "source \"/home/ec2-user/anaconda3/bin/activate\" \"/home/ec2-user/anaconda3/envs/$CKN\" && exec /home/ec2-user/anaconda3/envs/$CKN/bin/python -m ipykernel_launcher -f '{connection_file}' "
  ],
  "display_name": "$CKNAME",
  "language": "python",
  "metadata": {
    "debugger": true
  }
}
EOL

是的,在这种情况下回答是完全可以的。请阅读[答案]并[编辑]您的答案,以包含有关此代码实际解决手头问题的说明。始终记住,您不仅要解决问题,还要教育OP和任何未来读者。 - Adriaan
当您参加高度推荐的[导览]时,基本思想和概念会被清晰易懂地解释。 - Yunnosch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接