스트리밍은 대부분의 브라우저와
Developer 앱에서 사용할 수 있습니다.
-
Metal로 머신 러닝 가속하기
Metal Performance Shaders Graph의 새로운 기능을 활용하여 머신 러닝 트랜스포머 모델을 가속하는 방법을 알아보세요. 모델의 컴퓨팅 대역폭 및 품질을 개선하고 새로운 MPSGraph 뷰어에서 모델을 시각화하는 방법도 알아봅니다.
챕터
- 0:00 - Introduction
- 2:07 - Transformer support
- 13:41 - Fast Fourier transforms
- 16:42 - MPS Graph viewer
리소스
- Filtering Images with MPSGraph FFT Operations
- Forum: Machine Learning and AI
- Metal Performance Shaders Graph
- MPSGraph
관련 비디오
WWDC24
WWDC23
WWDC22
WWDC21
-
다운로드
안녕하세요 Kamal Ramamoorthy입니다 GPU, Graphics and Display 팀의 소프트웨어 엔지니어로 일하고 있습니다 이 비디오에서는 동료인 Sam과 함께 Metal로 머신 러닝 모델을 가속하는 방법을 설명해 드리겠습니다 학습은 Apple 플랫폼에 모델을 배포하는 첫 번째 단계입니다 두 번째 단계는 기기에 배포할 모델을 준비하는 것입니다 마지막으로 모델은 애플리케이션에 통합될 준비가 끝납니다 오늘 비디오에서는 이 단계에 초점을 두겠습니다 Core ML을 사용하여 모델을 배포하는 경우 MPSGraph가 Metal을 사용한 GPU 가속을 제공합니다 Core ML에 대해 더 알아보려면 ‘Apple 플랫폼의 머신 러닝 살펴보기’ 비디오를 시청하세요 또다른 비디오 자료로 ‘Core ML을 사용하여 머신 러닝 및 AI 모델을 온디바이스로 배포하기’도 있습니다 모델을 학습시키는 데 PyTorch나 TensorFlow, JAX 같은 프레임워크를 사용할 수도 있습니다 자세한 내용은 ‘Apple Silicon GPU에서 머신 러닝 및 AI 모델 학습시키기’를 시청하세요 이 모든 프레임워크는 Metal Performance Shaders Graph 즉 Metal을 사용하여 범용 컴퓨팅 그래프를 구축하고 실행하는 프레임워크를 기반으로 합니다 MPSGraph는 GPU 동기화와 메모리에 대한 로우 레벨 제어를 제공하므로 어떤 경우에는 MPSGraph를 직접 사용할 수도 있습니다 예를 들어 애플리케이션이 Metal을 사용한다면 MPSGraph로 ML 작업과 다른 GPU 작업을 순서대로 실행할 수 있습니다 버퍼와 같은 로우 레벨 Metal 리소스를 공유할 수도 있죠 아직 Metal을 사용하여 머신 러닝을 가속해 본 적이 없다면 작년 WWDC의 비디오를 시청해 보세요 이 비디오에서 저와 Sam은 세 가지 내용을 살펴보겠습니다 먼저 MPS 및 MPSGraph 개선사항입니다 트랜스포머 모델의 효율성 향상에 집중하여 많은 개선이 이루어졌습니다 따라서 해당 모델을 예로 들겠습니다 두 번째는 FFT 기반 ML 모델을 가속하는 새로운 기능입니다 그런 다음 끝으로 Sam이 MPSGraph Viewer를 소개하겠습니다 ML 모델을 시각화할 수 있는 뷰어입니다 먼저 트랜스포머 모델의 성능을 향상하는 데 초점을 둔 새로운 기능을 살펴보겠습니다 트랜스포머는 언어 모델에서 텍스트를 번역하거나 예측하고 생성하는 데 흔히 사용됩니다 입력은 토큰의 시퀀스입니다 예를 들어 ‘The quick brown’ 같은 간단한 문장은 3토큰 입력입니다 언어 모델은 다음 토큰을 ‘fox’로 예측하며 응답합니다 새로운 문장은 모델에 반복적으로 입력되어 새로운 토큰이 생성됩니다
MPS와 MPSGraph의 새로운 기능으로 트랜스포머 모델을 개선할 수 있습니다 개선사항은 세 가지 범주로 분류됩니다 첫 번째는 컴퓨팅 성능 향상입니다 두 번째는 메모리 대역폭 절약 마지막으로 트랜스포머 모델의 품질 향상이 있습니다 컴퓨팅 성능부터 살펴보겠습니다
트랜스포머 기반 모델은 여러 겹의 트랜스포머 블록으로 구성됩니다 트랜스포머 블록의 내부를 살펴보면 멀티헤드 어텐션, 정규화 그리고 피드 포워드 블록으로 구성됩니다 멀티헤드 어텐션 블록은 매우 컴퓨팅 집약적인 블록의 하나입니다 이 블록에서는 대규모의 다차원 행렬곱을 계산하며 이 연산은 컴퓨팅 집약적이죠 입력 행렬은 행렬곱 레이어에 투영되어 쿼리 행렬 Q 키 행렬 K, 값 행렬 V를 생성합니다 이 행렬들은 Scaled Dot Product Attention 블록에 입력됩니다 트랜스포머 모델의 중심이 되는 블록이죠
두 가지 방법으로 이 어텐션 블록의 성능을 최적화할 수 있습니다 어텐션 블록 내부를 보면 여러 연산으로 구성되어 있습니다
이제 MPSGraph의 새로운 연산이 이러한 일련의 연산을 하나의 커널로 결합하여 더 효율적으로 실행할 수 있습니다
이 연산을 사용하려면 scaledDotProductAttention 메서드를 MPSGraph 객체에서 호출합니다 이 메서드는 쿼리, 키, 값 텐서를 인수로 취합니다
결합된 SDPA 연산을 사용하면 트랜스포머 모델의 성능을 향상할 수 있습니다 멀티헤드 어텐션 블록을 다시 살펴보며 이 텐서들을 사용하여 컴퓨팅 성능을 높이는 다른 방법을 보여 드리겠습니다 여기에서 투영된 쿼리, 키, 값이 첫 번째 토큰에 어떻게 적용되는지 볼 수 있습니다 행렬곱 연산이 임베딩 벡터를 쿼리, 키, 값으로 투영합니다
다음 출력 토큰을 생성하기 위해 이전에 생성된 모든 토큰을 행렬곱 연산에 입력해야 합니다 그러면 이전 반복 작업에서 이미 계산했던 투영된 K와 V의 계산이 다시 실행됩니다
시퀀스가 길어질수록 비용이 그만큼 늘어납니다 이 문제를 완화하기 위해 생성되는 투영값을 캐싱하여 이후의 반복 작업에서 재사용할 수 있습니다 가장 먼저 해야 할 작업은 캐싱된 K와 V 값을 저장할 K와 V 텐서를 만드는 겁니다 이러한 텐서를 KV 캐시라고 부릅니다 첫 번째 반복에서는 첫 번째 토큰에 대한 K와 V 값이 계산되어 KV 캐시에 저장됩니다
이제 캐싱된 값을 재사용할 수 있으므로 두 번째 반복에서 두 번째 토큰의 K와 V 값만 계산하면 됩니다 이렇게 하면 행렬-행렬 곱셈을 행렬-벡터 곱셈으로 단순화할 수 있습니다
투영된 K와 V를 KV 캐시의 끝에 추가할 수도 있습니다 반복할 때마다 새로운 텐서를 생성하면 되죠 하지만 그러면 메모리를 많이 사용합니다 대신 슬라이싱 업데이트 연산으로 기존 텐서를 그 자리에서 업데이트하면 됩니다
그런 다음 슬라이싱 연산으로 KV 캐시의 계산된 부분만 추출하면 됩니다
코드에서 방법을 확인해 보겠습니다
먼저 캐시를 나타내는 플레이스홀더를 생성합니다 텐서의 차원은 모델의 세부 구성에 따라 달라집니다 이 예시에서는 캐시의 키 부분에만 초점을 두겠지만 값 부분도 동일하게 작동합니다 KV 캐시를 그 자리에서 업데이트하기 위해 캐시의 현재 상태를 나타내는 변수를 생성해야 합니다 일반적인 그래프 연산과 달리 나중에 이 변수가 다른 값을 참조하도록 변경할 수 있습니다
모든 토큰에 대해 캐시에 투영된 키를 저장해야 합니다 이는 MPSGraph 객체의 sliceUpdateDataTensor 메서드를 사용해 처리할 수 있습니다 starts와 ends 배열은 새 값을 저장할 위치를 나타냅니다 이 예에서는 캐시의 유효한 부분 끝에 추가합니다 여기에서는 간격이 균일합니다
이제 업데이트된 캐시를 다시 기존 변수에 할당할 수 있습니다 MPSGraph가 이를 최적화하여 그 자리에서 캐시 할당을 업데이트합니다 마지막으로 슬라이싱 연산으로 KV 캐시에서 방금 계산된 부분만 추출할 수 있습니다 캐시의 시작 부분에서 가장 최근에 추가된 키 투영값까지입니다
그런 다음 업데이트된 키 캐시를 SDPA 연산에 전달합니다
이렇게 컴퓨팅 성능을 향상한 후에는 메모리 대역폭이 새로운 병목 지점이 됩니다
대형 언어 모델의 가중치를 저장하는 데 필요한 메모리 공간의 크기는 수억 GB에 달할 수 있습니다 이러한 가중치는 일반적으로 16비트 부동 소수점으로 표현됩니다 하지만 MPS는 이러한 가중치를 8비트 정수로 양자화해 메모리 공간을 절반으로 줄이도록 지원합니다
올해부터는 MPS에서 4비트 정수도 지원합니다 이를 통해 가중치의 크기를 더욱 줄일 수 있습니다 MPS는 가중치를 이처럼 양자화된 형식으로 매핑하는 다양한 기법을 지원합니다
예시 텐서입니다 요소들이 숫자 선 위에 분산되어 있습니다 8비트 양자화에서는 양자화 가능한 지점 256개가 숫자 선상에 선형적으로 분포되어 있습니다 4비트 양자화의 경우 16개의 지점이 있습니다 양자화가 진행되는 동안 각 값은 가장 가까운 양자화 값으로 조정됩니다 양자화 크기 조절 비율은 오른쪽의 공식으로 계산할 수 있습니다 양자화하면 약간의 오류가 발생하지만 메모리 공간과 대역폭을 2배 또는 4배 절약할 수 있습니다 MPSGraph 객체의 dequantize 메서드를 사용하여 값을 역양자화할 수 있습니다
또 다른 양자화 기법의 경우 룩업 테이블을 사용합니다 이 기법은 숫자 선상에서 가중치가 여러 구역에 밀집되어 있는 경우에 유용합니다 아핀 양자화를 사용하면 양자화 값은 균일하게 분포되지만 입력값은 그렇지 않죠 따라서 대부분의 양자화된 비트가 사용되지 않는데 특정 양자화 지점에만 입력값이 밀집되기 때문입니다 룩업 테이블을 통해 양자화된 비트를 더 잘 사용할 수 있습니다 이 기법에서는 데이터의 분포에 따라 직접 양자화 지점을 선택합니다 양자화 값을 룩업 테이블에 저장하고 각 가중치에 이 테이블에 대한 4 또는 8비트 인덱스를 할당합니다 이러면 더 융통성 있는 작업이 가능하죠 테이블에서 값을 조회하기 위해 약간의 성능만 저하될 뿐입니다
이렇게 양자화된 값은 dequantize 메서드로 다시 32비트 부동소수점 값으로 변환할 수 있습니다 양자화된 가중치를 32비트 룩업 테이블에 전달하면 되죠 그런 다음 역양자화된 텐서를 평소처럼 사용할 수 있습니다 예를 들어 행렬곱에 입력으로 전달할 수 있죠 사실 이런 경우에는 MPSGraph가 한 단계 더 나아갑니다
그래프에서 행렬곱 전에 가중치를 역양자화하는 연산이 포함되어 있다면
MPSGraph가 두 연산을 하나의 양자화 행렬곱 연산으로 대체합니다 이 연산은 필요에 따라 즉석에서 가중치를 역양자화하므로 역양자화된 가중치의 임시 사본을 저장하지 않아도 됩니다
양자화는 메모리와 메모리 대역폭을 절약할 수 있지만 숫자의 정확도가 떨어질 수 있습니다 이제 트랜스포머 모델의 품질을 높이는 방법 2가지를 소개하겠습니다
가중치를 양자화할 때 각 가중치는 정확도가 낮은 값으로 매핑됩니다 또한 스케일과 함께 선택적으로 양자화된 값을 역양자화할 때 적용되는 오프셋을 선택합니다 그러나 모든 가중치에 동일한 스케일과 오프셋 값을 사용하면 재구성되는 값의 정확도에 한계가 있을 수밖에 없습니다 대신 요소들의 블록을 개별적으로 양자화하며 각각 다른 스케일과 오프셋 값을 사용할 수 있습니다 이렇게 하면 각 블록마다 더 정확한 스케일과 오프셋 값을 사용할 수 있습니다
이를 위한 코드는 이전 예시와 비슷하지만 스케일과 오프셋 값을 하나만 전달하는 대신 각 블록에 대한 스케일과 오프셋이 담긴 텐서를 전달하면 됩니다
지금까지 양자화에 대해 말씀드렸습니다 이제 다른 방법을 알려 드리죠 어댑터를 사용하여 트랜스포머 모델의 품질을 향상할 수 있습니다
어댑터는 모델에 추가할 수 있는 작은 레이어이며 몇 가지 연산 및 매개변수로만 구성됩니다 모델을 미세 조정할 때 어댑터 내의 매개변수만 업데이트됩니다 이 방법으로, 사전 학습된 모델을 새 작업에 적응시킬 수 있지만 양자화로 인해 추가되는 오류를 상쇄하는 데 사용할 수도 있습니다 MPSGraph 콜러블로 모델에 어댑터를 추가할 수 있습니다
각 어댑터는 별도의 MPSGraph이며 메인 그래프에서 호출될 수 있습니다 먼저 각 어댑터에 고유한 이름을 지정하여 베이스 그래프에서 어댑터에 대한 호출을 추가합니다 이렇게 하려면 코드에서 어댑터에 대한 호출이 생성하는 출력의 형상과 유형을 정의해야 합니다 그런 다음, 메인 MPSGraph 객체에서 call 메서드를 사용하여 어댑터에 호출을 추가합니다 여기에서 콜러블에 대한 이름, 입력, 출력 유형을 정의하면 됩니다
그런 다음, 각 어댑터에 대한 MPSGraph를 생성합니다 이 예시에서는 ‘input’을 나타내는 플레이스홀더로 차원이 지정되지 않은 텐서를 생성하고 다음으로 ‘input’에 2를 곱해 ‘output’ 텐서를 생성하겠습니다
끝으로 각 어댑터에 대한 그래프를 그래프 실행기로 컴파일합니다 다른 MPS 그래프와 마찬가지로 컴파일됩니다 먼저 그래프에 정확한 형상을 제공해 입력 유형을 정의합니다 그런 다음 그래프 객체의 compile 메서드를 호출하며 Metal 기기, 입력 유형 출력 텐서를 전달합니다
이제 메인 그래프에서 어댑터에 대한 호출을 추가하고 각 어댑터에 대한 그래프 실행기를 컴파일했으니 끝으로 메인 그래프에서 어댑터 이름을 실제 그래프 실행기에 매핑하면 됩니다 이는 GraphCompilationDescriptor를 사용하여 네트워크에서 메인 MPSGraph를 컴파일할 때 처리됩니다 먼저 각 어댑터의 이름을 해당 그래프 실행기에 매핑하는 딕셔너리를 생성하고 설명자에 설정하면 됩니다 그런 다음 메인 그래프를 컴파일할 때 컴파일 설명자를 제공하기만 하면 됩니다 이렇게만 하면 어댑터 설정이 완료됩니다 요약하자면 어댑터와 콜러블로 모델이 새로운 작업을 할 수 있도록 맞춤화할 수 있고 이를 활용하여 모델 출력을 미세 조정하여 품질을 향상할 수 있습니다 다음으로 소개할 것은 올해 MPS와 MPSGraph에 추가된 푸리에 변환 관련 기능입니다 고속 푸리에 변환 또는 줄여서 FFT는 신호 또는 이미지와 같은 데이터를 시간 또는 공간 도메인에서 주파수 도메인으로 변환합니다 머신 러닝 모델에서 흔히 전처리 단계에 사용되어 오디오를 처리하며 음성 텍스트 변환 모델이나 한 트랙에서 다양한 오디오 소스를 분리하는 모델 등에 사용됩니다 특정 컨볼루션 레이어의 속도를 높이는 데 사용할 수도 있고 다양한 이미지 처리와 과학 컴퓨팅 애플리케이션에 사용됩니다 예를 들어 오디오 신호에서 텍스트를 추출하려면 입력 파형은 먼저 단시간 푸리에 변환 또는 STFT를 거치며 이후 트랜스포머 모델이 진동수 범위를 분석하여 텍스트를 추출합니다 MPSGraph를 사용하여 GPU에서 효율적으로 ML 모델을 실행하는 방법은 이미 설명해 드렸습니다 그런데 MPSGraph가 지원하는 고속 푸리에 변환을 통해 전체 파이프라인을 GPU로 옮길 수 있습니다 첫 번째 단계는 단시간 푸리에 변환을 구현하는 것입니다 입력 파형을 더 작은 여러 개의 뷰 또는 윈도우로 나눠야 하며 이는 서로 중첩될 수 있습니다 각 윈도우가 실질적으로 독립된 신호가 되는 겁니다 스펙트럼 누설을 줄이기 위해 개별 윈도우에 윈도우 함수를 곱합니다 마지막으로 일반적으로 배칭된 1차원 FFT 연산으로 각 윈도우의 STFT를 계산할 수 있습니다 파형을 더 작은 윈도우로 분할하려면 스트라이드 뷰를 만들면 됩니다 먼저 윈도우 뷰의 형태를 설정합니다 여기에서는 윈도우의 너비가 512개 요소입니다 그런 다음 각 차원 간의 간격을 설정합니다 이 예에서는 256을 사용합니다 기본 1D 배열의 각 단계마다 256개의 요소를 건너뛰어 두 번째 차원을 지정하는 겁니다 최종 배치 차원이 1로 설정되지만 더 큰 배치를 사용할 수 있습니다
마지막으로 입력 텐서의 arrayView 메서드를 호출하여 스트라이드 뷰를 생성할 수 있습니다 이 방식의 장점은 뷰 연산에서 입력 배열의 메모리를 앨리어싱하여 복사하지 않으므로 메모리와 GPU 시간이 절감됩니다
이제 모든 윈도우에 대한 FFT를 계산할 수 있습니다 먼저 스트라이드 뷰 데이터에 대한 플레이스홀더를 생성합니다 스트라이드 뷰 NDArray 외부에서 데이터를 로드하고 나중에 그래프를 실행할 때 제공해야 합니다 다음으로 윈도우 함수를 곱합니다 보통 Hann 윈도우 또는 Gaussian 윈도우를 사용합니다 가령 여기에 MPSGraphConstant 텐서를 사용할 수 있습니다 끝으로 FFTTensor 연산을 생성할 수 있습니다 고속 푸리에 변환에 대해 설명했고 이제 Sam에게 차례를 넘기겠습니다 MPSGraph 구조를 더 잘 파악할 수 있는 방법을 소개해 드릴 겁니다 고마워요, Kamal 안녕하세요, Sam Colbran입니다 저도 소프트웨어 엔지니어로 GPU, 그래픽스 및 디스플레이 팀 소속입니다 잘 모르실 수도 있지만 있는데 Metal은 Xcode와 Instruments의 고급 도구도 제공하므로 Apple GPU를 최대한 활용할 수 있습니다 쉽게 사용할 수 있는 강력한 도구로 Metal 파이프라인과 온디바이스로 실행되는 AI 모델을 더 크고 복잡하게 확장할 수 있습니다 하지만 Metal 파이프라인은 Xcode의 의존성 뷰어로 시각화할 수 있는 반면에 지금까지 MPSGraph는 시각화할 수 없었습니다 이제 Metal 도구에 추가된 최신 도구를 소개합니다 Xcode 16에 포함된 MPSGraph Viewer입니다 머신 러닝 및 AI를 위해 특별히 설계된 새로운 도구입니다 이제 Xcode에서 직접 MPSGraph 패키지를 열고 연산이 어떻게 연결되는지 시각화할 수 있습니다 데모로 들어가기 전에 먼저 MPSGraph 패키지를 어떻게 생성하는지 다시 알아보겠습니다 MPSGraph를 직접 사용할 때와 다른 프레임워크로 ML 모델을 개발할 때를 나누어서 설명하죠 MPSGraph로 직접 모델을 생성했다면 먼저 그래프를 MPSGraph 실행기로 컴파일합니다 그런 다음 serialize API에 실행기를 전달해 패키지를 생성합니다
올해 새로 출시된 기능으로 MPSGraph 실행기를 직접 CoreML 패키지에서 생성할 수도 있습니다 그러면 예전처럼 실행기를 MPSGraph 패키지로 직렬화할 수 있죠
아니면 다른 프레임워크 예를 들어 ONNX로 내보내는 프레임워크로 제작했다면 mpsgraphtool로 모델을 변환할 수 있습니다 예시를 살펴보며 이야기하겠습니다
저는 매개변수가 70억 개인 Mistral 모델을 사용 중이며 이는 올해의 비디오 중에서 ‘머신 러닝 및 AI 모델을 Apple Silicon으로 가져오기’에서 변환된 CoreML입니다 이제 명령어 라인에서 mpsgraphtool에 액세스할 수 있습니다 원하는 터미널을 열고 convert 인수를 추가하여 mpsgraphtool을 실행합니다
완료되었습니다 새로운 mpsgraph 패키지가 준비되었습니다 이제 새로운 MPSGraph Viewer를 사용해 간단히 확인할 수 있습니다 변환된 Mistral 패키지를 이미 Xcode 16에서 열어 두었습니다 화면에 표시되는 내용을 설명하겠습니다 좌측 상단부터 보면 컴파일 옵션이 있습니다 기본적으로 뷰어는 그래프를 있는 그대로 표시합니다 즉 특성 기기에 최적화되지 않은 겁니다 따라서 사용 중인 기기와 무관하게 동일한 연산이 표시됩니다
그 아래는 연산 내비게이터입니다 그래프에서 사용된 모든 연산의 목록입니다 가운데에는 그래프가 있고 마지막으로 오른쪽에는 연산 속성이 표시되는데 나중에 다시 설명하겠습니다
이 크기로는 보기 어려우니 확대하겠습니다
이제 대략적인 구조가 보이고 확대해 들어갈수록 더 세부적으로 표시됩니다 이렇게 스크롤하며 각 연산의 모든 입력 및 출력을 확인하고 어떻게 연결되어 있는지 파악할 수 있습니다 이렇게 하면 그래프의 구조를 더 쉽게 시각화하고 이해할 수 있죠
Mistral은 트랜스포머 모델이며 Kamal의 설명대로 여러 겹의 트랜스포머 블록으로 구성됩니다 해당 블록을 찾아보겠습니다 새로운 Scaled Dot Product Attention 연산자부터 찾아보겠습니다 각 트랜스포머 블록의 멀티헤드 어텐션 부분에 있겠지요 직접 찾아 봐도 되지만 왼쪽의 연산 내비게이터를 보면 이미 32개가 있음을 알 수 있죠 이 그룹을 펼치고 첫 번째 연산을 클릭하여 그래프에서 해당 위치로 이동하겠습니다
연산의 입력이 5개네요 쿼리, 키, 값은 기억나실 겁니다 Kamal이 설명했으니까요
약간 축소하고 전체 트랜스포머 블록이 더 잘 보이게 하겠습니다
연결을 따라가 보면 쿼리를 구성하는 블록을 볼 수 있고 키와 값도 있네요 이 정도 크기에서도 키와 값 모두에 사용되는 변수를 확인할 수 있습니다 키 부분의 변수를 확대해 보죠 상태를 사용하는 CoreML에서 내보낸 모델이라 KV 캐시를 사용하고 MPS의 새로운 변수에 할당 연산과 변수에서 읽기 연산을 활용합니다 이는 Kamal이 설명한 대로 계산 성능을 향상합니다 이제 그래프를 단순화하기 위해 뷰어에서 몇 가지 연산과 이러한 변수를 여러 위치에 표시할 수 있습니다 변수를 선택하면 오른쪽의 속성에서 최초로 생성된 위치와 사용된 모든 장소를 확인할 수 있습니다
하나의 트랜스포머 블록을 봤는데요 나머지는 어떨까요? 속성과 마찬가지로 연산 내비게이터에서 여러 연산을 동시에 선택할 수 있습니다 이렇게 대략적인 구조는 파악했습니다 레이어들이 계속해서 반복되는 것을 볼 수 있습니다 멋지네요 이제 상수에 대해 이야기해 보겠습니다 어쩌면 그래프 안에서 직접 표시되는 녹색 프리뷰를 이미 보셨을 수도 있습니다 하지만 왼쪽의 상수 내비게이터 탭에서 상수를 크기 순으로 정렬하여 찾아도 됩니다 가장 큰 상수를 선택하고 더블 클릭하여 상수 뷰어를 엽니다 여기에서 학습된 가중치를 확인하고 모델이 어떻게 학습되었는지 인사이트를 얻을 수 있습니다 이를 통해 모델을 최적화하여 더 나은 온디바이스 통합을 위한 기회를 모색할 수도 있습니다 다만 뷰어는 그래프를 있는 그대로 표시한다는 점을 기억하세요 특성 기기에 최적화되어 있지 않습니다
실제로 실행되는 그래프는 다를 수 있습니다 예를 들어 MPS그래프는 자동으로 연산을 하나의 Metal 커널로 결합해 연산을 최적화할 수도 있습니다 뷰어로 이를 확인할 수 있습니다 방법을 보여드리겠습니다 ResNet50이 포함된 MPSGraph 패키지를 열었습니다 마찬가지로, 확대하면 모든 연산과 상수를 볼 수 있습니다 이번에는 제 기기에서 그래프의 모습을 살펴보겠습니다
좌측 상단의 컴파일 옵션에서 내 기기를 선택합니다
이제 확대해 보면 이 Metal Shader (Stitched) 영역에 연산이 결합된 것을 볼 수 있으며 펼쳐서 내부를 볼 수 있습니다 이 연산들이 하나의 최적화된 Metal Shader에 결합되었으므로 내부적으로 메모리 오버헤드 없어 성능이 크게 향상됩니다 일반적으로 하드웨어에서 그래프가 결국 어떻게 실행되는지 알면 런타임 성능 특성을 완전히 이해하는 데 유용합니다 새로운 MPSGraph Viewer의 설명은 여기까지입니다 이제 오늘 내용을 요약해 보겠습니다 Kamal이 앞서 설명했듯이 Metal를 사용하여 머신 러닝을 가속화할 수 있습니다 MPSGraph도 사용할 수 있습니다 이미 CoreML과 같은 인기 있는 프레임워크 내부에서 사용되어 Apple Silicon에서 최적의 성능을 제공하고 있습니다 올해 트랜스포머를 위한 새로운 기능으로 컴퓨팅 성능을 향상할 수 있으며 새로운 Scaled Dot Product Attention연산자나 KV 캐시가 도움이 됩니다 메모리 대역폭은 양자화로 절약하고 품질은 어댑터와 콜러블을 통해 향상할 수 있습니다 푸리에 변환은 이제 MPSGraph에서 최신 스트라이드 NDArray API를 사용하여 MPSGraph에서 더 빠르게 계산할 수 있습니다 끝으로 새로운 MPSGraph Viewer로 모델이 Apple Silicon에서 어떻게 실행되는지 쉽게 이해하고 인사이트를 얻을 수 있습니다 MPSGraph의 문서와 샘플 코드도 잊지 말고 확인해 보시고 당연히 모델 통합이 퍼즐의 마지막 조각이므로 아직 시청하지 않으셨다면 여기 보이는 여러 멋진 비디오를 시청하고 학습과 배포에 대해 더 자세히 알아보세요 시청해 주셔서 감사하고 즐거운 WWDC 보내시기 바랍니다
-
-
찾고 계신 콘텐츠가 있나요? 위에 주제를 입력하고 원하는 내용을 바로 검색해 보세요.
쿼리를 제출하는 중에 오류가 발생했습니다. 인터넷 연결을 확인하고 다시 시도해 주세요.