lumen-app 0.4.2__py3-none-any.whl

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.
Files changed (56) hide show
  1. lumen_app/__init__.py +7 -0
  2. lumen_app/core/__init__.py +0 -0
  3. lumen_app/core/config.py +661 -0
  4. lumen_app/core/installer.py +274 -0
  5. lumen_app/core/loader.py +45 -0
  6. lumen_app/core/router.py +87 -0
  7. lumen_app/core/server.py +389 -0
  8. lumen_app/core/service.py +49 -0
  9. lumen_app/core/tests/__init__.py +1 -0
  10. lumen_app/core/tests/test_core_integration.py +561 -0
  11. lumen_app/core/tests/test_env_checker.py +487 -0
  12. lumen_app/proto/README.md +12 -0
  13. lumen_app/proto/ml_service.proto +88 -0
  14. lumen_app/proto/ml_service_pb2.py +66 -0
  15. lumen_app/proto/ml_service_pb2.pyi +136 -0
  16. lumen_app/proto/ml_service_pb2_grpc.py +251 -0
  17. lumen_app/server.py +362 -0
  18. lumen_app/utils/env_checker.py +752 -0
  19. lumen_app/utils/installation/__init__.py +25 -0
  20. lumen_app/utils/installation/env_manager.py +152 -0
  21. lumen_app/utils/installation/micromamba_installer.py +459 -0
  22. lumen_app/utils/installation/package_installer.py +149 -0
  23. lumen_app/utils/installation/verifier.py +95 -0
  24. lumen_app/utils/logger.py +181 -0
  25. lumen_app/utils/mamba/cuda.yaml +12 -0
  26. lumen_app/utils/mamba/default.yaml +6 -0
  27. lumen_app/utils/mamba/openvino.yaml +7 -0
  28. lumen_app/utils/mamba/tensorrt.yaml +13 -0
  29. lumen_app/utils/package_resolver.py +309 -0
  30. lumen_app/utils/preset_registry.py +219 -0
  31. lumen_app/web/__init__.py +3 -0
  32. lumen_app/web/api/__init__.py +1 -0
  33. lumen_app/web/api/config.py +229 -0
  34. lumen_app/web/api/hardware.py +201 -0
  35. lumen_app/web/api/install.py +608 -0
  36. lumen_app/web/api/server.py +253 -0
  37. lumen_app/web/core/__init__.py +1 -0
  38. lumen_app/web/core/server_manager.py +348 -0
  39. lumen_app/web/core/state.py +264 -0
  40. lumen_app/web/main.py +145 -0
  41. lumen_app/web/models/__init__.py +28 -0
  42. lumen_app/web/models/config.py +63 -0
  43. lumen_app/web/models/hardware.py +64 -0
  44. lumen_app/web/models/install.py +134 -0
  45. lumen_app/web/models/server.py +95 -0
  46. lumen_app/web/static/assets/index-CGuhGHC9.css +1 -0
  47. lumen_app/web/static/assets/index-DN6HmxWS.js +56 -0
  48. lumen_app/web/static/index.html +14 -0
  49. lumen_app/web/static/vite.svg +1 -0
  50. lumen_app/web/websockets/__init__.py +1 -0
  51. lumen_app/web/websockets/logs.py +159 -0
  52. lumen_app-0.4.2.dist-info/METADATA +23 -0
  53. lumen_app-0.4.2.dist-info/RECORD +56 -0
  54. lumen_app-0.4.2.dist-info/WHEEL +5 -0
  55. lumen_app-0.4.2.dist-info/entry_points.txt +3 -0
  56. lumen_app-0.4.2.dist-info/top_level.txt +1 -0
lumen_app/__init__.py ADDED
@@ -0,0 +1,7 @@
1
+ from lumen_app.utils.logger import get_logger
2
+
3
+ logger = get_logger("lumen")
4
+
5
+
6
+ def main() -> None:
7
+ logger.info("Hello from lumen-app!")
File without changes
@@ -0,0 +1,661 @@
1
+ from dataclasses import dataclass
2
+ from typing import Literal
3
+
4
+ from lumen_resources import LumenConfig
5
+ from lumen_resources.lumen_config import (
6
+ BackendSettings,
7
+ Deployment1,
8
+ ImportInfo,
9
+ Mdns,
10
+ Metadata,
11
+ ModelConfig,
12
+ Region,
13
+ Runtime,
14
+ Server,
15
+ Service,
16
+ Services,
17
+ )
18
+
19
+
20
+ @dataclass
21
+ class DependencyMetadata:
22
+ """Python 依赖元数据(pip 管理的部分)。
23
+
24
+ 用于描述特定平台的 Python 依赖安装要求,包括可选依赖标识符、
25
+ 额外的 PyPI 索引 URL 等。
26
+
27
+ Attributes:
28
+ extra_index_url: 额外的 PyPI 索引 URL(如 CUDA PyTorch 索引)
29
+ extra_deps: 可选依赖标识符(对应 pyproject.toml 中的 [project.optional-dependencies])
30
+ python_version: Python 版本要求
31
+ install_args: 额外的 pip 安装参数
32
+ """
33
+
34
+ extra_index_url: list[str] | None = None
35
+ extra_deps: list[str] | None = None
36
+ python_version: str = "3.11"
37
+ install_args: list[str] | None = None
38
+
39
+
40
+ @dataclass
41
+ class DeviceConfig:
42
+ """设备配置类。
43
+
44
+ 定义特定硬件平台的推理配置,包括运行时、ONNX 提供者、
45
+ 批处理大小、精度,以及相关的依赖元数据。
46
+
47
+ Attributes:
48
+ runtime: 推理运行时类型(torch/onnx/rknn)
49
+ onnx_providers: ONNX 执行提供者列表
50
+ rknn_device: RKNN 设备标识(如 "rk3588")
51
+ batch_size: 设备硬编码批处理大小(如 CPU/NPU 固定为 1)
52
+ description: 设备描述
53
+ precision: 设备硬编码精度(根据设备支持情况自动选择)
54
+ env: mamba yaml 配置文件标识符(default/cuda/openvino/tensorrt)
55
+ os: 操作系统约束(linux/win/darwin)
56
+ dependency_metadata: Python 依赖元数据
57
+ """
58
+
59
+ runtime: Runtime
60
+ onnx_providers: list | None
61
+ rknn_device: str | None = None # 如 "rk3588"
62
+ batch_size: int | None = (
63
+ None # 设备硬编码batch_size,如cpu, npu设备均为1,如果是动态batch_size 设备,则为None,可以在后续根据任务类型/期望配置灵活调整。将会覆盖LumenConig中的batch_size字段。
64
+ )
65
+ description: str = ""
66
+ precision: str | None = (
67
+ None # 设备硬编码精度,根据设备的支持情况,自动选择最优的精度,将会覆盖LumenConfig中的precision字段。
68
+ )
69
+ env: str = "default" # mamba yaml 配置文件标识符
70
+ os: str | None = None # 操作系统约束 (linux/win/darwin)
71
+ dependency_metadata: DependencyMetadata | None = None # Python 依赖元数据
72
+
73
+ @classmethod
74
+ def rockchip(cls, rknn_device: str):
75
+ return cls(
76
+ runtime=Runtime.rknn,
77
+ onnx_providers=None,
78
+ rknn_device=rknn_device,
79
+ batch_size=1, # NPU fixed to 1 batch size
80
+ description="Preset for Rockchip NPU",
81
+ precision="int8",
82
+ env="default",
83
+ dependency_metadata=DependencyMetadata(extra_deps=["rknn"]),
84
+ )
85
+
86
+ @classmethod
87
+ def apple_silicon(cls, cache_dir: str = "."):
88
+ return cls(
89
+ runtime=Runtime.onnx,
90
+ onnx_providers=[
91
+ (
92
+ "CoreMLExecutionProvider",
93
+ {
94
+ "ModelFormat": "MLProgram",
95
+ "MLComputeUnits": "ALL",
96
+ "RequireStaticInputShapes": "0",
97
+ "EnableOnSubgraphs": "0",
98
+ "SpecializationStrategy": "FastPrediction",
99
+ "ModelCacheDirectory": f"{cache_dir}/cache/coreml",
100
+ },
101
+ ),
102
+ "CPUExecutionProvider",
103
+ ],
104
+ batch_size=1, # NPU fixed to 1 batch size
105
+ description="Preset for Apple Silicon",
106
+ env="default",
107
+ dependency_metadata=DependencyMetadata(extra_deps=["apple"]),
108
+ )
109
+
110
+ @classmethod
111
+ def nvidia_gpu(cls):
112
+ return cls(
113
+ runtime=Runtime.onnx,
114
+ onnx_providers=[
115
+ ("CUDAExecutionProvider", {"cudnn_conv_algo_search": "HEURISTIC"}),
116
+ "CPUExecutionProvider",
117
+ ],
118
+ batch_size=4,
119
+ description="Preset for low RAM (< 12GB) Nvidia GPUs",
120
+ env="cuda",
121
+ dependency_metadata=DependencyMetadata(
122
+ extra_deps=["cuda"],
123
+ ),
124
+ )
125
+
126
+ @classmethod
127
+ def nvidia_gpu_high(cls, cache_dir: str = "."):
128
+ return cls(
129
+ runtime=Runtime.onnx,
130
+ onnx_providers=[
131
+ (
132
+ "TensorRTExecutionProvider",
133
+ {
134
+ "trt_fp16_enable": True,
135
+ "trt_engine_cache_enable": True,
136
+ "trt_engine_cache_path": f"{cache_dir}/cache/trt",
137
+ "trt_max_workspace_size": 2147483648, # 2GB
138
+ },
139
+ ),
140
+ "CUDAExecutionProvider",
141
+ "CPUExecutionProvider",
142
+ ],
143
+ description="Preset for high RAM (>= 12GB) Nvidia GPUs",
144
+ env="tensorrt",
145
+ dependency_metadata=DependencyMetadata(
146
+ extra_deps=["cuda"],
147
+ ),
148
+ )
149
+
150
+ @classmethod
151
+ def intel_gpu(cls, cache_dir: str = "."):
152
+ return cls(
153
+ runtime=Runtime.onnx,
154
+ onnx_providers=[
155
+ (
156
+ "OpenVINOExecutionProvider",
157
+ {
158
+ "device_type": "GPU",
159
+ "precision": "FP16",
160
+ "num_streams": 1,
161
+ "cache_dir": f"{cache_dir}/cache/ov",
162
+ },
163
+ ),
164
+ "CPUExecutionProvider",
165
+ ],
166
+ description="Preset for Intel iGPU or Arc GPU",
167
+ precision="fp16",
168
+ env="openvino",
169
+ dependency_metadata=DependencyMetadata(extra_deps=["openvino"]),
170
+ )
171
+
172
+ # ROCm Support is under evaluation.
173
+ # @classmethod
174
+ # def amd_gpu(cls):
175
+ # return cls(
176
+ # runtime=Runtime.onnx,
177
+ # onnx_providers=[
178
+ # (
179
+ # "MIGraphXExecutionProvider",
180
+ # {
181
+ # "migraphx_fp16_enable": 1,
182
+ # "migraphx_int8_enable": 0,
183
+ # "migraphx_exhaustive_tune": 0,
184
+ # },
185
+ # ),
186
+ # "CPUExecutionProvider",
187
+ # ],
188
+ # description="Preset for AMD Radeon GPUs",
189
+ # precision="fp16",
190
+ # )
191
+
192
+ @classmethod
193
+ def amd_gpu_win(cls):
194
+ """
195
+ Installation instruction: Refer to https://ryzenai.docs.amd.com/en/latest/gpu/ryzenai_gpu.html
196
+ """
197
+ return cls(
198
+ runtime=Runtime.onnx,
199
+ onnx_providers=[
200
+ "DMLExecutionProvider",
201
+ "CPUExecutionProvider",
202
+ ],
203
+ description="Preset for AMD Ryzen GPUs",
204
+ env="default",
205
+ dependency_metadata=DependencyMetadata(extra_deps=["cpu"]),
206
+ )
207
+
208
+ @classmethod
209
+ def amd_npu(cls, cache_dir: str = "."):
210
+ """
211
+ Installation instruction: Refer to https://ryzenai.docs.amd.com/en/latest/inst.html
212
+ """
213
+ return cls(
214
+ runtime=Runtime.onnx,
215
+ onnx_providers=[
216
+ ("VitisAIExecutionProvider", {"cache_dir": f"{cache_dir}/cache/amd"}),
217
+ "CPUExecutionProvider",
218
+ ],
219
+ description="Preset for AMD Ryzen NPUs",
220
+ env="default",
221
+ dependency_metadata=DependencyMetadata(extra_deps=["cpu"]),
222
+ )
223
+
224
+ @classmethod
225
+ def nvidia_jetson(cls):
226
+ return cls(
227
+ runtime=Runtime.onnx,
228
+ onnx_providers=[
229
+ ("CUDAExecutionProvider", {"cudnn_conv_algo_search": "HEURISTIC"}),
230
+ "CPUExecutionProvider",
231
+ ],
232
+ description="Preset for low RAM (< 12GB) Nvidia Jetson Devices",
233
+ env="default",
234
+ os="linux",
235
+ dependency_metadata=DependencyMetadata(
236
+ extra_index_url=["https://pypi.jetson-ai-lab.io/jp6/cu126"],
237
+ extra_deps=["cuda"],
238
+ ),
239
+ )
240
+
241
+ @classmethod
242
+ def nvidia_jetson_high(cls):
243
+ return cls(
244
+ runtime=Runtime.onnx,
245
+ onnx_providers=[
246
+ (
247
+ "TensorRTExecutionProvider",
248
+ {
249
+ "trt_fp16_enable": True,
250
+ "trt_engine_cache_enable": True,
251
+ "trt_engine_cache_path": "./cache/trt",
252
+ "trt_max_workspace_size": 2147483648,
253
+ },
254
+ ),
255
+ "CUDAExecutionProvider",
256
+ "CPUExecutionProvider",
257
+ ],
258
+ description="Preset for high RAM (>= 12GB) Nvidia Jetson Devices",
259
+ env="default",
260
+ os="linux",
261
+ dependency_metadata=DependencyMetadata(
262
+ extra_index_url=["https://pypi.jetson-ai-lab.io/jp6/cu126"],
263
+ extra_deps=["cuda"],
264
+ ),
265
+ )
266
+
267
+ @classmethod
268
+ def cpu(cls):
269
+ return cls(
270
+ runtime=Runtime.onnx,
271
+ onnx_providers=[
272
+ "CPUExecutionProvider",
273
+ ],
274
+ batch_size=1,
275
+ description="Preset General CPUs",
276
+ env="default",
277
+ dependency_metadata=DependencyMetadata(extra_deps=["cpu"]),
278
+ )
279
+
280
+
281
+ class Config:
282
+ def __init__(
283
+ self,
284
+ cache_dir: str,
285
+ device_config: DeviceConfig,
286
+ region: Region,
287
+ service_name: str,
288
+ port: int | None,
289
+ ):
290
+ self.cache_dir: str = cache_dir
291
+ self.region: Region = region
292
+ self.port: int = port or 50051
293
+ self.service_name: str = service_name
294
+
295
+ self.unified_runtime: Runtime = device_config.runtime
296
+ self.unified_rknn_device: str | None = device_config.rknn_device
297
+ self.device_config: DeviceConfig = device_config
298
+
299
+ def minimal(self) -> LumenConfig:
300
+ return LumenConfig(
301
+ metadata=Metadata(
302
+ version="1.0.0",
303
+ region=self.region,
304
+ cache_dir=self.cache_dir,
305
+ ),
306
+ deployment=Deployment1(
307
+ mode="hub", services=[Service(root="ocr")], service=None
308
+ ),
309
+ server=Server(
310
+ port=self.port,
311
+ host="0.0.0.0",
312
+ mdns=Mdns(enabled=True, service_name=self.service_name),
313
+ ),
314
+ services={
315
+ "ocr": Services(
316
+ enabled=True,
317
+ package="lumen_ocr",
318
+ import_info=ImportInfo(
319
+ registry_class="lumen_ocr.general_ocr.GeneralOcrService",
320
+ add_to_server="lumen_ocr.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
321
+ ),
322
+ backend_settings=BackendSettings(
323
+ device=None, # Auto Detect For Non-PyTorch Backend
324
+ batch_size=self.device_config.batch_size or 1,
325
+ onnx_providers=self.device_config.onnx_providers,
326
+ ),
327
+ models={
328
+ "general": ModelConfig(
329
+ model="PP-OCRv5",
330
+ runtime=self.unified_runtime,
331
+ rknn_device=self.unified_rknn_device,
332
+ precision="fp32",
333
+ dataset=None,
334
+ )
335
+ },
336
+ )
337
+ },
338
+ )
339
+
340
+ def light_weight(
341
+ self, clip_model: Literal["MobileCLIP2-S2", "CN-CLIP_ViT-B-16"]
342
+ ) -> LumenConfig:
343
+ return LumenConfig(
344
+ metadata=Metadata(
345
+ version="1.0.0",
346
+ region=self.region,
347
+ cache_dir=self.cache_dir,
348
+ ),
349
+ deployment=Deployment1(
350
+ mode="hub",
351
+ services=[
352
+ Service(root="ocr"),
353
+ Service(root="clip"),
354
+ Service(root="face"),
355
+ ],
356
+ service=None,
357
+ ),
358
+ server=Server(
359
+ port=self.port,
360
+ host="0.0.0.0",
361
+ mdns=Mdns(enabled=True, service_name=self.service_name),
362
+ ),
363
+ services={
364
+ "ocr": Services(
365
+ enabled=True,
366
+ package="lumen_ocr",
367
+ import_info=ImportInfo(
368
+ registry_class="lumen_ocr.general_ocr.GeneralOcrService",
369
+ add_to_server="lumen_ocr.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
370
+ ),
371
+ backend_settings=BackendSettings(
372
+ device=None, # Auto Detect For Non-PyTorch Backend
373
+ batch_size=self.device_config.batch_size or 1,
374
+ onnx_providers=self.device_config.onnx_providers,
375
+ ),
376
+ models={
377
+ "general": ModelConfig(
378
+ model="PP-OCRv5",
379
+ runtime=self.unified_runtime,
380
+ rknn_device=self.unified_rknn_device,
381
+ precision="fp32",
382
+ dataset=None,
383
+ )
384
+ },
385
+ ),
386
+ "clip": Services(
387
+ enabled=True,
388
+ package="lumen_clip",
389
+ import_info=ImportInfo(
390
+ registry_class="lumen_clip.general_clip.clip_service.GeneralCLIPService",
391
+ add_to_server="lumen_clip.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
392
+ ),
393
+ backend_settings=BackendSettings(
394
+ device=None, # Auto Detect For Non-PyTorch Backend
395
+ batch_size=self.device_config.batch_size or 1,
396
+ onnx_providers=self.device_config.onnx_providers,
397
+ ),
398
+ models={
399
+ "general": ModelConfig(
400
+ model=clip_model,
401
+ runtime=self.unified_runtime,
402
+ rknn_device=self.unified_rknn_device,
403
+ dataset="ImageNet_1k",
404
+ precision=self.device_config.precision or "fp16",
405
+ )
406
+ },
407
+ ),
408
+ "face": Services(
409
+ enabled=True,
410
+ package="lumen_face",
411
+ import_info=ImportInfo(
412
+ registry_class="lumen_face.general_face.GeneralFaceService",
413
+ add_to_server="lumen_face.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
414
+ ),
415
+ backend_settings=BackendSettings(
416
+ device=None, # Auto Detect For Non-PyTorch Backend
417
+ batch_size=self.device_config.batch_size or 1,
418
+ onnx_providers=self.device_config.onnx_providers,
419
+ ),
420
+ models={
421
+ "general": ModelConfig(
422
+ model="buffalo_l",
423
+ runtime=self.unified_runtime,
424
+ rknn_device=self.unified_rknn_device,
425
+ precision=self.device_config.precision or "fp16",
426
+ dataset=None,
427
+ )
428
+ },
429
+ ),
430
+ },
431
+ )
432
+
433
+ def basic(
434
+ self, clip_model: Literal["MobileCLIP2-S4", "CN-CLIP_ViT-L-14"]
435
+ ) -> LumenConfig:
436
+ return LumenConfig(
437
+ metadata=Metadata(
438
+ version="1.0.0",
439
+ region=self.region,
440
+ cache_dir=self.cache_dir,
441
+ ),
442
+ deployment=Deployment1(
443
+ mode="hub",
444
+ services=[
445
+ Service(root="ocr"),
446
+ Service(root="clip"),
447
+ Service(root="face"),
448
+ Service(root="vlm"),
449
+ ],
450
+ service=None,
451
+ ),
452
+ server=Server(
453
+ port=self.port,
454
+ host="0.0.0.0",
455
+ mdns=Mdns(enabled=True, service_name=self.service_name),
456
+ ),
457
+ services={
458
+ "ocr": Services(
459
+ enabled=True,
460
+ package="lumen_ocr",
461
+ import_info=ImportInfo(
462
+ registry_class="lumen_ocr.general_ocr.GeneralOcrService",
463
+ add_to_server="lumen_ocr.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
464
+ ),
465
+ backend_settings=BackendSettings(
466
+ device=None, # Auto Detect For Non-PyTorch Backend
467
+ batch_size=self.device_config.batch_size or 5,
468
+ onnx_providers=self.device_config.onnx_providers,
469
+ ),
470
+ models={
471
+ "general": ModelConfig(
472
+ model="PP-OCRv5",
473
+ runtime=self.unified_runtime,
474
+ rknn_device=self.unified_rknn_device,
475
+ precision=self.device_config.precision or "fp32",
476
+ dataset=None,
477
+ )
478
+ },
479
+ ),
480
+ "clip": Services(
481
+ enabled=True,
482
+ package="lumen_clip",
483
+ import_info=ImportInfo(
484
+ registry_class="lumen_clip.general_clip.clip_service.GeneralCLIPService",
485
+ add_to_server="lumen_clip.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
486
+ ),
487
+ backend_settings=BackendSettings(
488
+ device=None, # Auto Detect For Non-PyTorch Backend
489
+ batch_size=self.device_config.batch_size or 5,
490
+ onnx_providers=self.device_config.onnx_providers,
491
+ ),
492
+ models={
493
+ "general": ModelConfig(
494
+ model=clip_model,
495
+ runtime=self.unified_runtime,
496
+ rknn_device=self.unified_rknn_device,
497
+ dataset="ImageNet_1k",
498
+ precision=self.device_config.precision or "fp16",
499
+ )
500
+ },
501
+ ),
502
+ "face": Services(
503
+ enabled=True,
504
+ package="lumen_face",
505
+ import_info=ImportInfo(
506
+ registry_class="lumen_face.general_face.GeneralFaceService",
507
+ add_to_server="lumen_face.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
508
+ ),
509
+ backend_settings=BackendSettings(
510
+ device=None, # Auto Detect For Non-PyTorch Backend
511
+ batch_size=self.device_config.batch_size or 5,
512
+ onnx_providers=self.device_config.onnx_providers,
513
+ ),
514
+ models={
515
+ "general": ModelConfig(
516
+ model="antelopev2",
517
+ runtime=self.unified_runtime,
518
+ rknn_device=self.unified_rknn_device,
519
+ precision=self.device_config.precision or "fp16",
520
+ dataset=None,
521
+ )
522
+ },
523
+ ),
524
+ "vlm": Services(
525
+ enabled=True,
526
+ package="lumen_vlm",
527
+ import_info=ImportInfo(
528
+ registry_class="lumen_vlm.fastvlm.GeneralFastVLMService",
529
+ add_to_server="lumen_vlm.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
530
+ ),
531
+ backend_settings=BackendSettings(
532
+ device=None, # Auto Detect For Non-PyTorch Backend
533
+ batch_size=self.device_config.batch_size or 1,
534
+ onnx_providers=self.device_config.onnx_providers,
535
+ ),
536
+ models={
537
+ "general": ModelConfig(
538
+ model="FastVLM-0.5B",
539
+ runtime=self.unified_runtime,
540
+ rknn_device=self.unified_rknn_device,
541
+ precision=self.device_config.precision or "int8",
542
+ dataset=None,
543
+ )
544
+ },
545
+ ),
546
+ },
547
+ )
548
+
549
+ def brave(self) -> LumenConfig:
550
+ return LumenConfig(
551
+ metadata=Metadata(
552
+ version="1.0.0",
553
+ region=self.region,
554
+ cache_dir=self.cache_dir,
555
+ ),
556
+ deployment=Deployment1(
557
+ mode="hub",
558
+ service=None, # None for hub mode
559
+ services=[
560
+ Service(root="ocr"),
561
+ Service(root="clip"),
562
+ Service(root="face"),
563
+ Service(root="vlm"),
564
+ ],
565
+ ),
566
+ server=Server(
567
+ port=self.port,
568
+ host="0.0.0.0",
569
+ mdns=Mdns(enabled=True, service_name=self.service_name),
570
+ ),
571
+ services={
572
+ "ocr": Services(
573
+ enabled=True,
574
+ package="lumen_ocr",
575
+ import_info=ImportInfo(
576
+ registry_class="lumen_ocr.general_ocr.GeneralOcrService",
577
+ add_to_server="lumen_ocr.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
578
+ ),
579
+ backend_settings=BackendSettings(
580
+ device=None, # Auto Detect For Non-PyTorch Backend
581
+ batch_size=self.device_config.batch_size or 10,
582
+ onnx_providers=self.device_config.onnx_providers,
583
+ ),
584
+ models={
585
+ "general": ModelConfig(
586
+ model="PP-OCRv5",
587
+ runtime=self.unified_runtime,
588
+ rknn_device=self.unified_rknn_device,
589
+ precision=self.device_config.precision or "fp32",
590
+ dataset=None,
591
+ )
592
+ },
593
+ ),
594
+ "clip": Services(
595
+ enabled=True,
596
+ package="lumen_clip",
597
+ import_info=ImportInfo(
598
+ registry_class="lumen_clip.expert_bioclip.BioCLIPService",
599
+ add_to_server="lumen_clip.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
600
+ ),
601
+ backend_settings=BackendSettings(
602
+ device=None, # Auto Detect For Non-PyTorch Backend
603
+ batch_size=self.device_config.batch_size or 8,
604
+ onnx_providers=self.device_config.onnx_providers,
605
+ ),
606
+ models={
607
+ "bioclip": ModelConfig(
608
+ model="bioclip-2",
609
+ runtime=self.unified_runtime,
610
+ rknn_device=self.unified_rknn_device,
611
+ dataset="TreeOfLife-200M",
612
+ precision=self.device_config.precision or "fp16",
613
+ )
614
+ },
615
+ ),
616
+ "face": Services(
617
+ enabled=True,
618
+ package="lumen_face",
619
+ import_info=ImportInfo(
620
+ registry_class="lumen_face.general_face.GeneralFaceService",
621
+ add_to_server="lumen_face.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
622
+ ),
623
+ backend_settings=BackendSettings(
624
+ device=None, # Auto Detect For Non-PyTorch Backend
625
+ batch_size=self.device_config.batch_size or 8,
626
+ onnx_providers=self.device_config.onnx_providers,
627
+ ),
628
+ models={
629
+ "general": ModelConfig(
630
+ model="antelopev2",
631
+ runtime=self.unified_runtime,
632
+ rknn_device=self.unified_rknn_device,
633
+ precision=self.device_config.precision or "fp16",
634
+ dataset=None,
635
+ )
636
+ },
637
+ ),
638
+ "vlm": Services(
639
+ enabled=True,
640
+ package="lumen_vlm",
641
+ import_info=ImportInfo(
642
+ registry_class="lumen_vlm.fastvlm.GeneralFastVLMService",
643
+ add_to_server="lumen_vlm.proto.ml_service_pb2_grpc.add_InferenceServicer_to_server",
644
+ ),
645
+ backend_settings=BackendSettings(
646
+ device=None, # Auto Detect For Non-PyTorch Backend
647
+ batch_size=self.device_config.batch_size or 1,
648
+ onnx_providers=self.device_config.onnx_providers,
649
+ ),
650
+ models={
651
+ "general": ModelConfig(
652
+ model="FastVLM-0.5B",
653
+ runtime=self.unified_runtime,
654
+ rknn_device=self.unified_rknn_device,
655
+ precision=self.device_config.precision or "fp16",
656
+ dataset=None,
657
+ )
658
+ },
659
+ ),
660
+ },
661
+ )