도메인 전문지식을 활용한 모델 설계
·
DL
"AI를 어디에 쓸까"로 시작한 프로젝트는 대체로 같은 길을 간다. 데이터를 모으고, 잘 알려진 모델을 얹고, 성능이 모자라면 모델을 키운다. 그런데 어떤 문제는 모델을 아무리 키워도 잘 안 풀리고, 어떤 문제는 질문을 한 번 바꾸는 것만으로 작은 모델에서도 풀린다.그 차이를 만드는 게 도메인 전문지식이다. 정확히 말하면 "이 분야의 전문가는 무엇을 보는가" 라는 질문이다. 전문가가 실제로 보는 것을 알아내면, 모델에 무엇을 넣어야 하는지도 어떤 구조가 맞는지도 따라 나온다.이 글은 적응적 센싱 편에서 이어진다.앞 글이 센서를 조절해 입력을 모델에 맞췄다면, 이 글은 한 발 더 나가서 문제 정의 자체를 도메인 지식으로 다시 짠다. 손대는 자리는 다르지만 목적은 같다 — 모델을 키우지 않고 푸는 법.수면의..
적응적 센싱
·
DL
시력이 나빠서 칠판이 안 보이는 학생에게 해 줄 조언은 둘 중 하나다. "흐릿한 글씨를 5,000개쯤 읽어서 눈을 단련해라" 또는 "안경을 맞춰라." 사람에게 이 질문을 하면 아무도 첫 번째를 고르지 않는다. 그런데 지난 몇 년간 AI가 분포 이동에 대응해 온 방식은 정확히 첫 번째였다. 낯선 입력이 두려우니 세상의 데이터를 미리 다 삼켜 두자는 것 — 그게 초거대 AI 전략의 정체다.이 글은 그 전략의 청구서를 먼저 계산하고, 두 번째 답인 적응적 센싱(adaptive sensing) 으로 넘어가는 정리다. 모델을 키우는 대신 카메라를 조절한다. 뇌를 재훈련하는 대신 감각기관 쪽 입력을 고친다.이 글은 테스트 타임 도메인 적응 편에서 이어진다.앞 글과 이 글은 같은 문제에 대한 정반대의 답이다. 문제는..
테스트 타임 도메인 적응
·
DL
모델을 다 만들고 나면 마지막에 검증 정확도를 확인한다. 97%가 나온다. 데이터를 잘 나눴고, 과적합도 없고, 학습 곡선도 깨끗하다. 그대로 배포한다.그리고 현장에서 68%가 나온다.코드는 그대로고 가중치도 그대로다. 바뀐 건 데이터뿐이다. 학습할 때는 스튜디오 조명 아래 선명한 사진이었는데, 현장에서 들어오는 건 저녁 무렵 흔들린 사진, 렌즈에 김이 서린 사진, 다른 회사 센서로 찍은 사진이다. 사람 눈에는 여전히 같은 대상이지만 모델이 보는 숫자의 분포는 다르다. 이 어긋남에 이름이 붙어 있다 — 분포 이동(distribution shift) 이다. 여기서 보통 떠올리는 답은 "현장 데이터를 모아서 라벨링하고 다시 학습한다"이다. 맞는 답이지만 비싸고 느리다. 라벨링에 몇 주가 걸리고, 그 사이에도..
온디바이스 AI와 정수연산 양자화
·
DL
가중치를 전부 INT8로 바꿨다. 파일 크기가 4분의 1이 됐다. 그런데 NPU가 달린 보드에 올려 보니 추론 시간이 거의 그대로다. 어떤 경우에는 오히려 느려진다. 그리고 에러 로그는 한 줄도 없다.이건 양자화를 잘못한 게 아니라 양자화를 절반만 한 것이다. 값을 정수로 바꾸는 일과 연산 과정을 정수로 바꾸는 일은 서로 다른 작업이고, 정수 전용 가속기가 요구하는 것은 후자다. 그리고 전자만 끝난 모델은 가속기에서 거부당하는 대신 조용히 CPU로 흘러간다. 실패가 실패처럼 보이지 않는다는 점이 이 문제를 어렵게 만든다.이 글은 리소스 효율적 AI 모델 편에서 이어진다. 그 글이 수 체계와 양자화의 기초를 다뤘다면, 이 글은 그렇게 만든 모델을 실제 가속기 위에 올렸을 때 생기는 문제를 다룬다.정리의 축..
리소스 효율적 AI 모델
·
DL
"이 모델은 4비트로 양자화되어 있습니다." 요즘 모델 카드에서 흔히 보는 문장이다. 그런데 4비트로 줄인다는 게 정확히 무슨 일인지는 잘 설명되지 않는다. 32비트짜리 실수 하나를 4비트로 바꾼다는 것은 무엇을 버리는 일인가. 버린 만큼 정말 빨라지는가. 가중치를 절반이나 0으로 만들었는데 왜 GPU에서는 속도가 그대로인가.이 질문들에 답하려면 결국 한 층 아래로 내려가야 한다. 컴퓨터가 실수를 어떻게 담는가, 그리고 그 표현에 따라 덧셈과 곱셈 중 무엇이 더 비싼가. 이 두 가지를 모르면 경량화 기법들은 그냥 이름의 나열로 남는다. 반대로 알고 나면 "왜 이 기법은 GPU에서 이득이 나고 저 기법은 전용 가속기가 필요한가"가 한 줄로 정리된다.이 글은 그 아래층을 깔기 위한 정리다. 이진 수 체계에서..
파이썬 스코프와 global
·
알면좋은것들
파이썬을 좀 쓰다 보면 반드시 한 번은 만나는 장면이 있다. 함수 안에서 밖의 변수를 읽는 것은 아무 문제 없이 되는데, 거기에 값을 넣으려는 순간 갑자기 에러가 난다. 그것도 "없는 변수"라는 이유로. 분명 위에 선언해 뒀는데 말이다.count = 0def add(): count = count + 1 # UnboundLocalError: cannot access local variable 'count'add()읽기만 하는 코드로 바꾸면 멀쩡히 돈다. 한 줄에 읽기와 쓰기가 같이 있을 뿐인데 왜 갑자기 없는 변수가 되는가. 이 질문에 답하려면 파이썬이 이름을 언제, 어떤 순서로 결정하는지를 알아야 한다.이 글은 그 규칙을 한 번에 정리한 것이다. 이름을 찾는 순서부터 시작해 global과 n..
트라이 완전정리
·
알고리즘/이론
검색창에 pyth까지만 쳤는데 python, pythonic, pytorch가 주르륵 떨어지는 화면을 매일 본다. 이걸 딕셔너리로 만들어 보려고 하면 곧바로 막힌다. "pyth" in words는 False고, 그렇다고 등록된 단어를 전부 훑으면서 startswith를 부르면 단어가 많아질수록 느려진다. 문제는 자료구조 선택이다. 해시는 "이 값이 있느냐"에 답하도록 만들어진 물건이라, "이 글자들로 시작하는 값이 있느냐"에는 원리상 답할 수 없다. 이 질문을 O(글자 수)에 답하려고 만든 것이 트라이다. 이 글은 트라이를 처음 쓰는 사람이 코딩 테스트에서 바로 꺼낼 수 있을 만큼만 정리한 것이다. 구조와 세 가지 기본 연산, 복잡도와 메모리, 그리고 노드에 값을 얹어 응용하는 지점까지 다룬다. 📖 이..
[SWEA] B형 기출 - 타워디펜스게임 (python)
·
알고리즘/SWEA
B형 기출타워디펜스라길래 좀 재밌겠다 싶었는데 지문이 A4로 세 장쯤 됐다.그래서 풀고 나서 뿌듯함도 세배![문제]도망자가 출발지에서 도착지까지 정해진 길을 따라 걸어가고, 길 옆에 세운 타워들이 그걸 쏴서 막는다. 도망자가 죽거나 탈출한 턴과 그때 남은 체력을 각각 기록해서 돌려주면 된다.길은 출발지와 도착지를 잇는 한 줄이고 갈래가 없다. 이게 보장된다.함수하는 일init(N, mMap)맵을 받는다. 0은 빈 칸, 1은 길, 2는 출발지, 3은 도착지addTower(r, c, interval)(r, c)에 재장전시간 interval짜리 타워를 세운다runSimulation(M, interval, hp, retTs, retHP)도망자 M명이 interval턴마다 한 칸씩 움직이는 게임을 끝까지 돌린다타..