What’s New in Core ML 2

iOS/Tip 2018. 8. 21. 07:26
반응형

[최종 수정일 : 2018.08.16]

원문 : https://www.appcoda.com/coreml2/

What’s New in Core ML 2

Core ML은 애플의 머신러닝(Machine Learning) 프레임워크 입니다. 작년에 발표된 Core ML은 개발자들에게 몇 줄의 코드만으로 강력하고 똑똑한 머신러닝 기능을 앱에 통합할수 있는 방법을 제공합니다. 올해, WWDC 2018, 애플은 Core ML 2.0을 발표하였습니다 - Core ML의 차기버젼은 모델의 크기 최적화, 성능 개선하여 프로세스를 간소화하는데 중점을 두고, 개발자에게 그들만의 Core ML 모델을 사용자정의 할수 있는 능력을 제공합니다.

이 튜토리얼에서, Core ML 2.0에서 소개된 모든 새로운 기능과 머신러닝 앱을 적용할수 있는 방법을 알려줄것입니다. Core ML을 처음 접하는 경웨, 튜토리얼으로 익숙해 지는 것을 추천합니다. 이미 익숙한 경우라면, 시작해 봅시다!!

주의 
이 기능들을 테스트하기 위해서, 여러분의 맥(Mac0에 macOS Mojave가 설치되어 있어야하며, 또한, coremltools beta가 설치되어 있어야 합니다. 만약 없더라도 걱정하지 마세요. 이 튜토리얼에서 나중에 다운로드 하는 방법을 설명할 것입니다.

빠른 요약(A Quick Recap)

앱 스토어에는 강력한 작업을 수행할수 있는 많은 훌륭한 앱이 있습니다. 예를들어, 텍스트를 이해할수 있는 앱을 찾을수 있습니다. 또는 기기의 모션을 기반으로 여러분이 어떤 일을 하는지 알수 있는 앱도 있을것입니다. 더욱이(Even further) 이전 이미지를 기반으로 이미지에 필터를 적용하는 앱이 있습니다. 이러한 앱들은 공통점이 한가지 있습니다 : 그것들은 모든 머신러닝의 예제이고 Core ML 모델로 만들수 있습니다


Core ML은 개발자가 앱에 간단히 머신러닝 모델을 통합할 수 있게 해줍니다. 대화 내용을 이해하거나 다른 오디오를 인식할수 있는 앱을 만들수 있습니다. 게다가(furthermore), 애플은 두개의 프레임워크를 통해서 실시간 이미지 분석과 자연어 이해하기에 대해 추가적인 단계를 진행할수 있도록 만듭니다. : 비젼(Vision) 과 자연어(Natural Language)

비젼(Vision)과 자연어(Natural Language)이 Core ML을 기반으로 만들어졌기에, VNCoreMLRequest API와 NLModel API를 사용하여, 앱의 ML 기능을 크게 향상시킬수 있습니다.

올해에, 애플은 Core ML 개발자를 돕기위해서 3가지 핵심에 중점을 두었습니다.

  1. 모델 크기
  2. 모델의 성능
  3. 모델 사용자정의

이러한 3가지 핵심을 살펴봅시다.

모델 크기(Model Size)

Core ML의 큰 장점 하나는 모든것이 기기에서 처리된다는 것입니다. 이 방법은, 사용자의 프라이버시가 언제나 안전하고 어디에서든지 계산을 처리할 수 있습니다. 하자민, 보다 더 정확한 머신러닝 모델이 사용되면, 크기가 더 커질수 있습니다. 앱에서 이러한 모델을 포함(import)하면 사용자의 기기에 많은 공간을 차지할 수 있습니다.

애플은 개발자들에게 Core ML 모델을 양자화(quantize)하는 도구를 제공하기로 결정했습니다. 모델을 양자화(Quantizing) 하는 것은 더 작은 형식으로 숫자를 저장하고 계산하는데 사용하는 기술을 말합니다. 모든 머신러닝 모델의 핵심(at the core root)에서, 그것은 단지 숫자를 계산하는 기계일뿐입니다. 숫자를 줄이거나 공간을 덜 차지하는 형식으로 저장하는 경우에, 모델의 크기를 획기적(drastically)으로 줄일수 있습니다. 이로 인해 실시간 메모리 사용량이 줄어들고 계산이 빨라집니다!

참고
양자화(Quantization)은 샘플링을 통해 획득한 데이터에 숫자로 된 값을 할당하는 것을 의미

머신 러닝 모델의 핵심 3가지

  • 모델의 숫자(The number of models)
  • 가중치의 숫자(The number of weights)
  • 가중치의 크기(The size of the weights)

모델을 양자화(Quantizize) 할때, 가중치의 크기(size of the weight)를 줄이고 있습니다. iOS 11에서, Core ML 모델은 32비트 포델로 저장되었습니다. iOS 12에서, 애플은 모델을 16비트와 8비트 모델로 저장할수 있는 기능을 주었습니다. 이것을 이 튜토리얼에서 보게 될 것입니다.

가중치(weights)에 대해서 익숙하지 않는 경우에, 좋은 예가 있습니다. 집에서 슈퍼마켓으로 간다고 합시다. 제일먼저, 어떤길로 갈것인지 선택할수 있습니다. 두번째, 이미 마켓으로 가는방법을 알고 있기 때문에,슈퍼마켓으로 가는 가장 짧은 길을 찾으려고 할것입니다. 세번째로, 이전의 2개의 경로를 알고 있기 때문에, 더 짧은 경로를 선택할 것입니다. 마켓에 갈때마다, 시간이 지날수록 더 짧은 길을 선택하는 것을 배우게(learn)될 것입니다. 어떤 경로를 선택해야 하는지 아는 것을 가중치(weights)라고 합니다. 따라서(Hence), 가장 정확한 경로는, 가중치(weights)가 가장 큰 것입니다.

실천해 봅시다. 코드를 짤 시간입니다.

가중치 양자화(Weight Quantization)

예제에서, 데모를 위해 Inceptionv3 라는 인기 있는 머신러닝 모델을 사용합니다. 이곳에서 Core ML 포멧 모델을 다운로드 할 수 있습니다.

모델을 열면, 94.7MB에 가까운 공간을 차지하고 있는 것을 볼수 있습니다.


이 모델을 양자화(quantize)하기 위해서 파이선 패키지 coremltools를 사용할 것입니다. 어떻게 하는지 봅시다!

기기에 python이나 pip가 설치되어 있지 않은 경우에, 이곳에서 설치 순서를 배울수 있습니다.

먼저, coremltools의 베타버젼이 설치되어 있어야 합니다. 터미널을 열고 아래와 같이 입력합니다.

pip p install coremltools==2.0b1

다음과 같은 출력 결과를 보게될 것입니다.


이 명령어는 Core ML 툴의 베타 1의 베타 버젼을 성공적으로 설치합니다. 다음 단계에는 파이썬이 필요합니다. 걱정하지 마세요, 그것은 정말 간단하고 많은 코드가 필요하지 않습니다! 파이썬 에디터를 열거나 터미널에서 처리하세요. 먼저, coremltools 패키지를 포함(import)합니다. 터미널에서 python을 입력하고 나서 편집기가 보이면 다음과 같이 입력합니다.

import coremltools
from coremltools.models.neural_network.quantization_utils import *


이것은 Core ML 도구 패키지와 모든 양자화 유틸리티를 포함(import)합니다. 다음으로, model 변수를 정의하고 방금 다운로드 받은 Inceptionv3.mlmodel의 URL을 설정합니다.

modelm  = coremltools.models.MLModel('/PATH/TO/Inceptionv3.mlmodel')


모델을 양자화하기 전에(두줄만 필요합니다), 신경망(neural network)에 대한 배경지식을 알아봅시다.

신경망(neural network)는 다른 레이어들로 구성되어 있습니다. 이러한 레이어들은 많은 매개별수를 가진 수학 함수일 뿐입니다. 이러한 매개변수를 가중치(weights)라고 합니다.


가중치(weights)를 양자화(quantize)할때, 가중치의 최소값과 최대값을 가져와서 매핑(map)합니다. 그것들을 매핑(map)하는 많은 방법이 있지만 가장 일반적으로 사용되는 것은 선형(linear)과 조회(lookup) 입니다. 선형 양자화(Linear Quantization)는 매핑(map) 할때 가중치를 고르게 (evenly)하고 줄여줍니다. 양자화 테이블 조회(Lookup Table Quantization)에서, 모델은 테이블을 구성하고 유사성을 기반으로 가중치 그룹화하고 줄여줍니다.

복잡하게 들리더라도 걱정하지마세요. 우리가 해야 할 것은 비트(bits) 수와 모델을 표현할 알고리즘을 선택하는 것입니다. 우선 모델을 선형으로 양자화하도록 선택한 경우에 어떻게 되는지 봅시다.

lin_quant_model = quantize_weights(model, 16, "linear")

위 코드에서, Inceptionv3 모델의 가중치를 16비트로 양자회하고 선형 양자화(linear quantization)를 사용합니다. 코드를 실행하면 프로ㅡ램이 양자화하는 모든 레이어들의 긴 목록을 제공합니다.


모델을 저장하고 원래 모델과 비교해보세요. 저장할 위치를 선택하고 다음과 같이 입력하세요.

lin_quant_model.save('Path/To/Save/QuantizedInceptionv3.mlmodel')

두 모델을 열고 크기를 비교하세요.


inceptionv3 모델을 16비트 포멧으로 표현할때, 작은 공간을 차지하게 됩니다.

하지만, 가중치 양자화(weight quantization)가 무엇인지 아는 것이 중요합니다. 이전에 비유에서, 가중치가 많을수록 정확도가 올라간다고 했었습니다. 모델을 양자화할때, 크기와 함께 모델의 정확도도 줄어듭니다. 양자화(Quantization)는 정확도 교환(accuracy tradeoff)입니다. 양자화된 모델은 가중치의 근사치이며, 양자화된 모델을 실행하고 어떻게 수행하는지 보는 것이 항상 중요합니다.

이상적으로, 우리는 최고의 정확도를 유지하면서 모델을 양자화하길 원합니다. 올바른 양자화 알고리즘을 찾아서 처리할 수 있습니다. 이전 예제에서, 선형 양자화(Linear Quantization)가 사용되었습니다. 이제는 조회 양자화(Lookup Quantization)를 사용하고 무슨일이 일어나는지 봅시다. 이전과 마찬가지로, 터미널에서 다음과 같이 입력합니다.

lut_quant_model = quantize_weights(model, 16, "kmeans")


모델 양자화가 끝났을때, lin_quant_model과 lut_quant_model 모두를 몇가지 샘플 데이터를 통해 실행한 원래 모델과 비교해야 합니다. 이 방법은, 어떤 양자화 모델이 원래 모델과 가장 유사한지 알수 있습니다. 이곳에서 샘플이미지 폴더를 다운로드 하세요. 다음에 오는 줄을 입력하고 모델이 잘 수행되는지 볼수 있습니다.

compare_models(model, lin_quant_model, '/Users/SaiKambampati/Desktop/SampleImages')

이 작업은 시간이 걸리수 있지만 두 모델 모두 처리가 끝나면, 다음과 같은 출력을 보게 됩니다.


상위 첫번째 동의(the Top 1 Agreement)에 관심이 있습니다. 우리 모델과 100% 일치하는 것을 의미하는 100%를 보여줍니다! 원래 모델과 정확히 똑같고 적은 공간을 가지는 양자화된 모델을 가지고 있기 때문에 이는 엄청난 것입니다.

만약 양자화된 테이블 조회(Lookup Table Quantized) 모델과 비교를 원한다면, 프로젝트로 가져올수 있습니다.

compare_models(model, lut_quant_model, '/Users/SaiKambampati/Desktop/SampleImages')


100% 출력되므로 두 모델 모두 호환됩니다! 다른 모델을 양자화하는데 도전해 보세요. 위의 예제에서, Inceptionv3 모델을 16비트 모델로 낮추도록 양자화 하였습니다. 모델을 8비트, 4비트 표현으로 양자화 할수 있는지 계속 확인해 보고 샘플 데이터와 비교해보세요. 어떻게 수행되나요?


위 그림은 선형 알고리즘을 사용하여 Inceptionv3 모델을 1비트 표현으로 양자화했을때를 보여줍니다! 보다시피, 모델 크기는 대폭(drastically) 감소되었지만 정확도로 떨어졌습니다! 사실상, 0%의 정확도로 완전히 부정확합니다. 양자화를 다뤄보고 타협점을 찾으세요(find the happy medium). 양자화된 모델을 테스트 할때 그 수행이 정확한지 항상 확인해야 합니다!

성능(performance)

애플은 다음 단계로 Core ML 2에서의 성능에 중점을 두었습니다. ML 계산을 기기에서 수행하기때문에, 빠르고 정확하길 원합니다. 이것은 꽤 복잡할수 있습니다. 운이 좋게도, 애플은 CoreML 모델의 성능을 개선 시킬수 있는 방법을 제공하였습니다. 예제를 통해서 살펴봅시다.

스타일 변경(Style Transfer)은 기본적으로 이미지를 다른 스타일로 변경하는 머신러닝 앱입니다.기존에 Prisma 앱을 사용해봤다면, 그것은 스타일 변경 예제입니다.


스타일 변경의 인공신경망을 살펴보면, 알아차릴 것입니다. 이 알고리즘에 대한 특정 입력을 설정합니다. 신경망 내의 각 레이어는 원본 이미지에 특정 변형을 추가합니다. 이는 모델이 모든(every) 입력을 받아 출력물에 매핑하여 예측해야하는 것을 의미합니다. 예측(prediction)은 가중치(weights)를 만드는데 도움이 됩니다. 코드는 어떻게 될까요?

// Loop over inputs
for i in 0..< modelInputs.count {
    modelOutputs[i] = model.prediction(from: modelInputs[i], options: options) 
}

위의 코드에서, 각 입력에 대해, 모델에 예측을 만들고 몇가지 옵션(options)을 기반으로 출력을 만들어냅니다(yield). 하지만, 모든 입력을 반복하는데 오랜시간이 걸릴 수 있습니다.

이를 해결하기 위해, 애플은 새로운 Batch API를 도입하였습니다. for반복문과는 다르게, 머신러닝 안의 배치는 모델에 모든 입력이 공급될때이고 정확한 예측이 그 결과가 됩니다. 이는 훨씬 더 적은 시간이 걸릴수 있고 더 중요한 것은, 훨씬 적은 코드가 듭니다.

다음은 위의 for-반복문에 대해 새로운 배치 예측(Batch Predict) API로 작성된 것입니다.

modelOutputs = model.prediction(from: modelInputs, options: options)

그게 전부입니다! 코드 한줄만 있으면 됩니다! 아마도 궁금해 할것입니다. 잠깐! 이전에 이것을 한적이 없나요? 이것은 복잡하게 들립니다. 이것을 어디에서 사용하나요? 그것은 마지막에 맞춤설정(Customization)에서 다룰것입니다.

사용자 정의(Customization)

신경망을 살펴보면, 그것들이 많은 레이어들로 구성되어 있는 것을 볼수 있습니다. 하지만, 신경망을 Tensorflow에서 Core ML로 변환하려고 할때, 몇가지 시나리오가 있을수 있습니다. 또는 Keras에서 Core ML로 파이프라인 일수도 있습니다. 하지만, Core ML이 모델을 정확하게 변환 할수 있는 도구(tools)를 가지고 있지 않을 수도 있습니다.. 이게 무슨 뜻일까요? 다른 예제를 봅시다.

이미지 인식 모델은 복잡한 신경망(Convolutional Neural Network: CNN)을 사용하여 만듭니다. CNN은 고도록 최적화된 레이어층으로 이루어져 있습니다. 신경망을 하나의 포멧에서 Core ML로 변환할때, 각 레이어들을 변형합니다. 하지만, Core ML이 레어를 변환하는 툴을 제공하지 않는 경우가 드물게 있을수 있습니다. 과거에는, 아무것도 할수 없었지만, iOS 12에서, 애플 엔지니어는 Swift에서 자신만의 레이어를 만들수 있는 MLCustomLayer프로토콜을 도입하였습니다. MLCustomLayer으로, Core ML 모델에서 자신만의 신경망 레이어들의 동작을 정의할 수 있습니다. 하지만, 사용자 정의 레이어는 신경망 모델에서만 동작한다는 것을 주목해야 해야합니다

이것이 매우 복잡하게 들리지만, 걱정하지 마세요. 일반적으로 신경망의 모든 복잡도(intricacies)을 이해라기 위해서는 숙련된 데이터 과학자나 머신러닝 엔지니어가 필요하고 자신만의 모델을 작성하는 재능이 있어야 합니다. 이는 튜토리얼의 범위를 벗어난 것이므로, 여기에서 다루지 않을 것입니다.

결론(Conclusion)

Core ML 2.0에서의 새로운 변화들에 대해 요약해 봅시다. 모델을 더 단순하고, 빠르고, 좀 더 사용자정의 가능하도록 하는게 Core ML의 목표(aims) 입니다. 가중치 양자화(weight quantization)를 통해서 Core ML 모델의 크기를 줄이는 방법을 보았으며, 새로운 Batch API를 통해 모델의 성능을 개선하였고, 모델에 대해 사용자정의 레이어를 만드는 예제를 보았습니다. 개발자로써(as developers), 다른 두개의 기법(Batch API와 Custom Layers)보다 더 많은 가중치 양자화(weight quantization)를 사용하게 될것이라 예측합니다.

Core ML 2.0에 대해서 더 자세히 살펴보려면, 여기에 몇가지 좋은 자료들이 있습니다.


반응형
Posted by 까칠코더
,