문서

실제 Snake 작업 부하 최적화

채택한 선택적 경로는 MLX 컴파일, 16토큰 길이 버킷, 상한이 있는 토크나이즈된 질문 프리픽스 캐시를 결합합니다. 가중치를 바꾸거나, 모델을 양자화하거나, 예측을 캐시하거나, 양방향 인코더 은닉 상태를 질문들 사이에서 재사용하지는 않습니다.

짝지은 전체 루프 테스트에서 배포된 최적화 경로는 이동 2,400회 동안 초당 75.40 이동을 달성했고, 같은 테스트의 eager 추론은 초당 70.82 이동이었습니다: 1.065×, 약 6.5%입니다. 둘 다 사망 0회, 안전 개입 2회였고 2,400/2,400 스텝에서 실행 동작이 동일했습니다. 워밍업과 캐시 정리 후 합쳐진 활성 MLX 메모리 증가는 0바이트였습니다.

켜는 법

laya-snake --optimize
laya-snake --optimize --max-speed

일반 API도 같은 선택적 제어를 노출합니다:

import laya_mlx as laya

agent = laya.load(
    "aac6fef/laya-multilingual-mlx",
    compile=True,
    pad_to_multiple=16,
    cache_prompts=True,
)

세 옵션 모두 기본값은 꺼짐이며, 기존 eager 동작과 벤치마크 구성을 보존합니다. 컴파일은 입력 형상에 특화되므로, 첫 사용과 새 형상에서는 컴파일 비용이 들 수 있습니다. 가중치나 모듈 구조를 바꾼 뒤에는 새 Agent를 만드십시오. 패딩은 설정된 컨텍스트 한도를 넘지 않으면서 시퀀스 길이를 요청한 배수로 올림합니다. 마스크는 패딩된 토큰을 제외합니다.

cache_prompts=True는 Agent마다 마커 위치를 포함한 불변 PreparedQuestion 프리픽스를 최대 128개 유지합니다. 캐시 키에는 토크나이저 정체성, 특수 토큰, 질문 유형, 순서가 있는 렌더링 선택지, 지시문, 프리픽스 예산이 들어갑니다. 상태는 prepare 호출마다 한 번 정리되고 토크나이즈된 뒤, 각 질문 프리픽스와 독립적으로 이어 붙습니다. 질문이 바뀌면 적절한 프리픽스를 만들거나 고릅니다. 각 질문은 여전히 전체 모델 포워드를 거칩니다.

형상 및 준비 ablation

이 데모는 매 이동마다 방향, 안전 경로 추정, 먹이 도달 가능성 추정의 세 질문을 합니다. 따라서 배치 크기는 1이 아니라 3입니다. 실제로 기록한 보드 32개를 샘플링한 결과:

  • 다국어 시퀀스 길이는 59, 61, 63, 64였습니다. 16토큰 배수는 이들을 모두 64토큰 버킷에 넣습니다.
  • 영어 시퀀스 길이는 66, 68, 69, 70이었고, 80토큰 버킷에 매핑됩니다.
  • 다국어 입력을 64에서 96으로 패딩하면 토큰 단위 작업이 50% 늘어납니다. 별도의 단문 API 픽스처가 시사하는 93에서 96으로의 작은 조정이 아닙니다.

후보들은 측정 대상 형상을 한 번씩 모두 거친 뒤, 동일한 각 상태 안에서 순환 순서로 실행되었습니다. 표에는 토크나이즈와 출력 변환을 포함한 동기화된 Agent.predict 지연 시간이 들어 있고, 플래너/UI 작업과 초기 형상 워밍업은 제외됩니다.

변형 다국어 p50 / p95 (ms) 영어 p50 / p95 (ms)
Eager 9.12 / 10.21 21.83 / 26.73
프리픽스 재사용만 8.95 / 9.75 21.60 / 25.23
컴파일, 실제 길이 8.67 / 9.66 21.27 / 25.99
컴파일, 96으로 패딩 10.92 / 11.72 25.66 / 29.88
컴파일 + 프리픽스 재사용 8.66 / 9.21 21.03 / 23.97
컴파일, 작업 부하 버킷 8.66 / 9.55 21.78 / 26.12
컴파일 + 버킷 + 프리픽스 재사용 8.56 / 9.29 21.51 / 24.16

일곱 후보 모두 체크포인트마다 보드 32/32에서 eager가 제안하고 실행한 방향과 일치했습니다. 화면에 표시되는 소수점 네 자리 확률과 추정치의 최대 차이는 이 샘플들에서 0이었습니다. 이는 유한 샘플의 반올림된 출력 일치이며, 내부 부동소수점 텐서가 비트 단위로 동일하다는 주장이 아닙니다.

이 ablation은 설계를 선별하기 위해 상한이 있는 프리픽스 준비 래퍼를 썼습니다. 아래 전체 루프 테스트는 실제로 배포된 compile, pad_to_multiple, cache_prompts API 구현을 씁니다. 그 정확성 테스트는 상태 절단, 기준 변경, 마스크 정리, 캐시 축출 상황에서 준비된 ID와 마커를 추가로 비교합니다.

배포된 최적화 경로는 전체 실제 체크포인트 검증 매트릭스도 통과했습니다: FP32와 FP16에서 세 체크포인트 각각 선택 답 일치 63/63(총 378/378). 캘리브레이션된 확률 오차는 기존 허용 범위 안에 머물렀습니다. 각 구성은 측정된 활성 메모리 증가 0바이트로 유한하고 결정적인 반복 호출 10회를 추가로 통과했습니다. 최적화 검증 데이터. 원래 eager 경로의 구성당 100회 반복 결과는 원래 벤치마크 보고서에 남아 있습니다.

영어에서는 이 샘플에서 실제 시퀀스 길이로 컴파일하는 것이 더 큰 버킷을 강제하는 것보다 나았습니다. 데모는 다국어를 기본으로 합니다. 일반 API 사용자는 컴파일과 프리픽스 재사용을 켜면서 pad_to_multiple=None으로 둘 수 있습니다.

전체 루프 짝지은 테스트

네 시드, 각 이동 600회, 후보 순서는 시드마다 번갈아 바뀝니다. 렌더링에는 트루컬러 Rich 구성과 ANSI 직렬화가 포함되고, 터미널 에뮬레이터의 화면 그리기는 제외됩니다. 각 이동은 새로 예측합니다. 결과는 로컬 짝지은 실행 한 번에서 나온 것입니다.

시드 Eager 이동/초 최적화 이동/초 점수 (양쪽) 동작 일치
101 68.60 78.04 20 600
102 70.07 78.62 24 600
103 76.75 85.62 23 600
104 68.50 63.15 16 600

최적화 경로는 한 시드에서 더 느렸습니다. 따라서 6.5%는 이 측정 실행에서의 합쳐진 개선이며, 모든 에피소드나 머신에서 보장되는 개선이 아닙니다. 이전의 광범위한 속도 스윕과 이번의 짝지은 테스트는 서로 다른 실행이므로, 절대 속도를 빼서 속도 향상을 주장해서는 안 됩니다. 전체 루프 데이터.

지연 시간뿐 아니라 게임플레이로도 모델 선택

두 체크포인트가 짝지은 시드 20개 × 이동 300회를 실행했고, 체크포인트 순서는 시드마다 번갈아 바뀝니다. 모든 에피소드는 같은 초기 상태, 먹이 RNG 시드, 간결한 특징 설명, 사이클 방패를 썼습니다. 지평선은 고정되어 있습니다. 이는 이동 300회 후의 점수이며, 사망이나 보드 만원으로 끝나는 완전한 게임이 아닙니다. 이 모델 비교에는 터미널 렌더링이 포함되지 않았습니다.

체크포인트 생존 / 에피소드 이동 중앙값 / 평균 점수 추론 p50 / p95 (ms) 개입
laya 20 / 20 6000 7.0 / 6.9 23.15 / 28.21 0
multilingual 20 / 20 6000 10.0 / 9.9 9.38 / 14.38 2

다국어는 이 작업 부하에서 먹이 진전이 더 많고 더 빨랐으므로, 기본 데모 체크포인트로 남습니다. 이 결과는 이 특징 보조 정책을 평가한 것이지, 일반적인 추론 품질이나 도움 없는 Snake 모델이 아닙니다. 모든 에피소드와 추론.

재현

uv run --extra demo python -m experiments.snake_runtime \
  --output artifacts/snake/runtime-multilingual.json
uv run --extra demo python -m experiments.snake_runtime \
  --model models/hub/laya-mlx --bucket 80 \
  --output artifacts/snake/runtime-english.json
uv run --extra demo python -m benchmarks.snake_optimized \
  --output artifacts/snake/optimized-paired.json
uv run --extra demo python -m benchmarks.snake_models \
  --episodes 20 --steps 300 --output artifacts/snake/models.json

GPU 측정은 순차적으로 실행하십시오. 먼저 두 로컬 모델 디렉터리를 내려받으십시오. 체크인된 소스 기록이 정확한 샘플링 보드 상태를 제공합니다. 원시 ablation: 다국어, 영어, 최초 96토큰 파일럿.

이전의 간결 대 상세 프롬프트 비교는 64개 상태에서 프롬프트 순서를 번갈아 바꾸었고, 처음 8회 워밍업 반복을 버린 뒤 중앙값이 11.80 → 9.29 ms임을 확인했습니다. 그 원래의 임시 기록은 보드 스냅샷을 저장하지 않았으므로, 주요 재현 가능 ablation이 아니라 보조 근거입니다. python -m benchmarks.snake_prompt는 상태, 시드, 전체 결정, 방법을 저장하는 재현 가능한 버전을 제공합니다.

이 구현은 MLX의 공식 컴파일 가이드를 따릅니다: 오래 유지되는 컴파일된 콜러블과 일반적인 형상 특화를 씁니다. 형상에 의존하는 Python 모델 코드에는 shapeless=True를 쓰지 않습니다. 최신 문서는 Context7 CLI 요청이 네트워크 오류로 실패한 뒤 공식 사이트를 통해 확인했습니다.