flexsds 0.2.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.
Files changed (155) hide show
  1. flexsds-0.2.0/PKG-INFO +204 -0
  2. flexsds-0.2.0/README.md +193 -0
  3. flexsds-0.2.0/pyproject.toml +34 -0
  4. flexsds-0.2.0/setup.cfg +4 -0
  5. flexsds-0.2.0/src/flexsds/__init__.py +4 -0
  6. flexsds-0.2.0/src/flexsds/assets/ptit_logo.png +0 -0
  7. flexsds-0.2.0/src/flexsds/cli/__init__.py +1 -0
  8. flexsds-0.2.0/src/flexsds/cli/banner.py +84 -0
  9. flexsds-0.2.0/src/flexsds/cli/main.py +330 -0
  10. flexsds-0.2.0/src/flexsds/cli/output.py +69 -0
  11. flexsds-0.2.0/src/flexsds/cli/task_runner.py +171 -0
  12. flexsds-0.2.0/src/flexsds/cli/wizard.py +360 -0
  13. flexsds-0.2.0/src/flexsds/client/__init__.py +4 -0
  14. flexsds-0.2.0/src/flexsds/client/chat.py +137 -0
  15. flexsds-0.2.0/src/flexsds/client/client.py +107 -0
  16. flexsds-0.2.0/src/flexsds/client/monitor.py +95 -0
  17. flexsds-0.2.0/src/flexsds/core/__init__.py +44 -0
  18. flexsds-0.2.0/src/flexsds/core/compatibility.py +442 -0
  19. flexsds-0.2.0/src/flexsds/core/controller.py +502 -0
  20. flexsds-0.2.0/src/flexsds/core/cost_model.py +530 -0
  21. flexsds-0.2.0/src/flexsds/core/credentials.py +111 -0
  22. flexsds-0.2.0/src/flexsds/core/hardware.py +77 -0
  23. flexsds-0.2.0/src/flexsds/core/tree_topology.py +296 -0
  24. flexsds-0.2.0/src/flexsds/profiles/profile_sm75_t4.json +62 -0
  25. flexsds-0.2.0/src/flexsds/profiles/profile_sm89_l4.json +194 -0
  26. flexsds-0.2.0/src/flexsds/server/__init__.py +1 -0
  27. flexsds-0.2.0/src/flexsds/server/colab_runner.py +62 -0
  28. flexsds-0.2.0/src/flexsds/server/local_runner.py +208 -0
  29. flexsds-0.2.0/src/flexsds/server/modal_app.py +50 -0
  30. flexsds-0.2.0/src/flexsds/server/modal_runner.py +98 -0
  31. flexsds-0.2.0/src/flexsds/server/vscode_cli.py +82 -0
  32. flexsds-0.2.0/src/flexsds.egg-info/PKG-INFO +204 -0
  33. flexsds-0.2.0/src/flexsds.egg-info/SOURCES.txt +153 -0
  34. flexsds-0.2.0/src/flexsds.egg-info/dependency_links.txt +1 -0
  35. flexsds-0.2.0/src/flexsds.egg-info/entry_points.txt +2 -0
  36. flexsds-0.2.0/src/flexsds.egg-info/requires.txt +4 -0
  37. flexsds-0.2.0/src/flexsds.egg-info/top_level.txt +4 -0
  38. flexsds-0.2.0/src/pipeline/entity_eval.py +171 -0
  39. flexsds-0.2.0/src/pipeline/examples/node1_extractor_input_m0_04_001.txt +9 -0
  40. flexsds-0.2.0/src/pipeline/examples/node1_extractor_output_m0_04_001.json +90 -0
  41. flexsds-0.2.0/src/pipeline/extractor.py +502 -0
  42. flexsds-0.2.0/src/pipeline/invoice_models.py +163 -0
  43. flexsds-0.2.0/src/pipeline/node2_questions.py +30 -0
  44. flexsds-0.2.0/src/pipeline/openai_compatible.py +87 -0
  45. flexsds-0.2.0/src/pipeline/prompts/README.md +18 -0
  46. flexsds-0.2.0/src/pipeline/prompts/node1_extractor_system.md +92 -0
  47. flexsds-0.2.0/src/pipeline/prompts/node3_report_user.md +5 -0
  48. flexsds-0.2.0/src/pipeline/report_writer.py +143 -0
  49. flexsds-0.2.0/src/pipeline/schemas/invoice_extraction.schema.json +469 -0
  50. flexsds-0.2.0/src/pipeline/sql_guard.py +140 -0
  51. flexsds-0.2.0/src/pipeline/sqlite/schema.sql +219 -0
  52. flexsds-0.2.0/src/pipeline/text_to_sql.py +170 -0
  53. flexsds-0.2.0/src/pipeline/validation.py +166 -0
  54. flexsds-0.2.0/src/pipeline/w1_workload.py +139 -0
  55. flexsds-0.2.0/src/proposer/__init__.py +31 -0
  56. flexsds-0.2.0/src/proposer/adapter.py +153 -0
  57. flexsds-0.2.0/src/proposer/controller.py +460 -0
  58. flexsds-0.2.0/src/proposer/cost_model.py +216 -0
  59. flexsds-0.2.0/src/proposer/tree_adaptive.py +466 -0
  60. flexsds-0.2.0/src/server/__init__.py +3 -0
  61. flexsds-0.2.0/src/server/adaptive_scheduler.py +215 -0
  62. flexsds-0.2.0/src/server/budget_planner.py +287 -0
  63. flexsds-0.2.0/src/server/lineage.py +290 -0
  64. flexsds-0.2.0/src/server/lineage_diagnostics.py +38 -0
  65. flexsds-0.2.0/src/server/lineage_executor.py +129 -0
  66. flexsds-0.2.0/src/server/lineage_startup.py +47 -0
  67. flexsds-0.2.0/src/server/t4_rowwise_attention.py +262 -0
  68. flexsds-0.2.0/tests/test_adaptive_scheduler_glue.py +1428 -0
  69. flexsds-0.2.0/tests/test_aggregate_results.py +429 -0
  70. flexsds-0.2.0/tests/test_async_lineage_runtime_validator.py +203 -0
  71. flexsds-0.2.0/tests/test_benchmark_profiles.py +194 -0
  72. flexsds-0.2.0/tests/test_benchmark_workload_adapter.py +669 -0
  73. flexsds-0.2.0/tests/test_budget_controller.py +306 -0
  74. flexsds-0.2.0/tests/test_budget_fallback_recovery.py +228 -0
  75. flexsds-0.2.0/tests/test_budget_planner.py +403 -0
  76. flexsds-0.2.0/tests/test_budget_transition_scenarios.py +251 -0
  77. flexsds-0.2.0/tests/test_cli_chat_command.py +79 -0
  78. flexsds-0.2.0/tests/test_cli_monitor_command.py +96 -0
  79. flexsds-0.2.0/tests/test_cli_output_encoding.py +158 -0
  80. flexsds-0.2.0/tests/test_cli_wizard_flow.py +24 -0
  81. flexsds-0.2.0/tests/test_colab_runner.py +34 -0
  82. flexsds-0.2.0/tests/test_compatibility_guard.py +117 -0
  83. flexsds-0.2.0/tests/test_cost_model_l4.py +132 -0
  84. flexsds-0.2.0/tests/test_cost_model_solver.py +232 -0
  85. flexsds-0.2.0/tests/test_credentials_manager.py +80 -0
  86. flexsds-0.2.0/tests/test_end_to_end_flow.py +175 -0
  87. flexsds-0.2.0/tests/test_entity_eval.py +219 -0
  88. flexsds-0.2.0/tests/test_evaluate_node1_lanes.py +177 -0
  89. flexsds-0.2.0/tests/test_extractor.py +659 -0
  90. flexsds-0.2.0/tests/test_flexsds_advisor.py +122 -0
  91. flexsds-0.2.0/tests/test_flexsds_baseline.py +199 -0
  92. flexsds-0.2.0/tests/test_flexsds_client.py +43 -0
  93. flexsds-0.2.0/tests/test_flexsds_integration.py +247 -0
  94. flexsds-0.2.0/tests/test_hardware_profiler_benchmark.py +76 -0
  95. flexsds-0.2.0/tests/test_invoice_models.py +76 -0
  96. flexsds-0.2.0/tests/test_invoice_sqlite_v2.py +119 -0
  97. flexsds-0.2.0/tests/test_lineage_startup.py +446 -0
  98. flexsds-0.2.0/tests/test_local_runner.py +84 -0
  99. flexsds-0.2.0/tests/test_lossless_verifier.py +170 -0
  100. flexsds-0.2.0/tests/test_m005_ab.py +454 -0
  101. flexsds-0.2.0/tests/test_m1_01_smoke_helpers.py +51 -0
  102. flexsds-0.2.0/tests/test_m1_telemetry_contract.py +182 -0
  103. flexsds-0.2.0/tests/test_m2_campaign.py +230 -0
  104. flexsds-0.2.0/tests/test_m2_harness_contract.py +66 -0
  105. flexsds-0.2.0/tests/test_m2_plots.py +121 -0
  106. flexsds-0.2.0/tests/test_m2_summary.py +358 -0
  107. flexsds-0.2.0/tests/test_m3_preflight.py +210 -0
  108. flexsds-0.2.0/tests/test_m4_colab_preflight.py +134 -0
  109. flexsds-0.2.0/tests/test_m4_cost_profiler.py +206 -0
  110. flexsds-0.2.0/tests/test_m4_cost_runner.py +352 -0
  111. flexsds-0.2.0/tests/test_memory_pressure_rule.py +137 -0
  112. flexsds-0.2.0/tests/test_modal_bench_jobs.py +474 -0
  113. flexsds-0.2.0/tests/test_modal_client.py +266 -0
  114. flexsds-0.2.0/tests/test_modal_probe.py +249 -0
  115. flexsds-0.2.0/tests/test_modal_profiler.py +199 -0
  116. flexsds-0.2.0/tests/test_modal_runner_cli.py +89 -0
  117. flexsds-0.2.0/tests/test_modal_runner_config.py +547 -0
  118. flexsds-0.2.0/tests/test_modal_smoke.py +139 -0
  119. flexsds-0.2.0/tests/test_modal_vram_join.py +96 -0
  120. flexsds-0.2.0/tests/test_model_metadata_cache.py +66 -0
  121. flexsds-0.2.0/tests/test_node2_runner.py +206 -0
  122. flexsds-0.2.0/tests/test_node3_report.py +140 -0
  123. flexsds-0.2.0/tests/test_openai_compatible_ready_wait.py +97 -0
  124. flexsds-0.2.0/tests/test_proposer_adapter.py +143 -0
  125. flexsds-0.2.0/tests/test_protocol_b.py +580 -0
  126. flexsds-0.2.0/tests/test_protocol_b_boundary.py +531 -0
  127. flexsds-0.2.0/tests/test_protocol_b_boundary_early.py +412 -0
  128. flexsds-0.2.0/tests/test_protocol_b_boundary_gpu_resolution.py +99 -0
  129. flexsds-0.2.0/tests/test_protocol_b_boundary_kv.py +608 -0
  130. flexsds-0.2.0/tests/test_protocol_b_boundary_layer1.py +312 -0
  131. flexsds-0.2.0/tests/test_protocol_b_boundary_p177_attention_substitution.py +408 -0
  132. flexsds-0.2.0/tests/test_protocol_b_boundary_p177_k0_control.py +636 -0
  133. flexsds-0.2.0/tests/test_protocol_b_boundary_postwrite.py +613 -0
  134. flexsds-0.2.0/tests/test_protocol_b_boundary_tokenizer_revision.py +187 -0
  135. flexsds-0.2.0/tests/test_protocol_b_boundary_v2.py +244 -0
  136. flexsds-0.2.0/tests/test_run_node1_extractor.py +72 -0
  137. flexsds-0.2.0/tests/test_run_node1_lanes.py +279 -0
  138. flexsds-0.2.0/tests/test_run_pipeline_e2e.py +229 -0
  139. flexsds-0.2.0/tests/test_scalar_colab_git.py +230 -0
  140. flexsds-0.2.0/tests/test_scalar_colab_smoke.py +320 -0
  141. flexsds-0.2.0/tests/test_scalar_context.py +274 -0
  142. flexsds-0.2.0/tests/test_scalar_cost_capture.py +401 -0
  143. flexsds-0.2.0/tests/test_scalar_cost_evidence.py +230 -0
  144. flexsds-0.2.0/tests/test_scheduler_tree_glue.py +74 -0
  145. flexsds-0.2.0/tests/test_serving_profile_guard.py +85 -0
  146. flexsds-0.2.0/tests/test_sql_guard.py +96 -0
  147. flexsds-0.2.0/tests/test_t4_rowwise_attention.py +531 -0
  148. flexsds-0.2.0/tests/test_task_runner.py +89 -0
  149. flexsds-0.2.0/tests/test_tree_adaptive_controller.py +472 -0
  150. flexsds-0.2.0/tests/test_tree_topology.py +245 -0
  151. flexsds-0.2.0/tests/test_validation.py +280 -0
  152. flexsds-0.2.0/tests/test_vram_memory_lifecycle.py +145 -0
  153. flexsds-0.2.0/tests/test_w1_workload.py +91 -0
  154. flexsds-0.2.0/tests/test_w2_w3_workloads.py +60 -0
  155. flexsds-0.2.0/tests/test_w2_w3_workloads_v2.py +145 -0
flexsds-0.2.0/PKG-INFO ADDED
@@ -0,0 +1,204 @@
1
+ Metadata-Version: 2.4
2
+ Name: flexsds
3
+ Version: 0.2.0
4
+ Summary: Flexible Speculative Decoding Serving Engine for LLMs
5
+ Author: Can Duc Khoi, Bui Duc Dai, Nguyen The Duong
6
+ Requires-Python: >=3.9
7
+ Description-Content-Type: text/markdown
8
+ Requires-Dist: psutil
9
+ Provides-Extra: dev
10
+ Requires-Dist: pytest>=8.0; extra == "dev"
11
+
12
+ <div align="center">
13
+
14
+ <img src="logo/flexsds_banner.gif" alt="PTIT - FlexSDS Banner" width="100%" />
15
+
16
+ # FlexSDS: Hệ thống phục vụ suy luận phỏng đoán thích ứng nhận biết phần cứng
17
+
18
+ **Bộ công cụ phục vụ suy luận phỏng đoán thông minh cho các mô hình ngôn ngữ lớn tự lưu trữ**
19
+ *Hardware-Aware Adaptive Speculative Decoding Serving Toolkit for Self-Hosted LLMs*
20
+
21
+ [![PTIT](https://img.shields.io/badge/PTIT-Đồ%20án%20tốt%20nghiệp%20D22-ED1C24?style=for-the-badge&logoColor=white)](https://portal.ptit.edu.vn/)
22
+ [![Python](https://img.shields.io/badge/Python-3.11%20%7C%203.13-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
23
+ [![vLLM](https://img.shields.io/badge/vLLM-0.30.0%20Core%20V1-blue?style=for-the-badge)](https://github.com/vllm-project/vllm)
24
+ [![Modal](https://img.shields.io/badge/Modal-GPU%20L4%20Serverless-00C7B7?style=for-the-badge)](https://modal.com)
25
+ [![Status](https://img.shields.io/badge/Trạng%20thái-Sprint%205%20%2F%20M4%20Freeze-brightgreen?style=for-the-badge)]()
26
+
27
+ <br/>
28
+
29
+ <picture>
30
+ <source media="(prefers-color-scheme: dark)" srcset="logo/icon_dark.webp">
31
+ <source media="(prefers-color-scheme: light)" srcset="logo/icon_white.webp">
32
+ <img alt="FlexSDS Logo" src="logo/icon_dark.webp" width="90" height="90">
33
+ </picture>
34
+
35
+ </div>
36
+
37
+ ---
38
+
39
+ ## 1. Tổng quan đề tài
40
+
41
+ Trong các hệ thống xử lý tài liệu tự động và chuỗi tác vụ đa bước (multi-step LLM pipeline), **độ trễ sinh từ trong pha giải mã (Decode Latency)** là nút thắt cổ chai lớn nhất và bị tích lũy lũy tiến qua từng lời gọi mô hình. Kỹ thuật suy luận phỏng đoán truyền thống (Static Speculative Decoding) sử dụng cấu hình nháp cố định thường gặp phải hai rào cản nghiêm trọng trong môi trường triển khai thực tế:
42
+ 1. **Hiện tượng tăng tốc âm (Negative Speedup):** Khi gặp các tác vụ suy luận tự do có entropy cao hoặc khi hệ thống chịu tải đồng thời lớn ($c \ge 16$), việc ép chạy mô hình nháp vô ích biến nó thành tải ký sinh, làm giảm tốc độ thực tế (chỉ đạt $0.67\times - 0.81\times$ so với suy luận tuần tự cơ sở).
43
+ 2. **Nguy cơ tràn bộ nhớ (Out-Of-Memory - OOM):** Việc đồng thời nạp cả mô hình đích, mô hình nháp và phân bổ bộ đệm KV dễ dẫn đến tràn VRAM trên các dòng GPU phổ thông (NVIDIA Tesla T4 16GB, RTX 4090 24GB).
44
+
45
+ **FlexSDS** (*Flexible Speculative Decoding Serving*) là giải pháp mã nguồn mở hoàn chỉnh do nhóm sinh viên PTIT nghiên cứu và phát triển. Hệ thống tích hợp lớp điều khiển thích ứng **TreeAdaptive**, tự động nhận diện phần cứng, nạp ma trận chi phí thực nghiệm và giải ngưỡng hòa vốn động $\alpha^*(N, B)$ theo thời gian thực để co giãn cấu trúc cây nháp hoặc ngắt về suy luận tuần tự cơ sở, **bảo đảm tăng tốc tối đa nhưng không bao giờ bị chậm hơn chế độ mặc định (Lossless Guarantee)**.
46
+
47
+ ---
48
+
49
+ ## 2. Ứng dụng thực nghiệm: Luồng đa tác vụ trên hóa đơn bán hàng
50
+
51
+ Để kiểm chứng năng lực thích ứng trong môi trường thực tế, FlexSDS được triển khai phục vụ quy trình xử lý và phân tích hóa đơn bán hàng tiếng Việt (bộ dữ liệu MC-OCR) với 3 tác vụ đại diện:
52
+
53
+ ```text
54
+ ┌────────────────────────────────────────────────────────────────────────┐
55
+ │ HỆ THỐNG ĐA TÁC VỤ TRÊN HÓA ĐƠN BÁN HÀNG │
56
+ ├────────────────────────────────────────────────────────────────────────┤
57
+ │ [Ảnh / Thư mục hóa đơn tải lên] │
58
+ │ │ │
59
+ │ ▼ │
60
+ │ ┌────────────────────────────────────────────────────────────────────┐ │
61
+ │ │ TÁC VỤ 1: TRÍCH XUẤT NỘI DUNG HÓA ĐƠN THÀNH JSON (MC-OCR W1) │ │
62
+ │ │ • Trích xuất 7 trường pháp lý: Người bán, MST, Ngày, Tiền, VAT... │ │
63
+ │ │ • Cú pháp JSON cố định, alpha > 90% -> Tăng tốc tối đa (1.35x-1.4x) │ │
64
+ │ └──────────────────────────────────┬─────────────────────────────────┘ │
65
+ │ │ │
66
+ │ ▼ │
67
+ │ ┌────────────────────────────────────────────────────────────────────┐ │
68
+ │ │ TÁC VỤ 2: SINH MÃ SQL TRUY VẤN DỮ LIỆU HÓA ĐƠN (TEXT-TO-SQL W2) │ │
69
+ │ │ • Chuyển câu hỏi quản trị kinh doanh tiếng Việt sang truy vấn SQL │ │
70
+ │ │ • Cú pháp SQL bán cấu trúc, alpha ~ 80% -> Tăng tốc ổn định 1.3x │ │
71
+ │ └──────────────────────────────────┬─────────────────────────────────┘ │
72
+ │ │ │
73
+ │ ▼ │
74
+ │ ┌────────────────────────────────────────────────────────────────────┐ │
75
+ │ │ TÁC VỤ 3: HỎI ĐÁP & PHÂN TÍCH TÀI CHÍNH THÔNG MINH (INVOICE CHAT) │ │
76
+ │ │ • Khung chat tương tác trực tiếp về các hóa đơn vừa xử lý │ │
77
+ │ │ • Văn bản tự do, alpha < 60% -> Tự ngắt nháp (k=0), tránh trễ âm │ │
78
+ │ └────────────────────────────────────────────────────────────────────┘ │
79
+ └────────────────────────────────────────────────────────────────────────┘
80
+ ```
81
+
82
+ ---
83
+
84
+ ## 3. Các đột phá kỹ thuật nổi bật
85
+
86
+ * **Lớp thích ứng nhận biết phần cứng (Hardware-Aware TreeAdaptive v0.2):** Tự động nhận diện kiến trúc GPU (`sm_89` NVIDIA L4, `sm_75` Tesla T4) và giải nghiệm phương trình hòa vốn theo thời gian thực:
87
+ $$\alpha^*(N, B) = \arg_\alpha \left( \frac{\mathbb{E}[\tau(N, \alpha)]}{C(N, B)} = \frac{1}{C(0, B)} \right)$$
88
+ * **Triệt tiêu hoàn toàn hiện tượng tăng tốc âm:** Khi tỷ lệ chấp nhận thực tế $\alpha < \alpha^*$ hoặc khi bộ đệm KV vượt ngưỡng $90\%$, hệ thống lập tức ngắt suy đoán về chế độ an toàn ($N=0$), bảo đảm tốc độ luôn $\ge 1.00\times$.
89
+ * **Bộ gác cổng an toàn tương thích (Pre-flight Guard):** Quét dung lượng VRAM thực tế, kiểm tra độ lệch từ vựng (Heterogeneous Vocabulary) giữa mô hình đích và mô hình nháp trước khi khởi động tiến trình serving.
90
+ * **Đa nền tảng phục vụ:** Hỗ trợ khởi chạy server vLLM cục bộ (Local Dedicated Runner) hoặc triển khai tức thì lên nền tảng đám mây không máy chủ (Modal Cloud GPU L4) với chuẩn giao tiếp OpenAI API `/v1/chat/completions`.
91
+ * **Giao diện dòng lệnh tương tác (Interactive CLI Wizard):** Menu hỏi–đáp từng bước có nhận diện thương hiệu PTIT bằng ký tự khối Unicode và mã màu ANSI TrueColor 24-bit.
92
+
93
+ ---
94
+
95
+ ## 4. Bốn chế độ suy luận đối chứng (4 Serving Lanes)
96
+
97
+ Hệ thống cung cấp cơ chế đo kiểm thực nghiệm chuẩn hóa giữa 4 làn phục vụ trên cùng một hạ tầng phần cứng:
98
+
99
+ 1. **Làn 1 (`vanilla`):** Giải mã tuần tự cơ sở của mô hình đích Qwen2.5-7B-Instruct (chuẩn đối chứng $1.00\times$).
100
+ 2. **Làn 2 (`static`):** Suy luận phỏng đoán tĩnh với mô hình nháp độc lập Qwen2.5-0.5B-Instruct ($k=3$ cố định).
101
+ 3. **Làn 3 (`adaptive`):** Suy luận phỏng đoán thích ứng động TreeAdaptive co giãn ngân sách nháp theo tải và $\alpha$.
102
+ 4. **Làn 4 (`eagle`):** Đầu nháp suy đoán chuyên biệt EAGLE-3.1 tự huấn luyện cho miền hóa đơn tiếng Việt (`duckhoi/qwen2.5-7b-eagle3.1-speculator`).
103
+
104
+ ---
105
+
106
+ ## 5. Hướng dẫn cài đặt và sử dụng nhanh
107
+
108
+ ### 5.1. Cài đặt package
109
+
110
+ ```bash
111
+ # Clone kho mã nguồn từ GitHub
112
+ git clone https://github.com/theflyingkhui04/do-an-ptit-d22.git
113
+ cd do-an-ptit-d22
114
+
115
+ # Cài đặt môi trường ở chế độ phát triển (Editable Mode)
116
+ pip install -e .
117
+ ```
118
+
119
+ ### 5.2. Khởi chạy giao diện dòng lệnh tương tác (Interactive Wizard)
120
+
121
+ Chỉ cần gõ lệnh `flexsds` trên terminal để khởi động trợ lý hướng dẫn từng bước:
122
+
123
+ ```bash
124
+ flexsds
125
+ ```
126
+
127
+ Trợ lý sẽ tự động:
128
+ 1. Quét thông số phần cứng GPU và hiển thị banner nhận diện thương hiệu PTIT.
129
+ 2. Hướng dẫn chọn tác vụ, mô hình đích (Target), mô hình nháp (Draft).
130
+ 3. Chạy Pre-flight Guard kiểm tra an toàn VRAM và xung đột bảng từ vựng.
131
+ 4. Tự động nạp ma trận chi phí thực nghiệm và khởi chạy server phục vụ.
132
+
133
+ ### 5.3. Sử dụng lệnh trực tiếp (Direct CLI Commands)
134
+
135
+ ```bash
136
+ # Quét nhanh phần cứng và trạng thái VRAM
137
+ flexsds detect
138
+
139
+ # Khởi chạy endpoint serving trên nền tảng Modal Cloud
140
+ flexsds serve --backend modal --target Qwen/Qwen2.5-7B-Instruct-AWQ --draft Qwen/Qwen2.5-0.5B-Instruct
141
+
142
+ # Khởi chạy server phục vụ cục bộ trên GPU máy chủ
143
+ flexsds serve --backend local --port 8000 --gpu-memory-utilization 0.90
144
+ ```
145
+
146
+ ---
147
+
148
+ ## 6. Web demo và bảng đo lường metrics đối chứng
149
+
150
+ Hệ thống tích hợp giao diện web demo trực quan hỗ trợ:
151
+ * Tải lên một hoặc nhiều ảnh hóa đơn (kéo thả cả thư mục hoặc chụp ảnh trực tiếp).
152
+ * Lựa chọn 3 tác vụ xử lý độc lập: Trích xuất JSON, Sinh câu truy vấn SQL, hoặc Chat hỏi đáp tài chính.
153
+ * **Thiết lập đa endpoint song song:** Cho phép thêm URL của nhiều server (Vanilla vs. Static vs. FlexSDS Adaptive) để chạy đồng thời cùng một dữ liệu đầu vào.
154
+ * **Bảng so sánh metrics thời gian thực:**
155
+ * **TPOT (Time per Output Token - ms/token):** Đo tốc độ sinh từ thực tế của từng endpoint.
156
+ * **Throughput (tokens/s):** Tốc độ xả token ra màn hình.
157
+ * **Tỉ lệ chấp nhận nháp $\alpha$ (%):** Phản ánh đặc trưng ngữ nghĩa của tác vụ.
158
+ * **Trạng thái thích ứng:** Huy hiệu hiển thị quyết định co giãn cây của FlexSDS (`[Boost: k=4]`, `[Balanced: k=2]`, hoặc `[Fallback: k=0]`).
159
+ * **Hệ số tăng tốc (Speedup vs. Vanilla):** Trực quan hóa hiện tượng tăng tốc âm của chế độ tĩnh và khả năng duy trì tốc độ an toàn của FlexSDS.
160
+
161
+ ---
162
+
163
+ ## 7. Cấu trúc kho mã nguồn
164
+
165
+ ```text
166
+ do-an-ptit-d22/
167
+ ├── logo/ # Tài nguyên hình ảnh, logo PTIT và banner GIF
168
+ │ ├── flexsds_banner.gif # Banner động độ phân giải cao hiển thị trên README
169
+ │ ├── flexsds_banner_static.webp # Banner tĩnh
170
+ │ ├── icon_dark.webp # Logo biểu tượng chế độ nền tối (Dark mode)
171
+ │ └── icon_white.webp # Logo biểu tượng chế độ nền sáng (Light mode)
172
+ ├── pyproject.toml # Cấu hình package Python và entrypoint dòng lệnh flexsds
173
+ ├── src/
174
+ │ ├── flexsds/ # Gói mã nguồn công cụ FlexSDS
175
+ │ │ ├── cli/ # Giao diện CLI, Interactive Wizard và banner ANSI
176
+ │ │ ├── core/ # Bộ quét phần cứng, bộ gác cổng an toàn & TreeAdaptive
177
+ │ │ ├── profiles/ # Danh mục ma trận chi phí thực nghiệm (GPU L4 & T4)
178
+ │ │ └── server/ # Bộ điều phối runner (Modal serverless & Local vLLM)
179
+ │ ├── server/ # Bộ lập lịch thích ứng vLLM AdaptiveAsyncScheduler
180
+ │ ├── proposer/ # Bộ điều khiển nháp và mô hình chi phí thực nghiệm
181
+ │ └── pipeline/ # Đường ống xử lý hóa đơn MC-OCR (JSON, SQL, Report)
182
+ ├── experiments/ # Bộ công cụ đo benchmark 4 làn và kịch bản thực nghiệm
183
+ ├── docs/ # Tài liệu kỹ thuật, quy định thiết kế và outline báo cáo
184
+ └── tests/ # Bộ kiểm thử tự động toàn diện (unit & regression tests)
185
+ ```
186
+
187
+ ---
188
+
189
+ ## 8. Đội ngũ thực hiện
190
+
191
+ Nhóm áp dụng mô hình **Ghép cặp Luân phiên 70/30 (Pair-Rotation System)**: Mỗi thành viên chủ trì (Lead) 70% mảng chuyên môn cốt lõi, đồng thời luân phiên đồng hành (Partner) 30% ở các mảng còn lại:
192
+
193
+ | Chuyên môn cốt lõi (Lead 70%) | Thành viên thực hiện | Vai trò trong dự án |
194
+ | :--- | :--- | :--- |
195
+ | **AI Systems & Core-Engine** | **Cấn Đức Khôi** ([@theflyingkhui04](https://github.com/theflyingkhui04)) | Lead Architecture & Core vLLM Scheduler |
196
+ | **MLOps & Infrastructure** | **Bùi Đức Đại** | Lead Benchmark Harness & GPU Telemetry |
197
+ | **AI Application & Data** | **Dương Nguyễn Thế** | Lead Pipeline MC-OCR & Invoices Analytics |
198
+ | **Giảng viên hướng dẫn** | *(Cập nhật theo quyết định của khoa)* | Cố vấn khoa học & Giám sát chất lượng |
199
+
200
+ ---
201
+
202
+ ## 9. Bản quyền
203
+
204
+ Dự án được phát triển phục vụ đồ án tốt nghiệp đại học tại **Học viện Công nghệ Bưu chính Viễn thông (PTIT)**, niên khóa 2022–2026. Mã nguồn được phát hành theo giấy phép mã nguồn mở Apache 2.0.
@@ -0,0 +1,193 @@
1
+ <div align="center">
2
+
3
+ <img src="logo/flexsds_banner.gif" alt="PTIT - FlexSDS Banner" width="100%" />
4
+
5
+ # FlexSDS: Hệ thống phục vụ suy luận phỏng đoán thích ứng nhận biết phần cứng
6
+
7
+ **Bộ công cụ phục vụ suy luận phỏng đoán thông minh cho các mô hình ngôn ngữ lớn tự lưu trữ**
8
+ *Hardware-Aware Adaptive Speculative Decoding Serving Toolkit for Self-Hosted LLMs*
9
+
10
+ [![PTIT](https://img.shields.io/badge/PTIT-Đồ%20án%20tốt%20nghiệp%20D22-ED1C24?style=for-the-badge&logoColor=white)](https://portal.ptit.edu.vn/)
11
+ [![Python](https://img.shields.io/badge/Python-3.11%20%7C%203.13-3776AB?style=for-the-badge&logo=python&logoColor=white)](https://python.org)
12
+ [![vLLM](https://img.shields.io/badge/vLLM-0.30.0%20Core%20V1-blue?style=for-the-badge)](https://github.com/vllm-project/vllm)
13
+ [![Modal](https://img.shields.io/badge/Modal-GPU%20L4%20Serverless-00C7B7?style=for-the-badge)](https://modal.com)
14
+ [![Status](https://img.shields.io/badge/Trạng%20thái-Sprint%205%20%2F%20M4%20Freeze-brightgreen?style=for-the-badge)]()
15
+
16
+ <br/>
17
+
18
+ <picture>
19
+ <source media="(prefers-color-scheme: dark)" srcset="logo/icon_dark.webp">
20
+ <source media="(prefers-color-scheme: light)" srcset="logo/icon_white.webp">
21
+ <img alt="FlexSDS Logo" src="logo/icon_dark.webp" width="90" height="90">
22
+ </picture>
23
+
24
+ </div>
25
+
26
+ ---
27
+
28
+ ## 1. Tổng quan đề tài
29
+
30
+ Trong các hệ thống xử lý tài liệu tự động và chuỗi tác vụ đa bước (multi-step LLM pipeline), **độ trễ sinh từ trong pha giải mã (Decode Latency)** là nút thắt cổ chai lớn nhất và bị tích lũy lũy tiến qua từng lời gọi mô hình. Kỹ thuật suy luận phỏng đoán truyền thống (Static Speculative Decoding) sử dụng cấu hình nháp cố định thường gặp phải hai rào cản nghiêm trọng trong môi trường triển khai thực tế:
31
+ 1. **Hiện tượng tăng tốc âm (Negative Speedup):** Khi gặp các tác vụ suy luận tự do có entropy cao hoặc khi hệ thống chịu tải đồng thời lớn ($c \ge 16$), việc ép chạy mô hình nháp vô ích biến nó thành tải ký sinh, làm giảm tốc độ thực tế (chỉ đạt $0.67\times - 0.81\times$ so với suy luận tuần tự cơ sở).
32
+ 2. **Nguy cơ tràn bộ nhớ (Out-Of-Memory - OOM):** Việc đồng thời nạp cả mô hình đích, mô hình nháp và phân bổ bộ đệm KV dễ dẫn đến tràn VRAM trên các dòng GPU phổ thông (NVIDIA Tesla T4 16GB, RTX 4090 24GB).
33
+
34
+ **FlexSDS** (*Flexible Speculative Decoding Serving*) là giải pháp mã nguồn mở hoàn chỉnh do nhóm sinh viên PTIT nghiên cứu và phát triển. Hệ thống tích hợp lớp điều khiển thích ứng **TreeAdaptive**, tự động nhận diện phần cứng, nạp ma trận chi phí thực nghiệm và giải ngưỡng hòa vốn động $\alpha^*(N, B)$ theo thời gian thực để co giãn cấu trúc cây nháp hoặc ngắt về suy luận tuần tự cơ sở, **bảo đảm tăng tốc tối đa nhưng không bao giờ bị chậm hơn chế độ mặc định (Lossless Guarantee)**.
35
+
36
+ ---
37
+
38
+ ## 2. Ứng dụng thực nghiệm: Luồng đa tác vụ trên hóa đơn bán hàng
39
+
40
+ Để kiểm chứng năng lực thích ứng trong môi trường thực tế, FlexSDS được triển khai phục vụ quy trình xử lý và phân tích hóa đơn bán hàng tiếng Việt (bộ dữ liệu MC-OCR) với 3 tác vụ đại diện:
41
+
42
+ ```text
43
+ ┌────────────────────────────────────────────────────────────────────────┐
44
+ │ HỆ THỐNG ĐA TÁC VỤ TRÊN HÓA ĐƠN BÁN HÀNG │
45
+ ├────────────────────────────────────────────────────────────────────────┤
46
+ │ [Ảnh / Thư mục hóa đơn tải lên] │
47
+ │ │ │
48
+ │ ▼ │
49
+ │ ┌────────────────────────────────────────────────────────────────────┐ │
50
+ │ │ TÁC VỤ 1: TRÍCH XUẤT NỘI DUNG HÓA ĐƠN THÀNH JSON (MC-OCR W1) │ │
51
+ │ │ • Trích xuất 7 trường pháp lý: Người bán, MST, Ngày, Tiền, VAT... │ │
52
+ │ │ • Cú pháp JSON cố định, alpha > 90% -> Tăng tốc tối đa (1.35x-1.4x) │ │
53
+ │ └──────────────────────────────────┬─────────────────────────────────┘ │
54
+ │ │ │
55
+ │ ▼ │
56
+ │ ┌────────────────────────────────────────────────────────────────────┐ │
57
+ │ │ TÁC VỤ 2: SINH MÃ SQL TRUY VẤN DỮ LIỆU HÓA ĐƠN (TEXT-TO-SQL W2) │ │
58
+ │ │ • Chuyển câu hỏi quản trị kinh doanh tiếng Việt sang truy vấn SQL │ │
59
+ │ │ • Cú pháp SQL bán cấu trúc, alpha ~ 80% -> Tăng tốc ổn định 1.3x │ │
60
+ │ └──────────────────────────────────┬─────────────────────────────────┘ │
61
+ │ │ │
62
+ │ ▼ │
63
+ │ ┌────────────────────────────────────────────────────────────────────┐ │
64
+ │ │ TÁC VỤ 3: HỎI ĐÁP & PHÂN TÍCH TÀI CHÍNH THÔNG MINH (INVOICE CHAT) │ │
65
+ │ │ • Khung chat tương tác trực tiếp về các hóa đơn vừa xử lý │ │
66
+ │ │ • Văn bản tự do, alpha < 60% -> Tự ngắt nháp (k=0), tránh trễ âm │ │
67
+ │ └────────────────────────────────────────────────────────────────────┘ │
68
+ └────────────────────────────────────────────────────────────────────────┘
69
+ ```
70
+
71
+ ---
72
+
73
+ ## 3. Các đột phá kỹ thuật nổi bật
74
+
75
+ * **Lớp thích ứng nhận biết phần cứng (Hardware-Aware TreeAdaptive v0.2):** Tự động nhận diện kiến trúc GPU (`sm_89` NVIDIA L4, `sm_75` Tesla T4) và giải nghiệm phương trình hòa vốn theo thời gian thực:
76
+ $$\alpha^*(N, B) = \arg_\alpha \left( \frac{\mathbb{E}[\tau(N, \alpha)]}{C(N, B)} = \frac{1}{C(0, B)} \right)$$
77
+ * **Triệt tiêu hoàn toàn hiện tượng tăng tốc âm:** Khi tỷ lệ chấp nhận thực tế $\alpha < \alpha^*$ hoặc khi bộ đệm KV vượt ngưỡng $90\%$, hệ thống lập tức ngắt suy đoán về chế độ an toàn ($N=0$), bảo đảm tốc độ luôn $\ge 1.00\times$.
78
+ * **Bộ gác cổng an toàn tương thích (Pre-flight Guard):** Quét dung lượng VRAM thực tế, kiểm tra độ lệch từ vựng (Heterogeneous Vocabulary) giữa mô hình đích và mô hình nháp trước khi khởi động tiến trình serving.
79
+ * **Đa nền tảng phục vụ:** Hỗ trợ khởi chạy server vLLM cục bộ (Local Dedicated Runner) hoặc triển khai tức thì lên nền tảng đám mây không máy chủ (Modal Cloud GPU L4) với chuẩn giao tiếp OpenAI API `/v1/chat/completions`.
80
+ * **Giao diện dòng lệnh tương tác (Interactive CLI Wizard):** Menu hỏi–đáp từng bước có nhận diện thương hiệu PTIT bằng ký tự khối Unicode và mã màu ANSI TrueColor 24-bit.
81
+
82
+ ---
83
+
84
+ ## 4. Bốn chế độ suy luận đối chứng (4 Serving Lanes)
85
+
86
+ Hệ thống cung cấp cơ chế đo kiểm thực nghiệm chuẩn hóa giữa 4 làn phục vụ trên cùng một hạ tầng phần cứng:
87
+
88
+ 1. **Làn 1 (`vanilla`):** Giải mã tuần tự cơ sở của mô hình đích Qwen2.5-7B-Instruct (chuẩn đối chứng $1.00\times$).
89
+ 2. **Làn 2 (`static`):** Suy luận phỏng đoán tĩnh với mô hình nháp độc lập Qwen2.5-0.5B-Instruct ($k=3$ cố định).
90
+ 3. **Làn 3 (`adaptive`):** Suy luận phỏng đoán thích ứng động TreeAdaptive co giãn ngân sách nháp theo tải và $\alpha$.
91
+ 4. **Làn 4 (`eagle`):** Đầu nháp suy đoán chuyên biệt EAGLE-3.1 tự huấn luyện cho miền hóa đơn tiếng Việt (`duckhoi/qwen2.5-7b-eagle3.1-speculator`).
92
+
93
+ ---
94
+
95
+ ## 5. Hướng dẫn cài đặt và sử dụng nhanh
96
+
97
+ ### 5.1. Cài đặt package
98
+
99
+ ```bash
100
+ # Clone kho mã nguồn từ GitHub
101
+ git clone https://github.com/theflyingkhui04/do-an-ptit-d22.git
102
+ cd do-an-ptit-d22
103
+
104
+ # Cài đặt môi trường ở chế độ phát triển (Editable Mode)
105
+ pip install -e .
106
+ ```
107
+
108
+ ### 5.2. Khởi chạy giao diện dòng lệnh tương tác (Interactive Wizard)
109
+
110
+ Chỉ cần gõ lệnh `flexsds` trên terminal để khởi động trợ lý hướng dẫn từng bước:
111
+
112
+ ```bash
113
+ flexsds
114
+ ```
115
+
116
+ Trợ lý sẽ tự động:
117
+ 1. Quét thông số phần cứng GPU và hiển thị banner nhận diện thương hiệu PTIT.
118
+ 2. Hướng dẫn chọn tác vụ, mô hình đích (Target), mô hình nháp (Draft).
119
+ 3. Chạy Pre-flight Guard kiểm tra an toàn VRAM và xung đột bảng từ vựng.
120
+ 4. Tự động nạp ma trận chi phí thực nghiệm và khởi chạy server phục vụ.
121
+
122
+ ### 5.3. Sử dụng lệnh trực tiếp (Direct CLI Commands)
123
+
124
+ ```bash
125
+ # Quét nhanh phần cứng và trạng thái VRAM
126
+ flexsds detect
127
+
128
+ # Khởi chạy endpoint serving trên nền tảng Modal Cloud
129
+ flexsds serve --backend modal --target Qwen/Qwen2.5-7B-Instruct-AWQ --draft Qwen/Qwen2.5-0.5B-Instruct
130
+
131
+ # Khởi chạy server phục vụ cục bộ trên GPU máy chủ
132
+ flexsds serve --backend local --port 8000 --gpu-memory-utilization 0.90
133
+ ```
134
+
135
+ ---
136
+
137
+ ## 6. Web demo và bảng đo lường metrics đối chứng
138
+
139
+ Hệ thống tích hợp giao diện web demo trực quan hỗ trợ:
140
+ * Tải lên một hoặc nhiều ảnh hóa đơn (kéo thả cả thư mục hoặc chụp ảnh trực tiếp).
141
+ * Lựa chọn 3 tác vụ xử lý độc lập: Trích xuất JSON, Sinh câu truy vấn SQL, hoặc Chat hỏi đáp tài chính.
142
+ * **Thiết lập đa endpoint song song:** Cho phép thêm URL của nhiều server (Vanilla vs. Static vs. FlexSDS Adaptive) để chạy đồng thời cùng một dữ liệu đầu vào.
143
+ * **Bảng so sánh metrics thời gian thực:**
144
+ * **TPOT (Time per Output Token - ms/token):** Đo tốc độ sinh từ thực tế của từng endpoint.
145
+ * **Throughput (tokens/s):** Tốc độ xả token ra màn hình.
146
+ * **Tỉ lệ chấp nhận nháp $\alpha$ (%):** Phản ánh đặc trưng ngữ nghĩa của tác vụ.
147
+ * **Trạng thái thích ứng:** Huy hiệu hiển thị quyết định co giãn cây của FlexSDS (`[Boost: k=4]`, `[Balanced: k=2]`, hoặc `[Fallback: k=0]`).
148
+ * **Hệ số tăng tốc (Speedup vs. Vanilla):** Trực quan hóa hiện tượng tăng tốc âm của chế độ tĩnh và khả năng duy trì tốc độ an toàn của FlexSDS.
149
+
150
+ ---
151
+
152
+ ## 7. Cấu trúc kho mã nguồn
153
+
154
+ ```text
155
+ do-an-ptit-d22/
156
+ ├── logo/ # Tài nguyên hình ảnh, logo PTIT và banner GIF
157
+ │ ├── flexsds_banner.gif # Banner động độ phân giải cao hiển thị trên README
158
+ │ ├── flexsds_banner_static.webp # Banner tĩnh
159
+ │ ├── icon_dark.webp # Logo biểu tượng chế độ nền tối (Dark mode)
160
+ │ └── icon_white.webp # Logo biểu tượng chế độ nền sáng (Light mode)
161
+ ├── pyproject.toml # Cấu hình package Python và entrypoint dòng lệnh flexsds
162
+ ├── src/
163
+ │ ├── flexsds/ # Gói mã nguồn công cụ FlexSDS
164
+ │ │ ├── cli/ # Giao diện CLI, Interactive Wizard và banner ANSI
165
+ │ │ ├── core/ # Bộ quét phần cứng, bộ gác cổng an toàn & TreeAdaptive
166
+ │ │ ├── profiles/ # Danh mục ma trận chi phí thực nghiệm (GPU L4 & T4)
167
+ │ │ └── server/ # Bộ điều phối runner (Modal serverless & Local vLLM)
168
+ │ ├── server/ # Bộ lập lịch thích ứng vLLM AdaptiveAsyncScheduler
169
+ │ ├── proposer/ # Bộ điều khiển nháp và mô hình chi phí thực nghiệm
170
+ │ └── pipeline/ # Đường ống xử lý hóa đơn MC-OCR (JSON, SQL, Report)
171
+ ├── experiments/ # Bộ công cụ đo benchmark 4 làn và kịch bản thực nghiệm
172
+ ├── docs/ # Tài liệu kỹ thuật, quy định thiết kế và outline báo cáo
173
+ └── tests/ # Bộ kiểm thử tự động toàn diện (unit & regression tests)
174
+ ```
175
+
176
+ ---
177
+
178
+ ## 8. Đội ngũ thực hiện
179
+
180
+ Nhóm áp dụng mô hình **Ghép cặp Luân phiên 70/30 (Pair-Rotation System)**: Mỗi thành viên chủ trì (Lead) 70% mảng chuyên môn cốt lõi, đồng thời luân phiên đồng hành (Partner) 30% ở các mảng còn lại:
181
+
182
+ | Chuyên môn cốt lõi (Lead 70%) | Thành viên thực hiện | Vai trò trong dự án |
183
+ | :--- | :--- | :--- |
184
+ | **AI Systems & Core-Engine** | **Cấn Đức Khôi** ([@theflyingkhui04](https://github.com/theflyingkhui04)) | Lead Architecture & Core vLLM Scheduler |
185
+ | **MLOps & Infrastructure** | **Bùi Đức Đại** | Lead Benchmark Harness & GPU Telemetry |
186
+ | **AI Application & Data** | **Dương Nguyễn Thế** | Lead Pipeline MC-OCR & Invoices Analytics |
187
+ | **Giảng viên hướng dẫn** | *(Cập nhật theo quyết định của khoa)* | Cố vấn khoa học & Giám sát chất lượng |
188
+
189
+ ---
190
+
191
+ ## 9. Bản quyền
192
+
193
+ Dự án được phát triển phục vụ đồ án tốt nghiệp đại học tại **Học viện Công nghệ Bưu chính Viễn thông (PTIT)**, niên khóa 2022–2026. Mã nguồn được phát hành theo giấy phép mã nguồn mở Apache 2.0.
@@ -0,0 +1,34 @@
1
+ [build-system]
2
+ requires = ["setuptools>=61.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "flexsds"
7
+ version = "0.2.0"
8
+ description = "Flexible Speculative Decoding Serving Engine for LLMs"
9
+ authors = [
10
+ {name = "Can Duc Khoi"},
11
+ {name = "Bui Duc Dai"},
12
+ {name = "Nguyen The Duong"}
13
+ ]
14
+ readme = "README.md"
15
+ requires-python = ">=3.9"
16
+ dependencies = [
17
+ "psutil",
18
+ ]
19
+
20
+ [project.optional-dependencies]
21
+ dev = [
22
+ "pytest>=8.0",
23
+ ]
24
+
25
+ [project.scripts]
26
+ flexsds = "flexsds.cli.main:main"
27
+
28
+ [tool.setuptools.packages.find]
29
+ where = ["src"]
30
+ include = ["flexsds*", "server*", "proposer*", "pipeline*"]
31
+
32
+ [tool.setuptools.package-data]
33
+ flexsds = ["profiles/*.json", "assets/*"]
34
+ pipeline = ["prompts/*.md", "schemas/*.json", "examples/*", "sqlite/*.sql"]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,4 @@
1
+ """FlexSDS: Flexible Speculative Decoding Serving Engine for LLMs."""
2
+
3
+ __version__ = "0.2.0"
4
+ __author__ = "Can Duc Khoi, Bui Duc Dai & Nguyen The Duong"
@@ -0,0 +1 @@
1
+ """FlexSDS CLI module."""
@@ -0,0 +1,84 @@
1
+ """FlexSDS branding banner module with PTIT logo in ANSI TrueColor."""
2
+ from __future__ import annotations
3
+
4
+ import sys
5
+ from typing import Optional
6
+ try:
7
+ from flexsds.cli.output import ascii_text, print_output, supports_truecolor, supports_unicode
8
+ from flexsds.core.hardware import HardwareInfo, detect_hardware
9
+ except ModuleNotFoundError:
10
+ from src.flexsds.cli.output import ascii_text, print_output, supports_truecolor, supports_unicode
11
+ from src.flexsds.core.hardware import HardwareInfo, detect_hardware
12
+
13
+ # Pre-compiled ANSI grayscale half-blocks for the official PTIT logo (26 cols x 12 rows)
14
+ # Zero-dependency, sub-millisecond monochrome rendering without PIL at runtime.
15
+ PTIT_LOGO_ANSI = [
16
+ " \033[38;2;181;181;181m▄\033[0m\033[38;2;112;112;112m▄\033[0m\033[38;2;185;185;185;48;2;119;119;119m▀\033[0m\033[38;2;128;128;128;48;2;154;154;154m▀\033[0m\033[38;2;95;95;95;48;2;176;176;176m▀\033[0m\033[38;2;81;81;81;48;2;175;175;175m▀\033[0m\033[38;2;83;83;83;48;2;145;145;145m▀\033[0m\033[38;2;103;103;103;48;2;95;95;95m▀\033[0m\033[38;2;140;140;140;48;2;72;72;72m▀\033[0m\033[38;2;214;214;214;48;2;87;87;87m▀\033[0m\033[38;2;196;196;196m▄\033[0m ",
17
+ " \033[38;2;170;170;170m▄\033[0m\033[38;2;202;202;202;48;2;165;165;165m▀\033[0m\033[38;2;139;139;139;48;2;222;222;222m▀\033[0m\033[38;2;150;150;150m▀\033[0m\033[38;2;221;221;221m▀\033[0m \033[38;2;149;149;149m▀\033[0m\033[38;2;74;74;74;48;2;138;138;138m▀\033[0m\033[38;2;101;101;101;48;2;74;74;74m▀\033[0m\033[38;2;216;216;216m▄\033[0m ",
18
+ " \033[38;2;211;211;211m▄\033[0m\033[38;2;215;215;215;48;2;152;152;152m▀\033[0m\033[38;2;169;169;169m▀\033[0m\033[38;2;215;215;215m▀\033[0m \033[38;2;222;222;222m▀\033[0m\033[38;2;76;76;76;48;2;99;99;99m▀\033[0m\033[38;2;206;206;206;48;2;214;214;214m▀\033[0m ",
19
+ " \033[38;2;221;221;221;48;2;108;108;108m▀\033[0m\033[38;2;125;125;125;48;2;217;217;217m▀\033[0m \033[38;2;120;120;120;48;2;145;145;145m▀\033[0m ",
20
+ " \033[38;2;177;177;177m▄\033[0m\033[38;2;124;124;124;48;2;87;87;87m▀\033[0m\033[38;2;155;155;155m▀\033[0m \033[38;2;231;231;231m▄\033[0m \033[38;2;208;208;208;48;2;187;187;187m▀\033[0m\033[38;2;187;187;187m▀\033[0m ",
21
+ " \033[38;2;160;160;160m▄\033[0m\033[38;2;80;80;80;48;2;71;71;71m▀\033[0m\033[38;2;160;160;160;48;2;227;227;227m▀\033[0m \033[38;2;185;185;185m▄\033[0m\033[38;2;181;181;181m▄\033[0m\033[38;2;178;178;178m▄\033[0m\033[38;2;212;212;212m▄\033[0m \033[38;2;183;183;183m▄\033[0m\033[38;2;185;185;185m▄\033[0m\033[38;2;193;193;193m▄\033[0m\033[38;2;176;176;176m▄\033[0m\033[38;2;210;210;210m▄\033[0m\033[38;2;232;232;232m▄\033[0m\033[38;2;230;230;230m▄\033[0m\033[38;2;218;218;218;48;2;181;181;181m▀\033[0m\033[38;2;219;219;219;48;2;207;207;207m▀\033[0m\033[38;2;229;229;229m▄\033[0m\033[38;2;227;227;227;48;2;170;170;170m▀\033[0m\033[38;2;173;173;173m▄\033[0m\033[38;2;181;181;181m▄\033[0m\033[38;2;166;166;166m▄\033[0m\033[38;2;198;198;198m▄\033[0m",
22
+ " \033[38;2;209;209;209m▄\033[0m\033[38;2;98;98;98;48;2;71;71;71m▀\033[0m\033[38;2;100;100;100;48;2;132;132;132m▀\033[0m \033[38;2;180;180;180;48;2;181;181;181m▀\033[0m\033[38;2;77;77;77;48;2;95;95;95m▀\033[0m\033[38;2;179;179;179;48;2;225;225;225m▀\033[0m\033[38;2;170;170;170;48;2;218;218;218m▀\033[0m\033[38;2;94;94;94;48;2;92;92;92m▀\033[0m\033[38;2;155;155;155;48;2;145;145;145m▀\033[0m\033[38;2;173;173;173m▀\033[0m\033[38;2;129;129;129;48;2;196;196;196m▀\033[0m\033[38;2;90;90;90;48;2;111;111;111m▀\033[0m\033[38;2;161;161;161m▀\033[0m\033[38;2;206;206;206;48;2;246;246;246m▀\033[0m\033[38;2;218;218;218;48;2;210;210;210m▀\033[0m\033[38;2;173;173;173;48;2;185;185;185m▀\033[0m\033[38;2;194;194;194;48;2;205;205;205m▀\033[0m\033[38;2;232;232;232m▀\033[0m \033[38;2;177;177;177m▀\033[0m\033[38;2;137;137;137;48;2;200;200;200m▀\033[0m\033[38;2;86;86;86;48;2;107;107;107m▀\033[0m\033[38;2;172;172;172m▀\033[0m\033[38;2;202;202;202m▀\033[0m",
23
+ " \033[38;2;165;165;165;48;2;138;138;138m▀\033[0m\033[38;2;66;66;66;48;2;68;68;68m▀\033[0m\033[38;2;149;149;149;48;2;149;149;149m▀\033[0m \033[38;2;183;183;183;48;2;173;173;173m▀\033[0m\033[38;2;86;86;86;48;2;86;86;86m▀\033[0m\033[38;2;143;143;143m▀\033[0m\033[38;2;138;138;138m▀\033[0m\033[38;2;168;168;168m▀\033[0m \033[38;2;188;188;188;48;2;184;184;184m▀\033[0m\033[38;2;110;110;110;48;2;95;95;95m▀\033[0m \033[38;2;221;221;221m▄\033[0m\033[38;2;222;222;222;48;2;107;107;107m▀\033[0m\033[38;2;144;144;144;48;2;129;129;129m▀\033[0m\033[38;2;133;133;133;48;2;92;92;92m▀\033[0m \033[38;2;190;190;190;48;2;186;186;186m▀\033[0m\033[38;2;106;106;106;48;2;92;92;92m▀\033[0m ",
24
+ " \033[38;2;126;126;126;48;2;135;135;135m▀\033[0m\033[38;2;72;72;72;48;2;78;78;78m▀\033[0m\033[38;2;131;131;131;48;2;97;97;97m▀\033[0m \033[38;2;217;217;217m▀\033[0m\033[38;2;178;178;178m▀\033[0m \033[38;2;221;221;221m▀\033[0m\033[38;2;182;182;182;48;2;157;157;157m▀\033[0m\033[38;2;198;198;198;48;2;68;68;68m▀\033[0m\033[38;2;81;81;81;48;2;101;101;101m▀\033[0m\033[38;2;106;106;106;48;2;224;224;224m▀\033[0m\033[38;2;197;197;197m▀\033[0m\033[38;2;179;179;179m▀\033[0m \033[38;2;223;223;223m▀\033[0m\033[38;2;181;181;181m▀\033[0m ",
25
+ " \033[38;2;193;193;193m▀\033[0m\033[38;2;74;74;74;48;2;165;165;165m▀\033[0m\033[38;2;77;77;77;48;2;96;96;96m▀\033[0m\033[38;2;145;145;145;48;2;86;86;86m▀\033[0m\033[38;2;152;152;152m▄\033[0m \033[38;2;227;227;227m▄\033[0m\033[38;2;166;166;166m▄\033[0m\033[38;2;93;93;93m▄\033[0m\033[38;2;175;175;175;48;2;69;69;69m▀\033[0m\033[38;2;87;87;87;48;2;121;121;121m▀\033[0m\033[38;2;68;68;68;48;2;205;205;205m▀\033[0m\033[38;2;142;142;142m▀\033[0m ",
26
+ " \033[38;2;195;195;195m▀\033[0m\033[38;2;148;148;148;48;2;209;209;209m▀\033[0m\033[38;2;124;124;124;48;2;179;179;179m▀\033[0m\033[38;2;130;130;130;48;2;160;160;160m▀\033[0m\033[38;2;117;117;117;48;2;164;164;164m▀\033[0m\033[38;2;88;88;88;48;2;193;193;193m▀\033[0m\033[38;2;94;94;94;48;2;226;226;226m▀\033[0m\033[38;2;147;147;147m▀\033[0m\033[38;2;218;218;218m▀\033[0m ",
27
+ "\033[38;2;125;125;125;48;2;141;141;141m▀\033[0m\033[38;2;118;118;118;48;2;136;136;136m▀\033[0m\033[38;2;119;119;119;48;2;137;137;137m▀\033[0m\033[38;2;120;120;120;48;2;138;138;138m▀\033[0m\033[38;2;125;125;125;48;2;137;137;137m▀\033[0m\033[38;2;130;130;130;48;2;136;136;136m▀\033[0m\033[38;2;133;133;133;48;2;136;136;136m▀\033[0m\033[38;2;132;132;132;48;2;137;137;137m▀\033[0m\033[38;2;128;128;128;48;2;138;138;138m▀\033[0m\033[38;2;122;122;122;48;2;140;140;140m▀\033[0m\033[38;2;118;118;118;48;2;141;141;141m▀\033[0m\033[38;2;113;113;113;48;2;136;136;136m▀\033[0m\033[38;2;148;148;148;48;2;141;141;141m▀\033[0m\033[38;2;149;149;149;48;2;144;144;144m▀\033[0m\033[38;2;114;114;114;48;2;134;134;134m▀\033[0m\033[38;2;118;118;118;48;2;143;143;143m▀\033[0m\033[38;2;118;118;118;48;2;140;140;140m▀\033[0m\033[38;2;118;118;118;48;2;140;140;140m▀\033[0m\033[38;2;118;118;118;48;2;140;140;140m▀\033[0m\033[38;2;118;118;118;48;2;139;139;139m▀\033[0m\033[38;2;119;119;119;48;2;139;139;139m▀\033[0m\033[38;2;119;119;119;48;2;138;138;138m▀\033[0m\033[38;2;119;119;119;48;2;138;138;138m▀\033[0m\033[38;2;119;119;119;48;2;137;137;137m▀\033[0m\033[38;2;119;119;119;48;2;137;137;137m▀\033[0m\033[38;2;119;119;119;48;2;137;137;137m▀\033[0m",
28
+ ]
29
+
30
+ def render_banner(hw_info: Optional[HardwareInfo] = None) -> str:
31
+ """Builds and returns the complete side-by-side FlexSDS banner."""
32
+ if hw_info is None:
33
+ hw_info = detect_hardware()
34
+
35
+ gpu_str = hw_info.summary()
36
+
37
+ info_lines = [
38
+ "\033[1;37m ███████╗██╗ ███████╗██╗ ██╗███████╗██████╗ ███████╗\033[0m",
39
+ "\033[1;37m ██╔════╝██║ ██╔════╝╚██╗██╔╝██╔════╝██╔══██╗██╔════╝\033[0m",
40
+ "\033[1;37m █████╗ ██║ █████╗ ╚███╔╝ ███████╗██║ ██║███████╗\033[0m",
41
+ "\033[1;37m ██╔══╝ ██║ ██╔══╝ ██╔██╗ ╚════██║██║ ██║╚════██║\033[0m",
42
+ "\033[1;37m ██║ ███████╗███████╗██╔╝ ██╗███████║██████╔╝███████║\033[0m",
43
+ "",
44
+ " \033[1;37mFlexSDS\033[0m \033[90m· Speculative Decoding Serving Engine · v0.2.0-alpha\033[0m",
45
+ " \033[90mNhóm đồ án D22\033[0m",
46
+ " \033[90mHọc viện Công nghệ Bưu chính Viễn thông (PTIT)\033[0m",
47
+ "",
48
+ f" \033[90m•\033[0m \033[37mHardware\033[0m : \033[90m{gpu_str}\033[0m",
49
+ " \033[90m•\033[0m \033[37mEngine\033[0m : \033[90mHardwareAdaptive v0.2\033[0m",
50
+ " \033[90m•\033[0m \033[37mBackends\033[0m : \033[90mModal / Colab / Local vLLM\033[0m",
51
+ ]
52
+
53
+ max_rows = max(len(PTIT_LOGO_ANSI), len(info_lines))
54
+ col_logo = list(PTIT_LOGO_ANSI) + [" " * 26] * (max_rows - len(PTIT_LOGO_ANSI))
55
+ col_info = list(info_lines) + [""] * (max_rows - len(info_lines))
56
+
57
+ output = []
58
+ for l, r in zip(col_logo, col_info):
59
+ output.append(f" {l} {r}")
60
+ return "\n".join(output)
61
+
62
+
63
+ def render_ascii_banner(hw_info: HardwareInfo) -> str:
64
+ """Compact branding/status fallback; hardware logic remains in HardwareInfo."""
65
+ return ascii_text(
66
+ "FlexSDS | Speculative Decoding Serving Engine | v0.2.0-alpha\n"
67
+ "PTIT | Hoc vien Cong nghe Buu chinh Vien thong | Nhom do an D22\n"
68
+ f"Hardware: {hw_info.summary()}\n"
69
+ "Engine: TreeAdaptive v0.2\n"
70
+ "Backends: Modal / Colab / Local vLLM"
71
+ )
72
+
73
+
74
+ def print_banner(hw_info: Optional[HardwareInfo] = None) -> None:
75
+ """Preserve rich branding on capable terminals; otherwise use plain ASCII."""
76
+ if hw_info is None:
77
+ hw_info = detect_hardware()
78
+ fallback = render_ascii_banner(hw_info)
79
+ rich = supports_unicode(sys.stdout) and supports_truecolor(sys.stdout)
80
+ print_output(render_banner(hw_info) if rich else fallback, fallback=fallback)
81
+
82
+
83
+ if __name__ == "__main__":
84
+ print_banner()