MLOps(1)

City_Duck·2022년 9월 11일
0

MLOps

목록 보기
2/5

MLOps와 Kubernetes

MlOps에서는 Kubernetes가 다음과 같은 이유로 필요하다.

  • Reproducibility : 실행 환경의 일관성 & 독립성
  • Job Scheduling : 스케쥴 관리, 병렬 작업 관리, 유휴 자원 관리
  • Auto-healing & Auto-scaling : 장애 대응, 트래픽 대응

이를 위해 MLOps에서는 도커와 쿠버네티스 다음과 같은 목적으로 사용한다.

  • Docker : Containerization
  • Kubernetes : Container Orchestration

이 중 Containerization이란

  • Containerization : 컨테이너화 하는 기술
  • Container : 격리된 공간에서 프로세스를 실행시킬 수 있는 기술

이를 사용하기 위해 Docker를 사용한다.
그리고 Kubernetes는 이러한 Docker들을 관리한다.

그렇기에 해당 포스트에서는 먼저 Docker에 대해 다루려고 한다.

Docker의 역할
Bulid Once, Run Anywhere
다른 컴퓨터 혹은 환경에서도 통일된 환경을 제공한다.

  • 도커의 설치 방법(apple silicon)
    Rosetta 2를 설치한다.

    $ softwareupdate --install-rosetta

    해당 링크를 통해 Docker 페이지에 접속한 후 Mac with Apple Chip을 버튼을 통해 다운받는다.

  • 리눅스 명령어 모음

  • Docker 이미지와 컨테이너의 관계

    • Image : 서비스 운영에 필요한 서버 프로그램,소스코드 및 라이브러리, 컴파일 된 실행 파일을 묶은 형태
    • Layer : 기존 이미지에 추가적인 파일이 필요할 때 다시 다운 받는 것이 아닌 해당 파일을 추가하기 위한 개념
    • Container : 이미지를 실행한 상태
  • Docker의 기본적인 명령어

  1. Docker pull

    • docker image repository부터 Docker image를 가져오는 커맨드

      	$ docker pull --help
      	$ docker pull example:tag
  2. Docker images

    • 로컬에 존재하는 docker image 리스트를 출력하는 커맨드

      	$ docker images --help
      	$ docker images
  3. Docker ps

    • 현재 실행중인 도커 컨테이너 리스트를 출력하는 커맨드

      	$ docker ps --help
      	$ docker ps -a
  4. Docker run

    • 도커 컨테이너를 실행시키는 커맨드

      	$ docker run -- help
      	$ docker run -it --name example /bin/bash
    • -it : -i 옵션 + -t 옵션
      container를 실행시킴과 동시에 interactive한 terminal로 접속시켜주는 옵션

    • --name : name
      컨테이너 id 대신, 구부하기 쉽도록 지정해주는 이름

    • /bin/bash
      컨테이너를 실행시킴과 동시에 실행할 커맨드로, /bin/bash는 bash 터미널을 사용

  5. Docker exec

    • Docker 컨테이너 내부에서 명령을 내리거나, 내부로 접속하는 커맨드

      	$ docker exec --help

      $ docker run -it -d --name example:tag
      $ docker ps

    • -d : 백그라운드에서 실행시켜, 컨테이너 접속 종료시에도 계속 실행

      	$ docker exec -it example /bin/bash
    • container 내부에 접속할 수 있는 것을 확인 가능

  6. Docker logs

    • 도커 컨테이너의 log를 확인하는 커맨드

      	$ docker logs --help
      	$ docker logs example -f
    • -f : 계속 watch 하며 출력

  7. Docker stop

    • 실행 중인 도커 컨테이너를 중단시키는 커맨드

      	$ docker stop --help
      	$ docker stop example 
  8. Docker rm

    • 도커 컨테이너를 삭제하는 커맨드

      	$ docker rm --help
      	$ docker rm example 
  9. Docker rmi

    • 도커 이미지를 삭제하는 커맨드

      	$ docker rmi --help
      	$ docker rmi example 
  • Docker Image

    • 어떤 애플리케이션에 대해 단순히 코드뿐만이 아니라, dependent한 모든 것을 함께 패키징한 데이터
    • Dockerfile : 사용자가 도커 이미지를 쉽게 만들 수 있도록, 제공하는 템플릿
  • Dockerfile 기본 명령어

  • FROM

    • Dockerfile이 base image로 어떠한 이미지를 사용할 것인지를 명시하는 명령어

      	FROM <image>[:<tag>][AS <name>]
      	#예시
      	FROM example 
  • COPY

    • 의 파일 혹은 디렉토리를 경로에 복사하는 명령어

      	COPY <src>...<dest>
      	#예시
      	COPY a.txt /example-directory/b.txt
      	COPY my-directory /example-directory-2
  • RUN

    • 명시한 커맨드를 도커 컨테이너에서 실행하는 것을 명시하는 명령어입니다.

      	RUN <command>
      	RUN ["executable-command","parameter1","parameter2"]
      	#예시
      	RUN pip install torch
      	RUN pip install -r requirements.txt
  • CMD

    • 명시한 커맨드를 도커 컨테이너가 시작될 때, 실행하는 것을 명시하는 명령어

    • 하나의 Docker Image에서는 하나의 CMD만 실행될 수 있다는 점이 RUN 명령어와 다름

      	CMD <command>
      	CMD ["executable-command","parameter1","parameter2"]
      	#예시
      	CMD python main.py
  • WORKDIR

    • 이후 작성될 명령어를 컨테이너 내의 어떤 디렉토리에서 수행할 것인지를 명시하는 명령어

    • 해당 디렉토리가 없다면 생성합니다.

      	WORKDIR /path/to/workdir
      	#예시
      	WORKDIR /home/example
  • ENV

    • 컨테이너 내부에서 지속적으로 사용될 environment variable의 값을 설정하는 명령어

      	ENV <key><value>
      	ENV <key>=<value>
      
      	#예시
      	# default 언어 설정
      	RUN locale-gen ko_KR.UTF-8
          ENV LANG ko_KR.UTF-8
      	ENV LANGUAGE ko_KR.UTF-8
      	ENV LC_ALL ko_KR.UTF-8
  • EXPOSE

    • 컨테이너에서 뚫어줄 포트/프로토콜을 지정할 수 있습니다.

    • protocol을 지정하지 않으면 TCP가 default로 설정됩니다.

      	EXPOSE <port>
      	EXPOSE <port></protocol>
      	#예시
      	EXPOSE 8080
  • 간단한 Docekrfile 작성하기

  • vi 혹은 vscode 등 편집기로 dockerfile을 연다.

  • 없을 경우 생성

    #예시
    cd PG/DB
    touch dockerfile
  • 그 후 다음과 같이 작성

    #base image를 설정
    FROM ubuntu
    
    # apt-get update 명령을 실행한다.
    RUN apt-get update
    
    # Docker Container가 시작될 때 "Hello world"를 출력한다.
    CMD ["echo","Hello world"]
  • Docker build from Dockerfile

    • docker build 명령어로 Dockerfile로부터 Docker image를 만든다.
    $ docker build --help
    
    # Dockerfile이 있는 경로에서 다음 명령을 실행
    $ cd PG/DB
    $ docker build -t my-image:v1.0.0 .
    • . : 현재 경로에 있는 Dockerfile 로부터
    • my-image 라는 이름과 v1.0.0이라는 태그이미지를 빌드
  • 이미지 빌드 확인

    $ docker image | grep my-image
    $ docker run my-image:v1.0.0
    # Hello world가 출력되는 것을 확인
  • Docker Image 저장소

    Docker hub로 들어가서 회원 가입한다. 그 후

    $ docker login
    
    # username, password 입력
    # Login Succeeded!
  • Docker Hub를 바라보도록 tag 생성

    $ docker tag my-image:v1.0.0 exmaple/my-image:v1.0.0
    # docker tag <image_name>:<tag_name> <user_name>/<image_name>:<tag>
  • Docker image push to Docker Hub

    $ docker push exmaple/my-image:v1.0.0
    
    # docker push <user_name>/<image_name>:<tag>

    이처럼 도커에 대해 조굼 알아보았다.
    다음으로는 Kubernetes에 대해 알아보려고 한다.


profile
AI 새싹

0개의 댓글