Search

[WWDC] What’s New in Core ML, Part 1

들어가며

 : 1년 전에 소개된 Core ML은 머신 러닝 모델을 앱에 통합하는 것을 믿을 수 없을 정도로 단순하게 만들어줍니다.
당신의 앱이 이미지의 내용을 이해하거나,
아마도 일부 텍스트를 분석할 수 있는 능력을 가지고 있다면 어떤 훌륭한 새로운 경험을 가능하게 할 수 있을지
당신의 앱이 오디오나 음악에 대해 추론하거나
당신의 동작 활동을 기반으로 당신의 행동을 해석하거나,
그들을 위해 새로운 콘텐츠를 변형하거나 생성할 수 있다면?
 : 이 모든 것, 그리고 훨씬 더 많은 것들이 쉽게 도달할 수 있습니다. 이러한 유형의 기능은 Core ML 모델로 인코딩될 수 있기 때문입니다.
Core ML의 모델들은 수백만 개의 매개 변수를 가지며 많은 양의 데이터에서 학습이 되어 있다고 합니다.
신경망, 트리 앙상블 또는 다른 모델 구조
Xcode에서 모델과 상호 작용하는 건, 단지 코드 몇 줄, 모델을 로드하는 것, 예측하는 것, 때로는 관심 있는 특정 출력을 끌어내는 것 입니다.
Core ML은 일부 상위 레벨 API와 통합되고 Core ML 모델을 제공하면 동작을 사용자 지정할 수 있기 때문에 경우에 따라서는 다시 코드를 쓸 필요가 없다고 합니다. Vision에서는 VNCoreMLRequest 개체를 통해 작업을 수행합니다. 그리고 새로운 자연어 프레임워크에서는 CoreML 모델에서 ML 모델을 인스턴스화할 수 있습니다.
이것이 Core ML입니다.
이번 세션에서는 앱의 관점에서 새로운 것들에 대한 이야기를 진행합니다.
1.
앱을 사용하는 모델의 크기와 수를 줄이면서도 동일한 기능을 사용할 수 있는 방법(Model Size)
2.
단일 모델에서 더 많은 성능을 얻을 수 있는 방법(Performance and Customization)
3.
Core ML을 사용해서 최첨단 머신 러닝 분야에 어떻게 보조를 맞출 수 있는지 결론을 내릴 것

Model Size

 : 당신의 앱 크기를 줄이는 데 도움을 줄 수 있는 코어 ML2의 두 가지 새로운 기능인 quantization와 flexible shapes을 소개하려고 합니다. 그렇다면 Core ML, 왜 모델과 장치에서 배워야 하는가?
Core ML은 네 가지 주요 이점이 제공합니다.
1.
사용자 개인 정보 보호는 충분히 존중
데이터가 사용자의 장치를 벗어나지 않도록 보장합니다.
2.
실시간 성능을 달성하는 데 도움
기계 학습 워크로드에 매우 효율적
3.
인터넷 서버를 유지 보수하고 지불할 필요가 없음
4.
언제든지 어디서나 사용 가능
기계 학습 모델을 장치에 저장한다면 어디서나 사용 가능합니다.
if, 우리는 멋진 지도를 가지고 있고, 지도는 멋진 특징들을 가지고 있다고 해볼게요. 사용자는 일단 지도에 매우 만족해 합니다. 우리는 기기에서 머신 러닝이 제공하는 기능들을 통해 앱에 놀라운 기능을 추가하고자 합니다.
몇몇 Core ML 모델을 훈련시키고 그것들을 앱에 추가합니다. 앱이 더 멋지고 사용자들은 훨씬 더 행복해하겠죠? 하지만 머신 러닝 기능을 추가한 후에 앱이 수십 또는 수백 메가바이터로 커질 수 있습니다.
  곧 앱의 크기가 통제 불능 상태가 될 수도 있습니다.
초기 번들 외부에 보관 가능
사용자는 필요에 따라 다운로드하여 장치에서 컴파일 진행
설치 크기가 변경되지 않았으므로 사용자 만족!
하지만 앱의 모든 Core ML 기능을 다운로드하고 사용하기 때문에 결국 앱의 크기는 여전히 크다!
대신 모델 자체의 크기를 줄임으로써 이 문제를 해결할 수 있다면 더 낫지 않을까요?
이렇게 하면 앱 내에서 모델을 보낼할 경우 더 작은 번들이 제공되고, 다운로드하는 앱에서 모델을 전송하는 대신 더 빠르고 더 적은 다운로드가 가능합니다. 그리고 어떤 경우에도, 당신의 앱은 더 낮은 메모리 공간을 누릴 것이다.
  메모리를 적게 사용하는 것이 앱의 성능에 더 좋고 시스템 전반에 좋습니다.
Core ML 앱의 크기를 문제를 더 잘 해결할 수 있는 요소로 분해할 수 있을까?
1.
모델의 개수
당신의 앱이 얼마나 많은 머신 러닝 기능을 가지고 있는지에 달려 있다.
2.
가중치의 개수
가중치의 수는 머신 러닝 문제를 해결하기 위해 선택한 아키텍처에 따라 달라집니다.
가중치는 머신 러닝 모델이 훈련 중에 학습한 정보를 저장하는 장소입니다. 복잡한 작업을 하도록 훈련되었다면, 수천만 개의 가중치를 필요로 하는 모델을 보는 것은 드문 일이 아닙니다.
3.
가중치의 크기
 : 신경망의 경우 가중치를 표시하고 저장할 수 있는 몇 가지 옵션이 있습니다.
1.
iOS 11의 Core ML
신경망은 부동소수점 32비트 가중치를 사용하여 저장되었다.
2.
iOS 11.2의 Core ML
당신의 피드백을 듣고 우리는 반정밀 부동소수점 16-bit 웨이트를 도입했습니다.
따라서 동일한 정확도에 필요한 스토리지의 절반을 앱에 제공합니다.
3.
iOS 12의 Core ML
양자화된 가중치를 사용하면 더 이상 Float 32 또는 Float 16 값을 사용하도록 제한되지 않습니다.
신경망은 8비트, 4비트, 1비트까지 모든 비트를 사용하여 인코딩될 수 있습니다.

Weight Quantization(이해 불가)

Quantization
이러한 가중치는 연속적인 범위에서 모든 값을 취할 수 있습니다.
하나의 가중치가 무한한 수의 가능한 값을 취할 수 있다는 것을 의미합니다.
신경망에서는 Float 32를 사용하여 가중치를 저장합니다. 이 가중치는 연속적인 성질을 더 잘 표현하기 위해 수십억 개의 값을 가질 수 있다는 것을 의미합니다.
BUT, 신경망은 더 낮은 정밀도로 작동
예를 들어, 여기서 양자화는 이 연속적인 가중치 스펙트럼을 256개의 가능한 값으로 바꾸었다. 따라서 양자화 전에 가중치는 가능한 모든 값을 취합니다. 양자화 후에는 256개의 옵션만 있습니다.
이제 이 작은 세트에서 가중치를 뺄 수 있기 때문에 Core ML은 가중치에 대한 저장된 정보가 8비트만 있으면 됩니다.
예를 들어, 우리는 네트워크가 56개의 다른 값들 중 하나 대신에, 8개의 값을 취하도록 제한할 수 있어요. 이제 8가지 옵션만 있으므로 모델을 저장하려면 Core ML의 무게당 3비트 값이 필요합니다.
이제 가중치를 나타내기 위해 선택하는 방법에 대한 몇 가지 세부 사항이 있습니다. 그들은 이 범위에서 균일하게 분포될 수 있으며, 이 경우 Lookup 테이블 양자화 대신 선형 양자화가 있으며, 이 값들을 임의의 방식으로 이 범위에 분산시킬 수 있습니다.
2,500만 개의 훈련된 매개 변수 → 32비트 float를 사용하여 이를 표현해야 합니다. → 100메가바이트가 넘음
이것을 8비트로 양자화한다면? 구조는 변하지 않는데 2,500만 개의 매개 변수를 가지고 있지만 단일 가중치를 저장하는 데 1바이트만 사용하고 있어서 모델 크기가 4배 줄어듦! 26MB
무게당 4비트만 사용하는 양자화된 표현을 사용하면 더 작은 모델을 만들 수 있습니다!
하지만 어떻게 양자화된 모델을 얻을 수 있을까요?
Core ML 형식의 신경망이 있는 경우 Core ML 도구를 사용하여 이를 양자화 가능합니다. Core ML 2는 자동으로 양자화되며 양자화된 모델을 교육할 수도 있어요!
→ 기존 모델 재교육 가능
→ 양자화된 모델을 얻은 후에 평소와 같이 Core ML로 변환 가능
→ 모델을 사용하기 위한 인터페이스는 전혀 변경되지 않아요.
1.
우리는 양자화된 모델이 원래 참조 부동소수점 모델의 더 낮은 정밀도 근사치를 가지고 있다는 것을 항상 고려
양자화된 모델이 모델의 크기에 비해 정확도가 높다는 것을 의미
2.
매우 활발한 연구 분야
항상 정량화된 모델의 정확성을 확인하고 참조된 부동소수점 버전과 비교하여 앱 및 사용 사례에 적합한 관련 데이터 및 폼 메트릭스를 제공하는 것이 좋습니다.

Demo

스타일 전송 예시에서 신경망은 그림이나 다른 이미지를 보고 학습한 스타일을 사용하여 사용자 이미지를 렌더링하도록 훈련했습니다.
여러 스타일들
일반
Wave 버전
이 앱이 어떻게 Xcode로 구축되었는지 봅시다. 이 스타일링을 수행하기 위해 Core ML과 비전 API를 사용합니다.
네 가지 Core ML 모델인 시티, 글래스, 오일, 웨이브스를 Xcode로 번들로 가지고 있습니다.
 이것들은 양자화된 모델로 보여지므로, 이 모델들 각각은 디스크 상의 이 공간의 6.7 MB
 양자화된 모델로 전환함으로써 메모리를 절약할 수 있습니다.
그래서 저는 먼저 Glass 스타일에 초점을 맞추고 이러한 스타일에 대해 다양한 양자화 버전이 어떻게 작동하는지 보고 싶습니다.
프로젝트 안에 끌어넣고 앱 다시 실행!
이미 6 또는 7메가바이트였던 8비트 버전이 1.7메가바이트로 내려갔습니다. 4비트를 사용하면 훨씬 더 절약할 수 있으며, 이제 모델은 1메가바이트 미만입니다.
 : 이제 앱으로 돌아가 봅시다. 글라스 스타일을 적용해볼게요!
8비트 양자화 방법은 매우 솔리드하기 때문에 변화가 크게 없습니다.
Glass 3bit 버전
Glass 2bit 버전
그럼 우리 앱에서 많은 공간을 차지하던 모델의 부동소수점 버전을 모두 제거하고 4비트 버전으로 교체해봅시다.
 : 이제 마지막으로 앱을 실행해 보겠습니다.
처음 : 32비트로 된 거대한 모델 → 총 앱 크기 27MB
중간 : 4비트 모델로 전환 → 총 앱 크기 3.4MB
 양자화를 통해서 매우 미세한 수준에서 가중치를 줄임으로써 앱 크기를 줄였습니다.
이제 애플리케이션에 필요한 모델 수를 줄일 수 있는 방법을 알아보겠습니다.
가장 간단한 경우, 당신의 앱에 세 가지 기계 학습 기능이 있다면, 당신은 세 가지 다른 기계 학습 모델이 필요합니다.
그러나 경우에 따라서는 두 가지 다른 기능을 지원하기 위해 동일한 모델을 사용할 수 있습니다.
스타일 전송, 다중 작업 모델에 대한 Turi Create 세션에 대한 예
경우에 따라 Core ML의 유연한 모양 및 크기라는 새로운 기능을 사용할 수 있습니다.
다른 이미지 해상도에서 동일한 스타일을 실행하려면 어떻게 해야할까? 다른 이미지 크기로 동일한 네트워크를 실행하려면 어떻게 해야 할까?
우리가 개발자로서 할 수 있는 것은 더 낮은 해상도의 입력뿐입니다. 또는 이미지 크기를 조정하고 처리한 다음 다시 스케일업하는 것입니다.
 과거에 그랬었음
과거에는 모델을 복제하여 두 가지 버전을 만들 수 있었습니다. 하나는 표준 정의용 다른 하나는 고화질용입니다. 그리고 이것은 물론 우리의 앱이 두 배나 더 크다는 것을 의미합니다.
우리는 Flexible Model을 도입하고 있습니다.
Flexible Model을 사용하면, 더 많은 해상도를 처리할 수 있는 단일 모델을 만들 수 있습니다.
전체 해상도의 크기는 모델도 유연한 해상도를 받아들입니다.
즉, 이제 단일 모델을 보내고 중복 코드를 가질 필요는 없습니다.
장점
1.
표준 화질과 고화질 사이에서 전환해야 하는 경우 모델을 처음부터 다시 로드할 필요가 없다.
2.
크기만 조정하면 되므로 훨씬 더 빠르게 전환할 수 있다.
모형의 유연성을 지정하는 두 가지 옵션이 있습니다.
1.
치수에 대한 범위를 정의하여 최소 너비 및 높이와 최대 너비 및 높이를 정의할 수 있습니다.
2.
사용할 모든 모양을 열거할 수 있습니다. → Better performance
이제 어떤 모델이 유연합니까?
따라서 우리는 여전히 코어 ML이 유연한 크기로 사용하는 모델의 수를 가지고 있으며, 가중치의 크기는 양자화에 의해 줄일 수 있다.
하지만 무게의 수는 어떨까요?
Core ML은 항상 머신러닝 문제에 적합한 크기의 모델을 선택하는 데 도움을 줍니다. Core ML은 이 세 가지 요소를 사용하여 앱의 크기를 해결하는 데 도움을 줄 수 있습니다.

Performance and Customization

성능 및 사용자 정의의 새로운 기능을 소개합니다.
처음부터 코어 ML의 기본 설계 원칙 중 하나는 앱에 가능한 최고의 성능을 제공해야 한다는 것이었습니다. 그리고 그 목표에 따라, 저는 당신의 앱이 어떤 애플 기기에서든 빛을 발할 수 있도록 돕는 Core ML의 새로운 기능을 강조하고 싶습니다.
앱의 관점에서, 그것은 입력의 이미지를 가져와서 단순히 양식화된 이미지를 반환합니다.
이것을 가능하게 하는 두 가지 주요 구성 요소가 있습니다.
1.
이 스타일을 적용하는 데 필요한 특정 매개 변수를 저장하는 MLModel 파일
2.
MLModel과 이미지를 가져와 결과를 생성하는 데 필요한 계산을 수행하는 추론 엔진
모델은 계층이라고 불리는 일련의 수학적 연산으로 구성된 신경망의 한 예
각 레이어는 이미지에 일부 변환을 적용하여 최종적으로 양식화된 출력을 생성
모형은 특정 변환과 적용할 스타일을 결정하는 각 레이어에 대한 가중치를 저장
Core ML 신경망 추론 엔진은 이러한 계층 각각에 대해 고도로 최적화된 구현을 가지고 있습니다.
GPU에서 MTL 셰이더를 사용합니다.
CPU에서 Accelerate, the proficient calculation을 사용할 수 있습니다. 그리고 모델, 장치 상태 및 기타 요인에 따라 계산의 다른 부분을 하드웨어의 다른 부분으로 동적으로 보낼 수 있습니다.
또한 네트워크에서 계층을 융합할 수 있는 기회를 찾을 수 있으므로 필요한 전체 계산이 줄어듭니다.
과거에는 이와 같은 워크로드가 있으면 다음과 같은 작업을 수행해야 했습니다. 기존 Core ML 예측 API에 대한 호출을 간단한 for loop으로 마무리했습니다.
  입력들의 배열 위에 루프하고, 출력들의 배열들을 생산합니다.
어떻게 애플의 기술을 활용하여 이 스타일 전송을 효율적으로 수행하는지 알아보겠습니다.
각각의 이미지에 대해, 우리는 일종의 전처리 작업을 해야 할 것입니다. 다른 것이 없다면, 우리는 데이터를 GPU로 보내야 합니다.
일단 그렇게 하면, 우리는 계산을 하고 출력 이미지를 생성할 수 있다. 그러나 GPU에서 데이터를 검색하여 앱으로 반환해야 하는 후 처리 단계가 있습니다.
이 그림을 개선하는 핵심은 GPU 파이프라인의 거품을 제거하는 것이다.
따라서 두 가지 주요 이유로 성능이 향상됩니다.
1.
GPU가 유휴 상태일 때 시간이 없기 때문에 전체 컴퓨팅 시간이 줄어듭니다.
2.
GPU가 지속적으로 작동하기 때문에 더 높은 성능 상태에서 작동할 수 있고 각 특정 출력을 계산하는 데 필요한 시간을 줄일 수 있습니다.
하지만 Core ML에서 가장 매력적인 점은 이와 같은 세부 사항에 대해 전혀 걱정할 필요가 없다는 것입니다. 사실, 당신의 앱에 대해 당신이 정말로 걱정하는 것은 오랜 시간에서 짧은 시간으로 가는 것이다.
그래서 올해 우리는 당신이 정확히 이것을 할 수 있게 해주는 새로운 배치 API를 소개할 것이다.
한 줄의 예측은 입력의 배열인 입력을 소비하고 출력의 배열을 생성합니다. 나머지는 Core ML이 알아서 할 것입니다.
[스타일 전송 예제 : 27분]
새로운 배치 API가 눈에 띄게 개선되었습니다. 많은 수의 예측이 필요한 경우 새로운 API를 사용하여 Core ML에 계산을 가속화할 수 있는 모든 기회를 제공하십시오.
Core ML은 여전히 성능이 뛰어나고 사용하기 쉬울 것입니다.
그 안에 말이 들어있나요?
 : 글쎄요. 어려운 것 같아요.
이젠 이 문제에 대한 제 견해가 바뀌었습니다.
이 최첨단 연구는 이런 종류의 질문에 대답할 수 있습니다! 몇 분 후면 말 분류기가 나옵니다!
새로운 말 찾기 모델
신경망은 고도로 최적화된 일련의 계층으로 구성되어 있습니다. 그것은 일련의 계층이며, 우리는 추론 엔진에서 각 계층에 대해 고도로 최적화된 구현을 가지고 있습니다.
하지만 Core ML에서 지원되지 않는 계층이 있다면 어떨까요? 과거에는 기다려야 하거나 다른 모델이 필요했습니다. 하지만 이 층이 말을 찾는 핵심 층이라면 어떨까요? 기다릴 여유가 있나요?
 머신 러닝의 속도를 고려할 때, 이것은 심각한 장애물이 될 수 있다.
신경망 계층이 없어진 경우, 구현체를 제공할 수 있습니다.
모델 내에서 사용자 지정 계층은 구현 클래스의 이름인 AAP Custom을 저장합니다.이 경우에는 AAP Custom은 말 레이어입니다. 구현 클래스는 추론 엔진에서 누락된 구현의 역할을 채웁니다. 계층이 Core ML에 내장되어 있는 것처럼, 여기서 제공되는 구현은 일반적이며 새로운 계층의 모든 인스턴스에 적용 가능해야 합니다.
파일이 런타임에 앱에 포함하기만 하면 됩니다. 그런 다음 이 특정 레이어에 대한 매개 변수는 모델에 대한 나머지 정보와 함께 ML 모델에 캡슐화됩니다.
사용자 지정 계층을 구현하는 것은 간단합니다.
1.
MLCustomLayer 프로토콜을 만들기
2.
ML 모델에 저장된 데이터를 기반으로 초기화하는 방법을 제공
3.
레이어의 출력을 위해 할당해야 할 공간을 알려 주는 방법 제공
4.
수행하는 방법 제공
전체 모델의 성능을 저하시키지 않고 유연성을 추가할 수 있어요.
프로토콜에는 선택적 방법이 포함되어 있습니다.
→ 레이어의 모델의 MTL 셰이더 구현을 제공.
추가 인코딩이나 GPU와의 여러 번의 이동으로 인한 추가 오버헤드가 발생하지 않습니다.
신경망 모델의 발전이 아무리 빠르더라도 Core ML을 따라잡을 수 있는 방법이 있습니다.
하지만 한계가 있어요.
사용자 지정 계층은 신경망 모델에만 작동하며 MLMultiArray인 입력과 출력만 받습니다. 이것은 신경망과 상호작용하는 자연스러운 방법입니다. 그러나 머신 러닝 분야는 이 분야에서만 발전하는 것에 국한되지 않는다.
머신 러닝 앱은 신경망을 사용하여 이미지를 유사성 공간에 내장한 다음 가장 가까운 이웃 방법이나 지역성에 민감한 해싱을 사용하여 유사한 이미지를 검색할 수 있습니다.
모델은 오디오와 모션 데이터를 결합하여 항상 링을 닫지 않는 사람에게 필요한 격려를 제공할 수 있습니다.
또는 아직 상상조차 하지 못한 완전히 새로운 모델 유형으로 사용자에게 새로운 경험을 제공합니다.
이러한 모든 경우에, Core ML의 단순성과 휴대성을 확보할 수 있다면 좋을 것입니다. 그래서 우리는 맞춤형 모델을 소개하고 있습니다.
Core ML 사용자 지정 모델을 사용하면 Core ML 내부에 없는 계산의 일부 구현을 캡슐화할 수 있습니다.
사용자 지정 계층과 마찬가지로 모델은 구현 클래스의 이름을 저장합니다.
클래스는 이러한 유형의 모델에 대한 일반 추론 엔진의 역할을 채웁니다.
그런 다음 이전과 마찬가지로 파라미터가 ML Model에 저장됩니다.
이를 통해 코드를 터치하지 않고도 앱에서 모델을 asset으로 업데이트할 수 있습니다.
또한 사용자 정의 모델을 구현하는 것도 간단합니다.
우리는 프로토콜인 ML Custom Model을 노출합니다.
ML 모델에 저장된 데이터를 기준으로 초기화하는 방법을 제공합니다.
입력에 대한 예측을 계산하는 방법을 제공합니다.
이 특정 모델 유형에서 최적화할 수 있는 기회가 있는 경우 배치 구현을 제공하는 선택적 방법이 있습니다.
만약 그렇지 않다면, 우리는 단일 예측을 for 루프에서 호출할 것입니다.
당신의 앱에서 사용자 정의 모델을 사용하는 것은 다른 Core ML 모델과 대체로 동일한 워크플로우입니다. Xcode에서 사용자 정의된 구성 요소가 있는 모델에는 간단한 설명과 함께 필요한 구현의 이름을 나열하는 종속성 섹션이 있습니다. 앱에 이것들을 포함하기만 하면, Core ML를 사용할 준비 완료 입니다!
예측 API는 단일 예측이든 일괄 예측이든 변경되지 않습니다.
  따라서 사용자 지정 계층과 사용자 지정 모델을 사용하면 머신 러닝의 빠른 속도를 따라잡는 데 필요한 flexiable을 희생하지 않고도 Core ML의 성능과 단순성을 사용할 수 있습니다.
새로운 신경망 레이어의 경우,
사용자 지정 레이어를 사용하면 Core ML의 신경망 추론 엔진에 이미 존재하는 많은 최적화를 사용할 수 있습니다.
사용자 지정 모델은 유형 및 기능에 대해 더 유연하지만 사용자 측에서 더 많은 구현 작업이 필요합니다.
두 가지 유형의 사용자 정의 모두 모델 매개 변수를 ML 모델에서 캡슐화할 수 있으므로 모델을 휴대할 수 있고 코드를 더 쉽게 만들 수 있습니다.
 Core ML은 앱 크기를 줄이고 성능을 향상시키며 머신 러닝의 최신 개발로 flecibility와 compatibility을 보장하는 많은 새로운 기능을 가지고 있습니다.
이번 세션에서는
1.
양자화가 모델 크기를 어떻게 줄일 수 있는지
2.
새로운 배치 API가 어떻게 더 효율적인 처리를 가능하게 할 수 있는지
3.
사용자 지정 계층과 사용자 지정 모델이 어떻게 당신의 앱에 최첨단 기계 학습을 가져오도록 도울 수 있는지
보여주었습니다.