2020.2-2020.12 | 국내 최초 학부생들이 개발하는 C++ 오픈소스 딥러닝 프레임워크
[WICWIU 개발 Challenge-인터뷰 형식]
질문: 위큐사용경험에대해알려주세요.
답변: 작년 한해 딥러닝 이미지 인식 기반 Fewshot 학습을 통한 이상치 검출이라는 주제로 WICWIU오픈소스를사용해서산학 연구를 진행했습니다.저는 이 프로젝트에서 WICWIU를사용해서사용자 정의Dataset을 만들고, Data Loader쪽 랜덤 블록 알고리즘, 결과 산출 및 실험을 담당하였습니다. 온디바이스라는제한적환경에서회사의 요청 사항으로 이 프로젝트는 WICWIU를이용해서진행하게되었습니다.
질문:위큐사용에어려운점은없었나요?
답변: 처음 WICWIU 처럼 큰 다른 사람이 짠 코드로 만들어진 프로젝트를 이해하는 건 쉽지 않았습니다. 하지만, WICWIU는학부생들이개발했고, 이미안정된오픈소스는아니였기때문에, 버그를 찾고 계속 계발이 필요 했습니다.
질문: 어려운점을 어떻게 해쳐 나갔나요?
답변: 오픈소스에기여하기위해먼저코드를이해하기위해 C++ 프로그래밍 능력의 기초를 쌓기 위해 친구들과 알고리즘 스터디를 만들어서 방학에는 매일 1문제, 학기 중 에는 매주 최소 1문제 이상 꾸준히 공부 하게 되었습니다.또, 딥러닝을 더 잘 이해하기 위해 3학년 때 부터, Calculus2, 선형대수학, 실전프로젝트1, 딥러닝 응용이라는 수업을 수강하였고, DOIT 파이썬, 밑바닥부터 시작하는 딥러닝1, 2, 처음배우는 딥러닝 수학, Pytorch로 배우는 딥러닝과 같은 책을 보고 딥러닝에 대한 이해를 높였고전부는아니지만제가맡은부분을개발할수있을정도로WICWIU 코드에대한분석을할수있었습니다.
질문:위큐의장점은무엇이였나요?
답변: 파이토치나텐서플로우를사용하는것보다는훨씬많이배울수있었습니다. 코드를 이해하기 위해서는 딥러닝에서 정말 밑단이 어떻게 돌아가야 하는지 딥러닝 지식뿐만 아니라 수학적인 부분까지 이해가 필요했기때문입니다.
질문: 어떻게위큐개발자로등록이되었나요?
답변: 이렇게 노력한 결과 저는 프로젝트를 진행하며, 여러 버그를 찾고 고치는 과정을 함께해 WICWIU 개발자로 기여를 인정받게 되었습니다.
제가 해결한 몇가지 버그를 말씀 드리겠습니다.
1) WICWIU안의 Preprocessing 중 RandomCrop과 HorizontalFlipFlop을 할때 channel축과 width height 축의 순서가 잘못 연산되고 있어서 실제로 이미지를 출력하면 해상도가 깨졌고, 이를 통해 학습 결과가 낮게 나오는 현상이 있었습니다. 수학적으로 horizontal flipflop을 어떻게 픽셀을 바꿔야 하는지 증명후 다시 수정해서 코딩하였습니다. 또, 해결하면서 Preprocessing 코드와 결과 뽑는 코드들을 추상화시키고 클래스로 나눠 정리하고, 오픈소스 전체적인 컨벤션을 맞추었습니다.
2) 사용했던 cimg라는 라이브러리에서 축을 어떤 순서로 사용하는지 모르고 그냥 사용해서, 우리 오픈소스에서 축이 흐트러져 이상한 결과를 출력하는 버그를 찾아냈고, 우리 오픈소스에서 축을 넣는 순서대로 변경해서 해결하였습니다.
3) 클래스에서 constructor를 만들어 주지 않아서 segmentation fault 버그가 생겼고, 디버깅에 성공했습니다.
4) ResNet 네트워크 설계를 하면서 인풋과 아웃풋 디멘젼을 맞춰주지 않아서 버그가 있었고, 디버깅에 성공했습니다.
[WICWIU란?]
WICWIU는“What I Create, What I Understand!”의 약자이며,
이론물리학자 리차드 파인만의 “What I cannot create, what I do not understand!”라는 명언에서 영감을 받았다.
WICWIU의 소스코드는 GitHub에서 다운로드가 가능하다.
[WICWIU의 우수성]
국내 대학으로는 최초로 한동대학교에서 공개한 오픈소스 딥러닝 프레임워크 WICWIU를 소개한다. WICWIU 는 다양한 연산자와 모듈, 그리고 일반적인 계산 그래프들을 표현할 수 있는 신경망 구조를 제공하여 Inception, ResNet, DenseNet 등 널리 사용되는 최신 딥러닝 모델들을 구성하기에 충분한 기능을 제공한다. 또한, GPU 기반 대규모 병렬 컴퓨팅을 지원해 빠른 학습이 가능하다. 대부분의 기존 딥러닝 프레임워크들은 파이썬 환경을 중심으로 설계되어 응용시스템 개발에 편리하지만 사용 자가 프레임워크 자체를 수정/확장하거나 모바일 등 다 양한 환경에 이식하기는 쉽지 않다. WICWIU는 일관성 이 높은 C++코드와 API로 구성되어 가독성과 확장성이 우수하다. 모든 API를 C++로 제공하여 C++개발자들이 쉽게 접근 가능하며, 파이썬 기반 프레임워크에 비해 메모리 및 성능 최적화에 유리하다. 따라서, 응용시스템의 개발 외에도 프레임워크 자체를 자원이 제한된 환경에 맞도록 수정하기 쉽다. 특히, 한글 문서를 제공하고 주요 딥러닝 알고리즘을 저수준 코드까지 직접 살펴보면서 이해하거나 수정할 수 있어서 딥러닝에 입문하는 연 구자들이 딥러닝 알고리즘을 직접 체험하거나 경험 많 은 연구자들이 새로운 아이디어를 테스트하기에도 적합 하다. 또한, 한국어 문서를 제공해 국내 개발자들이 쉽게 접근할 수 있다. WICWIU는 Apache 2.0 라이선스를 적용해 어떠한 연구 목적 및 상용 목적으로도 자유롭게 활용할 수 있다.
[WICWIU 구조]
[WICWIU의 기본 환경설정]
WICWIU는 현재 리눅스 환경에서 동작한다. 그러나, 다중스레드 학습 등 일부 기능을 제외하면 표준 C++로 작성되었으므로 윈도우 환경에도 쉽게 이식할 수 있다. GPU 연산을 활용해 신경망 모델을 학습하기 위해서는 NVIDIA cuda toolkit3) 및 cuDNN4) 패키지 를 먼저 설치해야 한다.
[WICWIU의 설치 및 사용법]
프로그램을설치하고사용하는방법은다음과같다.
WICWIU의소스코드는다음 명령을 통해 GitHub 에서다운로드가능하다.
git clone https://github.com/WICWIU/WICWIU
다운로드가 완료 되면 WICWIU/tutorials 아래에 위치한 예제 코드의 경로로이동한후 make 명령을 이용해 컴파일 하고 실행 할 수있다.
현재MNIST, CIFAR, ImageNet 에 대하여 학습 및 인식을 할 수 있는 예제 코드와 모델들이 제공 되고 있다.
예를 들어 WICWIU/tutorials/MNIST 에는 MNIST 필기 숫자 인식을 위한 코드가 예제로 제공 되며 컴파일 및 실행 명령은 다음과 같다.
[WICWIU의 사용 결과]