알고리즘 먼데이 챌린지
import sys
input = sys.stdin.readline
for _ in range(5):
k = input()
a = sum(map(int, k[0:7:2]))
for i in k[1:7:2]:
if int(i): a *= int(i)
print(a % 10)
import sys
input = sys.stdin.readline
n = int(input())
s = input()
a2n = {chr(i+97):i for i in range(26)}
n2a = {j:i for i, j in a2n.items()}
ans = []
for i in range(0, n, 2):
tmp = a2n[s[i]]
tmp = (tmp + int(s[i+1]) ** 2) % 26
ans.append(n2a[tmp])
print(''.join(ans))
import sys
input = sys.stdin.readline
n, l = map(int, input().split())
meta = [[0] * 1000 for _ in range(1000)]
ans = 0
for _ in range(n):
tmp = [*map(int, input().split())]
for j in range(tmp[0], tmp[2]):
for k in range(tmp[1], tmp[3]):
meta[j][k] += 1
# print(*meta, sep='\n')
ans = 0
for i in meta:
for j in i:
if j == l: ans += 1
print(ans)
3번을 풀지 못 했다. 이게 내가 이해력이 처참한 건지 또 예시가 정확하게 무슨 말을 하는 건지 캐치가 안 되더라고. 문제는 대충 구현류의 문제라고 생각했는데, 문제 이해가 일단 안 되니까 귀찮아서 그냥 손을 놨다.
4번 문제는 내 풀이로 답은 나오지만 시간 초과가 뜨게 된다. 아무래도 다른 방법을 강구해야 할 것 같은데, 마땅히 생각나는 것이 없어서 포기. 들어올 수 있는 생물종의 종류가 10만 개라는 것이 아무래도 가장 시간을 뺏는 요소인 것 같다. 영역이 전부 직사각형 모양이니까 이를 통해 무언가를 할 수 있지 않을까?
데일리 스크럼
주말에 무얼 했는지. 오늘까지 동료 평가와 랩업 리포트를 써야해서 다들 문서 작성에 주력하는 듯. 4명이 된 탓에 한 명이 모더레이터를 한번 더 해야했고, 정!당!한! 방법에 의해 나는 수요일 한번만 하게 됐다.
AI 서비스 개발 기초
필요한 기반 기술들. 이후에 다시 마주치는 강의들이 될 것. streamlit. 나는 처음에 이번 주차가 쉬어가는 느낌일 것이라 생각했는데, 지금 보니까 전혀 그렇지 않은..
변성윤 마스터님의 MLOps 전반적인 기술들에 대한 강의! ai 엔지니어로 가져야할 많은 기술들.
이 강의를 통해 큰 그림을 캐치하고, 능동적 자세를 가지고 지속적 개선을 이룰 수 있으면 좋을 것. 이러한 목표를 두고 왜?라는 질문 을 던지고 이를 계속 찾아나가는 그러한 기본소양을 함양하는 것이 베스트.
학습 방식에 대한 가이드라인. 강의는 1회만 듣고, 흐름 위주로 키워드 필기하라. 왜 이걸 공부하는지에 대해 고민하고 그 흐름을 잘 기억하라. 추가적으로 자료를 찾으며 공부하라. 복습할 때는 강의 자료에 정리가 잘 돼있으니 강의 자료를 적극적으로 활용하라. 꼭! 자신의 언어로 다시 정리하라!
MLOps
모델 개발 프로세스! 보통 자신의 컴퓨터에서 고정된 데이터를 통해 학습을 진행할 것이다. 즉 오프라인의 데이터. 그리고이것을 현실 세계에 서빙하는 과정이 필요하다. 그래서 끝에 온라인 환경에 deploy 과정이 추가된다. 모델이 배포된 이후. 지속적으로 확인이 필요함. 가령 이상한 결과값이 나오면? 인풋값이 이상할 수도, 모델의 성능이 계속 변경될 수도. 새로운 모델을 사용하게 될 수도 있다. 이런저런 다양한 이슈들이 존재한다!
이렇게 ai에는 모델링 말고도 다양한 영역이 존재한다.
MLOps란? 머신러닝 모델을 운영하며 반복적으로 필요한 업무를 자동화시키는 과정! 머신러닝 라이프 사이클 전반에 개입된다.
모델을 만들면 그것이 온라인에서 잘 작동해야만 한다. 모델이 어떤 리스크 있는 환경이든 잘 작동할 수 있게, 혹은 그 환경을 모델에 맞춰주는 것. 이런 것도 MLOps의 영역.
우리는 대체로 오른쪽을 최종으로 노리고 있다.
MLOps는 어떻게 공부하나? 주된 방법은 각 요소에서 해결해야할 문제를 찾아서 그것에 대한 방법론을 배우고 그것을 활용하는 식으로 하는 것이 좋다. 완전 춘추전국시대로 쓸 것도 많고 분야도 넓기 때문.
그렇다면 그 요소를 배워보자.
예시가 직관적인 편. 집에서 타코를 만드는 것, 가게를 열어 타코를 만들어 파는 것. 명백히 준비할 것도 다르고 생각할 것도 다르다. 쓰는 도구도 다르다!
가게의 자리에 해당하는 것.
서빙의 라이브러리도 다양하다. 어떤 목적을 가지는지, 어떤 방향으로 하는지에 따라 서빙의 방식도 다양하게 하면 좋다!
집에서 만들 때 다양한 시행착오를 겪을 것이다. 모델링을 다양하게 한다던가, 실험하는 것. 이를 통해 베스트 레시피를 만들게 될 것이다. 베스트 모델. 이 모델의 샘플을 따로 저장하거나 모형을 만들어 가게에서 활용할 수 있다.
또한 이런 것들을 다 기록할 수도 있다. 로깅!
나중에 이를 통해서 새로운 모델을 만들 수도 있겠지.
이렇게 실험과 모델 관리를 도와주는 툴이 있다. 대표적으로는 mlflow.
가게가 성장해서 한 메뉴가 아니라 다양한 메뉴를 만들게 된다. 그럼 각 메뉴가 공유하는 반죽이나 소스 등의 재료가 있을 것이다. 그렇다면 이런 것들은 미리 만들어 냉장고에 넣으면 편할 것이다. feature store. 데이터 전처리 시간을 줄일 수 있다. 정형 데이터에 대해서는 잘 되어 있지만 아직 완전히 상용화되지는 않았다고.
집에서도 가게에서도 같은 냉장고를 쓰면 균일한 재료를 쓸 수 있으니 도움이 될 것이다.
FEAST. 관련 라이브러리는 얼마 없다고 한다.
처음 만들 적의 재료와 현재 재료는 정말 같은가? 데이터에 대한 검증이 필요하다. 서빙 과정에서는 계속 변화가 발생하니까.
계속 학습을 시켜줘야 성능을 유지할 수 있다는 것. 관련 라이브러리는 얼마 없다. TFDV.
각종의 이유로 아예 새 재료로 다시 만들어야하는 경우도 있다. continuous training이 필요하다.
장차 자동화도 시킬 수 있다. AutoML.
이제 정리해보자. 머신러닝 모델을 운영하면서 신경써야 하는 부분들. 위에서 제시된 다양한 요소가 있다.
이 중에서 인프라와 서빙에 대해 깊게 다룰 예정.
Model Serving
서빙이란? 모델을 배포하는 것. 모델을 개발한 후에 현실에서 사용할 수 있게 만드는 행위. 서비스화라고도 함.
온라인, 배치 두 종류가 있다.
개념 차이를 먼저 잡자. 배치 서빙에는 inference 개념이 들어가있다는 것을 기억할 것.
온라인 서빙을 알아보자. 흔히 웹 서버에서 이뤄지는 것. 서버는 클라의 다양한 요청을 처리하는 역할을 한다. 이런 상황에서의 서빙은 요청이 들어올 때마다 이뤄진다.
요청이 올 때마다 실시간으로 예측. 모델의 단위가 커지면 모델 서버와 전처리 서버가 분리되기도 한다.
온라인 서빙은 이런 3가지 정도의 방법이 있다. flask와 fastapi를 써서 직접 서버를 구축하거나! AWS, GCP 같은 클라우드 서비스를 이용하거나(비용 문제가 좀 있음). 아니면 서빙 라이브러리! 직접 서버 구축은 서버에 대한 이해가 없으면 어렵다. 다만 추상화된 패턴으 제공하는 라이브러리를 통해 도움을 받을 수 있는 것. BentoML이 예시.
다양한 방법을 각자 상황에 맞춰 하면 된다. 다만 익히는 것은 클라우드를 시작으로 하고, 이후 직접 구축, 이후 서빙 라이브러리를 써보는 것을 추천한다!
왜 처음부터 서빙 라이브러리를 쓰지 않는가? 툴 자체 학습보다 점진적으로 문제를 인식하고 해결하는 과정을 겪게 하기 위해. 새로운 툴은 계속 나오니 하나에 종속되면 안 된다. 그럴수록 로우레벨을 더 익힐 필요가 있다.
온라인 서빙에서 무엇을 고려해야할까? 의존성. 보통 환경을 맞추는 도커 같은 것을 많이 활용한다. 레이턴시(지연시간). 모델 경량화 같은 방법을 사용하기도 한다.
결과 보정, 즉 후처리를 하는 코드가 필요하기도 하다.
이제 배치 서빙으로 넘어가자.
한번에 많은 인풋을 받고, 한번에 출력을 한다. 보통 시간 단위를 통해 배치를 나눈다. 주기적으로 학습과 예측을 하게 된다.
이와 관련된 라이브러리가 따로 있지는 않다. 그냥 메인 파일을 특정 시간마다 실행하는 식으로. 이때 워크 플로우 스케쥴러를 활용한다고 한다.
학습과 예측을 별도로 할 수 있다.
배치 서빙은 실시간이 필요없는 대부분의 방식에서 활용된다. 온라인 서빙보다 간단하고 지연시간 문제가 없다.
당연히 실시간 활용은 안 된다. 또 콜드스타트 문제도 생길 수도 있다. 단위 시간 내에는 추가되는 것들을 바로 추천할 수는 없다던가.
주간 추천 프로그램은 일주일마다 돌면 된다.
온라인과 배치의 선택 기준. 데이터가 하나씩 들어온다면 대체로 온라인으로 해야한다. 출력관련으로 생각할 수도 있다. 바로 결과를 반환해야하거나 통신이 필요한 케이스는 온라인.
항상 모든 걸 온라인으로 해야하는 것은 아니다. 실시간으로 모델의 결과가 활용되지 않는다면 배치를 써도 된다.
Rules of Machine Learning: Best Practices for ML Engineering
링크 강의에서 과제로서 정리하라고 준 글. 한글 번역이 있는데, 완벽하지는 않은 듯. mining을 광산이라고 표현해버리면.. 그래서 나도 대충 이해가는 대로만 적었다.
개념 정의를 잘 알고 있어야 이해가 쉽기 마련이다.
해결해야 하는 문제의 대부분은 엔지니어링을 잘하여 해결할 수 있다. 무엇을 고려하는 것이 좋을까? 관련하 43가지 규칙을 제시한다.
- 머신러닝 적용 이전. 머신러닝은 항상 데이터가 필요하다. 그래서 초창기에는 적용하는 것이 어렵다.
- 머신러닝 적용 전에 많은 것을 추적하라. 측정항목 계측을 염두해야 한다.
- 코드를 많이 넣는 것보다는 머신러닝을 택하라. k-donggun 쓰지마라.. 그래야 업데이트와 유지 관리가 쉽다.
- 여기부터는 머신러닝 적용 시점. 파이프라인 모델을 단순히 하고 인프라를 적절하게 유지하라. 전체적인 틀을 잡는 게 중요하다. 특성이 학습에 잘 들어가고, 모델이 가중치를 잘 학습하고, 특성이 서버에 잘 들어간다면 성공적인 것. 이 간단한 모델이 이후 복잡한 모델 테스트를 위한 기준 동작을 제시한다.
- 머신러닝과 별개로 인프라를 테스트하라. 가령 알고리즘에서 들어가야 하는 필드가 제대로 들어가는지, 채워져 있는지. 테스트 환경과 서빙 환경의 차이 파악.
- 기존에 있는 파이프라인을 사용할 때는 데이터가 남아있지 않도록 유의하라. 사용하는 곳에 알맞게 데이터를 처리해야한다.
- 휴리스틱(직관적으로 문제 해결하는 방식, 코드 k-donggun..) 접근을 머신러닝으로 바꿀 수 있는지 확인하라. 적절한 상승 효과가 생긴다. 그럼 휴리스틱 아예 쓰지 말라? 아니다. 전처리나 특성을 만드는 것, 학습에 넣을 원시 입력이나 라벨 수정은 휴리스틱도 효과적이다.
- 시스템의 최신 요구사항을 파악하라. 모델의 업데이트가 어떤 영향력을 가지는지 파악하라.
- 모델 서빙 이전에 문제를 감지하라.
- 자동 실패를 관찰하라. 잘 돌아가는 것 같은데 막상 안 속에서 원하지 않은 방향으로 나아갈지도 모르기에 수동으로도 확인을 해야 한다.
- 특성 열이 많아질수록 헷갈린다. 문서나 소유자를 명시하고 부여하라.
- 어떤 목표를 최적화하려는지 지나치게 고민 말라. 초반에는 다양한 변화가 생기기 마련이다. 물론 나중에는 더 명확해야 함.
- 첫 목표에 대해 간단하고 관찰되는 측정항목을 선택하라. 목표는 측정이 용이해야 한다. 또 간접 효과를 목표로 하지 말라. 나중에는 좋을 수도 있다.
- 해석이 가능한 모델로 하는 게 디버깅하기도 좋다. 그렇다면 피드백도 한결 쉽다.
- 데이터 관련하여 품질이나 스팸을 필터링하는 것은 중요하다.
- 여기부터는 특성추출. 출시와 업데이트를 계획하라
- 학습된 특성보다는 직접 관찰된 특성부터 시작하라. 함정을 피하라는 것이다.
- 다양한 맥락에서 컨텐츠의 특성을 탐색하라(이해가 잘..)
- 가능하면 매우 구체적인 특성을 사용하라.
- 기존 특성을 조합해 사람이 이해할 수 있게 특성을 새로이 생성하라. 이산화와 교차를 사용할 수 있다.
- 선형 모델에서의 가중치는 데이터의 양에 비례한다.
- 사용하지 않는 특성을 정리하라.
- 피드백 시, 실제 유저와 테스트하는 사람이 다를 수 있다는 것을 유의하라.
- 모델 간의 델타를 측정하라.
- 모델 선택 시 예측력보다 실용적 성능을 따져라.
- 측정된 오류에서 패턴을 찾아 새 특성을 생성하라.
- 관찰된 바람직하지 않은 동작에 신경써봐라. 얼마나 되는지.
- 단기적 행동 중에선 단기로 끝나는 것도 있다.
- 서빙 시 사용된 특성을 저장하고 로깅하라.
- 파일이 많아진다고 임의 삭제는 금물.
- 서빙 시에 데이터 조작을 하지 않도록 유의.
- 가능하면 학습 때와 서빙 때 코드를 재사용하라.
- 일반화를 고려해야 한다.
- 샘플링 편향을 주의해야 한다. 필터링을 희생해야 할 때도 있다.
- 순위 문제에서 발생하는 편향을 주의하라.
- 위치 특성이 있는 피드백 루프를 방지하라.
- 학습과 검증 데이터 간의 편향이 있을 수 있다.
- 더 정교하게. 일치하지 않는 목표가 문제가 될 시. 경우에 따라 목표를 변경하라.
- 장기적인 목표는 이익 창출. 당장 눈 앞의 결과에만 집착 말라.
- 앙상블은 단순하게 하라.
- 실적 개선이 필요하다면 질적으로 새로운 정보 출처를 찾으라.
- 다양성이나 맞춤 설정은 인기도와 관련이 낮을 수도 있다.
- 친구끼리는 비슷한 경향이 있다.
... 정리가 잘 된 것인지 모르겠다. 영어로 읽으면 너무 오래 걸릴 것 같고, 한글로 읽으니 번역이 중간중간 이상한 것 같다. 일단 이 정도로 끝내고, 더 익숙해지는 시간을 가져보자.
피어세션
금요일에 다하지 못한 깃 정리 마저! 하는데 2시간이 걸렸다! 내 서버의 저장소에 있는 게 도대체 무슨 구조로 돼있는 건지 풀을 해도 원격 저장소 그대로 되지도 않고 그래서 한참 손대려고 노력하다가 결국 포기했다. 그러고 희원님이 나선 후부터 일사천리로 진행되고 마무리.. 확실히 희원님은 에이스이긴 하다. 나도 뭔가 자연스럽다는 듯이 슥슥 하고 싶은데 아직 영 익숙치 않은 것 같다.. 아무튼 어떻게든 잘 마무리한 것 같아서 다행이다. 사실 조금 더 남았을 수도 있지만.. 일단 여기까지.
팀 미팅
오늘은 팀미팅이 꽤 많았다. 스터디가 결성되고, 레벨 2 팀과 미팅하고. 조금은 혼자 공부할 시간이 사라졌지만, 그만큼 네트워킹하는 것이 중요하다고 생각하고 있어서 조금도 아깝지 않다. 앞으로도 좋은 인연들과 좋은 관계로 함께 성장해나가는 게 내 목표 중 하나다.
회고 및 다짐
이번 주 생각보다 해야 할 게 많아서 놀랐다. 조금도 쉬어가는 주간이 아니었다.. 그러면 뭐 달라질 것 있나, 더 박차를 가해야지. 저번 주의 프로젝트는 정말 재밌었다. 한편으로 또 아직 부족한 것도 많다는 것을 많이 느낀 나날들이었다. 더 성장하지 않으면 안 된다는 의지가 불타올랐고, 아직 그 마음은 절실하니 이제 몸소 보여야만 한다. 나를 더더욱 절제하고 구속시켜서 연마해야지!
오늘 생각보다 강의를 많이 듣지 못 했는데, 내일은 더 열심히 하자. 당장 해야 할 게 산더미니 안심할 수 없다.
'일지 > 네부캠 AI 4기(22.09.19~23.02.14)' 카테고리의 다른 글
20221109수-6~7,미션 (2) | 2022.11.10 |
---|---|
20221108화-4~5, 살아남기 (2) | 2022.11.08 |
20221104금-Pstage발표,랩업 (2) | 2022.11.05 |
20221103목-Last of Pstage (2) | 2022.11.03 |
20221102수-10th of Pstage (4) | 2022.11.03 |