환경 구성 · Module 0~6

개발환경 표준화

SageMaker 위에서 Linux, Git, Docker, AWS CLI를 익히고 커스텀 커널을 등록합니다.

개발환경 표준화

SageMaker 위에서 Linux, Git, Docker, AWS CLI를 익히고 커스텀 커널을 등록합니다.

왜 환경 표준화인가?

"내 노트북에서는 되는데 서버에서는 안 돼요."

이 한 문장이 수많은 데이터 프로젝트를 지연시킵니다. 원인은 단순합니다 — 환경이 사람마다 다르기 때문입니다.

😰 문제✅ 해결
Python 버전이 사람마다 다름Docker 이미지로 버전 고정
라이브러리 충돌Conda 환경으로 격리
코드가 어디에 있는지 모름Git으로 버전 관리
서버에서 실행하면 죽음SageMaker Training Job
ℹ️ SageMaker Notebook은 결국 Linux EC2 인스턴스입니다. Linux 명령어를 알아야 모든 것을 할 수 있습니다.

Module 0 · 리눅스 기초 (2~3시간)

SageMaker Notebook, Docker 컨테이너, EC2 모두 Linux 환경입니다. Linux 터미널은 컴퓨터에게 말을 거는 도구입니다.

파일 시스템 탐색

📋 복사해서 붙여넣기

pwd               # 내가 지금 어디 있는지
ls -al            # 현재 폴더 파일 목록 (숨김 파일 포함)
cd ~/project      # project 폴더로 이동
tree              # 폴더 구조를 트리로 표시

파일/디렉토리 조작

📋 복사해서 붙여넣기

mkdir -p ~/project/{data,notebooks,src,docker}   # 폴더 한 번에 만들기
cp source.txt dest.txt     # 파일 복사
mv old.txt new.txt         # 이름 변경 또는 이동
rm -rf temp/               # 폴더째 삭제 (되돌릴 수 없음!)
⚠️ rm -rf되돌릴 수 없습니다. 경로를 두 번 확인하세요.

텍스트 파일 다루기

📋 복사해서 붙여넣기

cat requirements.txt       # 파일 내용 출력
head -20 train.log         # 앞 20줄만 보기
tail -f train.log          # 실시간으로 로그 보기
grep "ERROR" train.log     # ERROR가 포함된 줄만 필터
wc -l data.csv             # 줄 수 세기

환경변수

📋 복사해서 붙여넣기

export MY_VAR="hello"      # 환경변수 설정
echo $MY_VAR               # 값 확인
echo $PATH                 # PATH 경로 확인
ℹ️ .bashrc에 export를 쓰면 새 터미널을 열어도 유지됩니다.

미니 실습: 프로젝트 폴더 구조 만들기

📋 복사해서 붙여넣기

mkdir -p ~/project/{data,notebooks,src,docker}
ls -R ~/project
  • ls ~/project 실행 시 4개 폴더가 보이는가?

Module 1 · Git 기초 (2시간)

Dockerfile, requirements.txt, 학습 코드를 버전 관리하고 팀과 공유하는 도구입니다. Git은 시간 여행 기계입니다.

핵심 명령어

📋 복사해서 붙여넣기

# 저장소 가져오기
git clone https://github.com/hakmink/gs-ds-env
cd gs-ds-env

# 현재 상태 확인
git status
git log --oneline    # 커밋 이력 한 줄씩

# 변경 사항 저장
git add .
git commit -m "feat: add titanic preprocessing"
git push origin main

# 최신 코드 받기
git pull origin main
ℹ️ .gitignore 파일에 data/, *.csv, __pycache__/를 추가하세요. 대용량 데이터와 캐시 파일은 Git에 올리지 않습니다.

📋 복사해서 붙여넣기

# .gitignore 예시
echo "data/
*.csv
__pycache__/
.ipynb_checkpoints/
*.pkl" >> .gitignore
  • GitHub 리포지토리 페이지에서 파일이 보이는가?

Module 2 · Docker 기초 (4~6시간)

"이미지는 붕어빵 틀, 컨테이너는 붕어빵"

동일한 틀(이미지)로 언제, 어디서 찍어도 같은 붕어빵(컨테이너)이 나옵니다. SageMaker Training Job은 결국 Docker 컨테이너 위에서 실행됩니다.

비교가상머신 (VM)Docker 컨테이너
부팅 시간수 분수 초
용량GB 단위MB 단위
격리 수준OS 전체프로세스 수준
ML 실습 적합성무거움적합

Dockerfile 작성법

📋 복사해서 붙여넣기

# 각 명령어의 의미
FROM python:3.10-slim          # 베이스 이미지 선택
WORKDIR /opt/ml/code           # 작업 디렉토리
COPY requirements.txt .        # 파일 복사
RUN pip install -r requirements.txt  # 패키지 설치 (레이어 생성)
COPY src/ .                    # 소스코드 복사
ENTRYPOINT ["python", "train.py"]    # 실행 명령
ℹ️ 레이어 캐시: COPY requirements.txtCOPY src/보다 먼저 두면, 코드만 바꿀 때 pip install을 다시 하지 않아도 됩니다. 빌드 시간을 크게 줄여줍니다.

핵심 명령어

📋 복사해서 붙여넣기

# 이미지 빌드
docker build -t my-image:v1 .

# 이미지 목록 확인
docker images

# 컨테이너 실행
docker run --rm my-image:v1
docker run -it my-image:v1 /bin/bash       # 컨테이너 내부로 들어가기
docker run -v $(pwd):/opt/ml/code my-image:v1  # 볼륨 마운트

# 디버깅
docker logs <container_id>
docker exec -it <container_id> /bin/bash

# 정리
docker system prune -f    # 안 쓰는 이미지/컨테이너 전부 삭제

Custom Kernel용 이미지 만들기

📋 복사해서 붙여넣기

FROM python:3.10
RUN pip install ipykernel pandas scikit-learn lightgbm
RUN python -m ipykernel install --sys-prefix \
    --name custom_env \
    --display-name "My ML Kernel"
  • docker images에서 내 이미지가 보이는가?
  • jupyter kernelspec list에서 커스텀 커널이 보이는가?

Module 3 · AWS CLI + ECR (2~3시간)

만든 Docker 이미지를 AWS ECR(Elastic Container Registry)에 올려야 SageMaker가 사용할 수 있습니다. ECR은 AWS 전용 Docker Hub입니다.

AWS CLI 초기 설정

📋 복사해서 붙여넣기

# 설정 확인
aws --version
aws sts get-caller-identity    # 내가 누구인지 확인 (항상 먼저!)
ℹ️ SageMaker Notebook은 IAM Role로 자동 인증됩니다. aws configure를 따로 실행할 필요 없습니다.

ECR에 이미지 올리기

📋 복사해서 붙여넣기

ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGION="ap-northeast-2"
REPO_NAME="my-ml-image"

# 1. ECR 리포지토리 생성
aws ecr create-repository --repository-name $REPO_NAME --region $REGION

# 2. ECR 로그인 (push 전 필수)
aws ecr get-login-password --region $REGION | \
  docker login --username AWS --password-stdin \
  ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com

# 3. 이미지 태그 + Push
docker tag my-image:v1 ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO_NAME}:v1
docker push ${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com/${REPO_NAME}:v1

# 4. 확인
aws ecr list-images --repository-name $REPO_NAME
⚠️ 자주 하는 실수: ECR 로그인 없이 push하면 denied: Your authorization token has expired 에러가 납니다. push 전 반드시 로그인 먼저.
  • aws ecr list-images 결과에 내 이미지가 보이는가?
  • 리전이 올바른가? (ap-northeast-2 vs us-east-1 혼동 주의)

Module 4 · SageMaker Notebook + Custom Kernel (2시간)

Step 1
ECR 이미지
Step 2
커널 등록
Step 3
노트북 선택

Conda로 커널 등록하기

SageMaker Notebook Terminal에서 실행합니다.

📋 복사해서 붙여넣기

# Conda 환경 생성
conda create -n my_env python=3.10 -y
conda activate my_env

# 필요한 패키지 설치
pip install ipykernel pandas scikit-learn lightgbm

# Jupyter 커널로 등록
python -m ipykernel install --user \
  --name my_env \
  --display-name "Python (my_env)"

Lifecycle Configuration으로 자동화

SageMaker Notebook을 재시작할 때마다 수동 설정을 반복하지 않도록, Lifecycle Configuration으로 자동화합니다.

📋 복사해서 붙여넣기

#!/bin/bash
set -e

# Swap 메모리 설정 (메모리 부족 방지)
sudo fallocate -l 16G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

# Conda 환경이 없으면 생성
source /home/ec2-user/anaconda3/etc/profile.d/conda.sh
if ! conda env list | grep -q "my_env"; then
  conda create -n my_env python=3.10 ipykernel pandas scikit-learn -y
  conda run -n my_env python -m ipykernel install --user \
    --name my_env --display-name "Python (my_env)"
fi
ℹ️ Swap 메모리는 RAM이 부족할 때 디스크를 임시 메모리로 사용하는 방법입니다. SageMaker Notebook 인스턴스는 RAM이 제한적이어서, 큰 데이터를 다룰 때 Swap이 없으면 프로세스가 죽습니다.
  • Notebook에서 커널 선택 시 Python (my_env)가 보이는가?
  • free -h로 Swap 영역이 활성화됐는가?

Module 5 · SageMaker Training Job (3시간)

"노트북에서 돌리면 느리고, 노트북을 끄면 죽습니다."

Training Job은 별도 인스턴스에서 돌리고 결과만 S3에 저장합니다. 노트북을 꺼도 학습이 계속됩니다.

핵심 데이터 흐름

S3 (입력 데이터)  →  Training Container  →  S3 (모델 아티팩트)
                         ↓
                   /opt/ml/input/data/
                   /opt/ml/model/
                   /opt/ml/output/
ℹ️ /opt/ml/ 경로는 SageMaker가 자동으로 만들어주는 약속된 경로입니다. 학습 코드에서 이 경로를 기준으로 데이터를 읽고 모델을 저장해야 합니다.

Estimator 코드

📋 복사해서 붙여넣기

from sagemaker.estimator import Estimator
import sagemaker

role = sagemaker.get_execution_role()

estimator = Estimator(
    image_uri="<account>.dkr.ecr.<region>.amazonaws.com/my-training-image:v1",
    role=role,
    instance_count=1,
    instance_type="ml.m5.xlarge",
    output_path="s3://my-bucket/output/",
    hyperparameters={
        "epochs": 10,
        "lr": 0.001
    }
)

estimator.fit({"train": "s3://my-bucket/data/train/"})
  • AWS 콘솔 → SageMaker → Training jobs에서 상태가 Completed인가?
  • output_path S3 경로에 model.tar.gz가 생성됐는가?

Module 6 · 통합 실습 (반나절)

처음부터 끝까지 혼자 완주하는 실습입니다. 아래 체크리스트를 순서대로 완료하세요.

단계확인
프로젝트 폴더 구조 생성 (Linux)ls ~/project
GitHub 리포지토리 생성 후 pushGitHub 페이지에서 파일 확인
Notebook용 Dockerfile 작성 + 빌드docker images
ECR 리포지토리 생성 + 이미지 pushaws ecr list-images
SageMaker Notebook에서 커널 연결 확인커널 선택 메뉴에서 확인
Training용 Dockerfile 작성 + 빌드 + ECR pushECR 콘솔에서 확인
Estimator 설정 + fit() 실행Training jobs 상태 Completed
S3에서 모델 아티팩트 확인S3 콘솔에서 model.tar.gz
여기까지 완료했다면, 여러분은 "노트북에서 코드를 쓰고 → 컨테이너로 고정하고 → AWS에서 자동 학습하는" 전체 흐름을 혼자 구축한 겁니다. 이게 MLOps의 기초입니다.