From e1468d519188f8b63fede900e2306d8941232e42 Mon Sep 17 00:00:00 2001 From: BREW <81044362+b-re-w@users.noreply.github.com> Date: Sun, 4 Oct 2026 16:55:09 +0900 Subject: [PATCH] Docs: TypedPython kernels against JAX, torch delegation only where it matches JAX, no numpy (#189) --- docs/design/typedpython.md | 59 ++++++++++- docs/investigations/typedpython-vs-jax.md | 121 ++++++++++++++++++++++ 2 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 docs/investigations/typedpython-vs-jax.md diff --git a/docs/design/typedpython.md b/docs/design/typedpython.md index c0869d44..d607d7d0 100644 --- a/docs/design/typedpython.md +++ b/docs/design/typedpython.md @@ -351,7 +351,12 @@ IDE·타입 체커가 찾는 자리(pythonx-compose 배포본)에 설치돼야 - 커널 안: 고정 dtype 스칼라(f32, f16, bf16, int8 포함), 버퍼·텐서 뷰, 산술, 제어 흐름, 배리어. 객체 생성·힙 할당·예외·파이썬 호출은 없다. 위반은 등급 1 과 같은 게이트에서 컴파일 에러. - **커널 함수도 유효한 파이썬이다.** 타일 연산은 CPU 참조 구현을 가진 일반 파이썬 함수이고, 커널은 - CPython 에서 그대로 실행되어 수치를 대조할 수 있다. TileLang · Triton 과 갈리는 지점이다. + CPython 에서 그대로 실행되어 수치를 대조할 수 있다. TileLang · Triton · JAX Pallas 와 갈리는 지점이다 + (Pallas 는 CPU 에서 `interpret=True` 로만, JAX 위에서 돈다). +- **참조 구현은 numpy 에 의존하지 않는다 (결정 2026-10-04).** 타일 연산의 CPU 참조는 순수 파이썬(표준 + 라이브러리의 `array`, `memoryview`, `struct`)으로 쓴다. 참조의 목적은 정답이지 속도가 아니다. 커널을 + JAX · torch · numpy 없이 CPython 만으로 실행할 수 있다는 것이 Pallas 대비 차별점이고, 첫 조각의 + 시험으로 박는다 (§6 의 4). ### 5.3 CPU SIMD: `@compiled` 의 벡터화 @@ -377,6 +382,8 @@ Mojo 의 절반은 CPU SIMD 다. 등급 1 `@compiled` 의 C 백엔드(§4.3)가 - 채택하지 않는 것(참고 자료로만): TileLang/TVM (Vulkan 백엔드 없음, 커널이 일반 파이썬으로 실행되지 않음), CubeCL (진입점이 Rust 매크로, JIT 전용), IREE (모델 단위 입력과 자체 출력 형식, SPIR-V 코드 생성만 떼어 쓸 공식 경로 없음), xDSL (spirv 방언·SPIR-V/MSL/PTX 출력기 없음). +- IREE 기각은 **커널 컴파일러로서의** 평가다. **모델 통째 배포** 관점에서는 JAX 가 StableHLO 를 내고 + IREE 가 그것을 모바일로 AOT 컴파일하는 길이 경쟁자로 남는다 (§5.10). ### 5.5 출력기: 대상별로 교체 가능 @@ -390,6 +397,8 @@ Mojo 의 절반은 CPU SIMD 다. 등급 1 `@compiled` 의 C 백엔드(§4.3)가 Metal 4 텐서 연산(MSL 4 전용)에는 닿지 않는다. - **MSL 과 WGSL 출력기는 어느 IR 을 택해도 우리가 쓴다.** MLIR 상류에 두 대상이 없다. - SPIR-V 와 PTX 는 직접 내거나 MLIR 휠로 직렬화한다 (§5.4). +- **커널 번들은 IR 버전과 출력기 버전을 기록한다.** 런타임은 맞지 않는 번들을 거부한다. `jax.export` 가 + 호환 창을 명시하는 것과 같은 자리다. ### 5.6 런타임과 착지점: torchnative @@ -449,7 +458,48 @@ LLM 디코딩은 작은 연산이 많아 연산 사이의 디스패치와 메모 `torch.compile` 이득의 대부분이 융합이다. §5.6 이 미룬 그래프 캡처 기반 융합(동적 shape, in-place KV 갱신 문제)은 torchnative #68 에서 다룬다. 그전까지 모델 전체 수준의 속도 경쟁력은 제한된다. -### 5.10 선례, Taichi +### 5.10 JAX 와의 관계: 어디서 이기고, 무엇을 torch 에 맡기는가 + +> **결정 (2026-10-04, 메인테이너):** 설계는 JAX 대비 장점이 분명해야 한다. **torch 가 JAX 만큼 +> 성능을 내는 부분만 torch 에 맡기고**, 그렇지 않은 부분은 목록으로 두어 따로 판단한다. 근거는 +> [`typedpython-vs-jax.md`](../investigations/typedpython-vs-jax.md). + +**포지셔닝.** "JAX 보다 낫다" 가 아니라 **"JAX 가 가지 않는 곳에서 이긴다"** 로 쓴다. 근거가 이 범위에서만 +선다. + +| 우리가 이기는 곳 | 근거 (조사 2026-10-04, 웹 요약 경유) | +|---|---| +| 모바일 GPU(Vulkan, Metal)가 1급 대상 | Pallas 의 GPU 하강은 Mosaic GPU(Hopper 이상)이고 Triton 백엔드는 deprecated, Vulkan/Metal 백엔드 없음. jax-metal 은 macOS 15.6 에서 실패하는 이슈가 열려 있다 | +| 파이썬 의미 보존 | `jit` 은 트레이싱이라 부작용이 트레이스 때만 실행되고, 값 의존 분기는 에러, 배열은 불변, 범위 밖 인덱스는 clamp 된다. Pallas 커널은 JAX 없이 실행되지 않는다 | +| 빌드 타임 타입 게이트 | jaxtyping 은 실행(트레이스) 시점 검사이고 정적 검사기에는 `Array` 로만 보인다. 단, 우리도 shape 오류는 정적으로 잡지 못한다 | +| 생태계 착지 | transformers v5 가 TF 와 Flax 를 제거하고 PyTorch 만 남겼다. torch op 착지(§5.6)가 그 생태계에 붙는다 | + +**torch 에 맡기는 조건.** JAX 의 강점 중 우리가 직접 만들지 않는 것은 torch 가 맡는다. 다만 **torch 가 +JAX 와 같은 수준의 성능을 낸다는 근거가 있을 때만** 맡긴다고 확정하고, 근거가 없으면 아래 목록에 둔다. +2026-10-04 현재 어느 항목도 측정 근거가 없으므로 **전부 "판단 대기"** 다. + +| 기능 | JAX | torch 대응 | 판단 | +|---|---|---|---| +| 전체 프로그램 융합 | XLA | 데스크톱 `torch.compile`(Inductor). 모바일은 불가, torchnative 그래프 캡처로 대체 예정(#68, §5.9) | 판단 대기. **모바일에서는 알려진 격차** | +| 자동 미분 (`grad`) | 함수 변환, `jit` 과 합성 | `torch.autograd`, `torch.func.grad` | 판단 대기 (학습 성능 비교 없음. 온디바이스 목표상 추론이 우선) | +| 벡터화 (`vmap`) | `jit` 안에서 융합까지 | `torch.func.vmap` | 판단 대기 (`vmap` + 컴파일 조합의 성능 비교 없음) | +| 변환의 합성 (`jit`·`grad`·`vmap`) | 1급 | `torch.func` + `torch.compile` | 판단 대기 | +| 샤딩, 다중 기기 | `shard_map`, pjit | DTensor, FSDP | 판단 대기 (온디바이스 목표 밖일 가능성) | +| TPU · Hopper/Blackwell 커널 성숙도 | Mosaic TPU/GPU | torch_xla, Triton | 판단 대기 (데스크톱 CUDA 는 §5.8 의 Triton·TileLang 기준) | +| 내보낸 산출물의 호환 보장 | `jax.export` 후방 6 개월, 전방 3 주 | `torch.export`, ExecuTorch | 판단 대기. 우리 커널 번들은 IR 버전과 출력기 버전을 기록한다(§5.5) | + +각 항목은 측정(같은 작업을 JAX 와 torch 로 실행한 시간)이나 메인테이너 판단으로 "torch 에 맡김", "우리가 +만든다", "범위 밖" 중 하나로 닫는다 (§8 의 8). + +**불분명한 것.** + +- **JAX + IREE 모델 배포.** `jax.export` 의 StableHLO 를 IREE 가 AOT 컴파일해 모바일에 싣는 길은 이론상 있다. + IREE 는 §5.4 에서 *커널 컴파일러로서* 기각했지만(코드 생성만 떼어 쓸 공식 경로 없음), *모델 통째 배포* + 관점에서는 경쟁자다. 실제로 iOS/Android GPU 에서 도는 사례는 찾지 못했다. +- **성능.** 양쪽 모두 모바일 측정이 없다. "JAX 보다 빠르다" 고 주장할 근거는 지금 없다 (§5.8). +- **데스크톱 CUDA(PTX) 와 Mosaic GPU.** 비교 근거가 없다. + +### 5.11 선례, Taichi 파이썬 문법으로 Vulkan / Metal 커널을 AOT 컴파일해 모바일에 실었던 가장 가까운 선례다. 지금은 활동이 크게 줄었다. 기술보다는 **독자 런타임과 독자 생태계로 고립된 것**이 원인으로 보인다. @@ -463,7 +513,7 @@ TypedPython 은 그래서 자체 텐서 런타임을 만들지 않고 **torch op | 1b | 빌드 기본 단계로 연결 | PythonMultiplatform Gradle 플러그인이 사용자 파이썬 소스에 게이트를 항상 돌리고, 에러면 빌드 실패 | 1 | | 2 | typed IR → C 백엔드 (#41) | 프론트엔드·검증기·C 생성·런타임, 데스크톱에서 끝까지 | 없음 (pypackpack 슬롯은 3 의 의존) | | 3 | Kotlin 직접 호출 | 스텁 타입 기반 C ABI 호출 생성 | 스텁 배선 완료 | -| 4 | 첫 커널 조각 | f16 원소별 연산 또는 softmax 하나를 SPIR-V 로 컴파일해 torchnative `vulkan.rs` 로 실행, 기기에서 일반 파이썬 실행 · torchnative CPU 와 수치 일치, llama.cpp 대비 시간 기록 (§5.8) (추정 2~4 주) | torchnative 의 임의 SPIR-V 실행 진입점 | +| 4 | 첫 커널 조각 | f16 원소별 연산 또는 softmax 하나를 SPIR-V 로 컴파일해 torchnative `vulkan.rs` 로 실행, 기기에서 일반 파이썬 실행 · torchnative CPU 와 수치 일치, llama.cpp 대비 시간 기록 (§5.8), 커널이 JAX · torch · numpy 없이 CPython 만으로 실행됨 (§5.2) (추정 2~4 주) | torchnative 의 임의 SPIR-V 실행 진입점 | | 4b | Metal 조각 | 같은 커널을 MSL 로 직접 내 iOS · macOS 에서 수치 일치 | 4, candle-metal 연결 방식 (§8) | | 5 | 타일 행렬곱 | 행렬 유닛(cooperative matrix, simdgroup_matrix)을 쓰는 타일 matmul, 없는 기기는 SIMT 폴백, 빌드 타임 오토튜닝 (§5.7) (추정 2~4 개월, MLIR 패스 사용 시 1~3 개월) | 4, 4b | | 6 | 착지 | 커널을 `torch.library` op · `kernels` 번들 항목으로 등록, `transformers` 무수정 사용 | 5 | @@ -542,3 +592,6 @@ upstream 대비 수치 오차와 커널 시간을 기준선으로 박아 둔다. 6. 기본 검사에서 빠져나가는 방법을 둘 것인가, 예: 동적 기능이 꼭 필요한 모듈 하나를 `checked` 에서 빼는 표기. 두지 않으면 보장이 강해지고, 두면 이식이 쉬워진다. 7. §3.1 금지 목록을 `checked` 에서 경고로 둘 것인가, 에러로 둘 것인가. +8. **§5.10 의 "판단 대기" 목록.** 융합, 자동 미분, `vmap`, 변환 합성, 샤딩, TPU · 최신 GPU 성숙도, 내보낸 + 산출물의 호환 보장 각각을 "torch 에 맡김" (torch 가 JAX 만큼 성능을 낸다는 근거가 있을 때만), + "우리가 만든다", "범위 밖" 중 하나로 정한다. diff --git a/docs/investigations/typedpython-vs-jax.md b/docs/investigations/typedpython-vs-jax.md new file mode 100644 index 00000000..6254d5f2 --- /dev/null +++ b/docs/investigations/typedpython-vs-jax.md @@ -0,0 +1,121 @@ +# TypedPython 과 JAX 비교 (조사일 2026-10-04) + +결론의 반영: `docs/design/typedpython.md` §5.10 (2026-10-04). 메인테이너 결정: §5 의 권고 2 는 "torch 가 JAX 만큼 성능을 내는 부분만 torch 에 맡기고 나머지는 목록으로 따로 판단" 으로 바뀌었고, 권고 4 는 "numpy 의존 없음, 순수 파이썬 참조" 로 정해졌다. + +태그: [V] 가져온 URL 또는 실행한 명령, [R] 읽은 로컬 파일, [I] 추론. 웹 도구가 페이지를 요약해서 돌려주므로 +[V] 항목은 원문 인용이 아니라 요약을 본 것이다. 기기에서 직접 재지 않았다. + +## 1. 비교표 + +| 항목 | JAX (0.11.2, 2026-09-17 [V]) | TypedPython (설계안 [R]) | +|---|---|---| +| 프로그래밍 모델 | `jit` 가 tracer 로 함수를 jaxpr 로 변환. 순수 함수, 불변 배열 [V] | 일반 파이썬 의미를 보존. 컴파일은 IR 에서 증명, 실패하면 인터프리터에 남김 [R §4.3.1] | +| 파이썬 제어 흐름 | trace 시점에 평가. 값 의존 분기는 에러, `static_argnums` 는 재컴파일 [V] | 컴파일 구간에서도 CPython 과 같은 결과가 계약 [R §4.3.4] | +| 부작용 | `print`, list append 는 trace 때만 실행되고 사라짐 [V] | 보존 (같은 결과 원칙) [R] | +| 커널 | Pallas. GPU 는 Mosaic GPU (Hopper 이상), Triton 은 0.11.0 에서 deprecated, TPU 는 Mosaic [V] | `@kernel`, 타일 우선 + SIMT 폴백, Vulkan/Metal/WebGPU/CUDA 출력기 [R §5] | +| 커널의 CPU 실행 | `interpret=True`. 커널을 JAX 함수로 낮춰 grid 위 `scan` 을 `jit` 한 것 [V] | 커널이 수정 없이 CPython 에서 실행 [R §5.2] (설계, 미구현) | +| 모바일 GPU 커널 | Pallas 변경 기록에 Vulkan/Metal 없음 [V] | 1차 목표 (Vulkan, Metal) [R] | +| AOT | `jax.export` 로 StableHLO 직렬화. 내장 플랫폼 TPU, CPU, CUDA, ROCm [V] | 빌드 타임 AOT 가 전제 (iOS) [R §5.1] | +| 실행 런타임 | XLA/PJRT 또는 StableHLO 소비자 (IREE, Google AI Edge) [V] | torchnative 장치 계층 (ash/Vulkan, candle-metal) [R §5.6] | +| 전체 프로그램 융합 | XLA 가 jit 단위로 융합 [I, 일반 지식. 이번에 1차 출처를 확인하지 못함] | 없음. 그래프 캡처로 미룸 (§5.9) [R] | +| autodiff / vmap / sharding | 핵심 기능 [I, 일반 지식. 확인 못 함] | 없음 (설계에 언급 없음 [R]) | +| 정적 타입 | 배열 shape/dtype 은 `jaxtyping` 런타임 검사. 정적 체커는 `Array` 로만 취급 [V] | 빌드 기본 게이트, `Any` 유출 0 (Pyrefly) [R §4.2] | +| 자유 스레드 CPython | 3.14t, 3.15t 지원 표기, mac 포함 wheel [V 검색 요약] | 3.14t 데스크톱 opt-in, 컴파일 모듈은 GIL 재활성 [R INTENT, §4.3.4] | +| iOS/Android 휠 | 변경 기록에 언급 없음 [V]. jaxlib 휠은 Linux, macOS ARM64, Windows [V 검색 요약] | 임베드 대상 [R] | +| HF transformers | v5 에서 Flax/TF 클래스 제거, PyTorch 단일 백엔드 [V] | torch op 로 착지해 transformers 무수정 사용 [R §5.6] | + +## 2. 우리 설계가 이기는 지점 (근거가 버티는 것만) + +1. **모바일 GPU 가 1급 대상이다.** JAX 의 GPU 커널 경로는 Mosaic GPU 가 Hopper 이상 NVIDIA 로 한정되고, Triton + 은 deprecated 다 [V]. Pallas 변경 기록에 Vulkan/Metal 이 없다 [V]. 공식 Apple GPU 플러그인은 "experimental" 이고 + macOS 15.6 에서 `arange` 도 실패하는 이슈가 열려 있다 (jax-metal 0.1.1) [V]. 서드파티 metaljax 가 있으나 + 비공식 beta 이고 mlx-lm/llama.cpp 에 1.1~1.9배 뒤진다고 스스로 적는다 [V]. Android 에 대해서는 이번 조사에서 + 근거를 찾지 못했다 [I: JAX 공식 경로로는 없다고 보이나 증명은 아니다]. +2. **iOS/Android 에서 실행되는 런타임이 있다는 점.** JAX 모델의 모바일 배포는 jax2tf 를 거쳐 TF SavedModel, + LiteRT 로 가는 2단계 경로가 문서화돼 있고 jax2tf 는 experimental 이다 [V]. 임의의 Pallas 커널이 그 경로로 + 가는지는 확인하지 못했다. 그리고 `jax.export` 문서는 안정성이 보장되는 custom call 이 일부뿐이고 나머지는 + 안전 검사를 꺼야 직렬화된다고 한다 [V]. Pallas 커널은 custom call 로 내려가므로 [I] 이식 가능한 아티팩트가 + 되기 어렵다고 추정한다. +3. **정적 타입 게이트는 JAX 에 대응물이 없다.** jaxtyping 은 의도적으로 정적 shape 검사를 하지 않고, 정적 + 체커에는 `Array` 로 보인다. 런타임(trace 시점) 검사다 [V]. 우리의 "사용자 코드에 `Any` 없음" 보장은 다른 + 종류의 보장이다 [I]. 다만 이것이 JAX 대비 우위인 것은 "빌드 실패" 라는 시점뿐이며, shape 오류를 정적으로 + 잡는다는 뜻이 아니다 (우리도 못 한다). +4. **파이썬 의미를 바꾸지 않는다.** JAX 는 `jit` 안에서 값 의존 분기 에러, 부작용 소실, 인덱스 clamp (NumPy 는 + 에러), list 입력 거부, 기본 32비트 정밀도 등 다른 의미로 동작한다 [V]. TypedPython 의 계약은 "어떤 유효한 + CPython 실행과 구별 불가" [R §4.3.4] 이므로 기존 파이썬 코드를 의미 변경 없이 점진 컴파일한다는 점이 다르다. + 다만 이것은 설계 약속이고, 커널 쪽(타일 연산의 CPU 참조 구현)은 아직 구현이 없다 [R]. +5. **CPU 에서 "진짜 파이썬으로" 디버깅.** Pallas `interpret=True` 는 커널을 JAX 함수로 낮춘 `scan` 을 `jit` + 한 것이고, CPU 에서 Pallas 를 돌리는 유일한 방법이다 [V]. 커널 본문은 `Ref` 와 `pl.*` 연산을 쓰므로 JAX 없이는 + 실행되지 않는다 [I]. `jax.debug.print` 같은 JAX 도구가 쓰인다 [V]. 우리 설계는 JAX 도 필요 없이 CPython 만으로 + 돈다는 점에서 한 걸음 더 가깝다. 단, 그 "일반 파이썬 실행" 이 느리다는 비용은 둘 다 같다 [I]. +6. **생태계 방향.** transformers v5 가 Flax/TF 를 제거하고 PyTorch 단일 백엔드가 됐다 [V]. torch op 로 착지하는 + 우리 경로가 HF 생태계와 맞는다. JAX 쪽은 MaxText 등 별도 도구로 호환을 유지한다고 한다 [V]. + +## 3. JAX 가 이기는 지점과 따라잡으려면 + +| JAX 의 강점 | 우리 상태 | 격차를 메우려면 | +|---|---|---| +| XLA 전체 프로그램 융합 | 없음 (§5.9) [R] | torchnative 그래프 캡처 (torchnative #68). 단기에는 수작업 융합 커널 번들 | +| `grad`, `vmap`, `jit` 합성 | 설계 범위 밖 [R] | torch autograd 에 맡긴다고 명시. 커널은 forward/backward 를 사용자가 `torch.library` 로 등록 [I] | +| 샤딩, 다중 기기 (pjit, shard_map) | 없음 | 모바일/온디바이스 목표상 범위 밖으로 선언하는 것이 정직하다 [I] | +| 성숙도, TPU/Hopper 성능 | 코드 없음 (커널 단계 4부터) [R] | 데스크톱 CUDA 비교는 Triton/TileLang 기준 [R §5.8] | +| 타일 커널 DSL 의 검증된 파이프라이닝, warp specialization | 설계만 | Mosaic GPU 문서 (파이프라이닝, warp specialization, Blackwell matmul) [V] 를 참조 사례로 삼는다 | +| `jax.export` 의 호환 창 (후방 6개월, 전방 3주) [V] | 아티팩트 형식 미정 | 커널 번들에 IR 버전과 출력기 버전을 박는다 [I] | +| 자유 스레드 휠 | 3.14t 만 | JAX 는 3.14t, 3.15t 표기 [V]. 우리 MLIR 보조 휠은 3.15t 없음 [R §5.4] | + +## 4. 우위가 불분명하거나 입증되지 않은 것 + +- **"런타임 코드 생성 없음" 은 JAX 대비 우위가 아닐 수 있다.** 이유는 `jax.export` 의 StableHLO 를 IREE 가 AOT + 컴파일해 모바일에 싣는 길이 이론상 있기 때문이다 [V: IREE 와 Google AI Edge 가 StableHLO 소비자]. 실제로 JAX + 모델이 IREE 로 iOS/Android GPU 에서 도는 사례와 성능은 확인하지 못했다. 우리 조사도 IREE 를 "SPIR-V 코드 + 생성만 떼어 쓸 공식 경로 없음" 으로 기각했으나 [R §5.4], 그것은 커널 컴파일러로서의 평가이고 "모델을 통째로 + 배포하는 경로" 로서는 JAX+IREE 가 경쟁자다 [I]. +- **성능.** 둘 다 모바일에서 측정이 없다. llama.cpp/MLX 근접 목표는 안 [R §5.8]. metaljax 가 1.1~1.9배 뒤진다고 + 밝힌 수치가 있어 [V], 우리가 "JAX 보다 빠르다" 고 주장할 근거는 지금 없다. +- **"Pythonic 하다".** JAX 도 NumPy API 이고 학습 곡선이 낮다. 의미 보존의 가치는 기존 코드 이식 시나리오 + 에서만 나타난다 [I]. +- **타입 게이트의 가치.** JAX 사용자가 이 게이트를 원하는지(특히 `jnp` 중심 코드는 `Array` 로 충분히 추론되는지) + 검증하지 않았다 [I]. Pyrefly 가 JAX 를 쓰는 대규모 코드베이스에서 쓰인다는 서술 [R §4.1] 은 JAX 코드가 + 게이트를 통과한다는 뜻이 아니다. +- **Mosaic GPU 와의 직접 대결.** Hopper/Blackwell 한정이라 겹치는 기기가 없다. 우리 데스크톱 CUDA(PTX) 경로가 + JAX 보다 낫다는 주장은 근거가 없다 [I]. +- **Pallas 의 Vulkan/Metal 부재** 는 "변경 기록에 없다" 까지만 확인했다. 실험 브랜치나 제3자 포크는 못 봤다 [V 한계]. + +## 5. 설계 변경 권고 + +1. **포지셔닝 문장을 바꾼다.** "JAX 보다 낫다" 가 아니라 "JAX 가 가지 않는 곳(모바일 Vulkan/Metal, 앱에 임베드된 + CPython, 의미 보존)" 으로 쓴다. 근거가 이 범위에서만 서기 때문이다 (§2.1~2.4). +2. **범위 밖 선언을 문서에 넣는다.** autodiff, vmap, 샤딩은 torch 에 위임하고 만들지 않는다고 §5 에 한 단락 적는다. + 사용자가 JAX 와 같은 것을 기대하지 않게 한다. +3. **`interpret=True` 대응 성질을 시험으로 박는다.** "커널이 JAX/torch 없이 CPython 만으로 도는가" 를 첫 조각 시험에 + 넣는다. 이것이 Pallas 대비 구체적 차별점이므로 구현 전에 반증 가능해야 한다 (AGENTS.md §14). +4. **타일 연산의 CPU 참조 구현 의존성을 정한다.** numpy 를 쓰면 "의존 없는 CPython" 우위가 약해진다. 순수 파이썬 + 참조를 쓸지, 배열 라이브러리를 허용할지 결정이 필요하다 [I]. +5. **IREE 경로를 "모델 단위 대안" 으로 §5.4 에 한 줄 비교로 추가**한다. 기각 사유를 커널 컴파일러 관점과 모델 배포 + 관점으로 나눠 적는다. +6. **JAX 사용자 이주 경로 검토(선택).** 필요하면 StableHLO 입력을 받는 것은 INTENT §1 범위를 넘으므로 제안하지 + 않는다. 메인테이너가 정할 일이다. +7. **융합 격차를 "알려진 약점" 으로 표에 유지**하고 torchnative #68 완료 전에는 모델 전체 속도를 비교 대상으로 + 삼지 않는다 (§5.9 와 같다). + +## 6. 이 방법이 찾지 못하는 것 + +웹 요약 도구가 돌려준 문장에 의존했고(원문 대조 없음), 기기 실측, 비공개 Google 로드맵, 공식 문서에 없는 제3자 +Vulkan/Metal Pallas 포크, 그리고 XLA 융합/autodiff/vmap 의 1차 출처 확인(이번엔 일반 지식으로만 적음)은 찾지 +못한다. + +## 출처 (가져온 것) + +- https://docs.jax.dev/en/latest/changelog.html (0.11.2, Python 3.12 이상, 3.14t/3.15t, 모바일 언급 없음) +- https://docs.jax.dev/en/latest/pallas/CHANGELOG.html (Triton deprecated, Vulkan/Metal 없음) +- https://docs.jax.dev/en/latest/pallas/quickstart.html (Mosaic GPU, Hopper 이상, Triton 비권장, Ref) +- https://docs.jax.dev/en/latest/pallas/design/design.html (scan 기반 emulation) +- https://docs.jax.dev/en/latest/export/export.html , https://docs.jax.dev/en/latest/jax.export.html +- https://docs.jax.dev/en/latest/jit-compilation.html , .../notebooks/Common_Gotchas_in_JAX.html +- https://docs.jax.dev/en/latest/installation.html (Apple GPU experimental) +- https://github.com/jax-ml/jax/issues/34109 (jax-metal 실패) +- https://pypi.org/project/metaljax/ (비공식, 1.1~1.9배) +- https://docs.kidger.site/jaxtyping/faq/ +- https://github.com/openxla/stablehlo/blob/main/README.md (IREE, Google AI Edge) +- https://developers.google.com/edge/litert/conversion/jax/overview (jax2tf 경로, 검색 결과 요약) +- 웹 검색 요약: transformers v5 Flax 제거, jaxlib 3.14t 휠, pallas interpret 파라미터