윈도우, Linux 그리고 Docker


부스트 캠프를 진행하던 도중 질문게시판에 mlflow를 윈도우에서 돌렸는데 에러가 발생했다고 올라와서 궁금해서 조사하던 도중 알게된 사실과 추가적으로 궁금해서 찾아본 것들에 대해 정리해 보고자 한다

발생한 문제점

  • docker: Error response from daemon: invaild mode: 경로와 같은 에러가 발생하였다.

조사과정

  • 평소 python에서 코딩을 할 경우에도 /와 \를 혼용해서 사용하면 매우 쉽게 에러가 발생하는 모습을 보았기 때문에 Linux기반인 docker에서 windows 명령어를 사용해서 에러가 나는것이 아닐까 생각하였다

알게된 점

  • 원인은 : symbol에 존재했다. 윈도우에서는 : symbol을 C:\directory식으로 드라이브를 표기할 때 사용하지만, mount할때에는 : 를 연동할 대상의 구분자로 사용을 하기 때문이다
  • docker 에서 volumn mount를 시행할 시 입력되는 경로는 무조건 절대경로로 적어야한다. pwd로 입력해야한다고 doc에 나와있었다

해결 방법

  • C: 형태를 //C/directory 형태로 바꿔서 입력을 한다
    • 기존 윈도우에서 사용하는 형태를 리눅스 커맨드 형태로 바꿔서 입력한다
    • 어차피 docker 내부에서 작동할 커맨드이기 때문에 윈도우 커널에서도 잘 돌아간다
  • “”로 한번 감싸준다
    • “”로 싸주어서 전체 C:\가 링크인것을 알려준다

결론

  • 기본적으로 docker는 Linux 기반이기 때문에 windows로 사용할 경우 많은 제약이 당연하게도 뒤따른다
  • windows에서 Docker를 쓸 때는 WSL을 이용하자

reference

Docker


Docker

  • 리눅스의 응용 프로그램들을 프로세스 격리 기술을 사용하여 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트이다
  • 도커는 아래와 같은 주요 구성 요소들이 존재한다
    • 이미지
    • 컨테이너
    • 데몬

      Docker image

  • 서비스 운영에서 필요한 프로그램, 소스코드, 각종 모듈, 컴파일된 실행파일을 묶는 형태를 말한다
  • 간단히 말해서 프로세스를 실행하기 위해 필요한 모든 파일과 설정값을 저장하고 있어서 추가적으로 의존성 파일을 설치할 필요없는 상태이다
  • Image는 Layer로 이루어져 있다
  • image를 build할때 효율적으로 동작하기 위해 구현된 층을 Layer라고 한다
    • image는 여러개의 읽기전용 Layer로 구성되어 있다
    • 다른 image를 받아와서 그위에 Layer를 쌓아 새로운 Image를 만드는것도 가능하다
    • 아래의 명령어 한줄한줄이 Layer라고 생각해도 무방하다
      1
      2
      3
      4
      5
      6
      7
      FROM pytorch/pytorch:1.7.0-cuda11.0-cudnn8-runtime
      RUN apt-get update -y
      ...
      WORKDIR /app
      COPY ./src /app/src
      COPY ./test /app/test
      ENTRYPOINT python3 /app/src/run.py
  • 이를 통해 컨테이너를 생성할 수 있다

Docker Container

  • Image를 실행, 응용프로그램 자체를 격리된 공간에서 동작시키는 기술이다
  • Image를 통하여 여러대의 Container를 생성 할 수 있고, 이 Container들은 모두 동일한 개발환경을 가지게 된다
    • Docker의 장점 1
    • 여러대의 분리된 서버를 모두 같은 환경으로 만들 수 있다
  • Image를 실행시키기만 하면 Image에 저장되어있던 모든 파일들과 환경변수등이 셋팅되기 때문에 설치가 매우 간편하다
    • 장점 2

Docker Daemon

  • Docker Container나 Image를 관리하는 Kernel
  • user가 client를 통해서 보낸 명령을 받아서 Docker 객체들을 관리한다
  • 하나의 커널로 여러 Container를 관리하기 때문에 가상환경에 비해 도커가 용량을 덜 차지하고, 더 빠른 속도를 가질 수 있다

reference

AI 프로젝트 설계


문제를 해결하기 위한 흐름

  • 현상파악
  • 목적 및 문제 정의
  • 프로젝트 설계
  • Action
  • 추가적인 원인 분석

1. 현상 파악 및 문제 정의

  • 문제의 정의
    • 특정 현상을 파악하고, 그 현상의 있는 문제를 정의하는 과정이 필요하다
    • 풀고자 하는 문제를 명확하게 하는것이 중요하다
  • 어느정도 현상파악이 끝나면 내렸던 문제의 정의를 좀더 구체적으로 만들어본다
    • 문제 해결을 위한 대상을 정하기
    • 목표에 대한 구체적인 정의 등
    • 왜 그러한 일이 발생하는지 가설세우기
    • 이 문제대해 어떠한 데이터가 존재하는가?

2. 프로젝트 설계

  • 처음부터 최대한 자세하게 설계하자

  • 머신러닝 문제 타당성 확인

    항상 ML이 만능은 아니다

    • ML을 사용하면 좋은경우
    • 학습가능한 패턴이 존재하는 문제
      • 사람이 반복적으로 실행하는 task인 경우 -> ML로 대체될 가능성이 높다
    • 그리고 그 패턴이 복잡할 경우
      • 간단한 문제면 Huristic한 알고리즘이 이것보다 몇배는 더 빠르다
      • 간단하면 계산 코스트가 너무 커질 가능성이 높다
    • 목적함수를 만들 수 없으면 ML의 의미가 없다
    • 데이터 수집이 가능할 경우 : 데이터가 없으면 답이 없다
      • 없으면 데이터 수집부터 진행해야한다…. Labeling
    • 인종, 성향 등등의 윤리적인 제한에 자유로울 경우
  • 프로젝트의 목표 및 지표 설정

    • 목표 : 일반적인 목적, 큰 목적, 메인 Task
    • 지표 : 목적을 달성하기 위한 세부 단계의 목표
  • 제약조건

    • 이 문제를 해결하기 위해 무한한 자금과 시간이 있는것이 아니다.
    • 시간적인 문제
    • 금전적인 문제
    • 데이터가 민감한 정보들을 포함하고 있을 가능성도 존재한다
    • 데이터 윤리적인 문제
  • Baseline, Prototype 제작

  • Metric Evaluation

3. Action

  • 모델 개발 후 배포, 모니터링 과정
  • 앞서 설계한 지표의 변화 파악하는 과정을 진행한다

4. 추가 원인분석

  • 새롭게 발견한 상황들의 원인 분석 및 해결방안 설계

비즈니스 모델 BM

  • 회사가 어떤 서비스 가치를 제공하고있는가?
    • 비즈니스 모델 : 회사가 서비스를 제공하여 가치를 창출하는 방식
  • 서비스의 핵심을 파악하자
  • 어떠한 데이터를 가지고있는가
  • 데이터로 무엇을 할수 있을까

reference