본문 바로가기
  • 나를 찾는 여행...
▷ AI 인공지능

mlops 개발환경 구축 - AWS Ec2, docker, mobaXtern

by AmosK 2025. 9. 19.
728x90

MLOps 개발환경 구축을 위한 EC2, Docker, MobaXterm, WandB 설정 가이드

핵심 요약: EC2(클라우드 서버), Docker(컨테이너화), MobaXterm(SSH 접속 도구), WandB(실험 추적 도구)를 순차적으로 설정하여 완전한 MLOps 개발 환경을 구축할 수 있습니다. 각 도구는 서로 연동되어 효율적인 머신러닝 개발 파이프라인을 제공합니다.

 

1. 각 도구의 역할과 개념

EC2 (Amazon Elastic Compute Cloud)

AWS의 클라우드 가상 서버로, 언제든지 원하는 사양의 컴퓨터를 임대해서 사용할 수 있는 서비스입니다. MLOps에서는 모델 학습, 데이터 처리, 서비스 배포를 위한 컴퓨팅 자원으로 활용됩니다.

Docker

애플리케이션을 컨테이너로 패키징하는 기술로, 어떤 환경에서든 동일하게 실행될 수 있도록 보장합니다. MLOps에서는 개발 환경 일관성 유지와 배포 자동화에 핵심적인 역할을 합니다.

MobaXterm

Windows에서 Linux 서버에 접속할 수 있는 SSH 클라이언트 도구입니다. GUI 파일 탐색기와 터미널을 함께 제공하여 서버 관리를 편리하게 해줍니다.

WandB (Weights & Biases)

머신러닝 실험을 추적하고 시각화하는 MLOps 플랫폼입니다. 하이퍼파라미터, 성능 지표, 모델 버전을 자동으로 기록하고 비교할 수 있게 해줍니다.

 

2. EC2 인스턴스 설정하기

2.1 EC2 인스턴스 생성

단계별 EC2 생성 과정:[2][1]

  1. AWS 콘솔 접속
    •   AWS 계정 로그인 → EC2 서비스 선택
  2. 인스턴스 시작
    •   "인스턴스 시작" 버튼 클릭
    •   AMI 선택: Ubuntu Server 20.04 LTS (64비트)
    •   인스턴스 유형: t2.micro (프리티어, 기본 학습용)
  3. 네트워크 설정
    •   VPC: 기본 VPC 사용
    •   서브넷: 퍼블릭 서브넷 선택
    •   퍼블릭 IP 자동 할당: 활성화
  4. 보안 그룹 설정 (중요!)
SSH (포트 22): 내 IP 주소만 허용
HTTP (포트 80): 0.0.0.0/0 
HTTPS (포트 443): 0.0.0.0/0
MLflow (포트 8000): 내 IP 주소만 허용

 

 

   5. 키 페어 생성

  •   새 키 페어 생성 선택
  •   키 페어 이름: mlops-keypair
  •   유형: RSA
  •   형식: .pem (MobaXterm용)

6. 스토리지 설정 
     * 크기: 30GB
     * 볼륨 유형: gp2

2.2 인스턴스 기본 설정

인스턴스 생성 후 초기 설정:

bash

# 시스템 업데이트
sudo apt update && sudo apt upgrade -y

# 필수 패키지 설치
sudo apt install -y git vim curl wget


3. MobaXterm 설치 및 SSH 연결 설정

3.1 MobaXterm 설치

MobaXterm 다운로드 및 설치:

  1. 다운로드
  2. 압축 해제 및 실행
    •   다운로드받은 ZIP 파일 압축 해제
    •   MobaXterm_Personal_xx.x.exe  실행

3.2 SSH 연결 설정

EC2 인스턴스에 SSH 접속 설정:

  1. 새 세션 생성
    •   MobaXterm 실행 → 상단 "Session" 클릭
    •   "SSH" 선택
  2. 연결 정보 입력:[10]
  3. Remote host: [EC2 퍼블릭 IPv4 주소] Specify username: ☑️ ubuntu Port: 22
  4. 키 파일 설정
    •   "Use private key" 체크
    •   폴더 아이콘 클릭 → EC2에서 다운받은 .pem 파일 선택
  5. 북마크 설정
    •   Session name: MLOps-Server (구분하기 쉬운 이름)
  6. 연결 테스트
    •   "OK" 버튼 클릭
    •   처음 연결 시 호스트 키 확인 창이 뜨면 "Yes" 클릭

3.3 MobaXterm 한글 설정

터미널 한글 깨짐 방지:

  •   Settings → Terminal → Character encoding: UTF-8 선택

4. Docker 설치 및 설정

4.1 EC2에서 Docker 설치

Ubuntu에서 Docker 공식 설치 방법:
bash

# 1. 시스템 패키지 업데이트
sudo apt-get update

# 2. 필수 패키지 설치
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 3. Docker GPG 키 추가
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 4. Docker 저장소 추가
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. Docker Engine 설치
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 6. 설치 확인
sudo docker run hello-world

 

4.2 Docker 권한 설정

sudo 없이 Docker 사용하기:
bash

# 현재 사용자를 docker 그룹에 추가
sudo usermod -aG docker $USER

# 새 세션으로 다시 로그인 (MobaXterm 재접속)
exit

# 권한 확인
docker run hello-world

 

4.3 MLOps용 Docker 환경 구성

MLflow와 PostgreSQL을 포함한 Docker Compose 설정:

text

# docker-compose.yml 파일 생성
version: '3.8'

services:
  # PostgreSQL 백엔드 스토어
  postgres:
    image: postgres:13
    container_name: mlops-postgres
    environment:
      - POSTGRES_DB=mlflow
      - POSTGRES_USER=mlflow_user
      - POSTGRES_PASSWORD=mlflow_pass
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U mlflow_user -d mlflow"]
      interval: 30s
      timeout: 10s
      retries: 3

  # MinIO 아티팩트 스토어  
  minio:
    image: minio/minio
    container_name: mlops-minio
    ports:
      - "9000:9000"
      - "9001:9001"
    environment:
      - MINIO_ROOT_USER=minio
      - MINIO_ROOT_PASSWORD=miniostorage
    command: server /data --console-address ":9001"
    volumes:
      - minio_data:/data
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 10s
      retries: 3

  # MLflow 서버
  mlflow:
    image: python:3.9-slim
    container_name: mlops-mlflow
    depends_on:
      postgres:
        condition: service_healthy
      minio:
        condition: service_healthy
    ports:
      - "8000:8000"
    environment:
      - MLFLOW_BACKEND_STORE_URI=postgresql://mlflow_user:mlflow_pass@postgres:5432/mlflow
      - MLFLOW_DEFAULT_ARTIFACT_ROOT=s3://mlflow/
      - AWS_ACCESS_KEY_ID=minio
      - AWS_SECRET_ACCESS_KEY=miniostorage
      - MLFLOW_S3_ENDPOINT_URL=http://minio:9000
    command: >
      bash -c "
      pip install mlflow boto3 psycopg2-binary &&
      mlflow server 
      --backend-store-uri postgresql://mlflow_user:mlflow_pass@postgres:5432/mlflow
      --default-artifact-root s3://mlflow/
      --host 0.0.0.0
      --port 8000
      "

volumes:
  postgres_data:
  minio_data:

 

 

Docker Compose 실행:
bash

# 백그라운드 실행
docker-compose up -d

# 실행 상태 확인
docker-compose ps

# 로그 확인
docker-compose logs mlflow


5. WandB 설정 및 연동

5.1 WandB 계정 생성 및 API 키 발급

WandB 회원가입 및 설정:[8][7]

  1. 회원가입
  2. API 키 확인

5.2 EC2에서 WandB 설치 및 설정

Python 가상환경에서 WandB 설치:
bash

# Python 가상환경 생성
python3 -m venv mlops_env
source mlops_env/bin/activate

# WandB 설치
pip install wandb

# WandB 로그인
wandb login
# 프롬프트가 나타나면 앞서 복사한 API 키 붙여넣기


5.3 WandB 프로젝트 초기화

첫 번째 WandB 프로젝트 생성:

python

# test_wandb.py 파일 생성
import wandb
import random
import math

# 프로젝트 초기화
wandb.init(
    project="mlops-tutorial",  # 프로젝트 이름
    config={
        "learning_rate": 0.01,
        "epochs": 10,
        "batch_size": 32,
        "architecture": "CNN"
    }
)

# 가상의 학습 시뮬레이션
for epoch in range(10):
    # 가상의 손실과 정확도 생성
    loss = math.exp(-epoch/10) + random.random()*0.1
    accuracy = 1 - math.exp(-epoch/5) + random.random()*0.1

    # WandB에 메트릭 로그
    wandb.log({
        "epoch": epoch,
        "loss": loss,
        "accuracy": accuracy
    })

    print(f"Epoch {epoch}: Loss={loss:.4f}, Accuracy={accuracy:.4f}")

wandb.finish()



테스트 실행
:

bash

python test_wandb.py



5.4 WandB와 MLflow 통합

실제 MLOps 파이프라인에서 사용할 통합 코드:
python

# integrated_training.py
import wandb
import mlflow
import mlflow.sklearn
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.metrics import accuracy_score
import numpy as np

def train_model():
    # WandB 초기화
    wandb.init(
        project="mlops-integration",
        config={
            "model": "RandomForest",
            "n_estimators": 100,
            "max_depth": 5
        }
    )

    # MLflow 실험 시작
    mlflow.set_experiment("mlops-integration")

    with mlflow.start_run():
        # 데이터 준비
        iris = load_iris()
        X_train, X_test, y_train, y_test = train_test_split(
            iris.data, iris.target, test_size=0.2, random_state=42
        )

        # 모델 학습
        model = RandomForestClassifier(
            n_estimators=wandb.config.n_estimators,
            max_depth=wandb.config.max_depth,
            random_state=42
        )
        model.fit(X_train, y_train)

        # 예측 및 평가
        predictions = model.predict(X_test)
        accuracy = accuracy_score(y_test, predictions)

        # MLflow에 로그
        mlflow.log_param("n_estimators", wandb.config.n_estimators)
        mlflow.log_param("max_depth", wandb.config.max_depth)
        mlflow.log_metric("accuracy", accuracy)
        mlflow.sklearn.log_model(model, "random_forest_model")

        # WandB에 로그
        wandb.log({
            "accuracy": accuracy,
            "n_estimators": wandb.config.n_estimators,
            "max_depth": wandb.config.max_depth
        })

        print(f"Model accuracy: {accuracy:.4f}")

    wandb.finish()

if __name__ == "__main__":
    train_model()

 

6. 통합 환경 테스트 및 확인

6.1 전체 시스템 동작 확인

각 서비스 접속 테스트:

bash

# MLflow UI 접속 (브라우저에서)
# http://[EC2-퍼블릭IP]:8000

# MinIO 콘솔 접속 (브라우저에서)  
# http://[EC2-퍼블릭IP]:9001
# 사용자명: minio, 비밀번호: miniostorage

# WandB 프로젝트 확인
# https://app.wandb.ai 접속 → 본인 프로젝트 확인

 

6.2 환경변수 설정 자동화

편의성을 위한 환경변수 설정: wandb

bash

# ~/.bashrc에 추가
echo 'export WANDB_API_KEY=[본인의-API-키]' >> ~/.bashrc
echo 'export MLFLOW_TRACKING_URI=http://localhost:8000' >> ~/.bashrc
source ~/.bashrc

 

6.3 실습용 디렉토리 구조 생성

체계적인 프로젝트 구조 만들기:

bash

# MLOps 프로젝트 디렉토리 생성
mkdir -p ~/mlops-project/{data,notebooks,src,models,docker,scripts}

cd ~/mlops-project
tree
# mlops-project/
# ├── data/          # 데이터 파일
# ├── notebooks/     # Jupyter 노트북  
# ├── src/          # 소스 코드
# ├── models/       # 저장된 모델
# ├── docker/       # Docker 설정 파일
# └── scripts/      # 스크립트 파일

 

초보자를 위한 문제 해결 가이드

일반적인 문제와 해결책

문제 원인 해결책
EC2 SSH 연결 실패 보안 그룹 설정 오류 포트 22를 내 IP에 열어주기
Docker 권한 오류 사용자가 docker 그룹에 없음 sudo usermod -aG docker $USER 실행 후 재접속
MLflow 접속 불가 포트 5000이 막힘 보안 그룹에 포트 5000 추가
WandB 로그인 실패 API 키 오류 https://app.wandb.ai/authorize에서 새 키 발급

 

다음 단계 학습 방향

  1. 기초 단계: 간단한 scikit-learn 모델로 MLflow + WandB 연동 실습
  2. 중급 단계: PyTorch/TensorFlow 모델 학습 파이프라인 구축
  3. 고급 단계: Kubernetes 클러스터에서 자동화된 MLOps 파이프라인 운영

 

 
728x90
728x90