Neural Engine 속도와 에너지 측정
FP16 ANE 재작성은 컴파일된 MLX FP16 대비 완전 예측 속도를 1.39×, 의사결정당 추정 전체 시스템 에너지를 2.78× 개선합니다. 별도로 검증된 W8 K-means 후보는 각각 1.42×와 3.19×에 도달합니다. 어느 쪽도 요청된 10× 목표를 충족하지 못합니다. 이는 로컬 M3 Max 결과이며, 아래에 정밀도와 전력 측정의 한계가 있습니다.
구현과 변환 실험은 ANE_ENGINEERING.md에, 수학적 한계와 충실도 계약은 ANE_MATH.md에 있습니다.
최종 지속형 짧은 의사결정 비교
M3 Max, 40 GPU 코어, 128 GiB, macOS 27.2. 동일한 다국어 소스 체크포인트, 동일한 여덟 가지 invoice 상태 변형, 요청당 네 개 선택지 질문 하나, 실제 91토큰을 96으로 패딩. 출력 캐시나 생성 토큰은 없습니다. 세 모델 모두 상주 상태를 유지하며, 로딩, 컴파일, 워밍업은 측정 구간 밖에 있습니다.
기준선은 mx.compile, 프롬프트 프리픽스 캐싱, 32토큰 셰이프 버킷을
활성화합니다. 이는 과거의 eager MLX 기준선보다 빠릅니다. FP16 ANE 후보는 원래
가중치를 그대로 유지하며, 완전한 Core ML 트랜스포머 본체, 호스트 임베딩 조회,
FP32 CPU 액션 테일을 갖습니다. W8은 그룹형 K-means 가중치 전용 팔레트
압축을 사용하며 W8A8 연산이 아닙니다. 활성화는 여전히 FP16을 쓰고 호스트
액션 테일은 FP32로 남습니다.
| 지표 | MLX GPU FP16, 컴파일됨 | ANE FP16 | ANE W8 K-means |
|---|---|---|---|
| 완료한 의사결정 수 | 17,184 | 23,961 | 24,453 |
| 측정된 활성 지속 시간 | 120.02 s | 120.02 s | 120.02 s |
| 종단 간 P50 | 6.937 ms | 4.976 ms | 4.879 ms |
| 종단 간 P95 | 7.393 ms | 5.307 ms | 5.227 ms |
| 의사결정당 평균 경과 시간 | 6.984 ms | 5.009 ms | 4.908 ms |
| 평균 전체 시스템 전력 추정 | 61.39 W | 30.75 W | 27.39 W |
| 의사결정당 전체 시스템 에너지 | 0.4288 J | 0.1540 J | 0.1344 J |
| 의사결정당 유휴 차감 에너지 | 0.3393 J | 0.0888 J | 0.0715 J |
| 컴파일된 MLX 대비 속도 이득 | 1× | 1.394× | 1.423× |
| 컴파일된 MLX 대비 전체 시스템 에너지 이득 | 1× | 2.784× | 3.189× |
| 컴파일된 MLX 대비 유휴 차감 에너지 이득 | 1× | 3.823× | 4.749× |
비율은 모든 완료된 작업을 포함한 구간 평균을 사용합니다.
FP16: speed 1.394 × average system-power ratio 1.997 = energy gain 2.784
W8: speed 1.423 × average system-power ratio 2.241 = energy gain 3.189
에너지 비율에 속도를 다시 곱하면 경과 시간을 이중 계산하게 됩니다. 유휴 차감 행은 다른 측정 경계를 사용하며, 노트북 전체 전력이 3.8–4.7× 떨어진다는 뜻이 아닙니다. 이는 포화 처리량 구간입니다. 고정 FPS 전력 주장을 하려면 동일 요청 속도 실험이 필요합니다. W8은 이번 세션에서 평균 속도를 FP16 대비 약 2.1% 개선하는 데 그쳤고, 본체 패키지는 251.91에서 129.29 십진 MB로 줄었습니다. 패키지 크기는 원래 체크포인트/호스트 임베딩 테이블을 제외하며, 전체 런타임 메모리가 아닙니다.
각 구현은 MLX, ANE FP16, ANE W8, ANE W8, ANE FP16, MLX의 세 번의 균형 잡힌
주기로 20초 블록을 여섯 번 실행했습니다. 블록 사이에는 10초의 유휴 샘플링이
있고, 처음 3초의 유휴는 버리며, 인접한 안정 유휴 전력을 평균합니다. 백엔드
블록 전력 범위는 MLX가 60.32–62.38 W, FP16 ANE가 29.28–35.14 W, W8 ANE가
26.68–27.95 W였습니다. 다른 데스크톱 애플리케이션도 열려 있었으며, 교대 실행과
인접 유휴 샘플링은 백그라운드 부하와 센서 불확실성을 줄이지만 제거하지는
못합니다.
65,598회의 예측 모두 해당 상태에 대해 자기 백엔드의 반올림된 워밍업 출력과 일치합니다. 세 백엔드 모두 이 여덟 상태에서 같은 답을 선택합니다. 별도의 충실도 스위트는 더 넓습니다. FP16 L96은 최대 확률 드리프트 0.002925로 59/59 적합 질문을 통과하고, W8은 변경되지 않은 0.02 게이트에서 드리프트 0.014393으로 같은 59개를 통과합니다. 완전한 63/63 결과는 별도로 내보낸 FP16 L1024 모델에 속합니다. 이는 회귀 픽스처이며, 일반 작업 정확도나 임의 입력에서의 캘리브레이션 보존을 주장하는 것이 아닙니다.
이번 실행은 1,101개의 전력 샘플을 유지했고, 최대 간격은 0.510초, 기록된 최대 시스템 전력은 74.47 W였습니다. 버려진 샘플은 없습니다. 블록별 RSS는 모든 모델과 기록 버퍼가 상주한 공유 프로세스를 대상으로 기록되며, 그 값은 개별 백엔드의 모델 메모리에 귀속시킬 수 없습니다. 현재 런타임과 패키지 지문은 보고서와 함께 저장됩니다.
최종 원시 호출과 PSTR 샘플 · 감사된 요약과 세션 내 부트스트랩 구간
앞선 FP16 전용 파일럿은
1.410× 속도와 2.939× 총 시스템 에너지 이득을 측정했습니다. 이는 마지막 입력
검사와 호출별 안정성 계측보다 앞선 것입니다. 위의 새로운 3군 실행이 최종
런타임에 대한 공개된 비교입니다. 최종 원시 보고서의 메타데이터 경고 하나가
처음에 역사적인 macmon 컴포넌트 합 하한을 무조건적으로 서술했는데, 추가
metadata_corrections 항목이 이번 실행은 PSTR만 사용했음을 분명히 합니다.
원래 필드와 모든 측정값은 보존됩니다.
Snake 호환성은 별개의 워크로드입니다
같은 공개 Snake 플래너, 압축 프롬프트, 안전 정책을 FP16 ANE 어댑터와 컴파일된 MLX 양쪽에서 실행하며, 동일한 실시간 상태에서 평가 순서를 번갈아 바꿨습니다. 시드 101과 102는 각각 300스텝을 완료했습니다. 제안되고 실행된 액션 600/600이 일치하며, 사망 0회, 실드 개입 0회입니다. 최종 점수는 9와 10이었고, Snake 길이는 15와 16이었습니다. 최대 이동 확률 차이는 0.0036이었습니다. 이는 이 FP16 궤적 비교를 검증할 뿐, 압축 모델의 Snake 동작이나 무한 생존을 검증하지 않습니다.
| 시드 | ANE 완전 의사결정 P50 / P95 | 컴파일된 MLX 완전 의사결정 P50 / P95 |
|---|---|---|
| 101 | 23.45 / 27.10 ms | 17.14 / 23.58 ms |
| 102 | 17.68 / 27.30 ms | 19.18 / 33.27 ms |
ANE 어댑터는 B1/L96에서 세 질문을 순차적으로 실행하고, MLX는 세 질문을 최대 L64로 배치 처리합니다. 이 타이밍은 플래너 특징과 완전한 예측을 포함하고, 다른 백엔드의 작업, 게임 스텝, 터미널 렌더링은 제외하며, 상당한 변동을 보입니다. 이는 일관된 Snake 속도 향상이나 최대 안정 렌더링 속도를 입증하지 않습니다. 단일 질문 4.98 ms 결과를 전체 Snake 프레임 시간으로 광고해서는 안 됩니다. 전용 B3/L64 ANE 내보내기는 별도의 최적화 및 검증 작업이 될 것입니다.
python -m benchmarks.snake artifacts/ane-repro/body96/model.mlpackage \
/path/to/original/laya-multilingual --ane --mlx-compiled \
--steps 300 --seeds 101 102 --output artifacts/ane-snake.json
측정 경계와 텔레메트리 한계
모든 시간 측정 호출은 프롬프트 구성, 토크나이즈, 배열 구성, 해당되는 경우 호스트 임베딩 조회, 동기 모델 실행, 액션 특징, 캘리브레이션, 출력 포매팅을 포함합니다. MLX는 지연 출력을 평가하고, Core ML은 완료된 NumPy 배열을 돌려줍니다. 이는 고립된 모델 커널이 아니라 캐시되지 않은 예측을 비교합니다.
최종 비교는 작고 권한이 필요 없는
PSTR 전용 샘플러를
사용합니다. 이는 macmon 0.8.2의 저수준 SMC API를 고정하고, 읽기 전용 연결을
하나 열어, 원래 PSTR 값을 500 ms마다 샘플링합니다. IOReport 컴포넌트 카운터는
읽지 않습니다. 이는 전체 시스템 센서 추정치이며, 외부 벽전력이나 배터리 측정이
아닙니다. 실행 파일 해시와 소스 출처는 원시 결과와 함께 기록됩니다.
이 별도 샘플러가 필요했던 이유는 공식 macmon CLI가 그
소스에
나와 있듯 sys_power = max(PSTR, component_sum)을 계산하기 때문입니다. 이
OS에서 CPU와 ANE 카운터는 대개 0을 반환했고, 그러다 샘플 하나가 약 38,021 W
CPU와 2,068 W ANE로 튀었습니다. 컴포넌트 하한이 그 결함을 40,089 W 시스템
판독값으로 전파했습니다. IOReport 이상 현상의 정확한 원인은 밝혀지지 않았으며,
그 샘플에서 원래 PSTR 값을 복구할 수 없습니다. 영향을 받은 에너지 실행 전체를
거부했으며, 불량 샘플을 제거하거나 잘라내지 않았습니다. 그
원시 기록은
여전히 사용할 수 있지만, 그 안에 저장된 에너지 집계는 결과로 사용해서는 안
됩니다.
앞선 FP16 전용 실행은 공식 macmon v0.8.2 릴리스를 사용했고, 그 아카이브
SHA256은 588d5bde79885ba36f693e5150911c10c3ad208a2e418a3f2aa827ac84a2d973으로
검증되었습니다. 이는 이후 온전성 검사를 통과했고 역사적 증거로 남습니다. 최종
PSTR 전용 실행은 하나의 일관된 샘플러로 모든 백엔드를 다시 측정합니다.
하네스는 단조 수신 타임스탬프에 보간 경계를 적용해 와트를 적분합니다. 누락,
0 이하, 비유한, 또는 500 W 초과 시스템 판독값은 실행을 거부합니다. 500 W
상한은 이 M3 Max에 대한 의도적으로 느슨한 온전성 검사이며, 캘리브레이션된 정확도
한계가 아닙니다. max(2 seconds, 3 × sample interval)을 넘는 간격도 실행을
거부합니다. 요약은 완전한 균형 주기, 호출별 안정성, 호출 수, 활성 에너지, 양쪽
인접 유휴 구간, 그리고 그로부터 나온 유휴 차감 에너지를 원시 샘플과 대조해
검증합니다. 증분 에너지는 부호를 유지하며, 큰 비율을 만들어 내기 위해 클램프하지
않습니다.
직접 샘플러는 CPU/GPU/ANE 전력 필드를 측정하지 않으므로 생략합니다. 역사적인 누락 또는 0 컴포넌트 카운터는 에너지가 0임을, 또는 ANE 실행이 없음을 입증할 수 없습니다. 부트스트랩은 완전한 균형 주기를 재표집하며, 데스크톱 세션 하나의 세 주기로는 모든 백그라운드 부하, 미래 실행, 센서 정확도를 특징짓지 못합니다. 측정된 비율 중 10×에 가까운 것은 없습니다.
Neural Engine이 실제로 작업을 실행하는가?
재작성된 B1/L96 그래프의 Core ML 컴퓨트 계획은 6,390개의 비상수 연산 전부를
MLNeuralEngineComputeDevice에 배치합니다. 나머지 3,809개의 알 수 없는 항목은
상수입니다. 이는 예상 배치이며, 그 자체로 충분한 하드웨어 증거가 아닙니다. 일반
SDPA 내보내기는 이 시스템에서 NE 우선 연산이 하나도 없었습니다.
별도의 15.97초 Instruments Core ML 트레이스는 후보가 CPU_AND_NE로
실행되는 동안 수집되었고, 3,124개의 활성 “Neural Engine Prediction”
구간과 관련 없는 캐시된 시스템 모델 로드 하나를 포착했습니다. 따라서
내보낸 하드웨어 테이블은 컴퓨트 계획에 더해 실행 시점 ANE 활동의 긍정적 증거를
제공합니다. 이 테이블은 전역이라 모든 예측에 PID나 모델 정체성을 붙이지
않습니다. 이 기록에서 Core ML 모델 사인포스트 테이블은 비어 있었습니다. 우리는
모든 하드웨어 구간을 배타적으로 Laya에 귀속시키지 않으며, 호스트 작업이 ANE에서
실행된다고 주장하지 않습니다.
허용 목록에 오른 하드웨어 이벤트는
타임스탬프, 지속 시간, 기기, 레이블, 상태만 포함합니다. 전체 Instruments
아카이브와 프로세스 환경 메타데이터는 무시되는 artifacts/ 디렉터리에
남습니다. 트레이싱은 에너지 테스트와 별개였으며, 계측된 하드웨어 구간은
종단 간 지연 시간 결과로 사용되지 않습니다.
재현
먼저 엔지니어링 보고서의 명령으로 고정된 L96 FP16 및 W8
K-means 패키지를 만들고 검증하십시오. 그 명령들은 artifacts/ane-repro/ 아래의
새 디렉터리에 씁니다. 직접 센서 샘플러를 로컬에서 빌드하십시오. 시스템 데몬이나
권한 있는 서비스는 설치되지 않습니다.
pip install -e '.[convert,dev,compare,research]'
cargo build --release --locked --manifest-path benchmarks/pstr_sampler/Cargo.toml
python -m benchmarks.energy \
--source /path/to/original/laya-multilingual \
--candidate artifacts/ane-repro/body96-w8km/model.mlpackage \
--fp16-candidate artifacts/ane-repro/body96/model.mlpackage \
--candidate-factory experiments.ane_engineering.runtime:ANEAgent \
--sampler benchmarks/pstr_sampler/target/release/pstr-sampler --pstr-only \
--cycles 3 --seconds 20 --idle-seconds 10 \
--output artifacts/energy.json
python -m benchmarks.energy_summary artifacts/energy.json \
--output artifacts/energy-summary.json
독립적인 런타임 진단을 위해서는 benchmarks.trace_ane을 시작하고, 준비된 PID
파일을 기다린 뒤, 다른 모델 워크로드가 실행되지 않는 상태에서 Instruments를
연결하십시오.
python -m benchmarks.trace_ane \
--source /path/to/original/laya-multilingual \
--package artifacts/ane-repro/body96/model.mlpackage \
--seconds 90 --ready artifacts/trace.pid
# From another terminal; use the PID written to that file.
xcrun xctrace record --template 'Core ML' --attach <PID> \
--time-limit 15s --output artifacts/ane.trace
xcrun xctrace export --input artifacts/ane.trace --toc \
--output artifacts/toc.xml
xcrun xctrace export --input artifacts/ane.trace \
--xpath '/trace-toc/run[@number="1"]/data/table[@schema="ane-hw-intervals"]' \
--output artifacts/hardware.xml
python -m benchmarks.trace_summary --hardware-xml artifacts/hardware.xml \
--toc-xml artifacts/toc.xml --output artifacts/hardware-summary.json
원래 체크포인트와 더 짧은 내보내기는 서로 다른 컨텍스트 한도를 가집니다. L96 런타임은 맞지 않는 입력을 거부합니다. 짧은 워크로드 속도 결과는 512/1024 토큰에서, 또는 세 Laya 체크포인트 전반에서의 성능을 입증하지 않습니다.