(1강) 가벼운 모델

💡
경량화에 대한 기본적인 개념에 대해 알아본다.

미니코드

import sys
print(sys.getsizeof(0))             # 24
print(sys.getsizeof(1))             # 28
print(sys.getsizeof(2 ** 30 - 1))   # 28
print(sys.getsizeof(2 ** 30))       # 32
print(sys.getsizeof(2 ** 60 - 1))   # 32
print(sys.getsizeof(2 ** 60))       # 36
print(sys.getsizeof(2 ** 90 - 1))   # 36
print(sys.getsizeof(2 ** 90))       # 40
print(sys.int_info)                 # sys.int_info(bits_per_digit=30, sizeof_digit=4)
import dis

def add_1(a,b) :
    c = a + b 
    return c

def add_2(a,b) :
    return a + b

r1 = add_1(10, 20)
r2 = add_2(10, 20)

print(r1, add_1.__code__.co_varnames)           # 30 ('a', 'b', 'c')
dis.dis(add_1)
#   4           0 LOAD_FAST                0 (a)
#               2 LOAD_FAST                1 (b)
#               4 BINARY_ADD
#               6 STORE_FAST               2 (c)

#   5           8 LOAD_FAST                2 (c)
#              10 RETURN_VALUE

print(r2, add_2.__code__.co_varnames)           # 30 ('a', 'b')
dis.dis(add_2)
#   8           0 LOAD_FAST                0 (a)
#               2 LOAD_FAST                1 (b)
#               4 BINARY_ADD
#               6 RETURN_VALUE
import dis

num = 4
print(num != 0 not in [0,1,2,3])  # False

dis.dis('print(num != 0 not in [0,1,2,3])')
#   1           0 LOAD_NAME                0 (print)
#               2 LOAD_NAME                1 (num)
#               4 LOAD_CONST               0 (0)
#               6 DUP_TOP
#               8 ROT_THREE
#              10 COMPARE_OP               3 (!=)
#              12 JUMP_IF_FALSE_OR_POP    20
#              14 LOAD_CONST               4 ((0, 1, 2, 3))
#              16 COMPARE_OP               7 (not in)
#              18 JUMP_FORWARD             4 (to 24)
#         >>   20 ROT_TWO
#              22 POP_TOP
#         >>   24 CALL_FUNCTION            1
#              26 RETURN_VALUE

결정 (Decision making)

결정은 특정 상황이나 환경에 대한 판단을 의미한다. 이러한 판단과 결정은 각각의 근거를 통해 이루어지는데, 이 근거와 결정은 연역적 결정과 귀납적 결정으로 구분할 수 있다.

연역적 결정은 정의와 정리에 따라 이루어진다. 대표적인 예시로, 소크라테스의 3단 논법이 있다. 연역적 결정의 특징은, 전제가 참일 경우 결론도 반드시 참이 된다는 것이다. 즉, 연역적 결정은 전제와 논리에 따라 결정이 바뀔 수 있다.

1+1은 전제에 따라 참 값이 다르다.

귀납적 결정은 관찰 결과를 근거 삼아 결정을 내린다. 대표적인 예시로, "내일 해가 동쪽에서 뜰 것이다."와 같은 명제가 있다. 위와 같은 결정은 과거의 경험을 통해 얻은 결론이다. 이는, 논리적인 근거는 없지만 매우 높은 확률로 참값을 가질 것이다. 하지만 100% 무조건 참이라고 단언할 수는 없다. 소행성 충돌과 같은 사건으로 인해 태양이나 지구가 붕괴할 수도 있기 때문이다. 즉, 귀납적 결정은 과거의 관찰을 통해 높은 확률을 갖는 결론을 내리는 것이다.

귀납적 결정은 확률과 깊은 연관성을 갖는다.

결정기 (Decision making machine)

결정기는 결정을 대신 해주는 기계를 의미한다. 이전에는 인간 고유의 영역이라고 판단 되었으나, 현대에 이르러서는 기계에게 이와 같은 역할을 수행토록 한다. 더 나아가서 결정기는 단순 결정만을 수행하는 것이 아니라, 행동까지 수반하는 경우가 많다. 예를 들어, 로봇 청소기는 상황을 파악하며 청소를 수행하는 결정기이다.

이전의 결정기들은 인간의 결정에 도움을 주는 정도의 역할만을 수행했다. 오늘날에는 결정기들의 성능이 점점 더 향상되면서 지금은 민감한 사안에 대한 결정까지 수행하고 있다. 예를 들어, 의료 진단과 같은 결정은 매우 높은 성능의 결정기만 활용될 수 있다.

더 나아가서, 우리는 모든 것을 결정기에 의존할 수 없을 것이다. 가치판단과 같은 높은 수준의 사안은 인간조차 답을 내릴 수 없는 영역이기 때문이다.

가벼운 결정기 (Lightweight decision making machine)

경량화 (Lightweight)는 소형화와 의미상으로 차이점을 갖는다. 단순히 작고 가볍게 만드는 것이 아니라, 필요한 정보와 기능만을 남기는 것이기 때문이다.

오늘 날에는 TinyML이라는 분야가 주목을 받고 있다. 더 작은 용량과 전압과 시간으로 비슷한 수준의 성능을 내기 위해 연구하는 분야이다. 모델의 경량화는 오늘날 많은 곳에서 필요로 하고 있다. 예를 들어, 무인 운전은 실시간으로 데이터를 수집하고 결정을 내려야하는 필요가 있다.

Cloud에 Data를 송신하고, 추론하고, 수신받는 과정은 시간적인 지연을 유발한다.

Backbone & dataset for modal compression

새로이 모델을 개발하는 경우도 있으나, 이미 개발된 좋은 모델을 경량화 하는 것이 오늘날 연구의 트렌드이다. '모델의 성능을 얼마나 유지하면서 얼마나 경량화 하는가'가 관건인 것이다. Dataset 역시 객관적인 평가를 위해 잘 알려져있는 것을 사용하는 것이 일반적이다.

Edge devices

Edge Devices란 Network에서 말단에 존재하는 Node 기기를 의미한다. Edge Device에서 결정을 수행하는 것은 다양한 장점을 갖는다.

  1. Cloud나 On-premise 방식에 비해 저렴하다.
  1. Cloud나 방식에 비해 사생활 정보를 보호하기 쉽다.
  1. Cloud나 On-premise 방식에 비해 관리가 용이하다.
  1. Network의 연결 없이 어디서든 동작할 수 있다.
Network의 말단 기기를 Edge Device라고 한다. 개인 차량도 이에 포함할 수 있다.

Edge Device에서 동작하는 가벼운 모델은, Cloud나 On-premise 방식에서 동작하는 무거운 모델에 비해 성능의 저하가 있는 것은 사실이다. 즉, 경량화 모델은 "Dumb and Fast"의 특징을 갖는다.

Edge intelligence

Edge Device의 동작을 위해서는 다양한 방법을 사용할 수 있다. 예를 들어, 중앙 서버인 Cloud 외에 간이 서버를 설치해 성능을 유지하면서 속도를 향상시키는 방법이 있다.

Data 송수신의 시간을 줄이면서, 비교적 큰 모델을 사용하는 Edge Offloading의 예시

현재에 가장 대두 되고 있는 Edge Device의 동작은 Inference이지만, 이외에도 다양한 방법이 연구되고 있다.

Edge Inference를 위한 대표적인 방법으로 기계 친화적 구성이 있다. High Level의 언어로 구성된 Model을 Low Level의 언어로 구현해, Edge Device에서의 연산을 최소화 및 경량을 하는 것이다.

모델을 기계 친화적으로 구성하기 위한 변환의 예시

토이 코드 : Model Conversion

GitHub Gist Link


(2강) 팔리는 물건

💡
비즈니스적 의미를 갖는 엔지니어링에 대해 알아본다.

정방향, 역방향

비즈니스 내에서 엔지니어링은 많은 경우에 시간적 데드라인에 맞춰 개발된다. '소프트웨어 장인'이라는 책에서는 시간적인 데드라인보다는 완성도 높고, 버그가 없는 서비스를 개발하기를 권유한다.

'아이디어 불패의 법칙'이라는 책에서는 개발자 입장에서 잘 만드는 서비스보다, 고객의 관점에서의 서비스 개발이 필요하다고 설명한다.

이외에도 개발자의 실력은 무엇이고, 어떤 공부를 하는 것이 좋은가에 대한 화두로 강의가 진행되었다.

무엇에 초점을 맞춰 공부해야 하는가에 대한 답변

AI에서

AI 개발도 마찬가지이다. 개발자가 생각하기에 훌륭한 서비스보다는, 고객이 만족하는 서비스를 개발하려 노력해야겠다.

좋은 AI 개발자가 되기 위해 우리는 Modeling에 집중하고 있다. 하지만 실제 AI 개발에서 Modeling은 큰 비중을 차지하지 못하고 있다.

비즈니스에서의 Modeling과 우리가 공부하고 있는 것에 대한 예시

오히려, Data Handling 시점에서 고객 관점의 문제를 식별하고 해결할 수 있다는 논문도 있다.

Modeling 업무는 고객 관점과 맞닿아있지 않는 경우가 대부분이다.

On-device AI에서

GPT-3와 같은 모델은 실제로 성능 측면에서 엄청난 성과를 이루어냈다. 하지만, '비즈니스 내에서 이정도의 성능이 필요한가?'에 대해서도 생각해 볼 필요가 있다. 오히려 더 적은 비용으로 적당한 수준의 성능이 필요한 경우도 많을 것이다.

Edge Device에서 수행되는 AI는 가벼운만큼 성능은 다소 떨어진다. 하지만, 비즈니스에서의 다양한 니즈를 충족시켜줄 수 있는 좋은 방안이다.

On-device AI Solution 사례 (Nota)

Mobile Device에서 오타를 막기 위한 기술로서 AI가 활용될 수 있다.

No 오타 서비스의 예시

공사장과 같이 큰 Device를 설치하기 어려운 곳에서, 소형 Device로 동작하는 화면 인식기도 있다.

Edge Device의 화면인식 서비스의 예시

이외에도 도로 상황을 판단해 신호를 조절하는 데에도 소형 AI가 활용될 수 있다.

저전력 환경에서 도로를 통제하는 AI의 예시

토이코드 : Not enough resource

GitHub Gist Link


(3강) 가장 적당하게

💡
모델 경량화와 최적화에 대해 알아본다.

미니코드

from scipy.spatial import distance

print(distance.euclidean([1, 0, 0], [0, 1, 0]))  # 1.4142135623730951
print(distance.euclidean([1, 1, 0], [0, 1, 0]))  # 1.0

print(distance.hamming([1, 0, 0], [0, 1, 0]))    # 0.6666666666666666
print(distance.hamming([1, 0, 0], [1, 1, 0]))    # 0.3333333333333333
print(distance.hamming([1, 0, 0], [2, 0, 0]))    # 0.3333333333333333
print(distance.hamming([1, 0, 0], [3, 0, 0]))    # 0.3333333333333333

print(distance.cosine([1, 0, 0], [0, 1, 0]))     # 1.0
print(distance.cosine([100, 0, 0], [0, 1, 0]))   # 1.0
print(distance.cosine([1, 1, 0], [0, 1, 0]))     # 0.29289321881345254

Problem, computation, decision, and optimization

Problem은 주어진 상황과 해결하고자 하는 상황의 차이라고 표현할 수 있다. Computer Science적으로 표현하자면, Initial State와 Terminal State의 차이라고 할 수 있다.

Problem을 Solving하는 과정이 Decision이다.

Problem Solving을 위한 Computation은 최종적으로 Terminal State에 닿아야 한다. 문제를 풀었든, 풀지 못했든 말이다.

우리는 이 과정에서 이미 잘 증명된 Theorem을 활용한다. Computer에서는 잘 구현된 Library가 이 역할을 수행한다.

Problem Solving에는 Deductive Process와 Inductive Process가 있다. Deductive Process는 모든 경우의 수를 확인하여, 최종적으로 가장 좋은 것을 선택하는 것이다. Inductive Process는 모든 경우의 수를 고려하지는 않고, 더 나은 방향의 탐색만 수행하는 것이다.

Problem은 Decision Problem과 Optimization Problem으로 구분할 수 있다. Decision Problem은 Cost와 관계 없이 Terminal State에 도달했는가에 대한 성패여부만을 따진다. Optimization Problem은 Cost를 고려하며 Decision Problem을 여러 번 수행하여 가장 좋은 결과를 내놓고자 하는 것이다.

Constraints

Decision Problem은 제약조건을 상정하지 않은 채로 주어진다. Optimization Problem은 Decision Problem에서 여러 제약조건을 상정해가며 Cost를 낮춰가는 과정을 의미한다.

Decision Problem과 Optimization Problem의 차이

이는 Model Compression에 대입해 생각해볼 수 있다. 동일한 성능을 Goal로 하였을 때, 모델을 얼마나 경량화 할 수 있는가는 Optimization Problem인 것이다.

Constraints in model compression

많은 경우 우리는 Model의 성능을 높이는 데에만 집중했다. 이 때 발생하는 다양한 제약조건에 대한 고민은 하지 않은 것이다. NAS를 발표한 논문에서는 Model의 학습에는 CO2 발생이라는 Cost가 있음을 주장했다.

이외에도, 비즈니스 환경에서는 Model Size나 Inference Time과 같은 다양한 제약조건이 존재한다. 우리는 성능과 Cost의 사이에서 적절한 선을 찾을 수 있어야 한다.

토이 코드 : Manual backpropagation

GitHub Gist Link

'네이버 부스트캠프 AI Tech' 카테고리의 다른 글

[U] Day 38 - Lightwieght III  (0) 2021.03.28
[U] Day 37 - Lightweight II  (0) 2021.03.28
[U] Day 35 - CV V  (0) 2021.03.26
[U] Day 34 - CV IV  (0) 2021.03.26
[U] Day 33 - CV III  (0) 2021.03.26

+ Recent posts