GokuMohandas/Made-With-ML
요약
이 코스는 머신러닝(ML) 개념을 소프트웨어 엔지니어링과 결합하여 프로덕션급 ML 애플리케이션을 설계, 개발, 배포하는 전 과정을 다룹니다. 참가자들은 실험 단계부터 신뢰할 수 있는 프로덕션 시스템 구축까지의 모든 단계를 학습하며, MLOps 구성 요소(추적, 테스트, 서빙 등)와 CI/CD 워크플로우를 구현합니다. 이 과정은 ML을 특정 분야가 아닌 데이터를 생각하는 강력한 방식으로 정의하며, 소프트웨어/인프라 엔지니어부터 데이터 사이언티스트, 제품 리더십까지 모든 개발자에게 필수적인 기술적 토대를 제공합니다.
핵심 포인트
- ML 개념에 대한 제1원리(First principles) 이해를 구축합니다.
- 소프트웨어 엔지니어링의 베스트 프랙티스를 ML 모델 개발 및 배포 과정에 적용합니다.
- MLOps 구성 요소(추적, 테스트, 서빙, 오케스트레이션 등)를 포함한 End-to-end 시스템을 구축하는 방법을 학습합니다.
- 개발 환경에서 프로덕션 환경으로 빠르고 안정적으로 전환하는 Dev to Prod 전략을 익힙니다.
- CI/CD 워크플로우를 통해 지속적인 모델 개선 및 배포 파이프라인을 생성합니다.
4만 명 이상의 개발자들과 함께 ML (Machine Learning)로 책임감 있게 가치를 전달하는 방법을 배워보세요.
머신러닝 (Machine Learning)을 소프트웨어 엔지니어링 (Software Engineering)과 결합하여 프로덕션급 (Production-grade) ML 애플리케이션을 설계, 개발, 배포 및 반복하는 방법을 학습합니다.
- 강의: https://madewithml.com/
- 코드: GokuMohandas/Made-With-ML
이 코스에서는 실험 (Experimentation, 설계 + 개발) 단계에서 프로덕션 (Production, 배포 + 반복) 단계까지 나아갑니다. 우리는 신뢰할 수 있는 (Reliable) 프로덕션 시스템을 구축할 수 있게 해주는 구성 요소들을 동기 부여하며 반복적으로 진행할 것입니다.
💡 제1원리 (First principles): 코드로 바로 뛰어들기 전에, 모든 머신러닝 (Machine Learning) 개념에 대해 제1원리적인 이해를 구축합니다.
💻 베스트 프랙티스 (Best practices): 머신러닝 (Machine Learning) 모델을 개발하고 배포할 때 소프트웨어 엔지니어링 (Software Engineering)의 베스트 프랙티스를 구현합니다.
📈 확장성 (Scale): 완전히 새로운 언어를 배울 필요 없이 Python에서 ML 워크로드 (데이터, 학습, 튜닝, 서빙)를 쉽게 확장합니다.
⚙️ MLOps: 엔드 투 엔드 (End-to-end) 머신러닝 (Machine Learning) 시스템을 구축하면서 MLOps 구성 요소 (추적, 테스트, 서빙, 오케스트레이션 등)를 연결합니다.
🚀 개발에서 프로덕션으로 (Dev to Prod): 코드나 인프라 관리 (Infra management)의 변경 없이 개발에서 프로덕션으로 빠르고 안정적으로 전환하는 방법을 배웁니다.
🐙 CI/CD: 어떤 스택과도 통합될 수 있는 모듈식 방식으로 더 나은 모델을 지속적으로 학습하고 배포하기 위해 성숙한 CI/CD 워크플로우를 생성하는 방법을 배웁니다.
머신러닝 (Machine Learning)은 별개의 산업이 아니라, 특정 유형의 사람들에게만 국한되지 않는 데이터를 생각하는 강력한 방식입니다.
👩💻 모든 개발자: 소프트웨어/인프라 엔지니어 (Software/Infra engineer)이든 데이터 사이언티스트 (Data scientist)이든, ML은 여러분이 개발할 제품의 핵심적인 부분이 되어가고 있습니다.
👩🎓 대학 졸업생: 산업계에서 요구하는 실무 기술을 배우고 대학 커리큘럼과 산업계의 기대 사이의 간극을 메웁니다.
👩💼 제품/리더십 (Product/Leadership): 머신러닝 (Machine Learning) 기반의 놀랍고 (그리고 신뢰할 수 있는) 제품을 만들 수 있도록 기술적 토대를 구축하고자 하는 분들.
이 저장소 (Repository)의 콘텐츠에 대해 훨씬 더 상세한 안내를 받으려면 반드시 코스를 처음부터 끝까지 따라가시기 바랍니다. 아래 섹션들에 대해 로컬 노트북 (Local laptop)과 Anyscale 클러스터 (Clusters) 모두를 위한 지침을 제공할 예정이므로, 사용 중인 환경에 따라 ► 드롭다운 메뉴를 전환해 주세요 (Anyscale 지침이 기본적으로 활성화되어 있습니다). 만약 하루 만에 모든 것을 배울 수 있도록 구조 (Structure), 연산 자원 (Compute (GPUs)), 그리고 **커뮤니티 (Community)**를 제공하는 Anyscale를 통해 이 코스를 진행하고 싶다면, 곧 진행될 다음 라이브 코호트 (Live cohort)에 참여하세요 → [여기에서 신청하세요!]
먼저 환경 및 연산 구성 (Compute configurations)을 사용하여 클러스터를 설정하는 것부터 시작하겠습니다.
Local (로컬)
여러분의 개인 노트북 (단일 머신)이 클러스터 역할을 하게 되며, 하나의 CPU는 헤드 노드 (Head node)가 되고 나머지 CPU 중 일부는 워커 노드 (Worker nodes)가 됩니다. 이 코스의 모든 코드는 어떤 개인 노트북에서도 작동하지만, 더 큰 클러스터에서 동일한 워크로드 (Workloads)를 실행하는 것보다는 느릴 것입니다.
Anyscale
웹페이지 UI를 사용하여 Anyscale 워크스페이스 (Workspace)를 생성할 수 있습니다.
- Workspace name: `madewithml`
- Project: `madewithml`
- Cluster environment name: `madewithml-cluster-env`
...
또는, CLI를 사용하여 다음과 같이 워크스페이스를 생성할 수 있습니다.
anyscale workspace create ...
Other (기타 - 클라우드 플랫폼, K8s, 온프레미스)
로컬이나 Anyscale를 통해 이 코스를 진행하고 싶지 않다면, 다음과 같은 옵션이 있습니다.
- AWS 및 GCP 상에서 실행. 커뮤니티에서 지원하는 Azure 및 Aliyun 통합 환경도 존재합니다.
- 공식적으로 지원되는 KubeRay 프로젝트를 통해 Kubernetes (Kubernetes) 상에서 실행.
- 온프레미스 (On-prem) 또는 여기에 나열되지 않은 플랫폼에 Ray를 수동으로 배포.
다음 지침에 따라 저장소를 생성하세요: Create a new repository → 이름을 Made-With-ML로 지정
→ Add a README file을 선택 ( main 브랜치를 생성하므로 매우 중요합니다) → Create repository를 클릭 (아래로 스크롤)
이제 우리의 모든 코드가 담긴 저장소를 클론 (Clone)할 준비가 되었습니다:
git clone https://github.com/GokuMohandas/Made-With-ML.git .
touch .env
# .env 내부
GITHUB_USERNAME="CHANGE_THIS_TO_YOUR_USERNAME" # ← 이것을 본인의 사용자 이름으로 변경하세요
source .env
로컬 (Local)
export PYTHONPATH=$PYTHONPATH:$PWD
python3 -m venv venv # Python 3.10 사용을 권장합니다
source venv/bin/activate # Windows의 경우: venv\Scripts\activate
...
Anyscale
적절한 Python 버전과 라이브러리가 갖춰진 우리의 환경은 Anyscale Workspace를 설정할 때 사용했던 클러스터 환경을 통해 이미 모두 준비되어 있습니다. 따라서 다음 명령어들을 실행하기만 하면 됩니다:
export PYTHONPATH=$PYTHONPATH:$PWD
pre-commit install
pre-commit autoupdate
핵심 머신러닝 워크로드 (Machine Learning Workloads)를 대화형으로 따라가며 살펴보기 위해 Jupyter Notebook을 탐색하는 것부터 시작하세요.
로컬 (Local)
# 노트북 시작
jupyter lab notebooks/madewithml.ipynb
Anyscale
Anyscale Workspace 페이지의 오른쪽 상단에 있는 Jupyter 아이콘을 클릭하면 새 탭에서 JupyterLab 인스턴스가 열립니다. 그런 다음 notebooks 디렉토리로 이동하여 madewithml.ipynb 노트북을 여세요.
이제 소프트웨어 엔지니어링 모범 사례 (테스트 (Testing), 문서화 (Documentation), 로깅 (Logging), 서빙 (Serving), 버전 관리 (Versioning) 등)를 따라 깨끗한 Python 스크립트를 사용하여 동일한 워크로드를 실행할 것입니다. 노트북에서 구현한 코드는 다음과 같은 스크립트로 리팩터링 (Refactored)됩니다:
madewithml
├── config.py
├── data.py
...
참고: 아래의 --num-workers, --cpu-per-worker, --gpu-per-worker 입력 인자 (Input Argument) 값들을 귀하의 시스템 리소스에 맞춰 변경하세요. 예를 들어, 로컬 노트북을 사용 중이라면 --num-workers 6 --cpu-per-worker 1 --gpu-per-worker 0이 적절한 설정입니다.
export EXPERIMENT_NAME="llm"
export DATASET_LOC="https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv"
export TRAIN_LOOP_CONFIG='{"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3}'
...
export EXPERIMENT_NAME="llm"
export DATASET_LOC="https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/dataset.csv"
export TRAIN_LOOP_CONFIG='{"dropout_p": 0.5, "lr": 1e-4, "lr_factor": 0.8, "lr_patience": 3}'
...
우리는 실험을 추적하고 모델을 저장하기 위해 MLflow를 사용하며, 실험을 확인하기 위해 MLflow Tracking UI를 사용합니다. 지금까지 실험 데이터를 로컬 디렉토리에 저장해 왔으나, 실제 운영 환경(production setting)에서는 모든 실험을 저장할 중앙 집중식 위치를 갖게 된다는 점에 유의하세요. 팀원 모두가 각자의 실험을 추적할 수 있도록 자체적인 MLflow 서버를 구축하는 것은 쉽고 저렴하며, Weights & Biases, Comet 등과 같은 관리형 솔루션(managed solution)을 사용할 수도 있습니다.
export MODEL_REGISTRY=$(python -c "from madewithml import config; print(config.MODEL_REGISTRY)")
mlflow server -h 0.0.0.0 -p 8080 --backend-store-uri $MODEL_REGISTRY
로컬 (Local)
이 노트북을 로컬 노트북에서 실행 중이라면, http://localhost:8080/로 이동하여 MLflow 대시보드를 확인하세요.
Anyscale
Anyscale Workspaces를 사용 중이라면, 먼저 MLflow 서버의 포트(port)를 노출해야 합니다. Anyscale Workspace 터미널에서 다음 명령어를 실행하여 MLflow 서버의 공개 URL을 생성하세요.
APP_PORT=8080
echo https://$APP_PORT-port-$ANYSCALE_SESSION_DOMAIN
export EXPERIMENT_NAME="llm"
export RUN_ID=$(python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC)
export HOLDOUT_LOC="https://raw.githubusercontent.com/GokuMohandas/Made-With-ML/main/datasets/holdout.csv"
...
{
"timestamp": "June 09, 2023 09:26:18 AM",
"run_id": "6149e3fec8d24f1492d4a4cabd5c06f6",
...
export EXPERIMENT_NAME="llm"
export RUN_ID=$(python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC)
python madewithml/predict.py predict \
...
[{
"prediction": [
"natural-language-processing"
...
로컬 (Local)
로컬 (Local)
# 시작
ray start --head
# 설정
export EXPERIMENT_NAME="llm"
export RUN_ID=$(python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC)
...
애플리케이션이 실행되면, cURL, Python 등을 통해 사용할 수 있습니다:
# Python을 통해
import json
import requests
...
ray stop # 종료
Anyscale
Anyscale Workspaces에서는 Ray가 이미 실행 중이므로, 로컬에서 하는 것처럼 수동으로 시작하거나 종료할 필요가 없습니다.
# 설정
export EXPERIMENT_NAME="llm"
export RUN_ID=$(python madewithml/predict.py get-best-run-id --experiment-name $EXPERIMENT_NAME --metric val_loss --mode ASC)
...
애플리케이션이 실행되면, cURL, Python 등을 통해 사용할 수 있습니다:
# Python을 통해
import json
import requests
...
# 코드
python3 -m pytest tests/code --verbose --disable-warnings
# 데이터
...
이 시점부터 애플리케이션을 프로덕션 (Production) 환경에 배포하려면, Anyscale를 사용하거나 직접 관리하는 클라우드 VM / 온프레미스 (on-prem) 클러스터(Ray 포함)를 사용해야 합니다. Anyscale를 사용하지 않는 경우 명령어가 약간 다를 수 있지만 개념은 동일합니다.
이 모든 것을 직접 설정하고 싶지 않다면, 저희의 차기 라이브 코호트(live cohort){:target="_blank"}에 참여하는 것을 강력히 추천합니다. 그곳에서는 머신러닝 (Machine Learning)에만 집중할 수 있도록 이 모든 인프라가 이미 설정된 환경을 제공해 드립니다.
아래의 자격 증명 (Credentials)은 Anyscale Workspaces를 사용하는 경우 자동으로 설정됩니다. Workspaces에서는 이러한 자격 증명을 명시적으로 설정할 필요가 없지만, 로컬에서 실행하거나 Anyscale Jobs 및 Services가 실행되도록 구성된 외부 클러스터에서 실행하는 경우에는 설정해야 합니다.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN=$YOUR_CLI_TOKEN # Anyscale 자격 증명 페이지에서 가져옴
클러스터 환경 (cluster environment)은 우리의 워크로드 (workloads)가 어디에서 실행될지 (OS, 의존성 등)를 결정합니다. 우리는 이미 우리를 위한 클러스터 환경을 생성해 두었지만, 이것은 우리가 직접 환경을 생성하거나 업데이트하는 방법입니다.
export CLUSTER_ENV_NAME="madewithml-cluster-env"
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAME
컴퓨팅 구성 (compute configuration)은 우리의 워크로드가 어떤 리소스 위에서 실행될지를 결정합니다. 우리는 이미 우리를 위한 컴퓨팅 구성을 생성해 두었지만, 이것은 우리가 직접 구성하는 방법입니다.
export CLUSTER_COMPUTE_NAME="madewithml-cluster-compute-g5.4xlarge"
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME
이제 ML 워크로드를 실행할 준비가 되었습니다. 우리는 이 모든 것을 하나의 작업 (job)으로 결합하기로 결정했지만, 각 워크로드(학습 (train), 평가 (evaluate) 등)에 대해 별도의 작업을 생성할 수도 있었습니다. 먼저 workloads.yaml 파일 내의 $GITHUB_USERNAME 슬롯을 편집하는 것부터 시작하겠습니다:
runtime_env:
working_dir: .
upload_path: s3://madewithml/$GITHUB_USERNAME/jobs # <--- 사용자 이름 변경 (대소문자 구분)
...
여기서 runtime_env는 Anyscale Job을 실행할 때 모든 워커 (workers)가 사용할 수 있는 코드에 접근할 수 있도록 현재의 working_dir를 S3 버킷에 업로드해야 함을 지정합니다. GITHUB_USERNAME은 나중에 워크로드의 결과를 S3에 저장하여 나중에 (예: 서빙 (serving)을 위해) 검색할 수 있도록 하는 데 사용됩니다.
이제 ML 워크로드를 실행하기 위해 작업을 제출할 준비가 되었습니다:
anyscale job submit deploy/jobs/workloads.yaml
ML 워크로드가 실행된 후에는 모델을 프로덕션에 서빙할 준비가 됩니다. Anyscale Jobs 설정과 마찬가지로, serve_model.yaml 내의 $GITHUB_USERNAME을 반드시 변경하십시오.
ray_serve_config:
import_path: deploy.services.serve_model:entrypoint
runtime_env:
...
이제 서비스를 시작할 준비가 되었습니다:
# 서비스 롤아웃 (Rollout service)
anyscale service rollout -f deploy/services/serve_model.yaml
# 쿼리 (Query)
...
우리는 변경 사항이 생길 때마다 매번 수동으로 애플리케이션을 배포하지 않을 것입니다. 대신, GitHub Actions를 사용하여 이 프로세스를 자동화할 것입니다!
- 변경 사항을 저장하고 CI/CD 워크로드 (workloads)를 실행할 새로운 GitHub 브랜치 (branch)를 생성합니다:
git remote set-url origin https://github.com/$GITHUB_USERNAME/Made-With-ML.git # <-- 이것을 귀하의 사용자 이름으로 변경하세요
git checkout -b dev
- 먼저 GitHub 저장소 (repository)의
/settings/secrets/actions페이지에 필요한 자격 증명 (credentials)을 추가하는 것부터 시작하겠습니다.
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN=$YOUR_CLI_TOKEN # https://console.anyscale.com/o/madewithml/credentials 에서 가져온 값
- 이제 코드의 변경 사항을 만들고 (
main브랜치가 아닌 곳에서) GitHub로 푸시 (push)할 수 있습니다. 하지만 코드를 GitHub에 푸시하기 위해서는, 저장소로 푸시하기 전에 먼저 자격 증명 (credentials)을 통해 인증 (authenticate)을 해야 합니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 GitHub Trending Jupyter Notebook (weekly)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기