2018.05.04

머신러닝에 파이썬을 즐겨쓰는 4가지 이유

Serdar Yegulalp | InfoWorld
데이터 과학에서 언어, 생태계, 이를 중심으로 하는 개발 프로세스인 파이썬(Python)을 선호하게 된 이유가 무엇일까? 파이썬은 스크립트 작성과 프로세스 자동화, 웹 개발, 일반 애플리케이션 등 여러 소프트웨어 개발 영역에서 오랫동안 인기를 얻었다. 최근에는 머신러닝(Machine Learning) 언어로도 주목받고 있다. 머신러닝 분야에서 파이썬이 각광 받는 4가지 이유를 살펴보자.



프로그래밍이 단순해진다
첫 번째 이유는 파이썬의 성공 스토리와 관련돼 있다. 이 언어는 간소함을 제공한다. 파이썬이 처음 만들어졌을 때 주된 목표는 읽고 쓰기 쉬운 언어였다. 코드는 쓰는 것보다 읽는 경우가 많고, 특히 팀이 바뀌는 경우에는 더 그렇다. 다른 개발자로부터 여러 서드파티 구성 요소를 사용하거나 사용자 비즈니스 로직이 상당한 머신러닝 애플리케이션을 넘겨 받을 경우 가능한 적은 인지 오버헤드가 추가되는 언어로 작성하는 것이 도움이 된다. 좋은 파이썬 코드는 이런 필요를 충족하며 다른 언어보다 더 뛰어나다.

머신러닝 라이브러리가 있다
파이썬이 머신러닝 툴이 된 두 번째 이유는 사용할 수 있는 풍부한 머신러닝 라이브러리와 프레임워크다. 유명한 사이킷-런(Scikit-learn)부터 텐서플로우(TensorFlow), CNTK, 아파치 스파크 MLlib(Apache Spark MLlib) 등 알려진 머신러닝 및 딥 러닝(Deep Learning) 프레임워크 대부분이 파이썬의 영역에 있거나 파이썬 API를 지원한다. 특히 파이토치(PyTorch) 등은 그 이름에서 알 수 있듯이 특별히 파이썬을 염두에 두고 만들어졌다. 그러면서도 성능을 타협하지 않았다.

파이썬의 풍부한 라이브러리 생태계를 활용하면 하나의 명령으로 여러 프레임워크를 작업 공간에 설치할 수 있다. 파이썬 자체가 이를 적극 지원하기도 한다. 최근 파이썬은 여러 머신러닝 프레임워크에 필요한 플랫폼 전용 바이너리를 배포하기 쉽도록 라이브러리 패키징 메커니즘을 변경했다. 물론 이렇게 해도 부족하다면 우회책이 있다. 아나콘다(Anaconda) 같은 배포판은 파이썬의 생태계 밖에서 바이너리 의존성 등의 문제를 해결하기 위해 자체적인 패키징 메커니즘을 갖고 있다.


메모리를 대신 관리한다
파이썬 같은 수준 높은 언어가 제공하는 앱스트랙션과 이것이 활용되는 작업은 여러 다른 영역에서 장점이 된다. 예를 들어 파이썬은 프로그래머 대신 세부적인 메모리 관리를 수행하므로 결과적으로 개발자에게 개발 관련 문제에 집중할 수 있는 정신적인 여유를 제공한다. 목록, 설정, 사전, 투플(Tuple) 등 파이썬에 내장된 구성물과 데이터 앱스트랙션은 모두 파이썬 런타임을 통해 메모리를 관리한다. 자바(Java)도 같은 방식이지만 파이썬은 일반적으로 자바보다 정확하고 사용자와 최종 결과 사이에 절차적 장벽의 수가 더 적다.

머신러닝 앱은 파이썬의 메모리 관리 구조를 실제 연산 작업보다는 애플리케이션의 로직 또는 데이터 흐름 정리를 위한 용도로 더 활용한다. 연산 작업이 많이 필요한 리프팅(Lifting) 대부분은 NumPy 같은 외부 라이브러리가 처리한다. 하지만 언어와 런타임이 제공하는 앱스트랙션 덕분에 이들을 위한 메모리 관리 작업이 사용자의 동작보다 여러 계층 아래에서 자동으로 처리된다.

파이썬이 내부에서 메모리를 관리하는 방식은 자세히 들여다볼만한 가치가 있다. 파이썬은 효율성 대신에 사용 편의성을 택했지만 상황에 따라 그 방식이 명확하지 않을 때도 있다. 따라서 만약 완벽하게 최고의 성능을 내고 싶다면 결국 "뚜껑을 열고" 제공되는 더 낮은 수준의 앱스트랙션으로 작업해야 한다.

이와 관련된 내용을 테아노(Theano) 머신러닝 라이브러리에 관한 문서의 "파이썬 메모리 관리(Python Memory Management)" 섹션에서 확인할 수 있다. 성능을 최적화하는 또 다른 방법은 싸이썬(Cython)이다. 이 유틸리티 라이브러리를 통해 파이썬 코드를 C로 변환할 수 있다. 싸이썬을 통해 "바닐라" 파이썬과는 다른 방식으로 C의 메모리 관리 및 데이터 구성물에 직접 액세스할 수 있다.

파이썬이 느려도 상관없다
많은 사람이 파이썬을 "편리하지만 빠르지는 않다"고 말한다. 대부분은 맞는 말이다. 파이썬은 개발 편의성 대신에 순수한 성능을 타협하는 것이 일반적이다. 그렇다면 파이썬이 가장 빠른 언어가 아닌데도 머신러닝 같은 연산 집약적인 작업에 사용하는 이유는 무엇일까? 대답은 간단하다. 연산 집약적인 작업을 처리하는 것은 파이썬이 아니기 때문이다.

파이썬 머신러닝 애플리케이션에서 수행하는 실제 연산작업 대부분은 일반적으로 C, C++, 자바 등으로 작성한다. 파이썬은 라이브러리를 통해 이를 정리하고 상호작용할 뿐이다. 파이썬에서 구동하는 애플리케이션의 여러 부분은 일반적으로 성능에 민감하지 않으며 설정 및 해체, 명령 및 제어, 구성요소들 사이의 조정, 로깅(Logging) 및 보고 등을 처리한다.

하지만 애플리케이션이 파이썬과 가속화된 라이브러리 영역의 사이를 자주 오간다면 파이썬이 외부 라이브러리를 사용하기 때문에 성능 문제로 이어질 수 있다. 이런 환경 전환은 성능 문제를 야기하므로, 개발자는 파이썬과 외부 API 사이의 이동 횟수를 최소화하는 것이 좋다. 즉, 이 문제는 머신러닝만의 문제가 아니라 파이썬과 프로그래밍의 일반적인 안티패턴이다.

또한 필요한 경우 싸이썬(파이썬을 C로 변환), PyPy(JIT 가속 파이썬 코드용) 등의 다양한 툴을 통해 순수한 파이썬 코드의 속도를 높이는 방법도 있다. 궁극적으로 파이썬이 머신러닝에 매력적인 이유는 하나의 기능이 아니라 학습과 사용이 쉬운 언어, 광범위한 머신러닝 사용례를 다루는 서드파티 라이브러리 생태계, 수행 중인 작업에 걸맞은 성능 등 패키지 전체의 특성 때문임을 알 수 있다. ciokr@idg.co.kr 
2018.05.04

머신러닝에 파이썬을 즐겨쓰는 4가지 이유

Serdar Yegulalp | InfoWorld
데이터 과학에서 언어, 생태계, 이를 중심으로 하는 개발 프로세스인 파이썬(Python)을 선호하게 된 이유가 무엇일까? 파이썬은 스크립트 작성과 프로세스 자동화, 웹 개발, 일반 애플리케이션 등 여러 소프트웨어 개발 영역에서 오랫동안 인기를 얻었다. 최근에는 머신러닝(Machine Learning) 언어로도 주목받고 있다. 머신러닝 분야에서 파이썬이 각광 받는 4가지 이유를 살펴보자.



프로그래밍이 단순해진다
첫 번째 이유는 파이썬의 성공 스토리와 관련돼 있다. 이 언어는 간소함을 제공한다. 파이썬이 처음 만들어졌을 때 주된 목표는 읽고 쓰기 쉬운 언어였다. 코드는 쓰는 것보다 읽는 경우가 많고, 특히 팀이 바뀌는 경우에는 더 그렇다. 다른 개발자로부터 여러 서드파티 구성 요소를 사용하거나 사용자 비즈니스 로직이 상당한 머신러닝 애플리케이션을 넘겨 받을 경우 가능한 적은 인지 오버헤드가 추가되는 언어로 작성하는 것이 도움이 된다. 좋은 파이썬 코드는 이런 필요를 충족하며 다른 언어보다 더 뛰어나다.

머신러닝 라이브러리가 있다
파이썬이 머신러닝 툴이 된 두 번째 이유는 사용할 수 있는 풍부한 머신러닝 라이브러리와 프레임워크다. 유명한 사이킷-런(Scikit-learn)부터 텐서플로우(TensorFlow), CNTK, 아파치 스파크 MLlib(Apache Spark MLlib) 등 알려진 머신러닝 및 딥 러닝(Deep Learning) 프레임워크 대부분이 파이썬의 영역에 있거나 파이썬 API를 지원한다. 특히 파이토치(PyTorch) 등은 그 이름에서 알 수 있듯이 특별히 파이썬을 염두에 두고 만들어졌다. 그러면서도 성능을 타협하지 않았다.

파이썬의 풍부한 라이브러리 생태계를 활용하면 하나의 명령으로 여러 프레임워크를 작업 공간에 설치할 수 있다. 파이썬 자체가 이를 적극 지원하기도 한다. 최근 파이썬은 여러 머신러닝 프레임워크에 필요한 플랫폼 전용 바이너리를 배포하기 쉽도록 라이브러리 패키징 메커니즘을 변경했다. 물론 이렇게 해도 부족하다면 우회책이 있다. 아나콘다(Anaconda) 같은 배포판은 파이썬의 생태계 밖에서 바이너리 의존성 등의 문제를 해결하기 위해 자체적인 패키징 메커니즘을 갖고 있다.


메모리를 대신 관리한다
파이썬 같은 수준 높은 언어가 제공하는 앱스트랙션과 이것이 활용되는 작업은 여러 다른 영역에서 장점이 된다. 예를 들어 파이썬은 프로그래머 대신 세부적인 메모리 관리를 수행하므로 결과적으로 개발자에게 개발 관련 문제에 집중할 수 있는 정신적인 여유를 제공한다. 목록, 설정, 사전, 투플(Tuple) 등 파이썬에 내장된 구성물과 데이터 앱스트랙션은 모두 파이썬 런타임을 통해 메모리를 관리한다. 자바(Java)도 같은 방식이지만 파이썬은 일반적으로 자바보다 정확하고 사용자와 최종 결과 사이에 절차적 장벽의 수가 더 적다.

머신러닝 앱은 파이썬의 메모리 관리 구조를 실제 연산 작업보다는 애플리케이션의 로직 또는 데이터 흐름 정리를 위한 용도로 더 활용한다. 연산 작업이 많이 필요한 리프팅(Lifting) 대부분은 NumPy 같은 외부 라이브러리가 처리한다. 하지만 언어와 런타임이 제공하는 앱스트랙션 덕분에 이들을 위한 메모리 관리 작업이 사용자의 동작보다 여러 계층 아래에서 자동으로 처리된다.

파이썬이 내부에서 메모리를 관리하는 방식은 자세히 들여다볼만한 가치가 있다. 파이썬은 효율성 대신에 사용 편의성을 택했지만 상황에 따라 그 방식이 명확하지 않을 때도 있다. 따라서 만약 완벽하게 최고의 성능을 내고 싶다면 결국 "뚜껑을 열고" 제공되는 더 낮은 수준의 앱스트랙션으로 작업해야 한다.

이와 관련된 내용을 테아노(Theano) 머신러닝 라이브러리에 관한 문서의 "파이썬 메모리 관리(Python Memory Management)" 섹션에서 확인할 수 있다. 성능을 최적화하는 또 다른 방법은 싸이썬(Cython)이다. 이 유틸리티 라이브러리를 통해 파이썬 코드를 C로 변환할 수 있다. 싸이썬을 통해 "바닐라" 파이썬과는 다른 방식으로 C의 메모리 관리 및 데이터 구성물에 직접 액세스할 수 있다.

파이썬이 느려도 상관없다
많은 사람이 파이썬을 "편리하지만 빠르지는 않다"고 말한다. 대부분은 맞는 말이다. 파이썬은 개발 편의성 대신에 순수한 성능을 타협하는 것이 일반적이다. 그렇다면 파이썬이 가장 빠른 언어가 아닌데도 머신러닝 같은 연산 집약적인 작업에 사용하는 이유는 무엇일까? 대답은 간단하다. 연산 집약적인 작업을 처리하는 것은 파이썬이 아니기 때문이다.

파이썬 머신러닝 애플리케이션에서 수행하는 실제 연산작업 대부분은 일반적으로 C, C++, 자바 등으로 작성한다. 파이썬은 라이브러리를 통해 이를 정리하고 상호작용할 뿐이다. 파이썬에서 구동하는 애플리케이션의 여러 부분은 일반적으로 성능에 민감하지 않으며 설정 및 해체, 명령 및 제어, 구성요소들 사이의 조정, 로깅(Logging) 및 보고 등을 처리한다.

하지만 애플리케이션이 파이썬과 가속화된 라이브러리 영역의 사이를 자주 오간다면 파이썬이 외부 라이브러리를 사용하기 때문에 성능 문제로 이어질 수 있다. 이런 환경 전환은 성능 문제를 야기하므로, 개발자는 파이썬과 외부 API 사이의 이동 횟수를 최소화하는 것이 좋다. 즉, 이 문제는 머신러닝만의 문제가 아니라 파이썬과 프로그래밍의 일반적인 안티패턴이다.

또한 필요한 경우 싸이썬(파이썬을 C로 변환), PyPy(JIT 가속 파이썬 코드용) 등의 다양한 툴을 통해 순수한 파이썬 코드의 속도를 높이는 방법도 있다. 궁극적으로 파이썬이 머신러닝에 매력적인 이유는 하나의 기능이 아니라 학습과 사용이 쉬운 언어, 광범위한 머신러닝 사용례를 다루는 서드파티 라이브러리 생태계, 수행 중인 작업에 걸맞은 성능 등 패키지 전체의 특성 때문임을 알 수 있다. ciokr@idg.co.kr 
X