개발환경 표준화
SageMaker 위에서 Linux, Git, Docker, AWS CLI를 익히고 커스텀 커널을 등록합니다.
개발환경 표준화
SageMaker 위에서 Linux, Git, Docker, AWS CLI를 익히고 커스텀 커널을 등록합니다.
왜 환경 표준화인가?
이 한 문장이 수많은 데이터 프로젝트를 지연시킵니다. 원인은 단순합니다 — 환경이 사람마다 다르기 때문입니다.
| 😰 문제 | ✅ 해결 |
|---|---|
| Python 버전이 사람마다 다름 | Docker 이미지로 버전 고정 |
| 라이브러리 충돌 | Conda 환경으로 격리 |
| 코드가 어디에 있는지 모름 | Git으로 버전 관리 |
| 서버에서 실행하면 죽음 | SageMaker Training Job |
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
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.txt를 COPY 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 # 내가 누구인지 확인 (항상 먼저!)
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
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시간)
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
- 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_pathS3 경로에model.tar.gz가 생성됐는가?
Module 6 · 통합 실습 (반나절)
처음부터 끝까지 혼자 완주하는 실습입니다. 아래 체크리스트를 순서대로 완료하세요.
| ☐ | 단계 | 확인 |
|---|---|---|
| ☐ | 프로젝트 폴더 구조 생성 (Linux) | ls ~/project |
| ☐ | GitHub 리포지토리 생성 후 push | GitHub 페이지에서 파일 확인 |
| ☐ | Notebook용 Dockerfile 작성 + 빌드 | docker images |
| ☐ | ECR 리포지토리 생성 + 이미지 push | aws ecr list-images |
| ☐ | SageMaker Notebook에서 커널 연결 확인 | 커널 선택 메뉴에서 확인 |
| ☐ | Training용 Dockerfile 작성 + 빌드 + ECR push | ECR 콘솔에서 확인 |
| ☐ | Estimator 설정 + fit() 실행 | Training jobs 상태 Completed |
| ☐ | S3에서 모델 아티팩트 확인 | S3 콘솔에서 model.tar.gz |