ameva-runtime 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- ameva_runtime-1.0.0/LICENSE +17 -0
- ameva_runtime-1.0.0/MANIFEST.in +6 -0
- ameva_runtime-1.0.0/PKG-INFO +123 -0
- ameva_runtime-1.0.0/README.md +125 -0
- ameva_runtime-1.0.0/README.pypi.md +72 -0
- ameva_runtime-1.0.0/profiles/validated-vulkan-profiles.json +213 -0
- ameva_runtime-1.0.0/pyproject.toml +76 -0
- ameva_runtime-1.0.0/python/ameva_runtime/__init__.py +64 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/__init__.py +23 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/base.py +67 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/bitnet.py +50 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/diffusion.py +50 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/llamacpp.py +88 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/stt.py +50 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/tts.py +50 -0
- ameva_runtime-1.0.0/python/ameva_runtime/adapters/vision.py +51 -0
- ameva_runtime-1.0.0/python/ameva_runtime/cli.py +302 -0
- ameva_runtime-1.0.0/python/ameva_runtime/core.py +305 -0
- ameva_runtime-1.0.0/python/ameva_runtime/detector.py +232 -0
- ameva_runtime-1.0.0/python/ameva_runtime/doctor.py +194 -0
- ameva_runtime-1.0.0/python/ameva_runtime/exceptions.py +90 -0
- ameva_runtime-1.0.0/python/ameva_runtime/platform.py +87 -0
- ameva_runtime-1.0.0/python/ameva_runtime/protocol.py +118 -0
- ameva_runtime-1.0.0/python/ameva_runtime/router.py +123 -0
- ameva_runtime-1.0.0/python/ameva_runtime.egg-info/PKG-INFO +123 -0
- ameva_runtime-1.0.0/python/ameva_runtime.egg-info/SOURCES.txt +52 -0
- ameva_runtime-1.0.0/python/ameva_runtime.egg-info/dependency_links.txt +1 -0
- ameva_runtime-1.0.0/python/ameva_runtime.egg-info/entry_points.txt +4 -0
- ameva_runtime-1.0.0/python/ameva_runtime.egg-info/requires.txt +26 -0
- ameva_runtime-1.0.0/python/ameva_runtime.egg-info/top_level.txt +2 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/__init__.py +64 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/__init__.py +34 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/base.py +170 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/bitnet.py +105 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/diffusion.py +144 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/llamacpp.py +267 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/stt.py +109 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/tts.py +72 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/adapters/vision.py +165 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/bindings.py +123 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/cli.py +132 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/core.py +272 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/doctor.py +900 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/exceptions.py +32 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/platform.py +270 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/profiles/validated-vulkan-profiles.json +213 -0
- ameva_runtime-1.0.0/python/ameva_vulkan_runtime/protocol.py +125 -0
- ameva_runtime-1.0.0/python/tests/test_ameva_runtime.py +171 -0
- ameva_runtime-1.0.0/python/tests/test_core.py +143 -0
- ameva_runtime-1.0.0/python/tests/test_doctor_v0_v11.py +114 -0
- ameva_runtime-1.0.0/python/tests/test_handle_lifecycle.py +62 -0
- ameva_runtime-1.0.0/python/tests/test_modalities.py +165 -0
- ameva_runtime-1.0.0/setup.cfg +4 -0
- ameva_runtime-1.0.0/setup.py +30 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
Copyright 2026 UnoKim & AMEVA Open-Source Foundation
|
|
6
|
+
|
|
7
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
you may not use this file except in compliance with the License.
|
|
9
|
+
You may obtain a copy of the License at
|
|
10
|
+
|
|
11
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
|
|
13
|
+
Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
See the License for the specific language governing permissions and
|
|
17
|
+
limitations under the License.
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: ameva-runtime
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: Unified Next-Gen Hardware Orchestration & AI Acceleration Runtime for Mobile & Edge
|
|
5
|
+
Home-page: https://github.com/uno-km/ameva-runtime
|
|
6
|
+
Author: Eunho Kim
|
|
7
|
+
Author-email: Eunho Kim <contact@uno-km.com>
|
|
8
|
+
License: Apache-2.0
|
|
9
|
+
Project-URL: Homepage, https://uno-km.vercel.app/lib/vulkan/
|
|
10
|
+
Project-URL: Repository, https://github.com/uno-km/ameva-runtime
|
|
11
|
+
Project-URL: Documentation, https://uno-km.vercel.app/lib/vulkan/
|
|
12
|
+
Keywords: vulkan,opencl,npu,cpu-neon,android,termux,acceleration,adreno,mali,hal,ameva
|
|
13
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
16
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
17
|
+
Classifier: Operating System :: Android
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.8
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
|
|
25
|
+
Requires-Python: >=3.8
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Provides-Extra: stt
|
|
29
|
+
Requires-Dist: termux-stt>=1.1.1; extra == "stt"
|
|
30
|
+
Provides-Extra: diffusion
|
|
31
|
+
Requires-Dist: termux-diffusion>=1.3.1; extra == "diffusion"
|
|
32
|
+
Provides-Extra: bitnet
|
|
33
|
+
Requires-Dist: termux-bitnet>=1.0.0; extra == "bitnet"
|
|
34
|
+
Provides-Extra: llamacpp
|
|
35
|
+
Requires-Dist: termux-llamacpp>=1.0.0; extra == "llamacpp"
|
|
36
|
+
Provides-Extra: tts
|
|
37
|
+
Requires-Dist: termux-tts>=1.0.0; extra == "tts"
|
|
38
|
+
Provides-Extra: vision
|
|
39
|
+
Requires-Dist: termux-vision>=1.0.0; extra == "vision"
|
|
40
|
+
Provides-Extra: all
|
|
41
|
+
Requires-Dist: termux-stt>=1.1.1; extra == "all"
|
|
42
|
+
Requires-Dist: termux-diffusion>=1.3.1; extra == "all"
|
|
43
|
+
Requires-Dist: termux-bitnet>=1.0.0; extra == "all"
|
|
44
|
+
Requires-Dist: termux-llamacpp>=1.0.0; extra == "all"
|
|
45
|
+
Requires-Dist: termux-tts>=1.0.0; extra == "all"
|
|
46
|
+
Requires-Dist: termux-vision>=1.0.0; extra == "all"
|
|
47
|
+
Dynamic: author
|
|
48
|
+
Dynamic: home-page
|
|
49
|
+
Dynamic: license-file
|
|
50
|
+
Dynamic: requires-python
|
|
51
|
+
|
|
52
|
+
# AMEVA-Runtime (Python)
|
|
53
|
+
|
|
54
|
+
[](https://pypi.org/project/ameva-runtime/)
|
|
55
|
+
[](https://pypi.org/project/ameva-runtime/)
|
|
56
|
+
[](https://github.com/uno-km/ameva-runtime)
|
|
57
|
+
|
|
58
|
+
> **모바일 및 엣지 환경을 위한 차세대 통합 온디바이스 하드웨어 오케스트레이션 및 멀티모달 가속 런타임**
|
|
59
|
+
> *Next-Gen Unified On-Device Hardware Orchestration & Multi-Modal Acceleration Runtime for Mobile & Edge*
|
|
60
|
+
|
|
61
|
+
## Installation
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pip install ameva-runtime
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Quickstart
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
import ameva_runtime as ameva
|
|
71
|
+
|
|
72
|
+
# 1. Execute LLM inference directly with optimal on-device hardware dispatch
|
|
73
|
+
result = ameva.run(
|
|
74
|
+
model="qwen2.5-0.5b",
|
|
75
|
+
prompt="Space in Korean is:",
|
|
76
|
+
max_tokens=32
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
print(f"Generated text: {result.text}")
|
|
80
|
+
print(f"Hardware backend: {result.backend_used} ({result.tokens_per_second:.2f} t/s)")
|
|
81
|
+
|
|
82
|
+
# 2. Preview hardware execution plan
|
|
83
|
+
plan = ameva.plan(model="qwen2.5-0.5b")
|
|
84
|
+
print(f"Route: {plan.backend} | NGL: {plan.ngl} | Threads: {plan.threads}")
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Description
|
|
89
|
+
AMEVA Runtime provides a unified, zero-silent-fallback hardware orchestration engine for generative AI on mobile and edge devices. It automatically resolves vendor divergence, dispatching to native Vulkan hardware offload on Qualcomm Adreno while isolating driver deadlocks on ARM Mali through deterministic Cortex-A78 CPU-NEON multi-threading.
|
|
90
|
+
|
|
91
|
+
### Empirical Hardware Benchmarks (Qwen2.5-0.5B-Instruct)
|
|
92
|
+
|
|
93
|
+
| Device & SoC | GPU & Driver Architecture | Backend Route | Layer Offload | Generation Speed | Prompt Eval Speed | UI Freeze | Speedup |
|
|
94
|
+
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: |
|
|
95
|
+
| **Galaxy S25** (Snapdragon 8 Elite) | Qualcomm Adreno 830 (Vulkan 1.3) | **VULKAN** | **25/25 (100% VRAM)** | **35.80 t/s** (27.93 ms/t) | **4.53 t/s** | **0%** | **35.8x** |
|
|
96
|
+
| **Galaxy A35** (Exynos 1380) | ARM Mali-G68 MP5 (Vulkan 1.3) | **CPU-NEON** | **0/25 (Safe Guard)** | **3.55 t/s** (295 ms/t) | **8.05 t/s** | **0%** | Baseline |
|
|
97
|
+
| **Galaxy A35** (Forced Vulkan Test) | ARM Mali-G68 MP5 (vulkan.mali.so) | VULKAN | 25/25 | 0.00 t/s (Deadlock) | - | 100% (Hung) | Failed |
|
|
98
|
+
|
|
99
|
+
### Technical Rationale for ARM Mali CPU-NEON Fallback
|
|
100
|
+
The proprietary ARM Mali Vulkan driver (`/vendor/lib64/hw/vulkan.mali.so` via `/dev/mali0`) enforces aggressive kernel-level dynamic power management (DVFS) tied to `SurfaceFlinger` display composition. During headless compute dispatches in terminal or CLI environments (lacking an active window swapchain), the Mali driver interprets the absence of display flips as an idle state, downclocking GPU compute cores and failing to signal in-flight completion fences. This causes host threads waiting on `vkWaitForFences` or `vkQueueWaitIdle` to deadlock indefinitely.
|
|
101
|
+
|
|
102
|
+
To guarantee rock-solid system stability and eliminate device lockups, the **AMEVA SmartRouter** automatically identifies ARM Mali GPUs, bypasses the unstable headless Vulkan path, and dispatches inference to the high-performance ARM Cortex-A78 CPU-NEON cluster.
|
|
103
|
+
|
|
104
|
+
### CLI Quickstart
|
|
105
|
+
```bash
|
|
106
|
+
# 1. Automatic hardware diagnosis and profile inspection
|
|
107
|
+
ameva-run doctor
|
|
108
|
+
ameva-run profile
|
|
109
|
+
|
|
110
|
+
# 2. Dry-run execution plan
|
|
111
|
+
ameva-run plan -m qwen2.5-0.5b
|
|
112
|
+
|
|
113
|
+
# 3. Direct model execution with automatic hardware acceleration
|
|
114
|
+
ameva-run exec -m qwen2.5-0.5b -p "Space in Korean is:" -n 32
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
## Documentation
|
|
119
|
+
- [Official Documentation & API Reference](https://uno-km.vercel.app/lib/ameva-vulkan-runtime/)
|
|
120
|
+
- [GitHub Repository](https://github.com/uno-km/ameva-runtime)
|
|
121
|
+
|
|
122
|
+
## License
|
|
123
|
+
Apache-2.0 License. Copyright (c) 2026 Eunho Kim (@uno-km).
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# AMEVA-Runtime
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/ameva-runtime/)
|
|
4
|
+
[](https://pypi.org/project/ameva-runtime/)
|
|
5
|
+
[](https://www.npmjs.com/package/@ameva/runtime)
|
|
6
|
+
[](https://www.npmjs.com/package/@ameva/runtime)
|
|
7
|
+
[](https://github.com/uno-km/ameva-runtime)
|
|
8
|
+
|
|
9
|
+
> **모바일 및 엣지 환경을 위한 차세대 통합 온디바이스 하드웨어 오케스트레이션 및 멀티모달 가속 런타임**
|
|
10
|
+
> *Next-Gen Unified On-Device Hardware Orchestration & Multi-Modal Acceleration Runtime for Mobile & Edge*
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 📌 Architecture & Overview
|
|
15
|
+
|
|
16
|
+
AMEVA Runtime은 모바일 및 엣지 단말기를 위한 침묵 폴백(Zero-Silent-Fallback) 없는 차세대 통합 하드웨어 오케스트레이션 엔진입니다. 단말기별 GPU 벤더 아키텍처를 런타임에 정밀 진단하여 Qualcomm Adreno 환경에서는 네이티브 Vulkan VRAM 오프로드(Snapdragon 8 Elite 기준 35.80 tokens/sec)를 수행하고, ARM Mali 환경에서는 커널 드라이버 락업을 원천 차단하는 ARM Cortex-A78 CPU-NEON(3.55 tokens/sec)으로 자동 라우팅합니다.
|
|
17
|
+
|
|
18
|
+
### 실기기 추론 성능 실측 벤치마크 (Qwen2.5-0.5B-Instruct)
|
|
19
|
+
|
|
20
|
+
| 단말기 및 SoC | GPU 및 드라이버 환경 | 실행 백엔드 | GPU 레이어 적재 | 토큰 생성 속도 | 프롬프트 평가 속도 | 화면 프리즈 | 상대 가속도 |
|
|
21
|
+
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: |
|
|
22
|
+
| **Galaxy S25** (Snapdragon 8 Elite) | Qualcomm Adreno 830 (Vulkan 1.3) | **VULKAN** | **25/25 (100% VRAM)** | **35.80 t/s** (27.93 ms/t) | **4.53 t/s** | **0%** | **35.8배** |
|
|
23
|
+
| **Galaxy A35** (Exynos 1380) | ARM Mali-G68 MP5 (Vulkan 1.3) | **CPU-NEON** | **0/25 (안전 보호)** | **3.55 t/s** (295 ms/t) | **8.05 t/s** | **0%** | 기준선 |
|
|
24
|
+
| **Galaxy A35** (강제 Vulkan 시험) | ARM Mali-G68 MP5 (vulkan.mali.so) | VULKAN | 25/25 | 0.00 t/s (데드락) | - | 100% (먹통) | 실패 |
|
|
25
|
+
|
|
26
|
+
### ARM Mali GPU의 CPU-NEON 안전 라우팅 사유
|
|
27
|
+
ARM Mali 독점 드라이버는 화면 갱신(SurfaceFlinger Swapchain)이 없는 터미널(헤드리스 CLI) 환경에서 전력 관리 절전 진입으로 인해 `vkWaitForFences` 커널 펜스 신호를 유실하는 치명적인 데드락 결함을 가지고 있습니다. AMEVA Runtime은 이를 런타임에 자동 감지하여 Cortex-A78 CPU-NEON 클러스터로 즉각 분기함으로써 화면 먹통 없는 100% 안정 구동을 보장합니다.
|
|
28
|
+
|
|
29
|
+
### CLI 빠른 실행 가이드
|
|
30
|
+
```bash
|
|
31
|
+
# 하드웨어 진단 및 토폴로지 프로파일 확인
|
|
32
|
+
ameva-run doctor
|
|
33
|
+
ameva-run profile
|
|
34
|
+
|
|
35
|
+
# 하드웨어 분기 계획 사전 확인
|
|
36
|
+
ameva-run plan -m qwen2.5-0.5b
|
|
37
|
+
|
|
38
|
+
# 최적 하드웨어 백엔드로 실제 모델 추론 실행
|
|
39
|
+
ameva-run exec -m qwen2.5-0.5b -p "Space in Korean is:" -n 32
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
AMEVA Runtime provides a unified, zero-silent-fallback hardware orchestration engine for generative AI on mobile and edge devices. It automatically resolves vendor divergence, dispatching to native Vulkan hardware offload on Qualcomm Adreno while isolating driver deadlocks on ARM Mali through deterministic Cortex-A78 CPU-NEON multi-threading.
|
|
44
|
+
|
|
45
|
+
### Empirical Hardware Benchmarks (Qwen2.5-0.5B-Instruct)
|
|
46
|
+
|
|
47
|
+
| Device & SoC | GPU & Driver Architecture | Backend Route | Layer Offload | Generation Speed | Prompt Eval Speed | UI Freeze | Speedup |
|
|
48
|
+
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: |
|
|
49
|
+
| **Galaxy S25** (Snapdragon 8 Elite) | Qualcomm Adreno 830 (Vulkan 1.3) | **VULKAN** | **25/25 (100% VRAM)** | **35.80 t/s** (27.93 ms/t) | **4.53 t/s** | **0%** | **35.8x** |
|
|
50
|
+
| **Galaxy A35** (Exynos 1380) | ARM Mali-G68 MP5 (Vulkan 1.3) | **CPU-NEON** | **0/25 (Safe Guard)** | **3.55 t/s** (295 ms/t) | **8.05 t/s** | **0%** | Baseline |
|
|
51
|
+
| **Galaxy A35** (Forced Vulkan Test) | ARM Mali-G68 MP5 (vulkan.mali.so) | VULKAN | 25/25 | 0.00 t/s (Deadlock) | - | 100% (Hung) | Failed |
|
|
52
|
+
|
|
53
|
+
### Technical Rationale for ARM Mali CPU-NEON Fallback
|
|
54
|
+
The proprietary ARM Mali Vulkan driver (`/vendor/lib64/hw/vulkan.mali.so` via `/dev/mali0`) enforces aggressive kernel-level dynamic power management (DVFS) tied to `SurfaceFlinger` display composition. During headless compute dispatches in terminal or CLI environments (lacking an active window swapchain), the Mali driver interprets the absence of display flips as an idle state, downclocking GPU compute cores and failing to signal in-flight completion fences. This causes host threads waiting on `vkWaitForFences` or `vkQueueWaitIdle` to deadlock indefinitely.
|
|
55
|
+
|
|
56
|
+
To guarantee rock-solid system stability and eliminate device lockups, the **AMEVA SmartRouter** automatically identifies ARM Mali GPUs, bypasses the unstable headless Vulkan path, and dispatches inference to the high-performance ARM Cortex-A78 CPU-NEON cluster.
|
|
57
|
+
|
|
58
|
+
### CLI Quickstart
|
|
59
|
+
```bash
|
|
60
|
+
# 1. Automatic hardware diagnosis and profile inspection
|
|
61
|
+
ameva-run doctor
|
|
62
|
+
ameva-run profile
|
|
63
|
+
|
|
64
|
+
# 2. Dry-run execution plan
|
|
65
|
+
ameva-run plan -m qwen2.5-0.5b
|
|
66
|
+
|
|
67
|
+
# 3. Direct model execution with automatic hardware acceleration
|
|
68
|
+
ameva-run exec -m qwen2.5-0.5b -p "Space in Korean is:" -n 32
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## 🚀 Installation & Quickstart
|
|
75
|
+
|
|
76
|
+
### Python (PyPI)
|
|
77
|
+
```bash
|
|
78
|
+
pip install ameva-runtime
|
|
79
|
+
```
|
|
80
|
+
```python
|
|
81
|
+
import ameva_runtime as ameva
|
|
82
|
+
|
|
83
|
+
# 1. Execute LLM inference directly with optimal on-device hardware dispatch
|
|
84
|
+
result = ameva.run(
|
|
85
|
+
model="qwen2.5-0.5b",
|
|
86
|
+
prompt="Space in Korean is:",
|
|
87
|
+
max_tokens=32
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
print(f"Generated text: {result.text}")
|
|
91
|
+
print(f"Hardware backend: {result.backend_used} ({result.tokens_per_second:.2f} t/s)")
|
|
92
|
+
|
|
93
|
+
# 2. Preview hardware execution plan
|
|
94
|
+
plan = ameva.plan(model="qwen2.5-0.5b")
|
|
95
|
+
print(f"Route: {plan.backend} | NGL: {plan.ngl} | Threads: {plan.threads}")
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Node.js / TypeScript (npm)
|
|
100
|
+
```bash
|
|
101
|
+
npm install @ameva/runtime
|
|
102
|
+
```
|
|
103
|
+
```typescript
|
|
104
|
+
import { createContext, Doctor } from "@ameva/runtime";
|
|
105
|
+
|
|
106
|
+
const doctor = new Doctor();
|
|
107
|
+
const report = await doctor.runSelfTest();
|
|
108
|
+
console.log(`Topology Status: ${report.overallSuccess}, Hardware: ${report.deviceName}`);
|
|
109
|
+
|
|
110
|
+
const ctx = await createContext({ device: "auto" });
|
|
111
|
+
console.log(`Runtime Context Initialized on ${ctx.deviceName}`);
|
|
112
|
+
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 📖 Official Documentation & Benchmarks
|
|
118
|
+
- [Official Architecture & API Reference](https://uno-km.vercel.app/lib/ameva-vulkan-runtime/)
|
|
119
|
+
- [Ecosystem Metrics & Registry Stats](https://uno-km.vercel.app/foundation/metrics)
|
|
120
|
+
- [AMEVA Open-Source Foundation Portal](https://uno-km.vercel.app/foundation/index.html)
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 📄 License
|
|
125
|
+
Licensed under the Apache-2.0 License. Copyright (c) 2026 Eunho Kim ([@uno-km](https://github.com/uno-km)).
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# AMEVA-Runtime (Python)
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/ameva-runtime/)
|
|
4
|
+
[](https://pypi.org/project/ameva-runtime/)
|
|
5
|
+
[](https://github.com/uno-km/ameva-runtime)
|
|
6
|
+
|
|
7
|
+
> **모바일 및 엣지 환경을 위한 차세대 통합 온디바이스 하드웨어 오케스트레이션 및 멀티모달 가속 런타임**
|
|
8
|
+
> *Next-Gen Unified On-Device Hardware Orchestration & Multi-Modal Acceleration Runtime for Mobile & Edge*
|
|
9
|
+
|
|
10
|
+
## Installation
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
pip install ameva-runtime
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Quickstart
|
|
17
|
+
|
|
18
|
+
```python
|
|
19
|
+
import ameva_runtime as ameva
|
|
20
|
+
|
|
21
|
+
# 1. Execute LLM inference directly with optimal on-device hardware dispatch
|
|
22
|
+
result = ameva.run(
|
|
23
|
+
model="qwen2.5-0.5b",
|
|
24
|
+
prompt="Space in Korean is:",
|
|
25
|
+
max_tokens=32
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
print(f"Generated text: {result.text}")
|
|
29
|
+
print(f"Hardware backend: {result.backend_used} ({result.tokens_per_second:.2f} t/s)")
|
|
30
|
+
|
|
31
|
+
# 2. Preview hardware execution plan
|
|
32
|
+
plan = ameva.plan(model="qwen2.5-0.5b")
|
|
33
|
+
print(f"Route: {plan.backend} | NGL: {plan.ngl} | Threads: {plan.threads}")
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## Description
|
|
38
|
+
AMEVA Runtime provides a unified, zero-silent-fallback hardware orchestration engine for generative AI on mobile and edge devices. It automatically resolves vendor divergence, dispatching to native Vulkan hardware offload on Qualcomm Adreno while isolating driver deadlocks on ARM Mali through deterministic Cortex-A78 CPU-NEON multi-threading.
|
|
39
|
+
|
|
40
|
+
### Empirical Hardware Benchmarks (Qwen2.5-0.5B-Instruct)
|
|
41
|
+
|
|
42
|
+
| Device & SoC | GPU & Driver Architecture | Backend Route | Layer Offload | Generation Speed | Prompt Eval Speed | UI Freeze | Speedup |
|
|
43
|
+
| :--- | :--- | :---: | :---: | :---: | :---: | :---: | :---: |
|
|
44
|
+
| **Galaxy S25** (Snapdragon 8 Elite) | Qualcomm Adreno 830 (Vulkan 1.3) | **VULKAN** | **25/25 (100% VRAM)** | **35.80 t/s** (27.93 ms/t) | **4.53 t/s** | **0%** | **35.8x** |
|
|
45
|
+
| **Galaxy A35** (Exynos 1380) | ARM Mali-G68 MP5 (Vulkan 1.3) | **CPU-NEON** | **0/25 (Safe Guard)** | **3.55 t/s** (295 ms/t) | **8.05 t/s** | **0%** | Baseline |
|
|
46
|
+
| **Galaxy A35** (Forced Vulkan Test) | ARM Mali-G68 MP5 (vulkan.mali.so) | VULKAN | 25/25 | 0.00 t/s (Deadlock) | - | 100% (Hung) | Failed |
|
|
47
|
+
|
|
48
|
+
### Technical Rationale for ARM Mali CPU-NEON Fallback
|
|
49
|
+
The proprietary ARM Mali Vulkan driver (`/vendor/lib64/hw/vulkan.mali.so` via `/dev/mali0`) enforces aggressive kernel-level dynamic power management (DVFS) tied to `SurfaceFlinger` display composition. During headless compute dispatches in terminal or CLI environments (lacking an active window swapchain), the Mali driver interprets the absence of display flips as an idle state, downclocking GPU compute cores and failing to signal in-flight completion fences. This causes host threads waiting on `vkWaitForFences` or `vkQueueWaitIdle` to deadlock indefinitely.
|
|
50
|
+
|
|
51
|
+
To guarantee rock-solid system stability and eliminate device lockups, the **AMEVA SmartRouter** automatically identifies ARM Mali GPUs, bypasses the unstable headless Vulkan path, and dispatches inference to the high-performance ARM Cortex-A78 CPU-NEON cluster.
|
|
52
|
+
|
|
53
|
+
### CLI Quickstart
|
|
54
|
+
```bash
|
|
55
|
+
# 1. Automatic hardware diagnosis and profile inspection
|
|
56
|
+
ameva-run doctor
|
|
57
|
+
ameva-run profile
|
|
58
|
+
|
|
59
|
+
# 2. Dry-run execution plan
|
|
60
|
+
ameva-run plan -m qwen2.5-0.5b
|
|
61
|
+
|
|
62
|
+
# 3. Direct model execution with automatic hardware acceleration
|
|
63
|
+
ameva-run exec -m qwen2.5-0.5b -p "Space in Korean is:" -n 32
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
## Documentation
|
|
68
|
+
- [Official Documentation & API Reference](https://uno-km.vercel.app/lib/ameva-vulkan-runtime/)
|
|
69
|
+
- [GitHub Repository](https://github.com/uno-km/ameva-runtime)
|
|
70
|
+
|
|
71
|
+
## License
|
|
72
|
+
Apache-2.0 License. Copyright (c) 2026 Eunho Kim (@uno-km).
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema_version": "1.0.0",
|
|
3
|
+
"registry_name": "AMEVA Validated Vulkan Device Profiles",
|
|
4
|
+
"profiles": [
|
|
5
|
+
{
|
|
6
|
+
"model": "SM-A356N",
|
|
7
|
+
"codename": "a35x",
|
|
8
|
+
"market_name": "Samsung Galaxy A35 5G",
|
|
9
|
+
"soc": "Exynos 1380 (s5e8835)",
|
|
10
|
+
"gpu": "ARM Mali-G68 MP5",
|
|
11
|
+
"android_version": 16,
|
|
12
|
+
"api_level": 36,
|
|
13
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
14
|
+
"v10_matmul_max_error": 9.39369e-05,
|
|
15
|
+
"status": "VERIFIED_PRODUCTION",
|
|
16
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
17
|
+
"memory_alignment_bytes": 128
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"model": "SM-A546N",
|
|
21
|
+
"codename": "a54x",
|
|
22
|
+
"market_name": "Samsung Galaxy A54 5G",
|
|
23
|
+
"soc": "Exynos 1380 (s5e8835)",
|
|
24
|
+
"gpu": "ARM Mali-G68 MP5",
|
|
25
|
+
"android_version": 14,
|
|
26
|
+
"api_level": 34,
|
|
27
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
28
|
+
"v10_matmul_max_error": 9.39369e-05,
|
|
29
|
+
"status": "VERIFIED_INHERITED",
|
|
30
|
+
"source_profile": "SM-A356N",
|
|
31
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
32
|
+
"memory_alignment_bytes": 128
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"model": "SM-M546B",
|
|
36
|
+
"codename": "m54x",
|
|
37
|
+
"market_name": "Samsung Galaxy M54 5G",
|
|
38
|
+
"soc": "Exynos 1380 (s5e8835)",
|
|
39
|
+
"gpu": "ARM Mali-G68 MP5",
|
|
40
|
+
"android_version": 14,
|
|
41
|
+
"api_level": 34,
|
|
42
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
43
|
+
"v10_matmul_max_error": 9.39369e-05,
|
|
44
|
+
"status": "VERIFIED_INHERITED",
|
|
45
|
+
"source_profile": "SM-A356N",
|
|
46
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
47
|
+
"memory_alignment_bytes": 128
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"model": "SM-A536N",
|
|
51
|
+
"codename": "a53x",
|
|
52
|
+
"market_name": "Samsung Galaxy A53 5G",
|
|
53
|
+
"soc": "Exynos 1280 (s5e8825)",
|
|
54
|
+
"gpu": "ARM Mali-G68 MP4",
|
|
55
|
+
"android_version": 14,
|
|
56
|
+
"api_level": 34,
|
|
57
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
58
|
+
"v10_matmul_max_error": 9.45e-05,
|
|
59
|
+
"status": "VERIFIED_INHERITED",
|
|
60
|
+
"source_profile": "SM-A356N",
|
|
61
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
62
|
+
"memory_alignment_bytes": 128
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"model": "SM-A336N",
|
|
66
|
+
"codename": "a33x",
|
|
67
|
+
"market_name": "Samsung Galaxy A33 5G",
|
|
68
|
+
"soc": "Exynos 1280 (s5e8825)",
|
|
69
|
+
"gpu": "ARM Mali-G68 MP4",
|
|
70
|
+
"android_version": 14,
|
|
71
|
+
"api_level": 34,
|
|
72
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
73
|
+
"v10_matmul_max_error": 9.45e-05,
|
|
74
|
+
"status": "VERIFIED_INHERITED",
|
|
75
|
+
"source_profile": "SM-A356N",
|
|
76
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
77
|
+
"memory_alignment_bytes": 128
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"model": "SM-G991N",
|
|
81
|
+
"codename": "o1s",
|
|
82
|
+
"market_name": "Samsung Galaxy S21 5G",
|
|
83
|
+
"soc": "Exynos 2100",
|
|
84
|
+
"gpu": "ARM Mali-G78 MP14",
|
|
85
|
+
"android_version": 15,
|
|
86
|
+
"api_level": 35,
|
|
87
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
88
|
+
"v10_matmul_max_error": 9.39e-05,
|
|
89
|
+
"status": "VERIFIED_PRODUCTION",
|
|
90
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
91
|
+
"memory_alignment_bytes": 128
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"model": "SM-G996N",
|
|
95
|
+
"codename": "t2s",
|
|
96
|
+
"market_name": "Samsung Galaxy S21+ 5G",
|
|
97
|
+
"soc": "Exynos 2100",
|
|
98
|
+
"gpu": "ARM Mali-G78 MP14",
|
|
99
|
+
"android_version": 15,
|
|
100
|
+
"api_level": 35,
|
|
101
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
102
|
+
"v10_matmul_max_error": 9.39e-05,
|
|
103
|
+
"status": "VERIFIED_INHERITED",
|
|
104
|
+
"source_profile": "SM-G991N",
|
|
105
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
106
|
+
"memory_alignment_bytes": 128
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"model": "SM-G998N",
|
|
110
|
+
"codename": "p3s",
|
|
111
|
+
"market_name": "Samsung Galaxy S21 Ultra 5G",
|
|
112
|
+
"soc": "Exynos 2100",
|
|
113
|
+
"gpu": "ARM Mali-G78 MP14",
|
|
114
|
+
"android_version": 15,
|
|
115
|
+
"api_level": 35,
|
|
116
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
117
|
+
"v10_matmul_max_error": 9.39e-05,
|
|
118
|
+
"status": "VERIFIED_INHERITED",
|
|
119
|
+
"source_profile": "SM-G991N",
|
|
120
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
121
|
+
"memory_alignment_bytes": 128
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"model": "SM-G981N",
|
|
125
|
+
"codename": "z3s",
|
|
126
|
+
"market_name": "Samsung Galaxy S20 5G (Exynos)",
|
|
127
|
+
"soc": "Exynos 990",
|
|
128
|
+
"gpu": "ARM Mali-G77 MP11",
|
|
129
|
+
"android_version": 13,
|
|
130
|
+
"api_level": 33,
|
|
131
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
132
|
+
"v10_matmul_max_error": 1.12e-04,
|
|
133
|
+
"status": "VERIFIED_INHERITED",
|
|
134
|
+
"source_profile": "SM-G991N",
|
|
135
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
136
|
+
"memory_alignment_bytes": 128
|
|
137
|
+
},
|
|
138
|
+
{
|
|
139
|
+
"model": "SM-G986N",
|
|
140
|
+
"codename": "y2s",
|
|
141
|
+
"market_name": "Samsung Galaxy S20+ 5G (Exynos)",
|
|
142
|
+
"soc": "Exynos 990",
|
|
143
|
+
"gpu": "ARM Mali-G77 MP11",
|
|
144
|
+
"android_version": 13,
|
|
145
|
+
"api_level": 33,
|
|
146
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
147
|
+
"v10_matmul_max_error": 1.12e-04,
|
|
148
|
+
"status": "VERIFIED_INHERITED",
|
|
149
|
+
"source_profile": "SM-G991N",
|
|
150
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
151
|
+
"memory_alignment_bytes": 128
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
"model": "SM-G988N",
|
|
155
|
+
"codename": "z3s",
|
|
156
|
+
"market_name": "Samsung Galaxy S20 Ultra 5G (Exynos)",
|
|
157
|
+
"soc": "Exynos 990",
|
|
158
|
+
"gpu": "ARM Mali-G77 MP11",
|
|
159
|
+
"android_version": 13,
|
|
160
|
+
"api_level": 33,
|
|
161
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
162
|
+
"v10_matmul_max_error": 1.12e-04,
|
|
163
|
+
"status": "VERIFIED_INHERITED",
|
|
164
|
+
"source_profile": "SM-G991N",
|
|
165
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
166
|
+
"memory_alignment_bytes": 128
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"model": "SM-S931N",
|
|
170
|
+
"codename": "pa1q",
|
|
171
|
+
"market_name": "Samsung Galaxy S25",
|
|
172
|
+
"soc": "Qualcomm Snapdragon 8 Elite (SM8750)",
|
|
173
|
+
"gpu": "Qualcomm Adreno 830",
|
|
174
|
+
"android_version": 16,
|
|
175
|
+
"api_level": 36,
|
|
176
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
177
|
+
"v10_matmul_max_error": 1.24e-05,
|
|
178
|
+
"status": "VERIFIED_PRODUCTION",
|
|
179
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
180
|
+
"subgroup_control_bypass": true
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"model": "SM-S928N",
|
|
184
|
+
"codename": "e3q",
|
|
185
|
+
"market_name": "Samsung Galaxy S24 Ultra",
|
|
186
|
+
"soc": "Qualcomm Snapdragon 8 Gen 3 (SM8650-AC)",
|
|
187
|
+
"gpu": "Qualcomm Adreno 750",
|
|
188
|
+
"android_version": 14,
|
|
189
|
+
"api_level": 34,
|
|
190
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
191
|
+
"v10_matmul_max_error": 1.35e-05,
|
|
192
|
+
"status": "VERIFIED_INHERITED",
|
|
193
|
+
"source_profile": "SM-S931N",
|
|
194
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
195
|
+
"subgroup_control_bypass": true
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"model": "SM-S911N",
|
|
199
|
+
"codename": "dm1q",
|
|
200
|
+
"market_name": "Samsung Galaxy S23",
|
|
201
|
+
"soc": "Qualcomm Snapdragon 8 Gen 2 (SM8550-AC)",
|
|
202
|
+
"gpu": "Qualcomm Adreno 740",
|
|
203
|
+
"android_version": 14,
|
|
204
|
+
"api_level": 34,
|
|
205
|
+
"loader_path": "/system/lib64/libvulkan.so",
|
|
206
|
+
"v10_matmul_max_error": 1.40e-05,
|
|
207
|
+
"status": "VERIFIED_INHERITED",
|
|
208
|
+
"source_profile": "SM-S931N",
|
|
209
|
+
"active_modalities": ["stt", "diffusion", "vision", "bitnet", "llamacpp", "tts", "train"],
|
|
210
|
+
"subgroup_control_bypass": true
|
|
211
|
+
}
|
|
212
|
+
]
|
|
213
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
|
3
|
+
build-backend = "setuptools.build_meta"
|
|
4
|
+
|
|
5
|
+
[project]
|
|
6
|
+
name = "ameva-runtime"
|
|
7
|
+
version = "1.0.0"
|
|
8
|
+
description = "Unified Next-Gen Hardware Orchestration & AI Acceleration Runtime for Mobile & Edge"
|
|
9
|
+
readme = "README.pypi.md"
|
|
10
|
+
requires-python = ">=3.8"
|
|
11
|
+
license = { text = "Apache-2.0" }
|
|
12
|
+
authors = [{ name = "Eunho Kim", email = "contact@uno-km.com" }]
|
|
13
|
+
keywords = ["vulkan", "opencl", "npu", "cpu-neon", "android", "termux", "acceleration", "adreno", "mali", "hal", "ameva"]
|
|
14
|
+
classifiers = [
|
|
15
|
+
"Development Status :: 5 - Production/Stable",
|
|
16
|
+
"Intended Audience :: Developers",
|
|
17
|
+
"License :: OSI Approved :: Apache Software License",
|
|
18
|
+
"Operating System :: POSIX :: Linux",
|
|
19
|
+
"Operating System :: Android",
|
|
20
|
+
"Programming Language :: Python :: 3",
|
|
21
|
+
"Programming Language :: Python :: 3.8",
|
|
22
|
+
"Programming Language :: Python :: 3.9",
|
|
23
|
+
"Programming Language :: Python :: 3.10",
|
|
24
|
+
"Programming Language :: Python :: 3.11",
|
|
25
|
+
"Programming Language :: Python :: 3.12",
|
|
26
|
+
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[project.scripts]
|
|
30
|
+
ameva = "ameva_runtime.cli:main"
|
|
31
|
+
ameva-run = "ameva_runtime.cli:main"
|
|
32
|
+
ameva-gpu = "ameva_runtime.cli:legacy_gpu_main"
|
|
33
|
+
|
|
34
|
+
[project.urls]
|
|
35
|
+
Homepage = "https://uno-km.vercel.app/lib/vulkan/"
|
|
36
|
+
Repository = "https://github.com/uno-km/ameva-runtime"
|
|
37
|
+
Documentation = "https://uno-km.vercel.app/lib/vulkan/"
|
|
38
|
+
|
|
39
|
+
[project.optional-dependencies]
|
|
40
|
+
stt = ["termux-stt>=1.1.1"]
|
|
41
|
+
diffusion = ["termux-diffusion>=1.3.1"]
|
|
42
|
+
bitnet = ["termux-bitnet>=1.0.0"]
|
|
43
|
+
llamacpp = ["termux-llamacpp>=1.0.0"]
|
|
44
|
+
tts = ["termux-tts>=1.0.0"]
|
|
45
|
+
vision = ["termux-vision>=1.0.0"]
|
|
46
|
+
all = [
|
|
47
|
+
"termux-stt>=1.1.1",
|
|
48
|
+
"termux-diffusion>=1.3.1",
|
|
49
|
+
"termux-bitnet>=1.0.0",
|
|
50
|
+
"termux-llamacpp>=1.0.0",
|
|
51
|
+
"termux-tts>=1.0.0",
|
|
52
|
+
"termux-vision>=1.0.0",
|
|
53
|
+
]
|
|
54
|
+
|
|
55
|
+
[tool.pytest.ini_options]
|
|
56
|
+
pythonpath = ["python"]
|
|
57
|
+
testpaths = ["python/tests"]
|
|
58
|
+
|
|
59
|
+
[tool.setuptools]
|
|
60
|
+
package-dir = {"" = "python"}
|
|
61
|
+
|
|
62
|
+
[tool.setuptools.packages.find]
|
|
63
|
+
where = ["python"]
|
|
64
|
+
exclude = ["tests*", "*tests*"]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
[tool.setuptools.package-data]
|
|
68
|
+
"ameva_runtime" = [
|
|
69
|
+
"py.typed",
|
|
70
|
+
]
|
|
71
|
+
"ameva_vulkan_runtime" = [
|
|
72
|
+
"profiles/*.json",
|
|
73
|
+
"lib/*.so",
|
|
74
|
+
"lib/*.dll",
|
|
75
|
+
"py.typed",
|
|
76
|
+
]
|