지원을 하다보면 자신감이 드는 부분도 있지만, 아직은 부족한 점이 많다고 느낀다.
게다가 파이썬 개발자 환경이 다각화된 탓에, 해보고 싶은 게 많고 부족한게 많다고 느낀다.
프로젝트는 8월에 끝났지만 계속 마음속에 남았던 airflow 구축 이야기를 해보고자 한다.
다소 그림보다 글이 많을 수 있으니 관심이 없으면 보기 힘들듯.. 하하
🤔 해야 하는 것
Airflow를 도입하게 된 이유는 다음과 같다. (위가 중요하다)
- 그냥 해보고 싶어서: 저번에 쿠키를 추가하면서 로드밸런서를 구축하고.. https를 추가하는 작업은 정말 재밌었다. CI/CD도 재밌다는 것을 알게 되었고, airflow도 도전해보고 재미를 얻고 싶었다.
- 최신 곡 추가: 흔히들 프로젝트는 포폴 용도로 쓰고 버린다. 바로 애정이 없어서 그런 것 아닐까? 이 프로젝트는 적어도 도메인이 살아있는 1년 동안은 지속적으로 최신 정보를 업데이트 하면서 살아 숨쉬게 만들고 싶다.
- 더 많은 이미지 추가: 위와 같은 이유
- 유저에게 받은 피드백 반영: 솔직히 말해서 모델 성능이 그렇게 좋지는 않다. 그래서 피드백을 받은 것이고, 받았으니 이를 활용해야 한다.
사실 모두 만족시킬 수는 없다. (4번은 좀...)
🧭 대략적인 구성도
모델은 상황 / 분위기 / 날씨로 구분되어 있기 때문에 전처리랑 튜닝을 각각 해줘야 한다.
🖥️ 사용할 코드들
이미지니 크롤러: 크롤러는 이미 잘 준비되어 있다. DB 연동도 되고 필요시 csv 덤핑까지 해준다.
ml 프로젝트: 좀 수정해야 할 필요가 있지만 아무튼 다 전처리 / 파인튜닝 / 인덱스가 준비되어 있다.
https://github.com/Recdol/Imgenie/tree/3eb4201430dfb469cd48240969e600cc5fca35c8/ml
🧩 서버 구축 / 배포 전략
서버는 gcp에서 제공하는 airflow 서비스를 이용해도 좋지만, 우리 프로젝트는 0원으로 운영하는 아주 짠돌이 마인드가 운영 철학이라서 직접 서버를 GCE에 띄울 것이다.
DB는 그대로 MongoDB Altas를 사용하고, ml이 있지만, 저렴이 cpu로 이 모든걸 실행하게 할 예정이다.
환경설정이 복잡하니 도커로 띄울 생각이다.
파이프라인은 월에 1번 실행하게 할 것이다.
⚙️ 프로젝트 구조
프로젝트가 좀 커서 일부는 잘라냈다. 대충 요약하면 아래와 같다. 아래는 너무 기니까 다 안보겠지?
ml 데이터는 허깅 페이스 레포지토리에서 관리해서 dataset이랑 index, finetun은 clone해온것이다.
- data
- crawler: 크롤링된 플레이리스트 csv
- dataset: 전처리된 플레이리스트 dataset (dummy는 테스트 용이다) (hf)
- process: 전처리시 필요한 태그 정보 / 이미지 템플릿 / 전처리된 임시 데이터 셋
- finetune: 파인튜닝된 모델 (hf)
- indexing: 인덱스 파일 (hf)
- genie_crawler: 지니 크롤러 프로젝트
- ml: 전처리 / 파인튜닝 / 인덱스 프로젝트
.
├── config
├── dags
│ ├── 테스트용 dag
│ └── 진짜 실행 dag
├── data
│ ├── crawler
│ ├── dataset
│ │ ├── mood
│ │ │ ├── dummy_upsplash
│ │ │ ├── playlist
│ │ │ ├── playlist_dummy
│ │ │ └── unsplash
│ │ ├── sit
│ │ │ ├── dummy_upsplash
│ │ │ ├── playlist
│ │ │ ├── playlist_dummy
│ │ │ └── unsplash
│ │ └── weather
│ │ ├── dummy_upsplash
│ │ ├── playlist
│ │ ├── playlist_dummy
│ │ └── unsplash
│ ├── finetune
│ │ └── output
│ │ ├── mood
│ │ │ └── mood_huggingface
│ │ ├── sit
│ │ │ └── sit_huggingface
│ │ └── weather
│ │ └── weather_huggingface
│ ├── indexing
│ │ └── output
│ │ ├── mood
│ │ │ └── mood_dataset
│ │ ├── sit
│ │ │ └── sit_dataset
│ │ └── weather
│ │ └── weather_dataset
│ └── preprocess
│ ├── output
│ │ ├── mood_dataset
│ │ │ ├── playlist
│ │ │ └── playlist_dummy
│ │ ├── sit_dataset
│ │ │ ├── playlist
│ │ │ └── playlist_dummy
│ │ └── weather_dataset
│ │ ├── playlist
│ │ └── playlist_dummy
│ └── template
├── genie_crawler
└── ml
├── configs
│ ├── finetune
│ │ ├── data
│ │ ├── model
│ │ ├── path
│ │ ├── trainer
│ │ └── wandb
│ ├── indexing
│ └── preprocessing
사실 데이터가 다양해서 어떻게 관리할지 고민이 많이 됬었다.
이를 태스크 단위로 결과값을 data/{task} 에 넣기로 했고, 여러 테스크에서 필요한 dataset은 따로 분리했다.
😵💫 개발하면서 생긴 문제들
개발하면서 여러 문제에 부딪혔다. 여러개의 프로젝트를 airflow 프로젝트에 넣으려고 하다보니 생긴 문제다.
너무 오래 걸림 -> 더미 데이터 셋 활용
데이터셋이 그렇게 크지는 않지만, 아무래도 cpu를 쓰기 때문인지 전체 러닝 시간이 5시간 정도가 걸렸다.
그래서 더미 데이터 셋을 도입했고, 시간을 1~2시간으로 줄일 수 있었다. (이것도 문제긴 한데..)
데이터 용량 문제
원래 활용하고 있던 데이터 셋은 2개가 있었는데, 용량이 참 컸다.
playlists_0709랑 selected_playlist_0714였는데, 두개를 concat해서 사용하는 구조였다.
두 파일은 기간이 달라서 합치면 ~ 0709 + 0710 ~ 0714로 7월 14일까지의 데이터를 구한것이다.
근데 용량이 좀 컸다. playlists_0709가 경량화가 되기 전 데이터 파일이였기 때문이다. (원본사진이 들어 있음)
이 이유 포함해서 이런저런 이유로 아래와 playlists 파일 하나에 모든 데이터 셋을 저장했다.
- 날짜를 지움: git을 활용하기 때문에 파일 이름으로 버전 관리를 할 이유가 별로 없다고 판단했다.
- 파일을 하나로 합침: 크롤링 한 후, 전체 데이터를 csv로 덤핑한 후 데이터 셋을 만들기 때문에 나눌 필요가 없다. (데이터가 엄청 큰게 아니라서 나누는 게 더 관리하기 힘들다)
- 경량화: playlists_0709는 이전에 경량화가 도입되기 전의 데이터 셋이다. 이 파일을 경량화 버전으로 교체해야 한다고 생각했다.
poetry 모듈 설치 문제
airflow를 설치하고 여러 모듈을 설치하는데 특히 faiss에서 충돌 문제가 자꾸 발생했다. 이를 해결하기 위해 poetry를 도입했고, 말끔히 해결되었다. (비록 faiss는 pip로 설치 할것을 권장하지만, 잘 안되는걸 어떡해~)
그랬더니.. airflow프로젝트를 도커 이미지로 만들때 문제가 생겼다.
poetry를 전역으로 설치하기가 좀 까다로웠다.
전역으로 하지 않아도 파이썬 가상 환경 설정이 잘 실행이 안되는 듯 했다.
더 쉬운 방법을 찾고자 했고, poetry export 명령어를 이용해 requirements.txt를 만들어서 pip로 설치했다.
PermissionError: [Errno 13] Permission denied: 'git'
data/datasets은 git 프로젝트 파일로 되어 있다. (이런저런 이유로 그냥 datasets.load_dataset할 수는 없다)
데이터를 가져와서 사용하기 전에 한번 pull을 하는데, 이곳에서 아래와 같은 오류가 발생했다.
git 레포의 권한문제인가 싶었지만 전혀 아니였고, 뭔가 git 명령어를 못쓰게 설정한것 같은 느낌이 들었지만~
루트로 설정해보니 그냥 git이 없다는 것이였다.
어찌보면 에어플로우 이미지가 당연히 git을 가지고 있지 않았겠지만.. 3시간 가까이 설치할 생각을 못했다.
Selenium 이 잘 안돼 ㅠㅠ
docker-compose를 도입하고 나서 부터 뭔가가 꼬이기 시작했다.
의존성 설치는 전부 다 했지만, selenium에 꼭 필요한 브라우저가 없는 것이다. chromium을 설치해도, google-chrome을 설치해도 시스템 설정 문제인지 자꾸 오류가 남발한다.
(아니 왜 chromium은 mium이고 selenium은 nium인 거지 헷갈리게)
크롤러는 다른 도커로 띄워야 할까? 찾아보니 크롤러 전용 도커 이미지가 있더라. 고민이 된다.
https://hub.docker.com/r/selenium/standalone-chrome
💬 마무리
아직도 에어플로우를 구축하지 못하고 있다... 다음에는 각 테스크를 별도의 환경으로 분리해볼까 생각중이다.
'프로그래밍 > 부스트캠프 AI' 카테고리의 다른 글
[IMGenie] 결과 페이지 추가와 카카오톡 공유하기 (0) | 2023.10.06 |
---|---|
[Imgenie] https와 쿠키를 도입했음 (0) | 2023.09.27 |
[Imgenie] 회고 (0) | 2023.08.28 |
[Movie Rec] S3Rec의 모듈화 시도 (0) | 2023.06.25 |
[DKT] Github Action 테스트 도입 (1) | 2023.05.20 |