환경 구성 · 심화

SageMaker Conda 환경 & 커널 영속성

재시작해도 환경이 살아있도록 — ~/SageMaker/ 안에 Miniconda를 설치하는 방법

Conda 커널 영속성 — 심화 가이드

재시작해도 환경이 살아있도록 — ~/SageMaker/ 안에 Miniconda를 설치하는 방법

"분명히 어제 만들었는데, 노트북 재시작하니 커널이 사라졌어요."

왜 이게 필요한가?

SageMaker Notebook Instance는 두 종류의 스토리지가 있습니다.

경로유형재시작 후
/home/ec2-user/ (홈 디렉토리)임시 스토리지😰 초기화됨
/home/ec2-user/SageMaker/EBS 영구 볼륨유지됨

기본 conda create 명령어는 /home/ec2-user/anaconda3/envs/에 환경을 만듭니다. 이 경로는 재시작 시 초기화되므로 환경이 사라집니다.

해결책: Miniconda와 모든 conda 환경을 ~/SageMaker/.myenv/ 안에 설치합니다.
/home/ec2-user/SageMaker/
└── .myenv/                            ← EBS에 있으므로 재시작해도 유지
    └── miniconda/
        └── envs/
            ├── boilerplate312/        ← 내 conda 환경들
            ├── tabular312/
            └── streamlit314/

전체 흐름 한눈에 보기

최초 1회
create_env.sh
Miniconda 설치 + 환경 생성
재시작마다
start.sh
Lifecycle Auto-run
결과
커널 자동복원
JupyterLab에서 선택 가능
ℹ️ Lifecycle Configuration: SageMaker Notebook 설정에서 on-start 스크립트를 등록하면 인스턴스가 시작될 때마다 자동으로 실행됩니다. start.sh를 여기에 등록하면 재시작 후에도 커널이 자동 복원됩니다.

Step 1: 실습 repo 클론 (~/SageMaker 안에)

SageMaker Notebook Terminal에서 실행합니다.

📋 복사해서 붙여넣기

# SageMaker 영구 볼륨 안에 repo 클론
cd ~/SageMaker
git clone https://github.com/hakmink/gs-ds-env
ls gs-ds-env/

예상 결과:

bin  boilerplate312  lightgbm311  streamlit314  tabular312  tsai
⚠️ ~/SageMaker/ 안에 클론해야 합니다. 홈 디렉토리(~)에 클론하면 재시작 시 사라집니다.

Step 2: Swap 메모리 설정

Conda 환경 생성과 패키지 설치 중 메모리 부족으로 프로세스가 죽는 것을 방지합니다.

📋 복사해서 붙여넣기

cd ~/SageMaker/gs-ds-env/bin/
./increase_swap_size.sh

📋 복사해서 붙여넣기

# Swap 설정 확인
free -h

예상 결과:

              total        used        free      shared  buff/cache   available
Mem:           15Gi       2.1Gi        11Gi       ...
Swap:         4.0Gi          0B       4.0Gi   ← Swap 4G 활성화
  • free -h 에서 Swap이 4.0Gi로 표시되는가?

Step 3: 환경 생성 — create_env.sh

환경을 처음 만들 때 이 스크립트를 실행합니다.

스크립트 동작 순서 (6단계)

[1/6] Miniconda 설치  →  ~/SageMaker/.myenv/miniconda/
[2/6] conda 환경 생성  →  ~/SageMaker/.myenv/miniconda/envs/<env_name>/
[3/6] 환경 활성화
[4/6] uv로 requirements.txt 패키지 설치
[5/6] ipykernel 설치 + Jupyter 커널 등록  →  커널 이름: conda_<env_name>
[6/6] envs_dirs 등록 + 확인

사용법

📋 복사해서 붙여넣기

cd ~/SageMaker/gs-ds-env/bin/

# Usage: ./create_env.sh <env_name> <requirements_path> <python_version>
./create_env.sh boilerplate312 \
    /home/ec2-user/SageMaker/gs-ds-env/boilerplate312/kernel/requirements.txt \
    3.12
파라미터예시의미
env_nameboilerplate312conda 환경 이름
requirements_path.../kernel/requirements.txt설치할 패키지 목록
python_version3.12Python 버전

완료 후 확인

📋 복사해서 붙여넣기

# 환경 목록 확인
source ~/SageMaker/.myenv/miniconda/etc/profile.d/conda.sh
conda env list

# 커널 등록 확인
jupyter kernelspec list

예상 결과:

# conda env list
base        *  /home/ec2-user/SageMaker/.myenv/miniconda
boilerplate312  /home/ec2-user/SageMaker/.myenv/miniconda/envs/boilerplate312

# jupyter kernelspec list
Available kernels:
  conda_boilerplate312    /home/ec2-user/.local/share/jupyter/kernels/conda_boilerplate312
  python3                 /usr/local/share/jupyter/kernels/python3
  • conda env list에 내 환경이 ~/SageMaker/.myenv/... 경로로 표시되는가?
  • jupyter kernelspec listconda_boilerplate312가 있는가?
  • JupyterLab에서 커널 선택 시 conda_boilerplate312가 보이는가?

Step 4: 재시작 후 자동 복원 — start.sh

인스턴스를 재시작하면 커널 등록이 사라집니다. start.sh가 이를 자동으로 복원합니다.

start.sh가 하는 일

1. 한국어 로케일 설정
2. git 자격증명 복원 (~/SageMaker/.git-credentials → ~/.git-credentials)
3. Swap 메모리 설정 (increase_swap_size.sh)
4. ~/SageMaker/.myenv/miniconda/envs/ 에서 환경 자동 감지
5. 각 환경에 대해:
   - ~/.bashrc에 alias 등록
   - start_env.sh 실행 → 커널 Jupyter에 재등록

Lifecycle Configuration에 등록하기

🌐 AWS 콘솔: SageMaker → Notebook instances → 해당 인스턴스 → Lifecycle configuration

📋 복사해서 붙여넣기 (Lifecycle on-start 스크립트)

#!/bin/bash
set -e

# gs-ds-env가 SageMaker 볼륨에 있어야 함
cd /home/ec2-user/SageMaker/gs-ds-env/bin/

# start.sh 실행
./start.sh >> /tmp/start.log 2>&1

echo "Lifecycle start.sh 완료"
⚠️ Lifecycle Configuration 스크립트는 root 권한으로 실행됩니다. 스크립트 내부에서 ec2-user로 전환이 필요한 경우 sudo -u ec2-user bash -c "..." 형식을 사용하세요.

SageMaker Studio 사용자를 위한 uv venv 방식

SageMaker Studio (사용자: sagemaker-user)에서는 conda 대신 uv venv 방식을 사용합니다.

환경유저환경 경로
Notebook Instanceec2-user~/SageMaker/.myenv/miniconda/envs/<env>/
Studiosagemaker-user~/.myenv/<theme>/kernel/.venv/

📋 복사해서 붙여넣기

# Usage: ./gs-env-create-kernel-smus.sh <theme> <python_version> [kernel_name]
./gs-env-create-kernel-smus.sh boilerplate 3.12
ℹ️ Studio에서는 ~/.myenv/영구 EFS 볼륨에 마운트되어 있어, 별도의 Lifecycle Configuration 없이도 재시작 후 환경이 유지됩니다.

트러블슈팅

커널이 JupyterLab에 안 보여요

📋 복사해서 붙여넣기

# 커널 목록 확인
jupyter kernelspec list

# 커널이 없으면 수동 재등록
source ~/SageMaker/.myenv/miniconda/etc/profile.d/conda.sh
conda activate ~/SageMaker/.myenv/miniconda/envs/boilerplate312
python -m ipykernel install --user --name=conda_boilerplate312

# JupyterLab 커널 서버 재시작 (콘솔에서)
sudo initctl restart jupyter-server --no-wait

conda 명령어를 찾을 수 없어요

📋 복사해서 붙여넣기

# conda 초기화
source ~/SageMaker/.myenv/miniconda/etc/profile.d/conda.sh
conda init bash
source ~/.bashrc

# 확인
conda --version

패키지 설치 중 "Killed" 에러

메모리 부족으로 프로세스가 죽은 것입니다.

📋 복사해서 붙여넣기

# Swap 재설정
cd ~/SageMaker/gs-ds-env/bin/
./increase_swap_size.sh

# 확인
free -h

전체 설정 체크리스트

단계확인 방법
~/SageMaker/gs-ds-env/ repo가 클론됐는가?ls ~/SageMaker/gs-ds-env/bin/
Swap 4G가 활성화됐는가?free -h → Swap 4.0Gi
create_env.sh 실행 후 환경이 ~/SageMaker/.myenv/... 경로에 있는가?conda env list
커널이 conda_boilerplate312 이름으로 등록됐는가?jupyter kernelspec list
JupyterLab 커널 선택 메뉴에 보이는가?JupyterLab UI
Lifecycle Configuration에 start.sh가 등록됐는가?SageMaker 콘솔
인스턴스 재시작 후에도 커널이 살아있는가?재시작 후 jupyter kernelspec list
영속성의 핵심 원칙: 환경, 코드, 자격증명 모두 ~/SageMaker/ 안에 두세요. 이 경로만 인스턴스 재시작 후에도 살아남습니다.