2021년 3월 17일 수요일

AITech 학습정리-[Day 38] 빠르게 / 가지치기

 

==================================

학습내용

(6강) 빠르게


https://leejaymin.github.io/papers/dc18.pdf

밑으로 하드웨어쪽으로 내려가는걸 lowing. 근데 직접적으로 쫙 내려가는건 비효율 적이니 중간단계에 graph적으로 처리하는걸 만든다고 한다.


https://towardsdatascience.com/how-fast-numpy-really-is-e9111df44347

파이썬에서 그냥 파이썬보다 numpy가 빠르다. 파이썬은 각 숫자도 object로 보지만 numpy는 비슷한 object는 하나의 object로 보기 때문이라고 한다. 그리고 병렬적으로 해결 가능하고, C로 되어있어서. 간단한 이유는 파이썬은 interpreter이기 때문.


https://techdecoded.intel.io/resources/understanding-the-instruction-pipeline/#gs.qx06hk

https://www.techspot.com/article/1821-how-cpus-are-designed-and-built/

https://www.ecessa.com/blog/what-are-bandwidth-latency-and-throughput-and-what-is-right-for-your-business/

bandwith는 한번에 데이터가 갈 수 있는 양, latency는 가는데 걸리는 시간, throughput은 실제 데이터 양. 하나만 아무리 좋아도 다른게 안좋으면 병목현상이 생긴다.


딥러닝 모델에서도 생각할 수 있다. 개선이 필요

https://en.wikipedia.org/wiki/Hardware_acceleration
https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=8784190

https://www10.mcadcafe.com/blogs/jeffrowe/2017/03/16/the-continuing-importance-of-gpus-for-more-than-just-pretty-pictures/

CPU는 단순 처리보단 좀 더 복잡한걸 처리하도록 만들어져서 병렬 처리가 잘 안됨. 그래서 GPU한테 맡긴다.

http://www.hellot.net/new_hellot/magazine/magazine_read.html?code=202&sub=002&idx=52620
https://dada.cs.washington.edu/research/tr/2017/12/UW-CSE-17-12-01.pdf

CPU, GPU 말고 다른것들 종류.

IPU라고 아얘 CPU랑 메모리랑 물리적으로 거리를 가까운 곳에 놓아서 속도 개선한 것도 있고, SoC(System on Chip) (apple m1 chip)처럼 작은 칩에 전부 박아넣은 것도 있다. FPGA는 CPU,GPU와 고정해서 사용하는 ASIC의 사이. 조립해서 사용한다. 아두이노 같은거라고 보면 된다고 함.


Compression은 software쪽으로, Acceleration은 hardware쪽으로 연관있다고 함.

https://arxiv.org/pdf/2007.00864.pdf

모델 압축할 때 그냥 tflite로 범용성있게 압축해서 하는 것 보단 실제 실행되는 hardware 환경 예를들어 CPU코어갯수라던가, GPU 병렬처리 가능 정도등을 고려해서 tflite로 압축하는 것이 더 좋을 수밖에 없다.

https://arxiv.org/pdf/2002.03794.pdf

https://leejaymin.github.io/papers/dc18.pdf

프레임워크가 많이도 있는데 기계어로 어떻게 번역을 하는가?

컴파일러 중에서도 C용, Fortran용, Haskell용 컴파일러가 다 따로 있어서 불편했는데 이걸 하나로 합쳐준 LLVM IR이란게 있다고 한다. 비슷하게 구글에서 MLIR를 만들고 있는 중이라고 한다.


http://blog.naver.com/PostView.nhn?blogId=mesa_&logNo=221466719724&parentCategoryNo=&categoryNo=10&viewDate=&isShowPopularPosts=false&from=postView

https://www.tensorflow.org/mlir/dialects
https://llvm.org/
https://medium.com/tensorflow/mlir-a-new-intermediate-representation-and-compiler-framework-beba999ed18d
https://arxiv.org/pdf/2002.11054.pdf

https://arxiv.org/pdf/2002.03794.pdf
DL에서의 프론트엔드랑 백엔드는 프레임워크로 작업하는거랑 컴파일하는 작업을 분리해서 생각한듯.

https://arxiv.org/pdf/2002.03794.pdf

위 표에서 컴파일러에 따른 다른 장단점들이다. 어디엔 되고 안된다던지.. 그래서 회사에서나 자신의 요구사항에 맞는 것들을 고려해서 알맞는 컴파일러를 선택하자.

https://arxiv.org/pdf/2002.03794.pdf

DL 컴파일러가 최적화하는 방법들. OS시간에 배운 page fault 대비용 같은 것들도 보인다. 신기한건 벙렬처리용으로 바꿔주는 것도 있다는거.

https://openaccess.thecvf.com/content_CVPR_2019/papers/Wang_HAQ_Hardware-Aware_Automated_Quantization_With_Mixed_Precision_CVPR_2019_paper.pdf

https://arxiv.org/pdf/2007.00864.pdf

하드웨어까지 고려해서 압축하면 더 빨라진다. 위에서 했던 얘기.


실습

https://drive.google.com/file/d/1C1xEQi1kv7nZ2b4ZQkfUp3Tg7q7ab_8Z/view?usp=sharing

파이썬에서 병렬로 계산했을때의 속도차이


(7강) 가지치기


mask 언제 쓰는게 유용한가?


https://medium.com/@souvik.paul01/pruning-in-deep-learning-models-1067a19acd89
https://arxiv.org/pdf/1705.08922.pdf

필요없거나 덜 중요한 가지들을 잘라낸다. 실제 뇌도 그런다.

https://papers.nips.cc/paper/2015/file/ae0eb3eed39d2bcef4622b2499a05fe6-Paper.pdf

불필요한 가지를 잘라냈을 때 weight의 분포도 모습. weight 갯수가 1/10로 줄었다.

dropout 과 비슷하다고 볼 수 있는데, 가지치기인 pruning은 neuron을 아얘 없애는거고 dropout은 generator train을 위해서 잠깐 비활성화 하는거라 테스트할땐 전부 살려서 테스트한다는 차이점이 있음.

이 가치지기는 보통 한번으로 끝나지 않고 iter를 반복(fine tuning 을 반복)하며 만족할 때 까지 한다.

https://arxiv.org/pdf/2003.03033.pdf


https://arxiv.org/pdf/1506.02626.pdf

pruning을 이론적으로 표현한 것. theta가 weight들이라고 한다. weight의 변화에도 loss가 별로 미동이 없을때 즉 weight들이 이미 다 변할대로 변해서 수렴할 때 가지치기를 할수록 weight들이 점점 (0,0)으로 변한다는 내용같다.

https://arxiv.org/pdf/2003.03033.pdf

그래서 가지치기를 하면 weight수가 줄고 정확도도 조금씩 줄게 되어있다. 이를 나타낸 그래프.

EfficientNet에 대한 pruned model은? (further question)


https://github.com/he-y/Awesome-Pruning

https://arxiv.org/pdf/2003.03033.pdf

https://towardsdatascience.com/the-lottery-ticket-hypothesis-a-survey-d1f0f62f8884

pruning에도 여러 방법론들이 제기되고 있다. 그냥 마구잡이로 없애보는게 unstructured고 나름 규칙을 정해서 하는게 structured.


https://www.xilinx.com/html_docs/vitis_ai/1_2/pruning.html

이게 pruning의 기본 형태. 한번에 너무 많은걸 잘라내면 돌아올 수 없다. 적당히만 쳐내고 다시 학습시키고 적당히 쳐내고 다시 학습시키고..

https://arxiv.org/pdf/2003.03033.pdf
https://arxiv.org/pdf/1611.06440.pdf

http://proceedings.mlr.press/v119/tan20a/tan20a.pdf

두 논문 다 같은 얘기를 하지만 표현법만 다르게 하는 거임. 다른점은 오른쪽의 strategy 1,2가 4,5 순서가 바뀌어 있는데 훈련을 하고 가지치기를 했을때 훈련되고 남은 weight를 그대로 가지고 훈련할꺼냐 아니면 초기화시키고 훈련할거냐의 차이. 남은 weight를 가지고 lottery Ticket Hypothesis(가설) 이 나오게 된다.

https://medium.com/analytics-vidhya/rigging-the-lottery-training-method-of-high-speed-and-high-precision-sparse-networks-without-2340b0461d55
https://arxiv.org/pdf/1803.03635.pdf

학습시키고 자른다. 근데 자른 구조에서 weight를 초기화시키고 다시 학습하는 것보다 아까 학습하고 나온 weight를 넣고 학습하는게 잘 나오더라. 왜그런진 몰라서 가설임.


Iterative Magnitude Pruning은 가지치기한 구조에서 weight를 초기화하고 학습, with Rewinding은 학습했을 때 중간에 있던 weight를 넣어서 학습.



실습

https://drive.google.com/file/d/1jnFth_9Wm2CA3nWcvV1hb778Ox3o3ULM/view?usp=sharing

mask 씌우는 방식으로 pruning하기


===========================

피어세션

SK 직무마다 문제가 다른것 같음. 데이터 엔지니어링은 파이썬으로 데이터 분류하는거 나왔다고 함. DBMS는 오라클, mysql로 본듯.

롯데정보통신 1,2차 하루만에 다봄.


https://clovaai.github.io/AdamP/

adamp


=========================

후기

pruning도 관심이 조금 생김.


2021년 3월 16일 화요일

AITech 학습정리-[Day 37] 모델의 시공간 / 알뜰히

 

======================================

학습내용

(4강) 모델의 시공간


정답이 될 수 있을만한 구간을 feasible region이라고 부른다. feasible region에서 내가 원하는 조건의 답을 찾아서 구하는것. 모든 조건을 만족하는 곳.


풀릴 수 있는 문제인가 아닌가의 기준점. algorithm으 넘어서면 풀 수 없거나 영원히 돌려야 하는 구간이다.

http://news.khan.co.kr/kh_news/khan_art_view.html?art_id=201703082055005#csidx871276de9dbfc6eb1d464ad0c74a8e1


https://en.wikipedia.org/wiki/Principle_of_maximum_entropy#:~:text=The%20principle%20of%20maximum%20entropy,proposition%20that%20expresses%20testable%20information).

우리가 개 고양이 구분같은 딥러닝 알고리즘 문제를 푼다는 것은 시간을 과거로 되돌리는 것과 같다. 즉 시간이 이미 많이 지나서 둘이 섞여있는 엔트로피가 증가된 상태인 것을 과거로 돌려 다시 분리하는 것이다. 그래서 엔트로피를 거꾸로 돌리기 때문에 많은 에너지가 필요하다. 여기서 필요한건 사람의 지식 뿐 아니라 그걸 풀기위한 수식 등도 포함되어 있다.



자동화가 되면서 사람이 했던 일들을 점점 컴퓨터가 하도록 자동화됨.



https://doi.org/10.1038/s41467-020-14578-5

분류문제는 데이터를 좌표공간 위에 놓을 수 있기 때문에 가능한 것.



hidden dimension 들도 좌표에 올려놓는게 가능하긴 하다.



하이퍼 파라미터를 어떻게 설정하냐도 생각해 볼 수 있다. 근데 문제는 weight 같은 경우 그 값만 바꾸고 돌려보고 해도 되지만 하이퍼 파라미터는 조금 바꾸고 모델 전체를 다 돌려야 효과가 있는지 없는지를 알 수 있다. 그래서 그에 대한 방법론이 나오는 중.

https://arxiv.org/pdf/1012.2599.pdf?bcsi_scan_dd0fad490e5fad80=fwQqmV5CfHDAMm8dFLewPK+h1WGiAAAAkj1aUQ%3D%3D&bcsi_scan_filename=1012.2599.pdf&utm_content=buffered388&utm_medium=social&utm_source=plus.google.com&utm_campaign=buffer
하이퍼 파라미터 정하는 것도 딥러닝으로 할 수 있지 않을까? 해서 나온게 Surrogate model. Gaussian으로 한다고 한다. 관심없어서 잘 모르겠음.


https://arxiv.org/pdf/1611.01578.pdf

모델 설계 자체도 기계한테 맡길 수 있다. 저렇게 사람이라면 생각하기 힘들게 설계하는데 성능은 잘 나오더라.


https://arxiv.org/pdf/1807.11626.pdf

search space. 정답이 될 수 있는 모델의 candidate.

모바일에 돌리라고 나온 MobileNet을 써봤는데 실제론 잘 안나오더라. 그래서 난 이렇게 하니까 잘 나왔다~ 라는 내용.

https://arxiv.org/pdf/1812.00332.pdf%C3%AF%C2%BC%E2%80%B0

PROXY는 모바일에서 돌렸을 때를 가정해서 돌려주는 거다. 근데 써보니까 성능이 별로 안좋아서 그냥 PROXY 를 쓰지말자~ 하는게 취지.

https://github.com/mit-han-lab/once-for-all

one for all 은 모델을 설계한 뒤에 "재훈련 하지않고" 구조만 살짝 바꿔서 아무데나 넣을 수 있도록 하는 거.




MobileNet 시리즈. 위 그림은 V1에서 한 방법을 나타내는데, 1*1conv를 사용하고 입력을 쪼개서 계산하는 방식으로 파라미터 수를 1/9로 줄였다.


toycode. 어디가 병목인가?

https://drive.google.com/file/d/112gqB8gfZt0QDaa-886h6gIm8sX7fuJw/view?usp=sharing

실행시간이 너무 오래 걸리는 부분을 찾아서 수정할 수 있을 것 같다. 지금 생각나는건 cnn의 경우 위 mobilenet처럼 1*1conv로 쪼개서 계산한다던지..


(5강) 알뜰히



압축의 기본 방법.


https://terms.naver.com/entry.nhn?cid=58885&docId=3570842&categoryId=58885

압축의 종류. 비손실은 원래 데이터로 회복 가능하지만 비손실은 다시 원래대로 못돌린다. 필요없는걸 아예 삭제시키는 방향이라.


동물을 구분한다면 각 동물의 특징을 embedding vector로 나타난다. 이런것도 압축의 한 종류. 위에서 dict으로 문자를 숫자로 바꾼 것 처럼.


이렇게 압축된 걸로 학습을 하고 결과를 내놓는다. 나온 결과 embedding도 argmax등으로 복원해서 볼 수 있음.


뇌도 일종의 인코더. 저 3 그림을 보고 머리속에서 3이라고 label을 맞춰줌. 모델도 마찬가지.

KL divergence. P와 Q와의 거리라고 하기엔 위치가 바뀌면 바뀌니까 애매한데 얼마나 가까운지. 거리가 아니지만 거리처럼 생각하고 계산. 


파란색끼리 무질서도 관계, 빨간색끼리 무질서도 관계. 무질서도가 0이라는 것은 확실하게 맞다 라는 확언. 無엔드로피. 이 두개 차이를 비교해보자 하는게 코딩하는 내용.


빈도수 많은건 작은수로, 빈도수 적은건 큰 수로 배치. 이렇게 해서 크기 줄이기. Huffman coding.


근데 P가 이상적이라고 한다. 그래서 이상적인 P코드북을 이용해 저장했을 때랑 압축하려고 만든 Q코드북을 이용해 압축했을 때의 차이를 메꾸기 위해 Cross - Entropy라는 개념을 도입했다고 한다. 왜 차이가 생기냐면 빈도수가 많으면 그만금 그 빈도수가 많은 것에 대해 가중치가 더 부여되는게 당연한건데 압축하면 이 빈도수 많은게 상대적으로 작아지니까.

Q는 모델이 내놓은 predict 값 분포. P는 원래 정답 분포.


DKL = Q라는 코드북을 가지고 P라는 메세지를 해독했을 때의 무질서도 - P라는 코드북을 가지고 P를 해석했을때의 무질서도. 그래서 두개의 딱 차이만큼만 남음.


https://arxiv.org/pdf/1510.00149

모델 압축. Pruning + Quantization이 제일 좋다. tflite가 이런 방법들을 모두 동원해서 엄청 작은 용량으로 바뀐다.


모델경량화 (좀 더 상세한 방법)

https://drive.google.com/file/d/16LHNU20PQ0ce1N_X-3xZrwRHqAOcvJ71/view?usp=sharing




=======================================

과제


https://colab.research.google.com/drive/1HItF2I_9o4mE7yzBoqWPPrqoCnPYZfye?usp=sharing

사람 성별 구분.

전체적인 코드 작성 방법 즉, 모델 구조 구성 방법, 훈련코드 작성 방법, 데이터 증식 방법 등 보기 좋게 작성되어서 두고두고 쓸만할듯.

=========================

피어세션

정보 엔트로피는 클수록 결과가 뭐가 나올지 모른다. 랜덤성.

https://www.youtube.com/watch?v=nxbufH4JnpA

https://wkdtjsgur100.github.io/P-NP/

P, NP 문제


https://karpathy.github.io/2019/04/25/recipe/

논문대로 안될때 디버깅 방법등..


===================

후기

관심생긴게 저번 시간에 했던 ㅇㅇ 이랑 여기서 MnasNet, PROXYLESSNAS, mobilenet 압축방식, model compression이다. 나중에 봐야지.