Skip to content
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@

### How to Start
1. 필요한 node module을 설치합니다.
```bash
```text
npm install
```

2. 글 수정 및 추가를 후 ci 를 실행합니다.
```bash
```text
npm ci
```

3. node 서버를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다.
```bash
3. node 클러스터를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다.
```text
npm run start
```

Expand Down
12 changes: 6 additions & 6 deletions content/en/docs/help/how-to-contribute.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,19 @@ toc: true

1. 필요한 node module을 설치합니다.

```bash
```text
npm install
```

2. 글 수정 및 추가를 후 ci 를 실행합니다.

```bash
```text
npm ci
```

3. node 서버를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다.
3. node 클러스터를 실행 후 수정한 글이 정상적으로 나오는지 확인합니다.

```bash
```text
npm run start
```

Expand Down Expand Up @@ -71,13 +71,13 @@ draft: false

pre-commit을 통해 대부분의 test를 통과할 수 있습니다.

```bash
```text
pip install pre-commit
pre-commit run -a
```

pre-commit 후 test를 진행합니다.

```bash
```text
npm test
```
8 changes: 4 additions & 4 deletions content/en/docs/introduction/why_kubernetes.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ menu:
간단하게는 수많은 머신러닝 모델의 학습 요청을 순차적으로 실행 하는 것, 다른 작업 공간에서도 동일한 실행 환경을 보장해야 하는 것, 배포된 서비스에 장애가 생겼을 때 빠르게 대응해야 하는 것 등의 이슈 등을 생각해볼 수 있습니다.
여기서 컨테이너(Container)와 컨테이너 오케스트레이션 시스템(Container Orchestration System)의 필요성이 등장합니다.

쿠버네티스와 같은 컨테이너 오케스트레이션 시스템을 도입하면 실행 환경의 격리와 관리를 효율적으로 수행할 수 있습니다. 컨테이너 오케스트레이션 시스템을 도입한다면, 머신러닝 모델을 개발하고 배포하는 과정에서 다수의 개발자가 소수의 서버를 공유하면서 *'1번 서버 사용 중이신가요?', 'GPU 사용 중이던 제 프로세스 누가 죽였나요?', '누가 서버에 x 패키지 업데이트 했나요?'* 와 같은 상황을 방지할 수 있습니다.
쿠버네티스와 같은 컨테이너 오케스트레이션 시스템을 도입하면 실행 환경의 격리와 관리를 효율적으로 수행할 수 있습니다. 컨테이너 오케스트레이션 시스템을 도입한다면, 머신러닝 모델을 개발하고 배포하는 과정에서 다수의 개발자가 소수의 클러스터를 공유하면서 *'1번 클러스터 사용 중이신가요?', 'GPU 사용 중이던 제 프로세스 누가 죽였나요?', '누가 클러스터에 x 패키지 업데이트 했나요?'* 와 같은 상황을 방지할 수 있습니다.

## Container

Expand All @@ -43,15 +43,15 @@ menu:
그렇다면 컨테이너 오케스트레이션 시스템은 무엇일까요? **오케스트레이션**이라는 단어에서 추측해 볼 수 있듯이, 수많은 컨테이너들이 있을 때 컨테이너들이 서로 조화롭게 구동될 수 있도록 지휘하는 시스템에 비유할 수 있습니다.

컨테이너를 도입이 되면 서비스는 컨테이너의 형태로 사용자들에게 제공됩니다. 이 때 관리해야 할 컨테이너의 수가 적다면 운영 담당자 한 명이서도 충분히 모든 상황에 대응할 수 있습니다.
하지만, 수 백 개 이상의 컨테이너가 수 십 대 이상의 서버에서 구동되고 있고 장애를 일으키지 않고 항상 정상 동작해야 한다면, 모든 서비스의 정상 동작 여부를 담당자 한 명이 파악하고 이슈에 대응하는 것은 불가능에 가깝습니다.
하지만, 수 백 개 이상의 컨테이너가 수 십 대 이상의 클러스터에서 구동되고 있고 장애를 일으키지 않고 항상 정상 동작해야 한다면, 모든 서비스의 정상 동작 여부를 담당자 한 명이 파악하고 이슈에 대응하는 것은 불가능에 가깝습니다.

예를 들면, 모든 서비스가 정상적으로 동작하고 있는지를 계속해서 모니터링(Monitoring)해야 합니다.
만약, 특정 서비스가 장애를 일으켰다면 여러 컨테이너들의 로그를 확인해가며 문제를 파악해야 합니다.
또한 특정 서버나 특정 컨테이너에 작업이 몰리지 않도록 스케줄링(Scheduling)하고 로드 밸런싱(Load Balancing)하며, 스케일링(Scaling)하는 등의 수많은 작업을 담당해야 합니다.
또한 특정 클러스터나 특정 컨테이너에 작업이 몰리지 않도록 스케줄링(Scheduling)하고 로드 밸런싱(Load Balancing)하며, 스케일링(Scaling)하는 등의 수많은 작업을 담당해야 합니다.
이렇게 수많은 컨테이너들의 상태를 지속적으로 관리하고 운영하는 과정을 조금이나마 쉽게, 자동으로 할 수 있는 기능을 제공해주는 소프트웨어가 바로 컨테이너 오케스트레이션 시스템입니다.

머신러닝에서는 어떻게 쓰일 수 있을까요?
예를 들어서 GPU를 필요로 하는 딥러닝 학습 코드가 패키징된 컨테이너는 사용 가능한 GPU가 있는 서버에서 수행하고, 많은 메모리를 필요로 하는 데이터 전처리 코드가 패키징된 컨테이너는 메모리의 여유가 많은 서버에서 수행하고, 학습 중에 서버에 문제가 생기면 자동으로 동일한 컨테이너를 다른 서버로 이동시키고 다시 학습을 진행하는 등의 작업을 사람이 일일히 수행하지 않고, 자동으로 관리하는 시스템을 개발한 뒤 맡기는 것입니다.
예를 들어서 GPU를 필요로 하는 딥러닝 학습 코드가 패키징된 컨테이너는 사용 가능한 GPU가 있는 클러스터에서 수행하고, 많은 메모리를 필요로 하는 데이터 전처리 코드가 패키징된 컨테이너는 메모리의 여유가 많은 클러스터에서 수행하고, 학습 중에 클러스터에 문제가 생기면 자동으로 동일한 컨테이너를 다른 클러스터로 이동시키고 다시 학습을 진행하는 등의 작업을 사람이 일일히 수행하지 않고, 자동으로 관리하는 시스템을 개발한 뒤 맡기는 것입니다.

집필을 하는 2022년을 기준으로 쿠버네티스는 컨테이너 오케스트레이션 시스템의 사실상의 표준(De facto standard)입니다.

Expand Down
4 changes: 2 additions & 2 deletions content/en/docs/setup/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
title : "Setup"
description: "Setup kubernetes."
lead: ""
date: 2020-10-06T08:48:23+00:00
lastmod: 2020-10-06T08:48:23+00:00
date: 2021-12-13
lastmod: 2021-12-13
draft: false
weight: 200
images: []
Expand Down
16 changes: 0 additions & 16 deletions content/en/docs/setup/example.md

This file was deleted.

77 changes: 77 additions & 0 deletions content/en/docs/setup/intro.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
---
title : "1. Introduction"
description: "Setup Introduction"
lead: ""
date: 2021-12-13
lastmod: 2021-12-13
draft: false
weight: 201
contributors: ["Jaeyeon Kim"]
menu:
docs:
parent: "setup"
images: []
---

## MLOps 시스템 구축해보기

MLOps 를 공부하는 데 있어서 가장 큰 장벽은 MLOps 시스템을 구성해보고 사용해보기가 어렵다는 점입니다. AWS, GCP 등의 퍼블릭 클라우드 혹은 Weight & Bias, neptune.ai 등의 상용 툴을 사용해보기에는 과금에 대한 부담이 존재하고, 처음부터 모든 환경을 혼자서 구성하기에는 어디서부터 시작해야 할 지 막막하게 느껴질 수밖에 없습니다.

이런 이유들로 MLOps 를 선뜻 시작해보지 못하시는 분들을 위해, *모두의 MLOps*에서는 우분투가 설치되는 데스크탑 하나만 준비되어 있다면 MLOps 시스템을 밑바닥부터 구축하고 사용해 볼 수 있는 방법을 다룰 예정입니다.

하지만 [MLOps의 구성요소]({{< relref "docs/introduction/component.md" >}})에서 설명하는 요소들을 모두 사용해볼 수는 없기에, *모두의 MLOps*에서는 대표적인 오픈소스만을 설치한 뒤, 서로 연동하여 사용하는 부분을 주로 다룰 예정입니다.

*모두의 MLOps*에서 설치하는 오픈소스가 표준을 의미하는 것은 아니며, 여러분의 상황에 맞게 적절한 툴을 취사 선택하시는 것을 권장합니다.

## 구성 요소

이 글에서 만들어 볼 MLOps 시스템의 구성 요소들과 각 버전은 아래와 같은 환경에서 검증되었습니다.

원활한 환경에서 테스트하기 위해 **클러스터 (혹은 클러스터)** 와 **클라이언트**를 분리하여 설명드릴 예정입니다.
**클러스터** 는 우분투가 설치 되어 있는 데스크탑을 의미합니다.
**클라이언트** 는 노트북 혹은 클러스터가 설치 되어 있는 데스크탑 외의 클라이언트로 사용할 수 있는 다른 데스크탑을 사용하는 것을 권장합니다.
하지만 두 대의 머신을 준비할 수 없다면 데스크탑 하나를 동시에 클러스터와 클라이언트 용도로 사용하셔도 괜찮습니다.

### 클러스터

#### 1. Software

아래는 클러스터에 설치해야할 소프트웨어 목록입니다.

| Software | Version |
| --------------- | ----------- |
| Ubuntu | 20.04.3 LTS |
| Docker (Server) | 20.10.11 |
| Nvidia-Driver | 470.86 |
| Kubernetes | v1.21.7 |
| Kubeflow | v1.4.0 |
| MLFlow | v1.21.0 |

#### 2. Helm Chart

아래는 Helm을 이용해 설치되어야 할 써드파티 소프트웨어 목록입니다.

| Helm Chart Repo Name | Version |
| ----------------------------------------------- | ----------- |
| datawire/ambassador | v6.9.3 |
| prometheus-community/kube-prometheus-stack | v21.0.0 |

### 클라이언트

클라이언트는 MacOS (Intel CPU), Ubuntu 20.04 에서 검증되었습니다.

| Software | Version |
| --------------- | ----------- |
| kubectl | v1.21.7 |
| helm | v3.7.1 |
| kustomize | v3.10.0 |

### Minimum System Requirements

모두의 MLOps 를 설치할 클러스터는 다음과 같은 사양을 만족시키는 것을 권장합니다.
이는 Kubernetes 및 Kubeflow 의 권장 사양에 의존합니다.

- CPU : 6 core
- RAM : 12 GB
- DISK : 50 GB
- GPU : NVIDIA GPU (Optional)
75 changes: 75 additions & 0 deletions content/en/docs/setup/kubernetes-with-k3s.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
---
title: "4.3. Setup Kubernetes - K3s"
description: ""
date: 2021-12-13
lastmod: 2021-12-13
draft: false
weight: 223
contributors: ["Jongseob Jeon"]
menu:
docs:
parent: "setup"
images: []
---

**해당 과정은 클러스터로 사용하는 데스크탑에서 진행됩니다.**
로컬과 클러스터가 분리된 경우 꼭 클러스터에서 설치되도록 확인해 주세요.

## 1. Prerequisite

k3s 에서는 기본값으로 containerd를 백엔드로 이용해 설치합니다.
하지만 저희는 GPU를 사용하기 위해서 docker를 백엔드로 사용해야 하기 때문에 `--docker` 옵션을 통해 백엔드를 docker로 설치하겠습니다.

```text
curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.21.7+k3s1 sh -s - server --disable traefik --disable servicelb --disable local-storage --docker
```

k3s를 설치후 k3s config를 확인합니다

```text
cat /etc/rancher/k3s/k3s.yaml
```

## 2. 쿠버네티스 클러스터 셋업

k3s config를 클러스터의 kubeconfig로 사용하기 위해서 복사합니다.

```text
mkdir .kube
sudo cp /etc/rancher/k3s/k3s.yaml .kube/config
sudo chown mrx:mrx .kube/config
```

## 3. 쿠버네티스 클라이언트 셋업

이제 클러스터에서 설정한 kubeconfig를 로컬로 이동합니다.
로컬에서는 경로를 `~/.kube/config`로 설정합니다.
정상적으로 작동하는지 확인합니다.

## 4. 쿠버네티스 기본 모듈 설치

[Setup Kubernetes Modules]({{< relref "docs/setup/setup-kubernetes-module.md" >}})을 참고하여 다음 컴포넌트들을 설치해 주시기 바랍니다.

- helm
- kustomize
- CSI plugin
- [Optional] nvidia-docker, nvidia-device-plugin

## 5. 정상 설치 확인

최종적으로 node 가 Ready 인지, OS, Docker, Kubernetes 버전을 확인합니다.

```text
kubectl get nodes -o wide
```

다음과 같은 메시지가 보이면 정상적으로 설치된 것을 의미합니다.

```text
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ubuntu Ready control-plane,master 2d23h v1.21.7 192.168.0.75 <none> Ubuntu 20.04.3 LTS 5.4.0-91-generic docker://20.10.11
```

## 6. References

- [https://rancher.com/docs/k3s/latest/en/installation/install-options/](https://rancher.com/docs/k3s/latest/en/installation/install-options/)
Loading