문서

ANE 타당성: 등가 변환과 측정 가능한 10× 목표

연구 날짜: 2026-09-20. 하드웨어: M3 Max, 40코어 GPU, 128 GiB. 이 문서는 가설과 수학적 한계를 설명하며, 새로 측정한 속도 향상을 주장하는 것이 아닙니다. 출발점은 원래 Laya 가중치와 더 빠른 MLX FP16 런타임입니다. 엔지니어링 실험과 측정이 아래의 출발 관찰을 대체할 수 있습니다.

가장 좋은 첫 실험은 전체 트랜스포머를 고정 셰이프, 채널 우선으로 다시 작성한 뒤 실행 계획을 검사하는 것입니다. 가장 그럴듯한 자릿수 목표는 완료된 의사결정당 에너지이며, 모델이 유용한 지연 시간과 정확도를 유지한다는 전제가 붙습니다. Core ML 컴퓨트 유닛 설정을 바꾸는 것만으로는 Neural Engine이 모델을 실행했다는 충분한 증거가 되지 않습니다.

이어진 엔지니어링 실험이 그 재작성을 구현했고, 측정된 속도/에너지 보고서가 이제 결과를 기록합니다. 비압축 후보는 효율을 개선하지만 10× 목표를 충족하지 못했습니다. 아래의 가설과 원래 분모는 연구 기록으로 보존됩니다. 측정된 성능 주장에는 뒤의 컴파일된 MLX 비교를 사용하십시오.

최적화 전에 목표를 정의하십시오

같은 입력, 체크포인트, 정밀도 정책, 완료된 의사결정 수에 대해 다음을 정의합니다.

t = elapsed time / completed decisions
P = average measured power over that same interval
E = integrated energy / completed decisions = P × t

S = t_MLX / t_candidate                    speed gain
R = P_MLX / P_candidate                    power reduction factor
S × R = E_MLX / E_candidate                 energy efficiency gain

이 항등식에는 지연 시간 백분위수가 아니라 블록 평균 지연 시간을 사용하십시오. P50과 P95는 따로 보고하십시오. 전력의 5분의 1로 2× 빠른 결과는 10× 에너지 개선입니다. 절반 속도인 결과는 같은 10× 에너지 개선을 내려면 20× 전력 감소가 필요합니다. 속도에 이미 계산된 에너지 개선을 곱하면 경과 시간을 이중 계산하게 됩니다.

두 가지 서로 다른 전력 테스트가 있습니다.

  1. 포화 순차 추론: 실제 처리량, 지연 시간, 의사결정당 줄을 측정합니다. 전력이 낮지만 더 느린 후보가 자동으로 더 효율적인 것은 아닙니다.
  2. 동일 부하 제공, 예컨대 같은 Snake 틱 속도: 두 후보 모두 마감 시간 안에 같은 작업을 끝내야 합니다. 평균 전력, 총 구간 에너지, 마감 초과, 완료된 의사결정을 보고하십시오. 더 오래 자거나 작업을 버리는 것은 최적화가 아닙니다.

측정된 전력 영역을 기록하십시오. CPU + GPU + ANE 텔레메트리는 반드시 전체 기기나 배터리 전력인 것은 아니며, 그렇게 표기해서는 안 됩니다. 원시 에너지와, 사용 가능하다면 페어링된 유휴 차감 에너지를 보고하십시오. 부하에서 유휴를 뺀 값이 잡음과 비슷하면, 조용히 클램프해 거대한 비율을 보고하는 대신 불확실성을 보존하십시오. 토크나이즈, 입력 복사, CPU 폴백, 후처리를 엔드포인트의 회계 경계 안에 두십시오.

출발 증거와 분모

현재 다국어 MLX 벤치마크는 91토큰 질문 하나를 7.870 ms P50 / 9.870 ms P95로 측정합니다. 영어 MLX 벤치마크는 93토큰 질문을 13.334 / 13.734 ms로 측정합니다. 이는 모델 로딩과 워밍업을 제외한 종단 간 predict 측정입니다. 새 비교는 워크로드가 허용하는 경우 그 옵트인 컴파일과 프롬프트 캐시 설정을 포함해 적용 가능한 가장 강한 MLX 경로를 다시 실행해야 합니다. 역사적인 eager 결과는 영구적인 분모가 아닙니다.

기존 Core ML 다국어 내보내기는 CPU + GPU로 11.277 ms P50, ALL로 78.037 ms, CPU + NE로 81.336 ms를 측정합니다. 후자의 계획은 1,318개의 CPU 우선 연산과 NE 우선 연산 0개를 기록하며, 24개 SDPA 연산은 기기 메타데이터가 알 수 없습니다. 이는 NE 실행 주장을 확립하지 않습니다. 계획은 많은 연산을 NE-지원으로 나열하는데, 이는 NE-우선과 다릅니다. Apple은 컴퓨트 계획 기기 사용을 예상 기기 사용으로 설명하므로, 유리한 계획조차 런타임 프로파일링이나 관찰 가능한 NE 활동으로 뒷받침되어야 합니다.

기존 FP16 회귀 게이트는 100% 픽스처 argmax 일치, 유한한 결정적 출력, 캘리브레이션 및 액션 확률의 최대 0.02 절대 드리프트입니다. 이는 작은 코퍼스에 대한 변환 충실도 검사입니다. 일반 작업 정확도, Snake 능력, 압축 모델의 품질을 확립하지 않습니다.

등가 그래프 변환

Apple의 Transformer 배포 연구는 4차원 BC1L 활성화, 1×1 합성곱, 어텐션을 헤드로 나누기, 레이아웃 복사 줄이기에 동기를 부여합니다. 그 공개된 10× 예시는 다른 모델, 기기, 기준선이며, 여기의 MLX 비교로 옮길 수 없습니다. 그 레이아웃 권장을 이 OS와 칩에서 시험할 후보로 취급하십시오, 완전한 현재 하드웨어 지원 계약이 아닙니다.

선형 투영과 게이트 MLP

X[b,l,i]를 기존 활성화라 하고 U[b,i,0,l] = X[b,l,i]로 정의합니다. 선형 계층에 대해,

Y[b,l,o] = sum_i W[o,i] X[b,l,i] + bias[o]
K[o,i,0,0] = W[o,i]
Conv2D(U,K)[b,o,0,l] = Y[b,l,o]

이는 실수값 함수를 바꾸지 않고 레이아웃과 연산자 표현을 바꿉니다. 이 레이아웃을 전체 인코더와 두 결정 헤드 트랜스포머 계층에 걸쳐 유지하십시오. 모든 선형 계층 주위에서 그것으로 변환했다가 되돌리면 이점이 사라질 수 있습니다. QKV는 단일 D → 3D 합성곱으로 남을 수 있으며, 그 채널 출력을 Q, K, V로 나눕니다. 마찬가지로 기존의 융합된 D → 2I 인코더 투영을 보존하고, 채널을 value와 gate로 나누고, value에 원래 정확한 GELU를 적용하고, gate를 곱하고, I → D로 투영하십시오.

FP16의 경우, 시퀀스 폭이 32로 나누어떨어지면 Apple의 연구에 설명된 64바이트 마지막 축 정렬에도 맞습니다. 초기 셰이프는 짧은 API 픽스처가 B=1,L=96, 압축 Snake가 B=3,L=64입니다. 여기서 32의 배수 권장은 그 버퍼 모델을 따르며, 모든 워크로드를 큰 임의 길이로 패딩해도 된다는 허가가 아닙니다. Snake는 96토큰이 필요하지 않습니다.

어텐션과 RoPE

각 헤드에 대해 Q와 V는 (B,d,1,L)로, K는 (B,L,1,d)로 transpose해 유지하십시오. 다음을 계산합니다.

score[b,k,0,q] = sum_c Q[b,c,0,q] K[b,k,0,c] / sqrt(d)
weight = softmax(score + additive_mask, axis=key)
out[b,c,0,q] = sum_k weight[b,k,0,q] V[b,c,0,k]

이 표현에서 key 축은 축 1입니다. 헤드 출력을 채널 축에 연결하십시오. 이는 같은 어텐션 함수이며, softmax 축이 틀리면 조용히 바뀝니다. Apple의 레퍼런스 어텐션 구현이 그에 대응하는 두 개의 4차원 축약을 보여줍니다. 변환된 MIL 연산자를 검사하십시오. einsum을 쓰는 것만으로는 의도한 기기나 lowering을 보장하지 않습니다.

QK 전에 각 헤드의 채널 쌍에 RoPE를 적용하십시오. 체크포인트의 분할 절반 규칙, 원래 위치, 계층별 theta를 보존하십시오. 이 다국어 체크포인트에서 완전 RoPE와 로컬 RoPE 모두 theta 160000을 사용합니다. 모든 헤드를 함께 연결한 것의 첫 절반과 둘째 절반을 나누는 것은 틀렸습니다. 각 64채널 헤드 안에서 나누십시오. 위치 의존 회전은 일반적으로 하나의 위치 독립 가중치 행렬로 접을 수 없습니다.

로컬 규칙은 양방향 abs(q-k) <= 64이며 경계를 포함합니다. 키 패딩과 기존 패딩된 쿼리 규칙을 보존하십시오. 상수 위치 의존 부분은 고정 셰이프에 대해 트레이싱 전에 계산할 수 있지만, 샘플 패딩이 바뀌면 여전히 키 마스크에 영향을 주어야 합니다. 수학적 배제를 유한한 큰 음수 마스크로 대체하는 것은, 원래 구현의 유한 정밀도 동작과 일치하지 않는 한 수치 근사입니다. 적대적 입력과 패딩된 입력을 검증하십시오.

LayerNorm은 다른 정규화와 호환되지 않습니다

각 (b,l)에 대해 채널에 걸쳐서만 축약하십시오.

mu = mean_c U
v = mean_c (U-mu)^2
normalized = (U-mu) / sqrt(v + epsilon)
output = normalized * gamma + beta

원래 epsilon, affine 순서, 모집단 분산, 첫 계층 항등 정규화, 정확한 GELU, 잔차 순서를 유지하십시오. Apple의 레퍼런스 LayerNorm은 다른 affine 순서를 사용하며, 그 DistilBERT 어댑터는 bias를 변환해 이를 보상합니다. 그 클래스를 그대로 복사해 Laya의 state dict를 로드하면 0이 아닌 bias에서 틀립니다. 원래 순서의 명시적 affine 표현은 0일 수 있는 gamma로 나누는 것도 피합니다.

활성화를 클램프하거나, GELU를 tanh로 바꾸거나, LayerNorm을 RMSNorm으로 대체하면 함수가 바뀝니다. 제곱값이 넘치면 양의 재스케일링이 수학적으로 등가인 선택지입니다.

normalize(x/a, epsilon/a^2) = normalize(x, epsilon), for a > 0

유한 정밀도 누적에는 여전히 패리티 테스트가 필요합니다. FP32 축약은 복사나 CPU 폴백을 초래할 수 있으므로, 수치 동작을 조용히 완화하기보다 계획을 검사하십시오.

지원되지 않는 작업을 모델 경계로 옮기십시오

임베딩 조회, 동적 마커 gather, 액션 테일이 연속된 NE 영역을 막는다면, 다음 분할로 별도 후보를 만드십시오.

CPU: tokenizer → selected embedding rows → embedding LayerNorm
NE candidate: all encoder layers → type embedding addition → both heavy head layers
CPU: marker/CLS selection → small scorer → raw-probability features → action head

엔진을 넘는 것은 엔드포인트뿐입니다. 모든 계층의 어텐션이나 LayerNorm을 CPU로 오프로드하지 마십시오. 다국어 B=1,L=96에서 FP16 임베딩 텐서는 147,456바이트이고, B=3,L=64에서는 294,912바이트입니다. 이 복사와 전체 은닉 상태 출력 복사를 종단 간 측정에 포함하십시오.

다국어 토큰 테이블은 196,608,000개 매개변수를 가지지만 각 요청은 그 토큰 행만 모읍니다. ANE 트랜스포머 서브그래프로 반입할 필요가 없으며, 매 예측마다 전체 테이블 읽기로 계산해서는 안 됩니다. 그 LayerNorm은 위치 의존이 없으므로, 테이블 행의 오프라인 사전 정규화는 실수 산술상 등가입니다. 이는 반올림과 저장 정밀도를 바꿀 수 있어 자체 패리티 검사가 필요합니다. 액션 헤드는 온도 캘리브레이션 전 원시 마커 로짓의 확률을 소비하며, 그 특징을 공개 캘리브레이션 확률에서 재구성하면 체크포인트 동작이 바뀝니다.

10× 지연 시간 주장에 대한 산술 한계

D를 은닉 폭, I를 게이트 인코더 중간 폭, N을 인코더 계층 수, H=2를 결정 헤드 계층 수라 합니다. 토큰당 주요 행렬 매개변수 수와 덴스 산술은 다음과 같습니다.

A = N(4D^2 + 3DI) + 12HD^2
F_dense(B,L) = 2BLA + 4B(N+H)L^2D

곱셈과 덧셈을 따로 세십시오. 이 방정식은 norm, 활성화, 임베딩, 스코어링, 마스크, 복사, 런타임 오버헤드를 제외합니다. 프로파일러가 아닙니다. 마스킹된 로컬 계층에도 현재의 덴스 어텐션 계산을 모델링합니다.

체크포인트 D / I / N A FP16 주요 행렬 바이트 B=1,L=96에서의 덴스 작업 현재 MLX P50보다 10× 아래에 필요한 유효 컴퓨트
다국어 768 / 1152 / 22 124,452,864 248.91 MB 24.574 GFLOP 0.787 ms 안에 31.23 TFLOP/s
영어 / typed 아키텍처 1024 / 2624 / 28 368,312,320 736.62 MB 71.848 GFLOP 영어 기준선을 사용해 1.333 ms 안에 53.89 TFLOP/s

이는 요구되는 달성 속도이며, 주장된 ANE 피크 사양이 아닙니다. 레이아웃 재작성은 오버헤드를 제거하지만 그 덴스 투영을 제거하지는 않습니다. 하드웨어는 또한 24개 또는 30개 어텐션/MLP 블록의 순차 체인을 실행해야 합니다.

낙관적인 스트리밍 모델은 또 다른 조건부 하한을 줍니다.

t >= max(F / effective_compute, bytes_from_DRAM / effective_bandwidth)

40 GPU 코어 M3 Max는 400 GB/s 통합 메모리 대역폭으로 명시됩니다. 만약 각 주요 FP16 행렬이 요청마다 DRAM에서 한 번씩 가져온다면, 그 대역폭에 완전히 접근하더라도 다국어에 최소 0.622 ms, 영어에 1.842 ms가 듭니다. 실제 ANE 대역폭 접근은 더 작을 수 있고, 캐시되거나 압축된 가중치는 가정을 바꿉니다. 이는 무조건적인 물리적 하한이 아닙니다. 비압축 스트리밍에서 10× 영어 지연 시간이 특히 까다로운 이유와, 지연 시간이 완만하게 개선되어도 에너지 측정이 유용한 이유를 보여줍니다.

종단 간 시간의 측정된 비율 f가 계수 s만큼 개선될 때, Amdahl의 법칙은 S = 1 / (1-f+f/s)를 줍니다. 한 영역을 무한히 가속해도 그것이 원래 지연 시간의 최소 90%를 차지하지 않으면 10×에 도달할 수 없습니다. 의사결정당 줄을 목표로 할 때 유사한 한계는 FLOPs가 아니라 측정된 에너지의 비율을 사용합니다. 최종 헤드의 선택 쿼리 최적화는 모델 산술의 몇 퍼센트만 제거하며, 로컬 어텐션 희소성도 L<=64에서는 로컬 윈도가 모든 위치를 덮으므로 무시할 만합니다. 어느 쪽도 개연성 있는 단독 10× 경로를 제공하지 않습니다.

압축과 아키텍처 변경은 다른 계약을 가집니다

후보 같은 실수값 체크포인트 함수인가? 현실적으로 바꿀 수 있는 것
BC1L 레이아웃, 1×1 투영, 정적 위치/마스크, 헤드 분할 방정식과 입력이 보존되면 예 스케줄링, 지역성, 컴파일러 분할, 메모리 복사
CPU 엔드포인트 분할, 오프라인 임베딩 norm, 최종 헤드의 선택 쿼리 실수 산술에서는 예; 반올림 검증 필요 지원되지 않는 연산, 패키지 크기, 일부 미사용 작업
8/6/4비트 팔레타이제이션 또는 가중치 양자화 일반적으로 아니요 가중치 트래픽/저장, 그리고 아마도 추론 에너지/지연 시간
학습된 0이 아닌 가중치 가지치기 또는 저랭크 인수분해 대수적으로 정확한 구조가 존재하지 않으면 아니요 회복/캘리브레이션 후의 행렬 산술과 트래픽
조기 종료, 토큰 가지치기, 더 적은 계층, 더 좁은 학생 아니요 잠재적으로 큰 절감; 새 모델과 품질 계약
임의 질문 간 은닉 상태 재사용 이 양방향 인코더에는 아니요 잘못된 지름길; 문맥 상태는 질문에 의존
동일한 전체 입력 답 캐싱 캐시 적중에는 정확 워크로드 기능; 캐시되지 않은 추론 속도가 아님

Apple의 현재 최적화 개요는 NE 메모리/지연 시간 이득을 위해 팔레타이제이션을 가리키고, A17 Pro/M4와 함께 더 새로운 W8A8 컴퓨트 경로를 언급합니다. 그 더 새로운 하드웨어 속도 향상을 이 M3 Max로 외삽하지 마십시오. 양자화 성능 가이드는 또한 활성화 디퀀타이제이션이 CPU/GPU 실행을 느리게 할 수 있다고 경고합니다. 먼저 NE 상주 기준선을 확보한 뒤, 민감한 norm/스코어러는 적절히 보존하면서 8비트부터 아래로 가중치 팔레타이제이션을 시험하십시오.

FP16 가중치를 8비트나 4비트로 패킹하면 메타데이터를 제외하고 2×나 4×의 이상적인 가중치 저장 비율을 줍니다. 이는 동일한 지연 시간 배수가 아닙니다. 압축 해제, 활성화 이동, 계산이 그대로 남습니다. 가지치기는 선택한 표현이 실제로 0을 활용할 때만 런타임에 도움이 됩니다. 임의의 헤드/계층을 제거하거나 저랭크 절단을 수행하려면 품질 회복이 필요하며, 조건 없이 원래 모델 정체성을 유지할 수 없습니다.

입력별 로짓 오차 한계 ||z'-z||_infinity <= delta에 대해, 충분한 argmax 인증서는 top1(z)-top2(z) > 2delta입니다. 동일한 양의 캘리브레이션 온도 T에서 softmax의 무한대 노름 Lipschitz 한계는 ||p'-p||_infinity <= delta/(2T)를 줍니다. 이는 평가된 입력에 대한 유용한 진단이며, 양자화에 대한 전역 인증서가 아닙니다. 별도의 근접 마진 슬라이스와 다국어 평가 슬라이스를 보존하십시오. 포화된 예시는 큰 로짓 오차를 감출 수 있습니다.

세 가지 실험과 수용 게이트

  1. 고정 셰이프 등가 NE 그래프. 다국어 B=1,L=96,K=4와 Snake B=3,L=64,K=4를 BC1L 투영, 올바른 헤드별 RoPE, 명시적 어텐션, 원래 LayerNorm/GELU로 내보내십시오. 입력 배열과 개별 계층 출력을 원래 그래프와 비교하십시오. 어떤 주요 투영과 어텐션 블록이 NE 우선인지 검사한 뒤 실제 런타임 NE 활동을 확인하십시오. 지원 연산 수만으로는 성공이 아닙니다. 해당하는 최적화된 MLX 기준선을 번갈아 블록으로 다시 실행하십시오.
  2. 하나의 연속 트랜스포머 섬. 첫 그래프가 조각나면 임베딩과 소형 최종 테일을 CPU 경계로 옮기십시오. 같은 전력 측정 아래에서 전체 그래프 후보와 비교하십시오. 완전한 예측이 관찰된 실행 간 변동을 넘어 지연 시간이나 에너지를 개선할 때만 후보를 유지하십시오. 모든 복사를 포함하십시오. 빠른 고립 인코더로는 불충분합니다.
  3. 배치가 효과를 낸 뒤 에너지 중심 압축. 8비트 팔레타이제이션을 스크리닝한 뒤, 6/4비트를 별도의 근사 변형으로 스크리닝하십시오. 변경되지 않은 픽스처 게이트, 홀드아웃 choice/score/noul 작업, 다국어 입력, 근접 동점, Snake 궤적을 실행하십시오. 정확도, 확률 드리프트, 캘리브레이션을 성능과 함께 공개하십시오. 공격적인 압축이나 증류는 학습된 동작을 바꾼다면 별도로 이름 붙인 모델에 속합니다.

출시 주장 전에 같은 체크포인트/입력 해시와 교대하는 기준선/후보 순서를 사용하고, 콜드 컴파일은 제외하되 따로 보고하십시오. 최종 후보마다 최소 다섯 개의 지속 블록을 사용하고 원시 지연 시간, 완료 호출, 전력 샘플을 유지하십시오. 후보를 통과시키기 위해 완화하지 않은 채 원래 픽스처 일치와 기존 확률 허용 범위, 그리고 안정적 유한 출력과 한정된 메모리를 요구하십시오. 장문 입력과 셰이프 경계 입력은 짧은 고정 셰이프 데모와 따로 측정하십시오.

관련 속도, 동일 부하 전력, 또는 에너지 비율이 주장을 뒷받침하는 불확실성과 함께 최소 10이고 명시된 지연 시간 및 작업 품질 한도를 충족할 때만 10×를 선언하십시오. 불확실성 하한이 10에 도달하지 않으면 측정된 비율을 보고하십시오. 검증된 NE 실행과 함께 더 작은 에너지 이득도 유용한 증거로 남지만, 자릿수 결과는 아닙니다.

문서 출처

필수 Context7 CLI 워크플로를 사용했습니다. Core ML Tools를 /apple/coremltools로 해석한 뒤 트랜스포머 연산자/레이아웃 lowering과 NE 압축 동작을 질의했습니다(총 세 명령). Apple의 연구 글, 레퍼런스 소스, 현재 Core ML 최적화 문서, 컴퓨트 계획 문서, 위에 링크된 기기 사양을 확인했습니다. 모델 방정식, 매개변수 수, 출발 측정값은 이 저장소와 그 MLX 자매 프로젝트에서 도출했습니다. 이 연구 브랜치가 경쟁 GPU/ANE 벤치마크를 실행한 적은 없습니다.