20221110목-8,스페셜 미션
도커
도커는 나중에 쿠버네티스까지 확장된다. 도커는 가상화의 개념과 관련된다. 간혹 서버와 개발은 환경이 다를 수 있다. 그것을 편하게 맞추기 위해서 가상 환경을 필요로 한다. 같은 OS여도, 아니어도 환경이 다른 문제는 많이 발생한다. 그래서 계속 설정을 README에 기록하고 실행하도록 하는 게 좋다. 그렇게 사람이 직접 일일히 안 해도 되도록 하는 것이 가상환경을 구축하는 것이다. 서버 환경을 한번에 소프트웨어화하는 것.
도커는 소프트웨어 차원의 가상화. VM은 OS위에 OS를 실행시키는 것이라 굉장히 무겁다. 그러나 컨테이너 기술로 프로세스 개념의 차원에서 가상화를 진행할 수 있는 방법이 생겼고, 그것을 쉽게 해주는 것이 바로 도커이다.
도커는 이미지를 만들고, 그것으로 컨테이너를 실행한다. 이미지는 클래스, 컨테이너는 인스턴스 정도의 느낌이다.
이미지 하나만 있다면 동일한 환경의 컨테이너를 마구 만들 수 있게 된다!
도커를 사용하면 쉽게 환경을 구축할 수 있다. 나만 해도 별다른 어려움 없이 데비안을 설치한 적이 있다.
이게 컨테이너를 만드는 방식. 컨테이너 이름을 정하고, e로 환경변수 설정. d로 데몬모드. 이것은 백그라운드 실행 여부를 이야기한다. 창이 꺼져도 돌아가도록 만드는 것. p는 포트를 지정하는 것. 로컬의 포트와 컨테이너의 포트를 연결하는 과정이다. 보통 mysql은 3306으로 통신한다. 마지막에 사용하는 이미지가 적혀있다!
exec으로 도커 컨테이너 속에 접근할 수 있다. 이후에는 mysql을 사용하듯이 사용하면 되겠지!
도커에서 정말 기본적인 명령어들이니 잘 사용해보자. 많이 쓸수록 익숙해지기 마련이다.
volume mount. 컨테이너 내에서 무슨 짓을 해도 그것은 컨테이너 속 사정이다. 만약에 컨테이너 내의 파일을 유지하고 싶다면? 실제 우리 컴인 호스트와 컨테이너와 장소를 공유해야만 한다. 이때 V 옵션을 통해 폴더를 연결하는 과정을 거쳐주면 된다.
이거 없이 컨테이너 끄면 정말 다 날아가니까 꼭 유의하자. 깃은 돌릴 방법이 있지만, 이 놈은 진짜 없다.
나만의 이미지를 만드는 방법. 일단 세팅을 한 후에, pip --freeze > requirements.txt로 필요한 것들을 저장한다. 이후에는 도커 파일 만들기(이거 진짜 오랜만에 보네).
FROM에서 만들어질 기본적인 이미지를 지정한다.
COPY를 통해 현재 내 컴에 있는 파일을 컨테이너 내부 디렉에 복사한다.
WORKDIR 도커에 대한 명령어를 실행할 때 기준되는 디렉을 지정
ENV 컨테이너 속 환경변수 지정
RUN 실행! 기억 상으로는 이미지 만들어질 때 실행되던 거였던가.
CMD run으로 컨테이너 생성하자마자 실행될 커맨드 지정.
이제 이를 통해 docker build를 하면 도커파일을 통한 이미지가 생성된다.
EXPOSE 해도 아마 포트 지정을 하지 않으면 안 됐던 것으로 기억하는데, 오래 돼서 정말 가물가물이다.
아무래도 계속 써야 기억에 남는다..
미션 아이디어
내 모델은 속성을 고려한다. 그러니까 그 속성을 선택지로 준다면 충분히 괜찮은 예측을 할 수 있을 것으로 생각된다. 가령 먼저 유저 정보를 묻고, 그 후에는 책의 장르와 작가(상위 20만 선택지로, 나머지는 others)를 묻는 것이다. 이 과정은 사실 내 모델이 하는 일과는 다를지도 모른다. 내 모델은 결측된 값과 여타의 다른 속성들도 활용하니까. 하지만 서빙을 하는 것이니까, 그 서빙으로 진행하는 평점 예측이니까 어느 정도의 정보는 기입을 하는 게 더 자연스러운 것 같다.
각 정보를 유저가 입력하게 만들고, 그것을 토대로 평점을 예측하기.
1. 내 모델이 내가 제시한 정보만 기입하고 나머지를 결측이나 랜덤으로 채운 채로 돌아가는지.
2. catboost와 내 모델을 같이 써서 앙상블을 하는 것이 가능한지(한 값만 넣을 테니까)
3. 학습된 모델 자체를 저장하고, 로드하는 방법.
4. 내 생각대로 스트림릿에 적용하기.
역시 모델을 직접 다루는 일은 참 어렵다. 일단 동건 모델을 다시 돌려보려고 하는데 매번 데이터 전처리를 하는 초기 그 버전 그대로 남아있던 터라 그것을 수정하려고 했다. 괜히 짧게 할 수 있는 것을 2,3분 걸려가면서 할 필요가 없잖나.
그리 생각하고 이전에도 시도해서 잘 됐던, 지금은 주석 처리해둔 부분들을 풀었는데, 이번에는 문제가 발생하더라는 것. 몇 가지 문제들은 쉽게 손 볼 수 있었다. 주석처리 할 것과 안 할 것만 잘 구분하면 되니까. 내가 기억하기로 이전에도 같았다. 그런데 이번에는 사뭇 다른 문제가 터졌다.
터미널을 clear해서 사진이 남아있지 않지만, 데이터셋으로 만드는 과정에서 자료형에 대한 문제가 발생했다. 지금 생각해보면 아마 빈 값으로 들어가는 무언가가 있었을 것 같은데, 아무튼 그것 자체를 해결하는 게 더 시간이 많이 걸릴 것 같다는 생각이 들었고, 어쩔 수 없이 그냥 전처리하는데 시간 엄청 잡아먹는 초창기 모델 그대로 사용할 수밖에 없었다. 사실 어차피 최종 제출 때도 이 모델로 했던 지라 엄밀하게는 이게 맞는 방향이기는 하다..
모델의 predict는 이렇게 생겼다. 나는 예측을 진행할 때 들어가게 되는 값이 궁금해서 print를 찍었고,
그것을 토대로 한번 시험 삼아 한 값만을 넣어서 그것에 대해 예측을 진행하는 함수를 짜서 실행시켜봤다.
결과가 정상적으로 나오는 것을 확인할 수 있었다.
인풋으로 들어가게 되는 값은 유저id, isbn, 시, 주, 나라, 나이, 카테고리, 출판사, 언어, 저자의 순으로 10가지이다. 내 모델이 돌아가는 방향으로 정상적으로 돌아가기 위해서는 위의 값들을 전부 사이드바에서 조정이 가능해야만 한다.
일단 유저 id와 isbn은 조절할 수 있게 줄 수 있는 영역이 아닌 것 같다. 책 이름에 맞게 isbn을 전부 치환한다거나 그런 것은 가능하겠지만, 그것을 어떻게 전부 선택지로 주겠단 말인가? 오. 생각해보니 예측할 책 자체는 영화 추천에서 활용된 기법을 사용할 수 있을 것 같다. 내가 랜덤한 책을 제시하고 그 중에서 고르게 만드는 것이다. 오호.. 그렇다면 문제 접근이 생각보다 쉬워진다.
일단 원래 접근 방식에서 생각할 한 가지. 선택지는 범주를 잘 받게 할 수 있다 치자. fiction에 영어, 미국 뭐 이렇게 유저가 선택할 수 있게 한다고 쳐도 결국 그것을 라벨 인코딩하는 과정을 거쳐야 한다. 왜냐하면 내 모델이 그렇게 학습을 진행했기 때문이다.
자, 방금 생각한 아이디어를 조금만 더 발전시켜보자. 사실 방금 아이디어를 활용하면 모델을 이용하지 않아도 예측을 진행하는 것이 가능한 것 같다. 일단 사이드바에는 유저 정보를 넣게 한다. 사는 거주지와 나이. 그것을 토대로 유저를 특정하고, 그 후에 랜덤하게 책을 보여주면서 이 중에서 고르게 시키는 것이다. 이렇게 하면 쉽게 책의 isbn을 알 수 있다. 그리고 모델로 예측을 하면 된다.
더 편한 방법은? 자신이 어떤 유저인지 고르게 만든 후에 그냥 고를 수 있는 책 선택지를 학습셋이나 테스트셋에 있는 것들로만 한정시켜버린다.. 그러면 사실 모델 필요없이 완성된 csv파일만으로 평점을 내놓아줄 수 있다. 이건 그다지 예측이란 느낌이 들지 않으니 패스. 학습셋의 값을 그대로 뱉는 게 무슨 예측이냐.
처음 이 미션을 보면서 뇌리에 스쳤던 생각이 조금 구체화된 느낌이다. 그런데 일단 어떤 방법을 쓰더라도 라벨 인코딩된 값을 알아야한다는 것을 조금도 변함이 없다. 다른 분들이 괜히 원격 서버에 스트림릿을 적용하려고 한 게 아니구나. 나는 모델 pt 파일만 가져오면 될 것이라고 막연하게 생각하고 있었는데, 생각보다 조금 고려해야할 게 더 있다.
그럼 이제는 무얼 해야 하는가? 모델을 세이브앤 로드하는 법을 익히고, 인코딩된 값을 피클과 같은 형태로 저장하여 다시 꺼내 활용하는 것.
catboost와 동건 모델은 사용하는 데이터가 다르기 때문에 예측을 진행할 때도 데이터 처리방식이 달라진다. 이것을 하려면 할 수는 있을 것 같지만, 그것은 시간이 너무 오래 걸리는 일이 될 것 같다. 아무래도 나는 둘 중 하나를 선택해야만 할 것 같다. 음. 그렇다면 차라리 catboost가 낫지 않을까? 내가 알기로 catboost는 인코딩이 필요없이 그대로 값을 넣으면 되는 것으로 알고 있다.
캣부스트를 써보는 과정. 과연 라벨 인코딩 없어도 모델은 확실히 잘 돌아가는 모습을 보여주고 있다. 이번에 하는 미션이 서빙에 초점이 두어져있는 만큼, 전처리 부담이 적은 catboost만 활용하는 것이 좋다는 것이 내 생각이다. 동건 모델은 당장 하기에는 너무 망가져있어..
뭔가 이런 것을 쓰면 되지 않을까?
catboost 모델은 sub를 받고 있다.
그리고 그 녀석은 판다스의 데이터프레임 형태이다. 이놈을 적당히 저장해 불러와 테스트하는 과정을 거칠 필요가 있겠다. 이게 성공한다면, 이제 남은 것은 정말로 캣부스트의 학습된 모델을 내 로컬에 가져와서 서빙을 하는 것이다.
취업 특강
요즘 잘나가는 업스테이지의 러셀 님의 특강.
잘하는 사람에게 많이 배우라. 못하면 배우고, 잘하면 가르치면서 배우고. 그게 성장 학습 커뮤니티에서 이뤄져야 과정이다.
복습을 철저히 하라. 그냥 모델을 써보는 데에서 그치지 말고, 계속 분석하는 시간도 가져라
개인 프로젝트에서 끝내지 말고, 경진 대회를 적극적으로 나가보라.
매일 코딩 테스트 연습을 하라. 시간 내에 문제를 푸는 것은 항상 숙달이 돼야 한다.
취업의 여정
기업입장에서는 배우려고 오는 사람을 원하지는 않는다. 일하는 사람을 원할 뿐.
흠. 근데 이건 나로서는 아직 많이 생각하기 힘든 부분이다. 내가 가진 게 적어서 그런 것 같다.
추천도서!
피어세션
다들 미션을 하는 방법이 다르다. 아직 남아있는 ai 서버를 활용해서 과제를 하는 사람이 있는가하면, 영화 추천처럼 N개의 추천을 하고자 하는 사람도 있다. 다들 관점이 다르니 그렇다고 생각한다. 나는 이 과제에서 내가 가져가야 할 역량은 서빙을 해보는 경험이라고 생각해서 가급적 어떻게든 모델로 예측하는 것을 적용하는 방법만 알게 되면 이후에 스트림릿을 사용하는 방법에 초점을 맞추고 싶다.
9012번: 괄호 (acmicpc.net) 오늘의 문제는 이것. 나는 이전에 풀어본 적 있는 문제였는데, 그때 풀이가 잘 기억은 안 나서 그냥 다시 풀었다. 근데 이번에는 훨씬 더 pythonic하게 코드를 짠 느낌이다..ㅋㅋ 깔끔하면서도 작동 속도는 더 빠른 코드를 작성할 수 있었다.
다시 미션
역시 문제가 발생하지 않을 리가 없다.. 아무리 잘했다 생각해도 항상 문제는 발생하는 법이다. 역시 모델 세이브됐다고 바로 넘어가지 않길 잘했다.
근데 그러다가 어쩌다보니 또 됐다. 뭐 나 가지고 장난치냐! 정말 왜 됐는지 모르겠는데 아무튼 됐다.
아무튼 이제 할 일은 저렇게 모델을 저장하고 불러오면 된다는 것을 알았으니 그것을 그대로 내 로컬에 적용하는 것이다.
아니다. 그 이전에 들어갈 피쳐의 갯수를 조절할 필요가 있다. unnamed, continent는 충분히 줄일 만한 것 같다. 또한 유저가 유저 id를 알 수는 없기에 저것조차 없애고 진행해야만 한다. 심지어 rating도 들어있는데.. 물론 어차피 다 0값으로 들어있긴 하지만 왜 들어가 있는 거냐..?
일단 성공적으로 피쳐를 줄일 수 있었다. 예상했지만, 역시 유저 id가 없더라도 어느 정도 비슷하게 성능이 나온다. 내가 책 평점의 데이터를 계속 처리하면서 느꼈던 것은 이 데이터는 어떻게 해도 유의미하게 오차를 줄일 수 없다는 것. 막말로 그냥 전부 7점과 8점으로 매겨버려도 비슷한 지표를 얻게 될 것이다.
보다시피 필요한 피쳐들로 잘 예측을 내리고 있는 모습이다.
그러니 대충 따지자면 오늘 처음 생각했던 1~3에 대해 진행을 마친 것 같다.
기억해야 할 것! isbn, age, country, book_title, book_author, year of publication(int), publisher, language, category, summary, rating을 인자로 받는다. 이때 책에 대한 정보는 쉽게 얻어낼 수 있으니 그다지 걱정할 필요없고, rating은 0이다. 이제 알아야할 것은 age와 country이다. 이것만 넣어서 catboost를 돌리면 아무튼 예측은 진행할 수 있다는 것.
user_id를 쓰지 않기에 조금 석연찮은 구석이 있긴 하지만, 어차피 진정으로 일반화가 잘 된 모델이라면 id가 필요하지 않은 게 당연지사이기도 하니 넘어가도록 하자(사실 절대 당연지사가 아니다. 콜드 스타트와 데이터가 많은 유저는 구분되어야 한다).
값들을 다 날려먹기도 했고, 설정을 그다지 바꿔주지 않아서 그런지 확실히 성능이 떨어진 모습이 보이기는 하네..
일단은 이 정도로 만족하자구.
이제 확인해야할 것은 이것이 내 로컬에서도 정상적으로 돌아가는지의 여부이다. 아마 catboost만 깔아주면 될 것이라 생각하지만, 실제로 또 어떤지는 모르기에 신경쓸 필요가 있다.
그리고 이제 스트림릿을 어떻게 만들지를 구상해야만 한다.
이 자리에는 유저의 나이와 나라를 적는 칸이 들어가게 될 것이다. 유저의 나이는 위 처럼 드래그를 해서 하는 방식, 나라는 선택지를 고르는 방식으로 할 것이고, 상위 15개국만 가능하도록 하자.
업스테이지 강연
추천시스템에 관한 이야기.
암묵적 피드백을 활용하는 추천시스템. 대체로 클릭했나 안 했나 정도의 여부라 확실히 해석하기가 어렵다.
추천시스템의 문제. 인기편향은 두가지 방향에서 해석된다.
데이터 인기편향이 추천에 끼치는 영향.
인기도를 반영한 데이터. 학습을 진행하면 결국 인기 높은 아이템만 점수가 높게 나온다.
이를 해결하는 방법. 확인된 아이템에 대해서 규제를 걸어서 인기도가 지나치게 반영되지 않도록 한다. 인기도는 항상 규제하는 방향으로 해결책이 마련되고는 한다.
그러나 보통 작위적인 방향이 많다. 하지만 여기서 제시된 방법은 직관적이다.
NCF를 제외하고는 전부 효과적인 방법이었다.
그러나.. 애초에 관측 데이터가 적다면 큰 효과가 없다.
아무튼 추천시스템에서는 분명 인기 편향이 큰 문제이기 때문에 항상 주의깊게 바라봐야 한다.
음악추천. 여태의 추천은 선호를 따지지만, 비선호도 따져야 제대로 추천하지 않을까?
직접 데이터를 모아서 선호와 비선호 데이터를 확보함.
내 질문이 나오지 않아서 조금 아까웠다..
다시다시 미션..
내일 14시까지니 오늘 최대한 끝내야되는데.. 또 주변에서 일이 생기네. 안 된다 안되.
일단 사이드바를 건드리는 건 생각보다 어려운 일이 아니었다.
이렇게 state로, 페이지에 변화가 생길 때마다 초기화가 되지 않도록 session_state에 넣는 과정을 거쳐준다.
그 다음에는 이렇게 장난질하면 된다..! 공식 홈페이지인지 다양한 위젯들에 대해 잘 나와있기도 했고, 변성윤 마스터님의 강의에도 예시가 많이 제시되어 있어 편했다. 사실 인간인지, 성별이 뭔지는 쓰이지 않는데 그냥 연습 삼아 넣어봤다.
나이는 어렵지 않게 슬라이더를 넣었다. 나중에 함수를 한번 거쳐서 한 자릿수로 표준화를 해줄 것이다. 그리고 국가는 이렇게 10개의 선택지를 둘 것이다!
왜 10개냐 하면, 그게 편하잖냐.. 아니 뭐 모든 사이트에서 모든 국가 언어 지원해주는 것도 아닌데 뭐 대수냐 흥.
초반에는 이 코드가 제대로 돌아가지 않았다. 왜인지는 모르겠지만, selectbox는 value라는 인자를 받지 않더라고. 그렇지만 값이 변화하지 않기 때문에 큰 문제는 없는 것으로 보인다.
좋아좋아.. 처음에는 조금 겁이 났지만 각잡고 만져보자 싶으니까 뭔가 조금씩 되고 있다. 처음에 새로 내 csv파일을 불러오고 필요없는 컬럼은 삭제해주었다. 이제 랜덤한 20개 중에서 사용자가 고를 수 있도록 선택지를 부여할 것이다. 그 후 그것을 토대로 예측을 진행하면 되는 것이다!
현 시각 새벽 3시.. 막히고 있는 부분.
별 의미 없어 보이는 인자들을 다 제거했다가 전체적으로 다시 코드에 살을 붙여야 하게 생겼다... 에휴.. 근데 더 큰 문제가 무엇인가? 아직도 정확하게 작동하는 원리 파악이 안 됐다는 것이다. 대충은 알 것 같은데, 확실하게 모르니 확실하게 문제를 해결할 수가 없다. 지금 문제는 내가 책을 선택하기도 전에 페이지가 다음 단계로 넘어가는 것이다. 이것은 정말 sessionstate로 해결해야 하는 것 같은데..
일단 지금은 너무 능률이 떨어져서 자야 할 것 같다. 내일 다시 고민해보자. 내일이면 조금이라도 진전이 있을 것이다.