라이브러리를 설치하려 할 때 수명 주기 구성이 시간 초과되는 경우, 수동으로 설치한 라이브러리가 Amazon SageMaker에서 유지되도록 하려면 어떻게 해야 하나요?

최종 업데이트 날짜: 2022년 12월 6일

추가 라이브러리를 설치하려고 하면 수명 주기 구성 스크립트가 5분 이상 실행됩니다. 이로 인해 Amazon SageMaker 노트북 인스턴스가 시간 초과됩니다. 이 문제를 해결하고 싶습니다. 또한 수동으로 설치한 라이브러리가 노트북 인스턴스 세션 간에 유지되도록 하려면 어떻게 해야 하나요?

간략한 설명

수명 주기 구성 스크립트가 5분 이상 실행될 경우, 스크립트가 실패하고 노트북 인스턴스가 생성 또는 시작되지 않습니다.

이 문제를 해결하려면 다음 방법 중 하나를 사용합니다.

  • nohup: 'no hangup'의 줄임말인 nohup 명령은 전화 끊기 신호를 무시하는 Linux 명령입니다. 끝에 앰퍼샌드 기호가 있는 이 명령을 사용하면 패키지가 설치될 때까지 수명 주기 구성 스크립트가 백그라운드에서 강제로 실행되게 합니다. 이 방법은 기술적인 전문 지식이 부족한 사용자를 위한 모범 사례이며, 단기적인 해결 방법으로 적합합니다.
    참고: nohup 명령은 전화 끊기 신호를 무시합니다. 따라서 스크립트가 백그라운드에서 계속 실행될 수 있도록 하기 위해서는 앰퍼샌드 기호와 함께 사용해야 합니다. 수명 주기 구성 스크립트를 실행하는 쉘은 스크립트 끝에서 종료됩니다. 따라서 명령 시작 부분에 nohup을 추가하고 명령 끝에 &를 추가하여 수명 주기 구성 스크립트가 백그라운드에서 강제 실행되도록 하세요.
  • 노트북 인스턴스의 Amazon Elastic Block Store(Amazon EBS) 볼륨에 사용자 지정 영구 Conda 설치 버전 생성: 기존 노트북 인스턴스의 터미널에서 on-create 스크립트를 실행합니다. 이 스크립트는 Miniconda를 사용하여 EBS 볼륨(/home/ec2-user/SageMaker/)에 별도의 Conda 설치 버전을 생성합니다. 그런 다음 on-start 스크립트를 수명 주기 구성으로 실행하여 사용자 지정 환경을 Jupyter에서 커널로 사용할 수 있도록 합니다. 이 방법은 기술적인 전문 지식이 있는 사용자를 위한 모범 사례이며, 보다 장기적인 해결 방법입니다.

해결 방법

다음 방법 중 하나를 사용하여 수명 주기 구성 시간 초과 문제를 해결합니다.

nohup 명령 실행

nohup 명령을 사용하여, 5분 제한 시간이 만료된 후에도 수명 주기 구성 스크립트가 백그라운드에서 강제로 계속 실행되게 합니다. 명령 끝에 앰퍼샌드(&)를 추가해야 합니다.

예:

#!/bin/bash
set -e
nohup pip install xgboost &

이 스크립트는 라이브러리가 설치되고 나면 실행 중지됩니다. 실행 중지될 때 알림이 표시되지 않지만, ps 명령을 사용하여 스크립트가 아직 실행되고 있는지 확인할 수 있습니다.

참고: 대용량 Amazon Simple Storage Service(Amazon S3) 객체를 다운로드하는 등의 다른 시나리오에서 수명 주기 구성 스크립트가 시간 초과될 경우 nohup 명령을 사용할 수도 있습니다.

노트북 인스턴스의 EBS 볼륨에 사용자 지정 영구 Conda 설치 버전 생성

1.    기존 노트북 인스턴스의 터미널에서 원하는 편집기를 사용하여 .sh 파일을 생성합니다.

예:

vim custom-script.sh

2.    on-create 스크립트의 내용을 .sh 파일에 복사합니다. 이 스크립트는 사용자 지정 Conda 설치 버전에 새 Conda 환경을 생성합니다. 또한 이 스크립트는 새 Conda 환경에 NumPyBoto3를 설치합니다.

참고: Miniconda 설치 관리자 및 ipykernel을 다운로드하려면 노트북 인스턴스가 인터넷에 연결되어 있어야 합니다.

3.    스크립트를 실행 파일로 표시한 다음 실행합니다.

예:

chmod +x custom-script.sh
./custom-script.sh

4.    설치가 완료되면 노트북 인스턴스를 중지합니다.

5.    on-start 스크립트를 .sh 파일에 복사합니다.

#!/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/custom-miniconda/
source "$WORKING_DIR/miniconda/bin/activate"

for env in $WORKING_DIR/miniconda/envs/*; do

BASENAME=$(basename "$env")
source activate "$BASENAME"

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.."
# For notebook instance with alinux (notebook-al1-v1)
initctl restart jupyter-server --no-wait
# Use this instead for notebook instance with alinux2 (notebook-al2-v1)
systemctl restart jupyter-server

6.    중지된 노트북 인스턴스에서 on-start 스크립트를 수명주기 구성으로 추가합니다. 이 스크립트는 노트북 인스턴스를 시작할 때마다 사용자 지정 환경을 Jupyter에서 커널로 사용할 수 있도록 합니다.

7.    노트북 인스턴스를 시작한 다음 사용자 지정 환경에 사용자 지정 라이브러리를 설치합니다.

예를 들어 pyarrow를 설치하려면 다음을 수행합니다.

import sys
!conda install --yes --prefix {sys.prefix} -c conda-forge pyarrow

Conda를 업데이트해야 한다는 오류 메시지가 표시되면 다음 명령을 실행합니다. 그런 다음 사용자 지정 라이브러리를 다시 설치해봅니다.

!conda install -p "/home/ec2-user/anaconda3" "conda>=4.8" --yes
!conda install -p "/home/ec2-user/SageMaker/custom-miniconda/miniconda" "conda>=4.8" --yes

노트북 인스턴스를 중지했다가 다시 시작하더라도 사용자 지정 Conda 환경과 라이브러리를 계속 사용할 수 있습니다. 이를 다시 설치하지 않아도 됩니다.

참고: Amazon CloudWatch Logs를 사용하여 수명 주기 구성 스크립트와 관련된 문제를 해결할 수 있습니다. aws/sagemaker/studio 네임스페이스 아래의 로그 스트림 LifecycleConfigOnStart에서 스크립트 실행 로그를 볼 수 있습니다.