첫 주는 조금 여유로울줄 알았는데, 공부할게 많다.

 

 

02-1. 훈련 세트와 테스트 세트

확인 문제를 통해 이 부분을 공부해보자.

 

1. 머신러닝 알고리즘의 한 종유로서 샘플의 입력과 타깃(정답)을 알고 있을 때 사용할 수 있는 학습방법은 무엇인가요?

- 머신러닝은 크게 지도학습과 비지도학습으로 구분할 수 있고, 정답을 알고 있는 경우 지도학습을 적용한다.

→ ① 지도학습

 

2. 훈련 세트와 테스트 세트가 잘못 만들어져 전체 데이터를 대표하지 못하는 현상을 무엇이라고 부르나요?

- 훈련 세트와 테스트 세트를 만들 때 전체적인 데이터 분포를 유지하는 것이 중요하며 그렇지 못한 경우 편향을 보인다.

→ ④ 샘플링 편향

 

3. 사이킷런은 입력 데이터(배열)가 어떻게 구성되어 있을 것으로 기대하나요?

- 문제 해석이 조금 오해의 여지가 있어 보이지만, 특성은 열(column)로 나열되어 있고 데이터의 구분은 행으로 된다.

→ ② 행: 샘플, 열: 특성

 

 

 

02-2. 데이터 전처리

이 책은 초보자를 위한 수준은 아닌 것 같고, 기본 지식이 좀 있어야 따라갈만한 것 같다.

어쩐지 처음 이 책으로 공부할 때 왠지 자괴감이 좀 들더라니..... ㅠㅠ

 

분산 = 기대값(평균)으로부터 얼마나 떨어진 곳에 분포하는지를 가늠하는 숫자

표준편차 = 분산의 제곱근

 

 

표준화(Standardization) = 평균을 0, 분산을 1로 만들어주는 스케일링 기법 (Z-Score 활용)

 

기본이 될만한 것들을 같이 정리하면서 공부해봐야겠다.

반응형

새해를 맞이하여 야심찬 목표를 세우고 힘차게 달리다가 ... 살짝 지치기도 하고 ... 번아웃도 오고 ...

그러던 와중 또 다시 심장을 뛰게 해주는 혼공학습단 12기 모집 공지를 발견했다 !!!

 

그리고, 정말 고맙게도 지원을 받아주셔서 12기로 활동(공부?)하게 되었다 !!!

 

이번에 공부할 책은 바로~ 바로~

"혼자 공부하는 머신러닝+딥러닝"

 

책을 구매한지는 정말 오래되었는데, 사실 완독하지는 못했었다.

예전에 무심코 지나갔던 책 안의 중요한 정보~!!!

 

이제서야 함께 합니다 !!!

 

 

6주 코스, 열심히 완주해야지 !!!

https://hongong.hanbit.co.kr/혼공-게시판/?uid=162&mod=document&pageid=1

 

개인적으로 너무나 존경하고 애정하는 "박해선"님의 서적인만큼,

책 자체의 퀄리티도 너무나 훌륭하고 예제 및 동영상 등 부수적인 부분들도 너무나 훌륭하다.

https://www.youtube.com/playlist?list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX

 

저 동영상 녹화할 때 몇 번 라이브에 참여도 했었는데 ^^

 

 

우리를 공부시키기 위해 박해선님은 정말 많은 고민을 하시는 것 같다 ^^

 

챕터 구성에 대해서도 많은 고민의 흔적이 엿보인다.

 

 

 

뭔가 서론이 길었다!

이제 시작해보자.

 

 

Chapter 01. 나의 첫 머신러닝

 

 

01-1. 인공지능과 머신러닝, 딥러닝

박해선님은 직접 그린 그림과 글씨를 좋아하시는 것 같다 ^^

https://www.youtube.com/watch?v=J6wehCO_c58

 

 

 

01-2. 코랩과 주피터 노트북

이제는 이 책이 나온지도 조금 시간이 지나서

사용한 도구/패키지들의 버전들이 좀 옛날 것들이다.

 

Colab에 들어가서 기본적으로 설치된 Python 버전만 확인해봐도 좀 차이가 발생한다.

https://colab.research.google.com/

 

직접 실습들을 해보면서 버전 차이로 발생하는 것들이 있는지 확인해보면 재미있을 것 같다.

 

 

 

01-3. 마켓과 머신러닝

타이틀이 조금 웃기는데, 저런 제목이 나온이유는 다음과 같다.

https://www.youtube.com/watch?v=GOCVVSMeIf8

 

머신러닝을 공부하기 위해서 문제 상황을 다음과 같이 가정해보자.

- 생선을 파는 마켓이 있다.

- 생선의 크기나 무게를 가지고 그 생선이 무엇인지 맞추고 싶다.

 

동영상 강의 듣다보면 소음(?) 이슈가 있는데,

라이브로 참여했었을 때 마이크 켜 놓은 참석자가 한 명 있어서 조금 짜증났던 기억이 있다.

메시지로 그 사람한테 계속 뭐라했는데 강의를 듣지도 않았던 것 같고 메시지도 보지도 않았던 나쁜 사람 !!! ㅋㅋㅋ

 

첫 실습 내용인데,

첫번째 실습 내용부터 이렇게 쭉~ 진도를 나간다는 것이 조금 당황스럽기는 한데 ...

 

일단 Chapter01 진도는 여기까지!

반응형

[문제] Python으로 "Hello world!"를 가장 간단하게 출력하는 방법은?

[정답] 다음과 같은 방법을 생각해낸 사람은 파이썬 고수!!!

Hello world!

 

 

[문제] "python -m antigravity"를 실행하면 어떤 결과가 나올까?

[정답] 'antigravity'의 뜻은 반중력이며, 모든 것을 밀어내는 성질을 의미한다.

antigravity

 

응?! 아무것도 출력되는 것 없이 그냥 끝난다. 그런데... 갑자기 웹 브라우져가 실행되는데...

https://xkcd.com/353/

 

설마 XKCD를 처음보는 분이 계실리가.....?!

 

계실 수도 있으니 ^^ 설명을 해보자면,

 

랜들 먼로(Randall Munroe)가 일주일에 3번 연재하는 Web-Comic으로

공대 개그, Geek스러운 개그가 주된 유머 코드이다.

 

XKCD

 

웹사이트 메뉴 中 WHAT IF? 컨텐츠를 기반으로 책도 출간했다. 번역본도 있다.

아주 위험한 과학책

 

재밌지 않나!?

python CLI 가지고 별 이상한 일이 다 생긴다 ^^

 

 

[문제] python 으로 그래픽 UI를 어떻게 표현할 수 있는지 쉽게 설명할 수 있는 방법은?

[정답] python 에는 오랜 역사(?)를 갖고 있는 거북이(turtle) 모듈이 있다.

turtle demo

 

응!? turtle demo도 지원해준다고!?

turtle example

 

신기한(?) 윈도우가 하나 실행된다.

examples

 

하나 골라 보자.

clock example

 

turtle 모듈을 이용한 예제 코드도 볼 수 있고,

윈도우 하단의 "START"를 클릭하면 실행 결과도 확인할 수 있다.

 

"python -m turtledemo" 실행 하나만으로 이런 어플이 뜬다니,

대체 이런 것들은 어디에 숨어있었던 것인지...

 

그동안 Python을 몇 년 동안 만져왔는데, 지금까지 이런 것들을 전혀 몰랐다니!

 

 

생각보다 재미있어서 이런 것들 찾아서 몇 번 더 포스팅해보겠다 ^^

 

 

반응형

AI 특히 LLM, NLP를 공부하는 사람들이라면 최소한 한 번 이상 들어봤을 '허깅페이스(HuggingFace)'

  - https://huggingface.co/

https://huggingface.co/

 

2016년도에 설립된 뉴욕에 본사가 있는 프랑스계 미국 회사이며,

자연어 처리(NLP: Natural Language Processing), 특히 트랜스포머(Transformer)에 중점을 둔 커뮤니티라고 할 수 있다.

 

 

 

HuggingFace가 어떤 의미일까!?

 

이모지를 보면 한국어로는 '포옹하고 있는 얼굴'로 나오는 것이 있다.

이것이 HuggingFace의 정체이다!!! ^^

Emoji

 

허깅페이스는 작년(23년) 8월 2억3500만 달러(약 3113억원)의 자금을 투자 받았으며

45억 달러(약 6조)의 시장 가치를 평가받았다. 어마어마 하다.

 

그리고, 투자 기업 목록을 보면

구글과 엔비디아, 아마존, AMD, 인텔, IBM, 퀄컴, 세일즈포스 등 AI 개발 하면 떠오르는 테크 기업들이 대부분 포함됐다.

 

 

 

대체 허깅페이스가 무엇이기에 이렇게 많은 업체들이 관심을 갖고 투자를 하고 있을까?!

 

허깅페이스 사이트의 상단 메뉴를 살펴보자.

https://huggingface.co/

 

허깅페이스 사이트에서 제공해주는 기능은 다음 3가지라고 할 수 있다.

  - Models / Datasets / Spaces

 

 

▷ Models

Models

 

자연어 처리 외에도 다양한 유형의 모델들을 등록하고 다운로드 받을 수 있다.

  - Multimodal

  - Computer Vision

  - Natural Language Processing

  - Audio

  - Tabular

  - Reinforcement Learning

  - Other

 

무려 73만여개의 모델들이 등록되어 있는 것을 확인할 수 있다.

 

성능 좋은 LLM 모델을 오픈 공개한다고 하면 일단 허깅페이스에 등록하는 것이 거의 정해진 수순이다.

최근 애플에서도 모델을 오픈했고, 당연하게 허깅페이스에 등록했다고 기사가 나왔다.

apple model

 

지난달에 등록했던 OpenELM과 몇 일 전 등록한 coreml 모델들을 확인할 수 있다.

 

관심있는 모델을 선택하면 상세 정보 페이지가 나온다.

Meta-Llama-3-8B

 

Model Card를 통해 학습데이터에 대한 정보라던지, 어떻게 활용할 수 있는지 등 자세한 설명을 볼 수 있다.

 

 

 

▷ Datasets

Datasets

 

모델보다는 좀 부족한 17만여개의 Datasets도 업로드/다운로드 할 수 있다.

 

마찬가지로 Dataset card를 통해 자세한 정보를 확인해볼 수 있다.

ft-instruction-synthesizer-collection

 

이미지나 오디오 형식의 feature도 보고, 듣기 편하게 제공해준다.

 

 

 

▷ Spaces

Spaces

 

가장 인상적인 Spaces !!!

AI Apps들을 등록하고 사용해볼 수 있다.

 

ai-comic-factory

 

Japanimation 스타일로 AI를 공부하는 스토리를 그려달라고 했더니 저런 결과물을 생성해줬다 ^^

 

구글과 제휴를 했다고 하더니(24년 1월) GCP 리소스를 이용해 이런 서비스도 제공해줄 수 있나보다.

하지만, App 실행하다보면 GPU 할당 받기 위해 잠시 기다리라는 메시지가 종종 나오기는 한다.

 

 

 

▷ Docs

Docs

 

학생 또는 개발자라면 좀 더 관심 깊게 봐야하는 것은 Docs 메뉴이다.

심지어 한글도 비교적 충실히 제공해준다. (물론 유명한 컨텐츠에 한해서 ^^)

Transformers

 

그런데, 내용을 잘 보면 알겠지만, 일반적인 튜토리얼이 아니다.

HuggingFace를 활용하는 방법들을 설명해주는 내용들이다.

 

그렇다!!!

허깅페이스의 매력은 파이썬 패키지에 있다.

transformers

 

허깅페이스에 등록된 모델, 데이터셋 등을 편하게 사용할 수 있다.

추론도할 수 있고, fine-tuning을 해볼 수도 있고, 아니면 내가 다시 학습을 시켜볼 수도 있다.

 

 

 

여기까지 살펴본 결과 .... 

허깅페이스는 ML-Hub / AI-Hub / LLM-Hub 등의 명칭으로 불러야 할 것 같다.

AI Platform 이라고 정의하는 글도 본 것 같다.

 

다음에는 허깅페이스를 이용해서 파인튜닝 해보는 내용을 정리해보려고 한다.

이번 글은 여기에서 ... 이만~

반응형

Docker Compose를 이용한 설치를 한 상황을 기준으로 하겠다.

  - https://www.whatwant.com/entry/Apache-Airflow-install

 

[ Status ]

    - Docker Compose를 이용해서 Apache Airflow를 설치한 상태이다.

 

> docker ps

 

    - 하지만, example들이 엄청 많이 보인다.

        . 공부하기 위해 참조할 수는 있지만, 삭제해도 다시 살아나고..... 지워버리고 싶은 상황이다.

 

http://localhost:8090/home

 

[ Docker Compose Down ]

    - 현재 설치된 것을 모두 지워버려야 한다.

 

> docker compose down

 

> docker compose down

 

[ Edit docker-compose.yaml ]

    - YAML 파일의 내용을 살짝 바꿔줘야 한다.

 

> nano docker-compose.yaml

 

> nano docker-compose.yaml

 

    - 빨간 박스에 있는 것 처럼, 해당 값을 false로 변경해주면 된다.

 

[ Re-install ]

    - 이제 설치/실행 진행하면 된다.

 

❯ docker compose up airflow-init


❯ docker compose up

 

    - 그리고 웹브라우저 다시 열고 접속하고 로그인 하면... 깨끗한 화면을 볼 수 있다!

 

http://localhost:8090/home

 

깔끔!

반응형

'AI_ML > MLOps' 카테고리의 다른 글

Apache Airflow install (아파치 에어플로우 설치)  (1) 2024.05.04

▷ Basic Info ...

    - MLOps에 대해서 공부를 하다보면 누구나 한 번 이상 꼭 듣게 되는 도구 ... Apache Airflow !!!

    - 공식 사이트를 방문해보면 바람개비와 함께 산뜻한 페이지가 반긴다.

        . https://airflow.apache.org/

 

https://airflow.apache.org/

 

    - 하지만, 우리같은(?) 도구쟁이들은 GitHub 사이트가 더 좋다 ^^

        . https://github.com/apache/airflow

 

https://github.com/apache/airflow

 

    - 최신병에 걸려있기 때문에(^^), 릴리즈 정보를 확인해봐야 한다.

        . https://airflow.apache.org/announcements/

 

https://airflow.apache.org/announcements/

 

▷ Prerequisites

    - 기본적으로 POSIX 호환 운영체제에서 Python만 있으면 설치는 가능하다.

        . Linux 배포판 및 MacOS가 기본적인 지원 운영체제이지만

        . WSL2에서도 실행은 가능하다. 다만, 주력 지원 환경은 아니기에 Production 환경으로는 추천하지 않는다.

        . Kubernetes 환경에서 동작 가능한 것이지 설치할 때 필수 환경은 아니다.

 

    - 메모리는 최소 4GB 이상이 필요하다.

 

    - 설치할 때 SQLite를 같이 포함해서 설치를 진행할 수 있지만, Production에서는 별도 DB 구성을 추천한다.

 

https://airflow.apache.org/docs/apache-airflow/2.9.0/installation/prerequisites.html

 

▷ Environments

    - 설치 과정을 함께할 운영체제는 Ubuntu 20.04 환경이다.

        . Airflow는 Debian 계열하고 제일 친한 것 같다. 그렇다면 Ubuntu가 최선이지 않을까!?

 

❯ lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.6 LTS
Release: 20.04
Codename: focal

 

    - 일단 메모리 상황을 점검해보자.

        . 메모리는 마음대로 할 수 있는 것이 아니니 부족하다면... 다른 서버를 찾아야 한다 ㅠ

 

❯ free -h

                  total        used          free       shared    buff/cache   available
Mem:       7.8Gi       679Mi       6.4Gi          13Mi          677Mi        6.8Gi
스왑:        2.0Gi          0B         2.0Gi

 

    - Python 버전을 확인해보자.

        . Python 버전 관리를 위해서는 Pyenv를 사용하는 것을 권장합니다 !!!

        . https://www.whatwant.com/entry/pyenv

 

❯ pyenv --version   

pyenv 2.3.9-11-g3d83bcdb


❯ python --version

Python 3.8.16

 

▷ Install #1 - PyPI + venv

    - Apache Airflow를 설치하는 여러 방법이 있는데,

      PyPI를 이용하는 방법과 Docker를 이용하는 방법에 대해서 살펴보고자 한다.

 

① pyenv

    - Python 3.10 버전 환경에서 설치를 해보고자 한다.

    - pyenv를 이용해서 원하는 버전을 설치하도록 하겠다.

 

❯ pyenv versions  

  system
* 3.8.16 (set by /home/chani22/.pyenv/version)

# 사용하고자 하는 버전이 설치되어 있는지 확인


❯ pyenv install -l

Available versions:
  2.1.3
  2.2.3
...

# 설치가 가능한 버전 확인


❯ pyenv install 3.10.9

Downloading Python-3.10.9.tar.xz...
-> https://www.python.org/ftp/python/3.10.9/Python-3.10.9.tar.xz
Installing Python-3.10.9...
Installed Python-3.10.9 to /home/chani22/.pyenv/versions/3.10.9

 

② workspace / venv

    - Airflow를 설치할 디렉토리를 확보하고,

    - Python venv를 이용하여 가상환경까지 생성해보자.

 

❯ mkdir airflow

❯ cd airflow

❯ pyenv local 3.10.9 

❯ python -m venv .venv

❯ ls -al

합계 16
drwxrwxr-x 3   chani22 chani22 4096  4월 29 01:18 .
drwxr-xr-x 3    chani22 chani22 4096  4월 29 01:16 ..
-rw-rw-r-- 1      chani22 chani22      7  4월 29 01:16 .python-version
drwxrwxr-x 5   chani22 chani22 4096  4월 29 01:18 .venv

❯ source .venv/bin/activate

 

③ ENV

    - 설치에 필요한 정보들을 위해서 환경 변수들을 설정해준다.

    - "/srv/install/airflow" 디렉토리는 위에서 만들어 놓은 것을 사용해도 된다.

    - "AIRFLOW_VERSION"은 지금 현재 가장 최신 버전을 선택했다.

    - "PYTHON_VERSION"의 경우에 그냥 명시적으로 "3.10"이라고 설정해버려도 된다.

    - "CONSTRAINT_URL" 역시 그냥 명시적으로 버전을 지정할 수도 있다.

 

❯ export AIRFLOW_HOME=/srv/install/airflow

❯ export AIRFLOW_VERSION=2.9.0

❯ export PYTHON_VERSION="$(python -c 'import sys; print(f"{sys.version_info.major}.{sys.version_info.minor}")')"

❯ export CONSTRAINT_URL="https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt"


❯ echo $PYTHON_VERSION

3.10


❯ echo $CONSTRAINT_URL

https://raw.githubusercontent.com/apache/airflow/constraints-2.9.0/constraints-3.10.txt

 

④ install

    - 준비 끝. 설치 시작!

 

❯  pip install "apache-airflow==${AIRFLOW_VERSION}" --constraint "${CONSTRAINT_URL}"

...


❯ pip list | grep airflow                                                          

apache-airflow                                          2.9.0
apache-airflow-providers-common-io       1.3.0
apache-airflow-providers-common-sql     1.11.1
apache-airflow-providers-fab                    1.0.2
apache-airflow-providers-ftp                     3.7.0
apache-airflow-providers-http                   4.10.0
apache-airflow-providers-imap                 3.5.0
apache-airflow-providers-smtp                 1.6.1
apache-airflow-providers-sqlite                3.7.1

 

⑤ DB init

    - 그냥 실행하는 방법도 있지만, 하나씩 차근차근 셋업하는 것을 추천한다.

 

❯ airflow db migrate

DB: sqlite:////srv/install/airflow/airflow.db
Performing upgrade to the metadata database sqlite:////srv/install/airflow/airflow.db
[2024-04-29T02:20:10.674+0900] {migration.py:216} INFO - Context impl SQLiteImpl.
[2024-04-29T02:20:10.710+0900] {migration.py:219} INFO - Will assume non-transactional DDL.
[2024-04-29T02:20:10.713+0900] {migration.py:216} INFO - Context impl SQLiteImpl.
[2024-04-29T02:20:10.714+0900] {migration.py:219} INFO - Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Context impl SQLiteImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running stamp_revision  -> 1949afb29106
Database migrating done!

 

⑥ make admin account

    - 관리자 계정을 만들어주자.

    - "--role Admin" 부분만 잘 지켜주고, 나머지는 각자 취향대로.

 

❯ airflow users create --username whatwant --firstname whatwant --lastname boss --role Admin --email whatwant@whatwant.com

...
Password:
Repeat for confirmation:
[2024-04-29T02:31:53.165+0900] {override.py:1516} INFO - Added user whatwant
User "whatwant" created with role "Admin"

 

⑦ run

    - 이제 웹 UI를 확인해보자.

 

airflow webserver --port 8080

 

    - 웹브라우저를 실행해서, 다음 주소로 접속하면 된다.

        . http://localhost:8080

 

http://localhost:8080/

 

    - 앞에서 생성한 계정과 패스워드를 이용해서 Sign in 하면 된다.

 

http://localhost:8080/

 

    - 뭔가 화면은 나왔는데, 위에 뭔가 알람이 많이 보인다.

 

⑧ notice

    - 어?! 그런데 뭔가 경고같은 메시지가 보인다.

 

notice

 

    - 가장 위에 있는 메시지를 보면 실행중인 "scheduler"가 안보인단다. 해결해보자.

 

⑨ scheduler

    - 새로운 터미널을 추가로 띄워서 scheduler를 실행하면 된다.

 

new terminal

 

   - 터미널을 새로 띄우면 Python 가상환경도 추가 설정해야 한다.

 

❯ cd airflow

# 앞에서 진행했던 airflow 디렉토리로 이동


❯ source .venv/bin/activate


❯ airflow scheduler

 

    - 웹브라우저를 reload(F5) 하면 갑자기 못보던 샘플 DAGs 가 보인다.

 

http://localhost:8080/home

 

    - 상단에 보이는 알람 메시지가 3개에서 2개로 줄어들었다.

    - 나머지 2개는 production 환경에서 SQLite나 SeuentialExecutor를 사용하지 말라는 메시지다. 일단 무시!

 

http://localhost:8080/dags/example_params_trigger_ui/grid?tab=graph

 

    - Sample을 하나 선택해서 살펴보면 뭔가 멋지다! ^^

 

 

▷ Install #2 - Docker + Compose

    - docker를 이용한 airflow 설치를 해보자.

    - 그냥 docker image를 이용한 실행말고, 여러 모듈들을 같이 구성하기 위해 docker compose를 사용하겠다.

    - https://airflow.apache.org/docs/apache-airflow/2.9.0/howto/docker-compose/index.html

 

① docker / docker-compose

    - docker 및 docker-compose가 설치되어 있어야 한다.

        . Ubuntu 20.04 기준으로 Quick-Guide는 다음과 같다.

 

❯ mkdir docker 

❯ cd docker      

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.6.31-1_amd64.deb

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-buildx-plugin_0.14.0-1\~ubuntu.20.04\~focal_amd64.deb

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_26.1.1-1\~ubuntu.20.04\~focal_amd64.deb

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_26.1.1-1\~ubuntu.20.04\~focal_amd64.deb

❯ wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-compose-plugin_2.27.0-1\~ubuntu.20.04\~focal_amd64.deb


❯ ls -al

합계 109212
drwxrwxr-x 2 chani22 chani22     4096  5월  1 10:31 .
drwxr-xr-x 4 chani22 chani22     4096  5월  1 10:29 ..
-rw-rw-r-- 1 chani22 chani22 29821672  4월 11 21:01 containerd.io_1.6.31-1_amd64.deb
-rw-rw-r-- 1 chani22 chani22 29650176  4월 30 01:48 docker-buildx-plugin_0.14.0-1~ubuntu.20.04~focal_amd64.deb
-rw-rw-r-- 1 chani22 chani22 14601364  5월  1 00:17 docker-ce-cli_26.1.1-1~ubuntu.20.04~focal_amd64.deb
-rw-rw-r-- 1 chani22 chani22 25267932  5월  1 00:17 docker-ce_26.1.1-1~ubuntu.20.04~focal_amd64.deb
-rw-rw-r-- 1 chani22 chani22 12478416  5월  1 00:17 docker-compose-plugin_2.27.0-1~ubuntu.20.04~focal_amd64.deb


❯ sudo dpkg --install containerd.io_1.6.31-1_amd64.deb 

❯ sudo dpkg --install docker-ce-cli_26.1.1-1\~ubuntu.20.04\~focal_amd64.deb 

❯ sudo dpkg --install docker-ce_26.1.1-1\~ubuntu.20.04\~focal_amd64.deb    

❯ sudo dpkg --install docker-buildx-plugin_0.14.0-1\~ubuntu.20.04\~focal_amd64.deb 

❯ sudo dpkg --install docker-compose-plugin_2.27.0-1\~ubuntu.20.04\~focal_amd64.deb 


sudo usermod -aG docker $USER

# 터미널 재시작


❯ docker --version

Docker version 26.1.1, build 4cf5afa


❯ docker compose version

Docker Compose version v2.27.0

 

② download YAML

    - airflow 설치 과정을 위한 디렉토리 만들고

    - docker-compose YAML 파일을 다운로드 받자

 

❯ mkdir airflow-docker

❯ cd airflow-docker

❯ wget https://airflow.apache.org/docs/apache-airflow/2.9.0/docker-compose.yaml

--2024-05-01 10:44:57--  https://airflow.apache.org/docs/apache-airflow/2.9.0/docker-compose.yaml
airflow.apache.org (airflow.apache.org) 해석 중... 151.101.2.132, 2a04:4e42::644
다음으로 연결 중: airflow.apache.org (airflow.apache.org)|151.101.2.132|:443... 연결했습니다.
HTTP 요청을 보냈습니다. 응답 기다리는 중... 200 OK
길이: 11197 (11K)
저장 위치: `docker-compose.yaml'

docker-compose.yaml                 100%[==========================================>]  10.93K  --.-KB/s    / 0s       

2024-05-01 10:44:57 (45.5 MB/s) - `docker-compose.yaml' 저장함 [11197/11197]

 

    - YAML 파일 내용을 살펴보면 알겠지만, 많은 서비스가 별도의 docker로 구성되어 있다.

        . airflow-scheduler

        . airflow-webserver

        . airflow-worker

        . airflow-triggerer

        . airflow-init

        . postgres

        . redis

 

    - 그래서 메모리가 충분히 필요한데, 최소 4GB / 권장 8GB 이다.

 

③ mkdir

    - 여러 종류의 파일들을 저장할 디렉토리들을 만들어 놓자.

        . ./dags - you can put your DAG files here.
        . ./logs - contains logs from task execution and scheduler.
        . ./config - you can add custom log parser or add airflow_local_settings.py to configure cluster policy.
        . ./plugins - you can put your custom plugins here.

 

❯ mkdir -p ./dags ./logs ./plugins ./config


❯ ls -al

합계 36
drwxrwxr-x 6 chani22 chani22  4096  5월  1 10:53 .
drwxr-xr-x 5 chani22 chani22  4096  5월  1 10:44 ..
drwxrwxr-x 2 chani22 chani22  4096  5월  1 10:53 config
drwxrwxr-x 2 chani22 chani22  4096  5월  1 10:53 dags
-rw-rw-r-- 1 chani22 chani22 11197  4월  8 20:42 docker-compose.yaml
drwxrwxr-x 2 chani22 chani22  4096  5월  1 10:53 logs
drwxrwxr-x 2 chani22 chani22  4096  5월  1 10:53 plugins

 

④ UID

    - airflow가 실행될 UID도 설정해주자.

 

❯ echo -e "AIRFLOW_UID=$(id -u)" > .env


❯ cat .env

AIRFLOW_UID=1000

 

⑤ Customizing

    - YAML 파일을 수정할 수도 있다.

    - port만 살짝 바꿔봤다. (각자 취향)

 

❯ nano docker-compose.yaml

 

⑥ Initialize the database

    - DB 초기화를 진행하자.

 

❯ docker compose up airflow-init

 

    - 잘 실행되면 아래와 같은 화면이 나온다.

 

❯ docker compose up airflow-init

 

    - 아래와 같이 Permission denied 상황이 나올 수도 있는데,

      sock 파일의 권한을 조정하거나 그래도 안되면 재부팅 한 번 해주면 잘 된다.

 

❯ docker compose up airflow-init

permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.config-hash%22%3Atrue%2C%22com.docker.compose.project%3Dairflow-docker%22%3Atrue%7D%7D": dial unix /var/run/docker.sock: connect: permission denied


❯ sudo chown root:docker /var/run/docker.sock

 

    - 현재 상태를 확인해보면 다음과 같다.

 

❯ ls -al

합계 40
drwxrwxr-x 6 chani22 chani22  4096  5월  1 11:00 .
drwxr-xr-x 5 chani22 chani22  4096  5월  1 10:44 ..
-rw-rw-r-- 1 chani22 chani22    17  5월  1 10:55 .env
drwxrwxr-x 2 chani22 chani22  4096  5월  1 10:53 config
drwxrwxr-x 2 chani22 root     4096  5월  1 10:53 dags
-rw-rw-r-- 1 chani22 chani22 11197  5월  1 11:00 docker-compose.yaml
drwxrwxr-x 2 chani22 root     4096  5월  1 10:53 logs
drwxrwxr-x 2 chani22 root     4096  5월  1 10:53 plugins


❯ docker ps

CONTAINER ID   IMAGE          COMMAND                   CREATED         STATUS                   PORTS      NAMES
1dfae6410fa0   postgres:13    "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes (healthy)   5432/tcp   airflow-docker-postgres-1
466bc0539812   redis:latest   "docker-entrypoint.s…"   4 minutes ago   Up 4 minutes (healthy)   6379/tcp   airflow-docker-redis-1

 

⑦ Run Airflow

    - 이제 Airflow를 실행하자.

 

  docker compose up

...

 

   - 뭔가 잔뜩 메시지가 흘러나온다.

 

❯ docker compose up

 

    - 웹브라우저를 열어서 접속해보자.

        . http://localhost:8090/

        . 접속 정보: airflow / airflow

 

http://localhost:8090/

 

    - 어!? 뭔가 되게 깔끔한 화면이 나온다.

 

http://localhost:8090/home

 

    - Container 정보를 살펴보자.

 

> docker ps

 

 

우와~~~~ 뭔가 엄청 길었다.

추가적으로 살펴볼 것이 많이 남아있지만 일단 "설치 후 실행"이라는 것에 주안점을 두었다.

 

"운영" 측면에서는 더 알아봐야할 것이 많겠지만 지금은 여기까지만~~~ ^^

반응형

'AI_ML > MLOps' 카테고리의 다른 글

Airflow remove Example DAGs (에어플로우 예제 삭제)  (0) 2024.05.04

출처: https://www.whatwant.com

 

이번에는 Greedy Algorithm을 살펴보도록 하겠다.

 

앞서 살펴본 Dynamic Programming의 경우에는 모든 경우의 수를 고려하여 최적의 솔루션을 찾는 방식이었다면

Greedy Algorithm은 어떤 순간에 최선으로 보이는 것을 선택해서 문제를 푸는 방식이다.

 

뭔 말이냐고!? 일단 하나 살펴보자.

 

 

[Overview]

어떤 활동(activity)들의 집합이 있다고 해보자.

 

출처: https://www.whatwant.com

 

이처럼 여러 activities들이 있을 때,

서로 겹치지 않고 동시에 할 수 있는 activities 중 가장 큰 subset을 선택하는 문제는 어떻게 풀면 좋을까?

 

예를 들자면,

강의실이 하나만 있을 때 여러 수업들을 어떻게 배치해야 가장 많은 수업들을 배치할 수 있는지를 정하는 것과 같다.

 

[Sample]

예시를 하나 들어보자.

 

출처: https://www.whatwant.com

 

위와 같이 activity들이 있다고 했을 때 어떤 조합들이 가능할까?!

 

출처: https://www.whatwant.com

 

우선 {a3, a9, a11} 집합의 경우 mutually compatible 하게 잘 묶여 있다.

서로 배타적이면서 같이 어울릴 수 있는 조합이라는 말이다.

 

하지만, 이 집합은 주어진 상황에서 largest set이라고 할 수는 없다.

 

출처: https://www.whatwant.com

 

{a1, a4, a8, a11} set은 largest set이라고 할 수 있다.

4개보다 더 큰 조합은 찾을 수 없기 때문이다.

 

하지만 unique한 largest set은 아니다.

 

출처: https://www.whatwant.com

 

{a2, a4, a9, a11}의 경우도 largest set이다.

 

그런데, 이렇게 눈으로 정답을 찾는 것은 뭔가 좀..... ^^

 

[Optimal substructure]

일단 아래와 같은 문제가 주어졌다고 했을 때, 각 activity들의 시작 위치와 종료 위치를 작성해보자.

 

출처: https://www.whatwant.com

 

여기에서는 문제가 index 순서에 따라 종료 시간(f)이 순서대로 나와 있어서 정렬을 할 필요가 없지만,

종료 시간의 오름차순으로 정렬까지 해줘야 한다.

 

출처: https://www.whatwant.com

 

이렇게만 했으면 나머지는 쉽다.

 

출처: https://www.whatwant.com

 

제일 먼저 종료되는 시간 이후로 첫번째로 시작하는 activity를 선택하고,

그 activity가 종료되는 시간을 확인하고 또 다시, 그 종료 시간 이후로 시작하는 activity를 찾고... 반복하면 된다.

 

끝이다.

 

뭔가 허무한데, 끝이다.

 

 

[Elements of the greedy strategy]

어째서 Dynamic Programming과 다르게 Greedy Algorithm은 이렇게 문제를 풀 수 있는지에 대해서 알아보자.

 

출처: https://www.whatwant.com

 

subproblem을 모두 풀어야지만 솔루션을 선택할 수 있는 경우에는 Dynamic Programming 문제이고,

모든 subproblem을 풀기 전에 솔루션을 선택할 수 있는 문제는 Greedy Algorithm을 적용할 수 있다.

 

출처: https://www.whatwant.com

 

Zero-One 배낭 문제는 물건을 갯수 단위로만 가방안에 넣을 수 있는 경우에 해당하는 문제이다.

물건들의 가격과 무게가 모두 다르다고 했을 때, 어떻게 넣어야지 가장 비싸게 물건을 훔칠 수 있는지를 찾는 것이다.

모든 조합을 고려해야 문제가 풀리는 것이다.

 

출처: https://www.whatwant.com

 

이와는 다르게, 만약 아이템을 조각내서 가방에 담을 수 있다고 하면 어떻게 될까?

그러면 개별 단가가 가장 비싼 것들로 정렬해서 그냥 그렇게 넣으면 된다.

담을 수 있는 무게와 딱 떨어지지 않을 경우에는 조각내면 된다.

모든 조합을 고려할 필요가 없는 것이다.

 

예시를 들어보자.

 

출처: https://www.whatwant.com

 

⒜와 같이 상황이 주어졌다고 해보자.

배낭은 담을 수 있는 무게의 한계가 있다.

 

⒝는 Dynamic Programming 방식으로 해답을 찾아보는 것이다. 모든 조합을 검토하는 것이다.

 

⒞는 Greedy Algorithm 방식이다. 무게당 단가를 계산해서 가장 비싼 것들부터 넣기 시작하다가

무게 제한에 걸리는 시점에는 해당 아이템을 잘라내서 무게에 맞추면 되는 것이다.

 

확실히 문제의 유형이 다르다!!!

반응형

출처: https://www.whatwant.com

 

이번에 살펴볼 Dynamin Programming 알고리즘은

Matrix-Chain Multiplication (연쇄 행렬 곱셈)이다.

 

[Background]

우선 알아야할 내용은 바로 "행렬 곱" 규칙이다.

 

 

'행렬 곱'을 하기 위해서는 앞 행렬의 column 길이와 뒤 행렬의 row 길이가 같아야 한다.

그러면, 앞 행렬의 row 와 뒤 행렬의 column 길이만큼의 결과가 나온다.

 

두번째로 알아야할 내용은 행렬 곱에서 '결합 법칙'이 성립한다는 것이다.

 

 

그런데, 여기에서 우리가 주의깊게 살펴봐야할 사실이 하나 등장한다.

 

행렬 곱에서 결합을 어떻게 하는지에 따라 계산 횟수가 달라진다는 것이다.

 

 

위의 예시와 같이 3개의 행렬이 주어졌을 때,

계산 횟수를 살펴보면 10배의 차이가 발생한다는 것을 알 수 있다.

 

 

[Problem]

그러면 우리가 여기에서 해결하고자 하는 문제가 무엇일까?

 

 

곱셈을 해야하는 여러 행렬이 순서대로 주어졌을 때,

어떻게 결합을 해야 전체 계산 횟수를 최소화 할 수 있을지를 찾아내는 것이다.

 

 

[Brute force approach]

일단 무식하게 살펴보자.

 

 

총 4개의 행렬이 주어졌을 때, 총 5가지의 묶음 방법이 존재한다.

 

이를 분류해보면

앞에서부터 1개 묶음을 하면 총 2종의 결합 방법이 존재하고

2개 묶음을 하면 1종,

3개 묶음을 하면 2종의 결합 방법이 있기에 총 5종의 결합 방법이 있게 된다.

 

이 과정을 공식으로 살펴보면 다음과 같다.

 

 

공식을 유도하고 분석하는 것은 생략하도록 하겠다.

 

그런데, 이를 Asymptotic 하게 생각해보면, 다음과 같다.

 

 

마찬가지로 계산식 유도 및 분석은 생략하고.... 결론적으로 엄청난 경우의 수가 나오기에...

이렇게 문제를 푸는 것은 말이 안됨! ^^

 

[Solution]

똑똑하게 문제를 풀어보자.

 

 

지금까지 살펴본 내용을 공식화한 것으로 생각하면 된다.

위 공식을 가지고 직접 손으로 계산을 해보자.

 

행렬에 따라서 row와 column은 다음과 같이 살펴볼 수 있다.

 

 

왜 이렇게 표현이 되는지 이해가 안되면 안된다.

앞에서 충분히 살펴본 내용을 곰곰히 생각해보면 된다.

 

예시를 하나 들어보자.

행렬이 6개가 주어졌다고 했을 때, p값이 다음과  같이 제시 되었다고 해보자.

 

 

이 문제를 풀기 위해 우리는 m, s 행렬을 작성해야 한다.

 

 

왜 이렇게 하는지는 문제를 풀어보면서 알아보자.

 

 

위 공식을 살펴보면 알겠지만,

i=j 조건에서는 모두 0 값을 갖게 되고 i보다 j는 항상 커야 되기 때문에 표의 아랫부분은 계산하지 않아도 된다.

 

 

m[1][2] 값부터 계산해보면 위와 같이 정리해볼 수 있다.

k값은 ( i ≤ k < j ) 조건이므로 ( 1 ≤ k < 2 )와 같고, 그렇기 때문에 k값은 1밖에 갖을 수 없다.

 

s 행렬의 s[1][2] 값은 k값이 1이므로 1값을 작성하면 된다.

 

이런식으로 m[2][3], m[3][4], m[4][5], m[5][6] 부분을 채울 수 있다.

 

 

이번에는 m[1][3]을 계산해보자.

 

앞에서와 달리 k값은 ( 1 ≤ k < 3 )이므로, k값은 1, 2 의 2가지 경우가 있을 수 있다.

그러므로, 최종 결과가 2개 나오고, 그 중에서 min 값을 선택하면 된다.

 

k값이 1인 경우를 선택했으므로 s[1][3] 위치에는 1을 작성하면 된다.

 

 

하나씩 하나씩 이렇게 채워나가면 된다.

 

전부 채우면 다음과 같다.

 

 

끝~

 

[Pseudo Code]

이 과정을 가지고 pseudo code로 만들어보자.

 

 

이렇게 만들어진 결과물을 출력하기 위한 code는 다음과 같다.

 

 

[Time & Space]

time complexity 와 memory space를 계산해보면 다음과 같다.

 

먼저 Time Complexity를 살펴보자.

 

 

무려 n의 3승 이다.

 

메모리 공간을 계산해보면 다음과 같다.

 

 

알고리즘을 위해 추가로 사용하는 메모리는 m, s 배열이 필요하다.

Asymptotic 하게 해보면.... 결국은 n의 제곱만큼의 공간을 필요로 한다.

 

반응형

+ Recent posts