안녕하세요~


이번글에서는 '코딩'과 관련된 여러 용어들을 설명드리려고해요.


여러분이 만약 이제 코딩을 시작하신분이라면 '프로그래밍 언어'문법을 보시것만으로도 굉장히 힘드실거에요.


그런데 '프로그래밍 언어'를 시작도 해보기전에도 좌절하는 경우가 굉장히 많아요. 예를들어, 인문학만 하다가 프로그래밍을 처음했는데 직속상사가 "XX님 딥러닝 Framework 뭐써요?" 라고 물어본다면 멘붕이 오실거에요.


Framework는 또 뭐람.....


그래서 이번에는 Framework라는 개념을 이해하기 위해 필요한 여러 개념들에 대해서 알아보도록 할거요 ㅎㅎㅎ






<1. API>


여러분이 프로그래밍을 한다는건 컴퓨터와 대화를 한다는거에요. 컴퓨터는 기계기 때문에 전기신호만 받을 수 있어요. 그래서 전기신호가 켜진경우를 1, 꺼진경우를 0으로 간주하는 이진법체계위에서 발전해왔답니다.


<사진1>


우리가 컴퓨터를 하면 프린터, 모니터와 같은 출력장치와 키보드, 마우스와 같은 입력장치를 이용하게되죠? 그런데 우리가 아무생각없이 했던 이러한 행위가 실제 컴퓨터 본체에 있는 CPU라는 곳에 도달하게 되면 이진법으로 번역되서 전달되게되요. 



<사진2>


그러면 CPU는 또다시 그입력을 받아 본체 내부에 있는 memory(ram)를 통해 주변 장치들을 제어하게 된답니다.


<사진3>


<사진4>



그래서 초기에는 '010101000'과 같은 언어를 사용해야만 컴퓨터를 다룰 수 있었어요. 그런데 사람들이 사용하기 어려워서 컴퓨터를 멀리하려고 하자 조금더 쉬운 assembly lanugage라는 것이 나왔고, 오늘날 programming language라는 용어로 사용되는 좀더 고급(추상)언어인 java, C, python 같은 언어들이 만들어 졌어요.


<사진5>


하지만 컴퓨터를 실제로 제어하기 위해서는 '010100001'과 같은 이진법을 사용해야해요. 그런데 일반 사용자들이 이런것까지 만들 필요가 있을까요? 그리고 우리가 python과 같은 고급(추상) 프로그래밍언어를 사용할때 보면 우리가 코드를 입력하고 관련된 결과를 받게되는데요. 이렇게 입력과 출력을 하기 위해서 우리가 직접 관련기능(함수)들을 만들어 주어야 할까요? 아마 이렇게 되면 실제 입출력장치에도 접근해야하기 때문에 많은 시간들이 소요가 될거에요.


개발자들이 응용프로그램을 만들려고 할때마다 이러한 수 많은 작업들을 해야한다면 아마 많은 사람들이 포기할거에요. 그래서 여러 회사들은 개발자들이 응용프로그램을 만들기 위해 편하게 사용할 수 있는 인터페이스를 제공하는데 이것이 API (Application Programming Interface)에요.


회사들은 개발자들이 low level (01010과 같은 기계어) language와 assembly language를 직접 만들지 않고 고급(추상) 프로그래밍 언어만 간단하게 사용할 수 있게 사전작업을 하게되요. 그리고 이러한 사전작업을 마치면 회사들의 고유 API가 만들어 지는데 사용자들은 이를 이용해 간단히 프로그램을 만들 수 있게 되는거에요.


그래서 제가 python 언어를 사용한다는건 python API를 사용한다는 말과 같은거에요. abs(-10)이라는 언어는 절대값을 뱉어주는 함수에요. 아래와 같이 언어를 입력할 수 있는 것도 python을 만든 회사가 키보드를 통해 CPU로 값을 전달하는 과정과 모니터에 결과값을 출력해주는 과정에 필요한 low level, assembly level 작업들을 abs라는 함수에 내장시켜 준 것이지요.  



그런데 우리가 python api를 이용하려면 어떤 설명서 같은 것들이 있어야 하잖아요? 그래야 python 언어 문법도 이해하고, 함수가 뭐가 있는지도 알 수 있겠죠.


그래서 이러한 설명들을 모아둔 곳을 Document or Library라고 한답니다. 즉 설명서들을 도서관에 모아놓은 이미지를 생각하시면 될거에요. (Python API Library Link)


(API) document에는 사용자들이 자주 사용하거나 기본적인 연산을 다루는 함수들을 미리 만들어서 제공하기도해요. 그래서 따로 함수를 만들어줄 필요가 없게되는데요. 보통 이런 함수들을 '내장함수'라고 한답니다.


<사진6>






<2. Packages>


우리가 Python API를 사용한다고 해서 딥러닝에 필요한 기능들을 다 사용할 수 있을까요?


사실 Python API, Java API 같은 것들은 아주~~~ 기본적인 기능들만 제공하고 있기 때문에 Python API 만으로는 우리가 할 수 있는것들이 제한적이에요.


그래서 여러 분야에 있는 사람들은 이러한 기본적인 기능을 갖고 자신들의 분야에 맞추어서 새로운 것들을 만들기 시작했어요.


예를 들어, 행렬을 연산하려고 하는데 Python API는 너무 기본적인 연산만 제공하고 있고, 행렬연산을 매우 비효율적으로 하기 때문에 수치해석이나 이미지 분야와 같이 다차원의 행렬을 이용할 때 많은 문제가 발생할 수 밖에 없었어요. 그래서 이런 분야에 있는 사람들은 행렬연산을 할 수 있겠금 자신들이 Python API를 이용해 여러 함수들을 만들기 시작했는데요. 이렇게 해서 만들어진 것이 numpy package라는 거에요.


그래서 package라는 개념을 일반화해서 설명하자면 기본적인 Python API를 이용하여 자신들 분야에 맞는 함수들을 만들고, 이와 관련된 모든 함수를 하나의 package라는 큰 단위로 묶는거에요. 



Python API 자체도 여러 내장 함수들이 존재하기 때문에, 이와 관련된 package 도 존재할거에요. 하지만, 일반적으로는 Numpy와 같이 만들어서 사용하는 경우가 많아요. 그래서 Python을 설치하고 딥러닝 환경을 구축한다고 하면 딥러닝과 관련된 여러 package들 (ex: Numpy, Pandas, Scikit-learn ..) 을 추가적으로 설치해주어야 한답니다.





<5. Framework>


그럼 마지막으로 Framework에 대해서 알아보도록 할거에요.


우리가 앞서 Python API를 설치했다고 해볼게요. 그럼 우리가 이러한 Python API를 통해 딥러닝을 해본다고 가정합시다. 딥러닝은 하나의 학문 체계이기 때문에 굉장히 많은 수식과 개념들이 혼재되있어요. 그런데 이러한 개념들을 Python API로 하나씩 구현해주다보면 딥러닝을 하기도 전에 그만둘거에요.


그래서 딥러닝을 주력으로 하는 회사들은 자신들이 기본적인 틀을 제공해주고 사용자들은 이를 쉽게 이용하기만 하면되는 장치를 마련해주었는데 이것이 바로 Framework에요. 이러한 Framework는 여러 프로그래밍 API들 (C++, JAVA, Python API 등) 을 이용하여 딥러닝에서 사용되는 개념들을 함수로 만들기도하고, 딥러닝 체계에서 사용되는 프로그래밍 문법같은걸 따로 만들어서 학자들이 쉽게 프로그래밍 할 수 있도록 도와주었답니다.


어떻게 보면 API가 만들어지는 과정과 일맥상통하죠? 왜냐하면 사용자들이 구현하기 힘든부분을 회사들이 해결해주고 기능을 만들어주면 사용자들은 기능만 골라서 쓰면 되니까요 ㅎㅎ 그래서 보통 Framework를 API라는 용어랑 혼재해서 사용하기도 한답니다.





<6. Deep Learning Framework>


그렇다면 요즘 deep learning framework에는 어떤것들이 있을까요? 물론 많은 framework들이 만들어지고 있지만 역시 최근에 가장 이슈가 되는 framework은 Tensorflow(made by Google), Pytorch (made by Facebook)일 거에요.



<사진7>


<사진8>



어떤 Framework를 쓸지에 대해서는 좀 더 깊은 지식들이 필요하지만 보통 아래 원칙을 기준으로 선택을해요.


1. 사용하려고하는 Framework가 내 분야에서 효율적으로 동작하는것인가?

2. 사용하기 쉬운것인가?

3. 얼마나 많은 시장점유율을 갖고 있는가?


사실 Tensorflow가 굉장한 시장점유율을 갖고 있지만 최근 PyTorch가 좀 더 효율적이고, 사용하기 쉽다는 장점이 부각되면서 Tensorflow를 따라잡고 있는 추세라고 하던군요. 








다시 직장상사가 했던 질문 "XX님 딥러닝 Framework 뭐써요?"라고 물어보면 대답하실 수 있겠죠? ㅎㅎ






[사진 래퍼런스]

사진1

http://blog.daum.net/_blog/BlogTypeView.do?blogid=0myQv&articleno=32

사진2

https://clipartstation.com/input-and-output-devices-clipart-11/

사진3

https://www.web-stt.com/2019/05/04/what-does-the-inside-of-your-pc-look-like/

사진4

https://www.computerscience.gcse.guru/theory/von-neumann-architecture

사진5

https://guide.freecodecamp.org/computer-science/assembly-language/

사진6

https://docs.python.org/3/library/functions.html

사진7

https://ko.wikipedia.org/wiki/%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C

사진8

https://venturebeat.com/2020/01/30/openai-facebook-pytorch-google-tensorflow/

+ Recent posts