스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
머신 러닝 및 AI 모델을 Apple Silicon으로 가져오기
머신 러닝 및 AI 모델이 Apple Silicon의 강력한 성능을 활용하도록 최적화하는 방법을 확인해 보세요. 모델의 온디바이스 배포를 준비하기 위한 모델 변환 워크플로를 살펴보세요. Apple Silicon과 호환되는 모델 압축 기술을 살펴보고, 모델 배포 워크플로의 어느 단계에서 이러한 기술을 적용할 수 있는지 알아보세요. 아울러 저장 공간 크기, 지연 시간, 전력 사용량 및 정확도 사이의 균형에 대해서도 다룹니다.
챕터
- 0:00 - Introduction
- 2:47 - Model compression
- 13:35 - Stateful model
- 17:08 - Transformer optimization
- 26:24 - Multifunction model
리소스
관련 비디오
WWDC24
WWDC23
WWDC22
WWDC21
-
다운로드
안녕하세요, 저는 Qiqi Xiao입니다 Core ML 팀 엔지니어로 일하고 있습니다 오늘은 Core ML 도구의 몇 가지 흥미로운 개선 사항을 살펴보겠습니다 머신 러닝 및 AI 모델을 Apple Silicon으로 가져오는 데 도움이 되는 개선 사항입니다 모델 배포 작업 흐름에는 3가지 주요 단계가 있습니다 저는 준비 단계에 초점을 두고 기기에서 모델을 가장 효율적으로 실행하기 위해 필요한 모든 기능을 추가하는 방법을 설명해 드리겠습니다
이 세션에서는 머신 러닝 모델을 이미 구축해 두었다고 가정합니다 사전 학습 모델, 미세조정된 모델 새로 학습시킬 모델 모두 가능합니다 모델을 새로 학습시키는 방법을 자세히 알아보려면 올해 비디오 ‘Apple GPU에서 머신 러닝 및 AI 모델 학습시키기’를 시청하세요
앱에 모델을 통합하기 위해 작성해야 하는 코드에 대해서는 다루지 않겠습니다 통합 방법을 자세히 알아보려면 아래의 비디오를 시청하세요
시작하겠습니다
Core ML 도구는 오픈 소스 Python 패키지로 Apple 프레임워크에 사용할 모델을 최적화하고 변환하기 위한 유틸리티를 제공합니다 Core ML 도구로 PyTorch 모델을 Core ML 형식으로 변환할 수 있습니다 Apple Silicon에서 실행하기 위해 최적화된 형식이죠
Apple Silicon의 통합 메모리, CPU GPU 및 Neural Engine은 기기에서 짧은 지연 시간으로 머신 러닝 워크로드를 효율적으로 처리합니다 기본적으로 모델을 Core ML 형식으로 변환하고 추론에 Apple 프레임워크를 사용하기만 해도 앱이 Apple Silicon의 강력한 성능을 활용할 수 있습니다
Apple Silicon은 Apple의 모든 플랫폼을 지원하지만 각자 고유한 특징과 강점을 가지고 있습니다 대상 기기나 플랫폼의 저장 공간, 메모리, 컴퓨팅 성능을 종합적으로 고려하는 것이 좋습니다 이러한 요소를 고려하여 사용 사례에 맞게 모델의 크기, 정확도, 지연 시간 요구사항을 조정해야 합니다 모델 준비 단계에서 다양한 선택지와 최적화 방법을 고려하여 최적으로 조정해야 합니다 어떻게 하면 되는지 살펴봅시다 모델 압축부터 시작해 보겠습니다 이 섹션에서는 다양한 압축 기법과 작업 흐름에 대해 알아보겠습니다 그런 다음 Junpei가 스테이트풀 모델 지원에 대해 자세히 설명해 드릴 겁니다 또한 트랜스포머 아키텍처의 최적화에 관해서도 이야기할 겁니다
마지막으로 다중 함수 모델 지원에 대해 소개하겠습니다
먼저 모델 압축에 대해 살펴봅시다
요즘 성능이 좋은 머신 러닝 모델은 규모가 아주 큽니다 더 많은 저장 공간, 긴 지연 시간 많은 전력을 필요로 해서 기기에 효율적으로 배포하기 더욱 어려워졌습니다 선택지는 한 가지 뿐입니다 모델을 압축하여 크기를 줄여야 합니다
먼저 작년에 소개한 가중치 압축 기법을 다시 살펴보겠습니다
첫 번째 기법은 팔레트화라고 합니다 팔레트화에서는 값이 유사한 가중치를 클러스터로 묶어 클러스터의 중심 값을 통해 가중치를 나타냅니다 클러스터 중심은 룩업 테이블에 저장되며 테이블에 대한 N비트 인덱스 맵으로 압축된 가중치를 나타냅니다 이 예시에서는 가중치를 2비트로 압축했습니다
두 번째 기법은 양자화입니다 양자화를 수행하려면 Float 가중치 값을 정수 범위에 선형적으로 매핑합니다 이 정수 가중치와 함께 양자화 매개변수인 스케일과 편향 값이 저장됩니다 이는 나중에 정수를 Float으로 다시 매핑하는 데 사용됩니다
세 번째 기법은 프루닝입니다 프루닝은 모델 가중치의 수를 줄여 더욱 효율적으로 가중치를 나타낼 수 있습니다 가중치 행렬에서 가장 작은 값들을 0으로 설정했습니다 이제 비트 마스크와 0이 아닌 값만 저장하면 됩니다
기존 기법들은 많은 모델에서 잘 작동했습니다 이제 이 기법들을 대형 모델에 적용해 보고 저희가 어떻게 기법을 확장하여 압축을 향상했는지 살펴봅시다
예시용 Stable Diffusion 모델입니다 프롬프트라고 하는 자연어 설명을 받아 설명에 맞는 이미지를 생성하는 모델입니다
변환을 거친 후 가장 큰 모델의 크기가 Float16 정확도에서 5GB인데 이는 iPhone이나 iPad에서 실행하기에는 너무 큽니다 이 모델을 배포하려면 모델을 압축해야 합니다
팔레트화를 사용해 봅시다 비트 수를 조절해 다양한 압축률로 압축할 수 있습니다
예를 들어 8비트 팔레트화로 압축하면 모델의 크기가 Float16 모델의 절반 정도가 됩니다 Mac에서 멋진 이미지를 생성할 수 있습니다 ‘턱시도를 입은 고양이, 캔버스 유화’ 프롬프트로 생성한 결과입니다 하지만 모델을 2GB 미만으로 줄인 후 iPhone 및 iOS와 통합하고 싶습니다 6비트 팔레트화를 적용하면 됩니다 이제 iPad에서 이 모델을 실행할 수 있습니다
4비트 팔레트화는 어떨까요? 좋은 이미지를 얻을 수 없습니다 모델의 정확도가 떨어지네요 어떻게 된 걸까요?
결과를 더 잘 이해하기 위해 팔레트화로 어떻게 표현되는지 다시 살펴봅시다 iOS 17에서는 텐서별 팔레트화만 지원합니다 모든 값이 하나의 룩업 테이블에 클러스터로 묶인다는 겁니다 4비트 팔레트화를 사용하는 경우 클러스터 중심이 16개 뿐이라 전체 텐서로 다시 매핑할 때 세분성이 떨어지고 결과적으로 큰 행렬에서 오류가 발생할 확률이 높습니다 세분성을 어떻게 향상할지 생각해 봅시다
그 전에 머신 러닝 분야에서 자주 사용되는 몇 가지 용어를 소개하겠습니다 가중치는 행렬로 나타낼 수 있습니다 여기에서는 행렬의 행으로 출력 채널을 나타내고 열로 입력 채널을 나타내고 있습니다
전체 텐서를 압축할 수도 있고 각 채널 그룹 또는 각 채널을 압축할 수도 있습니다
행을 더 작은 블록으로 나눌 수도 있습니다 채널보다 작은 단위로 압축하는 겁니다
다이어그램의 왼쪽에서 오른쪽으로 갈수록 세분성이 높아집니다
팔레트화로 돌아와 iOS 17에서는 전체 가중치 텐서를 하나의 룩업 테이블에만 할당할 수 있었습니다 iOS 18에서는 이제 둘 이상의 룩업 테이블에 각 채널 그룹을 할당할 수 있습니다 이를 통해 정확도를 훨씬 높일 수 있습니다
선형 양자화의 경우 iOS 17에서는 스케일과 편향을 채널당 저장할 수 있었지만 iOS 18에서는 양자화 매개변수를 블록당 저장할 수 있습니다
프루닝 기법의 경우에도 이제 더 압축할 수 있습니다
이전에는 Float 정확도에서 0이 아닌 값만 남겨 가중치 수를 줄였지만 이제는 팔레트화나 양자화를 통해 더욱 압축할 수 있습니다 모델 크기를 더욱 줄일 수 있죠 2가지 다른 압축 기법의 특성을 동시에 활용할 수 있습니다 이제 가중치 수를 줄인 채 팔레트화나 양자화를 적용할 수 있습니다
이처럼 확장된 기법을 바탕으로 Python 코드에 팔레트화를 적용하는 예시를 살펴봅시다 먼저 OpPalettizerConfig 객체를 생성합니다 모델을 어떻게 압축할지 설정하는 객체입니다 4비트 팔레트화를 적용하고 클러스터링 모드는 ‘kmeans’ 16개 채널로 구성된 그룹을 룩업 테이블 1개에 할당하겠습니다 따라서 granularity를 ‘per_grouped_channel’로 설정하고 ‘group_size’를 16으로 설정합니다
설정을 완료했으니 OptimizationConfig에 전달하고 palettize_weights 메서드로 모델을 압축합니다
보시는 대로 간단한 프로세스입니다
모델이 어떻게 작동하는지 봅시다 group_size를 16으로 설정하고 고양이 프롬프트를 입력했습니다 이전보다 훨씬 좋은 이미지가 생성되었네요 정확도를 대부분 되찾았다는 의미입니다 크기는 1.29GB에서 1.3GB로 약간 증가했네요 크기가 증가한 이유는 추가된 룩업 테이블이 차지하는 저장 공간 때문입니다
요약하자면 iOS 18에서는 채널을 그룹으로 묶어 팔레트화할 때 룩업 테이블을 여러 개 사용할 수 있어 세분성이 향상됩니다 Neural Engine을 사용하는 Apple Silicon에서 빛나는 기능이죠 블록별 양자화 외에도 8비트에서 4비트 양자화까지 지원하도록 확장했습니다 이는 특히 Mac의 GPU에 최적화된 기능입니다 마지막으로 이제 프루닝에 다른 압축 방법을 결합할 수 있고 이는 Neural Engine에서 성능이 좋습니다
모델 압축에 대해 마무리하기 전에 압축 작업 흐름에 대해 살펴보고자 합니다 여기에서도 모델의 크기를 줄일 수 있습니다 지금까지는 모델을 학습시킨 이후에 압축을 진행했습니다 Core ML 모델을 가지고 데이터를 사용하지 않고 편리하게 압축할 수 있었습니다
하지만 데이터를 사용하지 않는 작업 흐름으로는 정확도와 압축률 간 최고의 균형을 얻지 못할 수 있습니다 압축률이 높아질수록 정확도가 더 빠르게 감소합니다
이를 해결하는 한 가지 방법은 학습할 때 압축하는 겁니다
학습 데이터를 통해 PyTorch 모델을 미세조정하면서 가중치를 압축할 수 있습니다 그런 다음 Core ML 형식으로 변환합니다
이렇게 하면 더 정확한 모델을 얻을 수 있지만 시간이 많이 걸리고 대형 모델에서는 데이터가 부족할 수 있습니다
이제 새로운 작업 흐름을 소개합니다 보정 데이터를 사용한 학습 후 압축입니다
데이터를 사용하지 않는 방식과 미세조정 방식 사이의 결과를 보입니다 이 방식으로는 약간의 데이터만 있으면 모델 압축을 보정할 수 있습니다
미세조정은 필요하지 않으므로 더 쉽게 구성할 수 있고 시간이 절약됩니다
올해 coremltools.optimize에 새로운 API가 도입되면서 이 작업 흐름을 손쉽게 수행할 수 있습니다
예시를 통해 살펴봅시다
예시에서는 프루닝을 사용하겠습니다 먼저 필요한 모듈을 가져옵니다 prune_config를 설정합니다 target_sparsity는 0.4로 설정했습니다 가중치 값의 40%를 프루닝해 제거한다는 의미입니다 샘플 수는 128로 설정했습니다 그런 다음 LayerwiseCompressor로 pruner를 생성하는 데 PyTorch 모델과 정의한 설정을 전달합니다 calibration_data_loader를 작성하는데 여러분의 모델에 맞게 정의하시면 됩니다
그런 다음 pruner.compress를 호출하며 calibration_data_loader를 전달해 압축되는 모델을 보정합니다
이제 압축한 모델을 Core ML 형식으로 변환할 수도 있고 앞서 설명한 대로 압축 후 팔레트화도 가능하므로 프루닝한 모델을 팔레트화해 더 압축할 수도 있습니다
압축된 메타데이터 정보를 전달하려면 이전에 압축한 모델을 이어서 사용합니다 마찬가지로 필요한 모듈을 가져오고 팔레트화 설정을 합니다 4비트 팔레트화에 세분성은 ‘per_grouped_channel’ group_size는 16으로 설정합니다
이제 PostTrainingPalettizer 객체를 생성한 다음 palettizer.compress를 통해 sparse_palettized_model을 얻습니다 이 PyTorch 모델도 간단하게 Core ML 형식으로 변환할 수 있습니다
가중치를 40% 제거한 후 Stable Diffusion 모델 크기가 1.1GB로 더 작아졌습니다 데이터를 사용하지 않고 압축하면 모델이 노이즈만 출력하는데 보정 데이터를 사용하면 새로운 고양이 이미지를 생성하는 모델이 만들어집니다 보정 데이터로 압축이 잘 되었고 새 이미지가 마음에 드네요
요약하자면 Core ML 도구 8에서 새로운 압축 방법을 사용하실 수 있고
보정 데이터를 사용하는 새로운 압축 작업 흐름도 사용할 수 있습니다 이 비디오에서는 전부 다루지 않았지만 올해에는 많은 기능이 추가되었습니다 자세히 알아보려면 Apple 문서를 참고하세요 압축을 즐기시기를 바랍니다
이제 Junpei가 스테이트풀 모델과 다른 최적화 기능을 소개하겠습니다
고마워요, Qiqi 안녕하세요, Core ML 팀 엔지니어 Junpei Zhou입니다 저와 함께 스테이트풀 모델과 트랜스포머 모델 최적화 다중 함수 지원에 대해 알아보면서 Apple Silicon에서 머신 러닝 모델을 사용하는 법을 익혀 봅시다
먼저 스테이트풀 모델에 대해 살펴보겠습니다
머신 러닝 모델에서는 일반적으로 입력과 출력만 있습니다 모델은 받은 입력으로 연산을 처리하여 출력을 생성합니다
모델 내부에서 흐르는 데이터는 보통 한 번의 추론에만 사용됩니다
하지만 경우에 따라 수명이 더 길어야 할 수도 있습니다 여러 번 실행하면서 같은 정보를 사용하려면 말이죠 이럴 때 보통 상태를 사용합니다
모델은 상태에서 데이터를 읽고 결과를 상태에 다시 쓸 수 있습니다
상태 내 정보는 유지되며 여러 번 실행하며 사용할 수 있습니다
다음은 누산기의 예시입니다 이전에 입력된 값을 모두 더해 저장합니다
초기 상태에서는 0입니다
모델이 상태와 입력에서 값을 받아 출력을 생성합니다
그러면서 이 결과를 상태에 다시 저장합니다
다른 입력이 들어오면 마찬가지로 상태에서도 값을 읽고 출력을 생성하며 상태도 업데이트합니다
Core ML에서 상태를 지원하기 전에는 모델에서 상태를 처리하려면 추가 입력과 출력을 명시적으로 정의하는 방법을 사용했습니다
누산기 예시의 경우 누산기를 위한 입력 및 출력 필드를 만들어
누산기 출력값을 명시적으로 다음 누산기 입력에 복사해야 했습니다
이렇게 하면 특히 상태의 크기가 커지면 비효율적입니다
올해부터 Core ML이 스테이트풀 모델을 지원합니다
이제 모델이 자동으로 상태 텐서를 업데이트하므로 직접 입력과 출력을 정의할 필요가 없습니다 대신 그 자리에서 업데이트할 수 있으므로 성능이 향상됩니다
누산기 예시의 경우 저는 PyTorch에서 이렇게 모델을 정의했습니다
PyTorch의 register_buffer API를 사용하여 모델의 상태 텐서를 나타냅니다
그런 다음 스테이트풀 PyTorch 모델을 스테이트풀 Core ML 모델로 간단하게 변환할 수 있습니다
새로 도입된 ct.StateType으로 상태를 지정하면 되는데 register_buffer API에서 사용한 상태 이름과 동일하게 설정합니다
이후 ct.convert에 상태를 전달해 스테이트풀 모델을 변환합니다
변환된 Core ML 모델이 스테이트풀 모델입니다 PyTorch 모델에서 상태를 읽고 쓸 때는 보통 그 자리에서 연산하거나 슬라이싱해 업데이트합니다
변환 과정에서 Core ML 도구가 변환된 Core ML 모델에 대응되는 연산을 생성합니다
스테이트풀 Core ML 모델을 온디바이스로 배포하는 방법을 자세히 알아보려면 이 비디오를 시청하세요
이제 트랜스포머 최적화에 대해 이야기해 봅시다
트랜스포머는 파운데이션 모델에서 가장 인기 있는 모델 아키텍처 중 하나입니다
트랜스포머는 여러 다중 헤드 어텐션 블록으로 구성되며 이 블록들이 계산 집약적이고 모델 추론 과정에서 대개 병목 지점이 됩니다
어텐션 블록은 여러 MatMul 및 Softmax 연산 그리고 쿼리, 키, 값의 3가지 대형 텐서로 구성됩니다 토큰을 생성하기 위해 현재 단어의 쿼리 벡터에서 시퀀스의 이전 모든 단어들의 키 벡터에 대한 어텐션을 구하고 어텐션 점수를 바탕으로 값 벡터를 반영합니다
이 시점마다 이전 토큰에 대한 키 및 값 벡터는 이미 이전 단계에서 계산되어 있습니다
반복 계산을 방지하기 위해 키-값 캐시 또는 줄여서 KV 캐시를 사용하여 각 단계에서 계산된 키와 값 벡터를 저장해 두고
나중에 사용할 수 있습니다
KV 캐시는 대형 언어 모델에서 디코딩 속도를 향상하기 위해 널리 사용되는 효율적인 방법입니다 여기에 앞서 소개한 스테이트풀 모델을 사용하기 아주 적합하네요
상태를 사용하지 않으면 KV 캐시를 입력과 출력으로 처리해야 하는데 KV 캐시는 보통 텐서 크기가 커 비효율적입니다
상태를 사용하면 그 자리에서 효율적으로 업데이트할 수 있습니다
이러한 스테이트풀 KV 캐시는 Apple Silicon에서 트랜스포머 모델을 준비하는 데 유용합니다
어텐션 블록 구조로 돌아가 보겠습니다 스테이트풀 KV 캐시를 사용하면 어텐션 계산 시 키와 값을 준비하는 데 효율이 좋아진다고 설명했습니다 다음으로는 자연스레
어텐션 계산 과정을 더 효율적으로 만들고 싶다는 생각이 듭니다
이 부분에서 트랜스포머 모델을 더 최적화할 수 있습니다
계산 과정을 결합한 Scaled Dot Product Attention 또는 SDPA 연산을 사용하는 겁니다
이전에는 SDPA 연산이 있는 PyTorch 모델을 변환하면 Core ML 도구가 SDPA 연산을 여러 작은 연산 matmul이나 softmax 등의 연산으로 나누었습니다
올해부터 최소 배포 대상을 iOS 18로 설정하면 Core ML 도구가 변환된 Core ML 모델에서 SDPA 연산을 사용합니다
SDPA 연산은 모든 입력을 한 번에 받아 어텐션을 효율적으로 계산합니다 Apple Silicon GPU에서 빛나는 기능입니다
Metal을 통한 SDPA 연산 최적화에 대해 자세히 알아보려면 이 비디오를 시청해 보시기를 강력하게 권장합니다
흥미로운 기능들을 소개해 드렸으니 이번에는 데모를 통해 Apple Silicon에서 Core ML 도구를 사용한 Mistral-7B 모델 준비 방법을 살펴봅시다 Mistral-7B는 강력한 대형 언어 모델로 73억 개의 매개변수가 있습니다 올해 도입된 스테이트풀 KV 캐시와 SDPA 연산을 활용하여 Mistral-7B를 Core ML 모델로 변환하여 Apple Silicon에서 원활하게 실행할 준비를 할 수 있습니다
이 주피터 노트북을 통해 Mistral-7B 모델을 스테이트풀 Core ML 모델로 변환해 봅시다 학습 후 블록별 양자화를 적용하겠습니다
코드를 깔끔하고 손쉽게 작성하기 위해 몇 가지 유틸리티를 가져오겠습니다
먼저 기존 Mistral-7B 모델을 스테이트풀 모델로 만들어야 합니다
기존 Mistral-7B 모델에서 시작하여 모델을 스테이트풀 모델로 변경해야 KV 캐시를 효율적으로 처리할 수 있습니다
KV 캐시를 위한 버퍼를 등록합니다 ‘keyCache’ 및 ‘valueCache’입니다
포워드 패스에서 KV 캐시를 그 자리에서 업데이트하는 등 모델의 다른 부분도 수정하는데
나중에 확인하실 수 있습니다
forward 함수에서 이미 KV 캐시를 위한 등록된 버퍼가 있으므로 더 이상 입력으로 받을 필요가 없습니다
이렇게 수정하면 KV 캐시를 유지되는 상태로 저장하는 스테이트풀 Mistral-7B 모델이 됩니다
이제 이 모델을 HuggingFace에서 다운로드한 가중치로 초기화하고 모델을 eval 모드로 설정합니다
예시 입력을 지정하려면 여기 Mistral-7B 모델에서 input_ids와 causal_mask가 필요하며 그런 다음 모델을 trace합니다
모델을 변환하려면 평소처럼 입력과 출력을 지정합니다 여기에서는 입력 형상을 ct.RangeDim으로 지정하는데 실행할 때마다 프롬프트 길이가 다를 수 있기 때문입니다
변환된 Core ML 모델에 KV 캐시용 상태가 있는지 확인하기 위해 올해 새로 도입된 ct.StateType으로 상태를 지정합니다
여기에서 이름을 ‘keyCache’ 및 ‘valueCache’로 지정해 torch_model에 등록한 버퍼 이름과 일치하도록 합니다
마지막으로 inputs, states, outputs를 전달하며 ct.convert를 호출하고 minimum_deployment_target을 iOS 18으로 설정합니다
ct.convert에 상태를 전달하면 변환된 Core ML 모델이 스테이트풀 모델이 되며 그 자리에서 업데이트되는 KV 캐시를 가집니다
변환 후 모델을 디스크에 저장해 모델 크기를 확인해 봅시다
변환이 완료되었습니다 모델의 크기를 확인해 봅시다
13GB로 상당히 큰 모델입니다
모델 예측을 실행하여 모델을 테스트해 보겠습니다 내부적으로는 Core ML 프레임워크를 사용하여 처리됩니다 프롬프트로 6월에 시애틀에서 방문하기 좋은 곳을 추천받아 보겠습니다
보시는 대로 상당히 큰 모델이지만 변환된 스테이트풀 Core ML 모델이 Mac에서 원활하게 실행됩니다
이 Float16 모델은 크기가 너무 큽니다 앞서 Qiqi가 설명한 모델 압축 기법을 적용해 봅시다
ct.optimize 모듈을 사용하여 압축 설정을 지정할 수 있습니다
OpLinearQuantizerConfig에서 dtype을 int4로 지정하고 granularity를 ‘per_block’ block_size를 32로 설정합니다
모델의 모든 가중치를 압축할 것이므로 이를 global_config로 설정합니다
연산 유형 또는 연산 이름별로 구성을 설정할 수도 있습니다
그런 다음 ct.optimize 모듈의 linear_quantize_weights 도구로 설정한 대로 모델을 양자화합니다
설정에 따라 ‘int4’로 ‘블록별’ 양자화되며 각 블록에 32개 요소가 들어갑니다 이 도구를 통해 Core ML 도구가 모델의 모든 가중치를 선형 양자화 알고리즘으로 압축합니다
양자화가 완료되었습니다
양자화된 모델의 크기를 확인해 봅시다
좋습니다 양자화된 모델의 크기가 기존 Float16 모델보다 훨씬 작아졌습니다 13GB에서 4GB 미만으로 감소했네요
동일한 프롬프트를 사용하여 양자화된 모델을 실행해 봅시다
훌륭하네요 모델 크기는 훨씬 작아졌지만 기존 Float16 모델보다 훨씬 빠르게 실행되며 생성된 출력의 품질은 비슷합니다
이 데모에서 보신 것처럼 KV 캐시와 양자화를 통해 Mistral-7B 모델을 간단하게 준비할 수 있습니다 이와 비슷한 작업 흐름을 따라 좋아하는 언어 모델을 Apple Silicon에 손쉽게 가져올 수 있습니다
마지막으로 한 가지 기능을 더 소개해 드리겠습니다 다중 함수 Core ML 모델 지원에 대한 내용입니다
여러 함수로 구성된 모델을 생각해 봅시다 예측을 실행하려면 모든 함수가 함께 실행되어야 합니다 예를 들어 모델에 피처 추출기가 있고 그 뒤에 분류기 계층이 있어 분류 출력을 생성합니다
마찬가지로 회귀 계층도 있어 회귀 출력을 생성합니다
이 둘을 결합하여 두 작업을 모두 처리하는 하나의 모델을 만들 수 있습니다
PyTorch에서는 이렇게 처리합니다
분류와 회귀에 같은 피처 추출기를 사용하며 각각 Core ML 모델로 변환합니다
올해에는 다중 함수 모델 지원이 도입되어 Core ML 도구를 사용하여 두 모델을 병합할 수 있습니다
병합 과정에서 Core ML 도구가 가중치의 해시 값을 계산하여 공유되는 가중치의 중복을 최대한 줄입니다
병합된 다중 함수 모델은 피처 추출기를 공유하며 두 작업을 모두 수행할 수 있습니다
다음은 Core ML 도구를 사용하여 Core ML 모델을 병합하는 코드 스니펫입니다
ct.convert로 두 모델을 변환하고 각각 mlpackage로 저장한 다음
MultiFunctionDescriptor를 생성하여 병합할 모델을 지정하고 병합한 모델의 새 함수 이름을 지정합니다
그런 다음 save_multifunction 유틸리티로 병합된 다중 함수 Core ML 모델을 생성합니다
Core ML 도구 Python API로 다중 함수 모델을 로드할 때 로드할 함수 이름을 function_name으로 지정한 다음 평소대로 예측을 실행하면 됩니다
다중 함수 모델은 특히 대형 모델에서 유용합니다
대형 모델을 미세조정할 때 모델 전체를 미세조정하려면 비용이 너무 많이 듭니다
대신 흔히 미세조정 과정에 어댑터를 사용합니다
어댑터는 일반적으로 작고 매개변수 개수가 적지만 전체를 미세조정한 모델과 유사한 성능을 보여 줍니다
하나의 기본 모델에서 다양한 분야 및 다운스트림 작업을 위한 여러 어댑터가 있을 수 있습니다
어댑터 블록은 모델의 시작이나 끝 부분에만 있는 게 아니라 중간 계층과 상호작용할 수도 있습니다
Core ML의 새로운 다중 함수 모델로 여러 어댑터를 결합하여 하나의 모델로 만들 수 있습니다 각 어댑터마다 별도의 함수로 정의되며
기본 모델의 가중치를 가능한 한 많이 공유합니다
‘Core ML을 사용하여 머신 러닝 및 AI 모델을 온디바이스로 배포하기’ 비디오에서 앱에 다중 함수 모델을 통합하는 방법을 자세히 알아보세요
텍스트에서 이미지를 생성하는 예시 모델에서 여러 어댑터를 하나의 모델로 결합하여 다양한 스타일의 이미지를 생성해 보는 비디오입니다
요약하자면 새로운 모델 압축 기법과 작업 흐름으로 높은 정확도를 유지하며 모델 크기를 상당히 줄일 수 있습니다 또한 상태를 사용하는 모델과 여러 기능을 가진 모델도 간단하게 만들 수 있습니다
대형 트랜스포머 모델도 손쉽게 Apple Silicon으로 가져올 수 있습니다
자세히 알아보려면 Core ML 도구 문서를 참고하시기를 바랍니다 감사합니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.