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.
- flexsds-0.2.0/PKG-INFO +204 -0
- flexsds-0.2.0/README.md +193 -0
- flexsds-0.2.0/pyproject.toml +34 -0
- flexsds-0.2.0/setup.cfg +4 -0
- flexsds-0.2.0/src/flexsds/__init__.py +4 -0
- flexsds-0.2.0/src/flexsds/assets/ptit_logo.png +0 -0
- flexsds-0.2.0/src/flexsds/cli/__init__.py +1 -0
- flexsds-0.2.0/src/flexsds/cli/banner.py +84 -0
- flexsds-0.2.0/src/flexsds/cli/main.py +330 -0
- flexsds-0.2.0/src/flexsds/cli/output.py +69 -0
- flexsds-0.2.0/src/flexsds/cli/task_runner.py +171 -0
- flexsds-0.2.0/src/flexsds/cli/wizard.py +360 -0
- flexsds-0.2.0/src/flexsds/client/__init__.py +4 -0
- flexsds-0.2.0/src/flexsds/client/chat.py +137 -0
- flexsds-0.2.0/src/flexsds/client/client.py +107 -0
- flexsds-0.2.0/src/flexsds/client/monitor.py +95 -0
- flexsds-0.2.0/src/flexsds/core/__init__.py +44 -0
- flexsds-0.2.0/src/flexsds/core/compatibility.py +442 -0
- flexsds-0.2.0/src/flexsds/core/controller.py +502 -0
- flexsds-0.2.0/src/flexsds/core/cost_model.py +530 -0
- flexsds-0.2.0/src/flexsds/core/credentials.py +111 -0
- flexsds-0.2.0/src/flexsds/core/hardware.py +77 -0
- flexsds-0.2.0/src/flexsds/core/tree_topology.py +296 -0
- flexsds-0.2.0/src/flexsds/profiles/profile_sm75_t4.json +62 -0
- flexsds-0.2.0/src/flexsds/profiles/profile_sm89_l4.json +194 -0
- flexsds-0.2.0/src/flexsds/server/__init__.py +1 -0
- flexsds-0.2.0/src/flexsds/server/colab_runner.py +62 -0
- flexsds-0.2.0/src/flexsds/server/local_runner.py +208 -0
- flexsds-0.2.0/src/flexsds/server/modal_app.py +50 -0
- flexsds-0.2.0/src/flexsds/server/modal_runner.py +98 -0
- flexsds-0.2.0/src/flexsds/server/vscode_cli.py +82 -0
- flexsds-0.2.0/src/flexsds.egg-info/PKG-INFO +204 -0
- flexsds-0.2.0/src/flexsds.egg-info/SOURCES.txt +153 -0
- flexsds-0.2.0/src/flexsds.egg-info/dependency_links.txt +1 -0
- flexsds-0.2.0/src/flexsds.egg-info/entry_points.txt +2 -0
- flexsds-0.2.0/src/flexsds.egg-info/requires.txt +4 -0
- flexsds-0.2.0/src/flexsds.egg-info/top_level.txt +4 -0
- flexsds-0.2.0/src/pipeline/entity_eval.py +171 -0
- flexsds-0.2.0/src/pipeline/examples/node1_extractor_input_m0_04_001.txt +9 -0
- flexsds-0.2.0/src/pipeline/examples/node1_extractor_output_m0_04_001.json +90 -0
- flexsds-0.2.0/src/pipeline/extractor.py +502 -0
- flexsds-0.2.0/src/pipeline/invoice_models.py +163 -0
- flexsds-0.2.0/src/pipeline/node2_questions.py +30 -0
- flexsds-0.2.0/src/pipeline/openai_compatible.py +87 -0
- flexsds-0.2.0/src/pipeline/prompts/README.md +18 -0
- flexsds-0.2.0/src/pipeline/prompts/node1_extractor_system.md +92 -0
- flexsds-0.2.0/src/pipeline/prompts/node3_report_user.md +5 -0
- flexsds-0.2.0/src/pipeline/report_writer.py +143 -0
- flexsds-0.2.0/src/pipeline/schemas/invoice_extraction.schema.json +469 -0
- flexsds-0.2.0/src/pipeline/sql_guard.py +140 -0
- flexsds-0.2.0/src/pipeline/sqlite/schema.sql +219 -0
- flexsds-0.2.0/src/pipeline/text_to_sql.py +170 -0
- flexsds-0.2.0/src/pipeline/validation.py +166 -0
- flexsds-0.2.0/src/pipeline/w1_workload.py +139 -0
- flexsds-0.2.0/src/proposer/__init__.py +31 -0
- flexsds-0.2.0/src/proposer/adapter.py +153 -0
- flexsds-0.2.0/src/proposer/controller.py +460 -0
- flexsds-0.2.0/src/proposer/cost_model.py +216 -0
- flexsds-0.2.0/src/proposer/tree_adaptive.py +466 -0
- flexsds-0.2.0/src/server/__init__.py +3 -0
- flexsds-0.2.0/src/server/adaptive_scheduler.py +215 -0
- flexsds-0.2.0/src/server/budget_planner.py +287 -0
- flexsds-0.2.0/src/server/lineage.py +290 -0
- flexsds-0.2.0/src/server/lineage_diagnostics.py +38 -0
- flexsds-0.2.0/src/server/lineage_executor.py +129 -0
- flexsds-0.2.0/src/server/lineage_startup.py +47 -0
- flexsds-0.2.0/src/server/t4_rowwise_attention.py +262 -0
- flexsds-0.2.0/tests/test_adaptive_scheduler_glue.py +1428 -0
- flexsds-0.2.0/tests/test_aggregate_results.py +429 -0
- flexsds-0.2.0/tests/test_async_lineage_runtime_validator.py +203 -0
- flexsds-0.2.0/tests/test_benchmark_profiles.py +194 -0
- flexsds-0.2.0/tests/test_benchmark_workload_adapter.py +669 -0
- flexsds-0.2.0/tests/test_budget_controller.py +306 -0
- flexsds-0.2.0/tests/test_budget_fallback_recovery.py +228 -0
- flexsds-0.2.0/tests/test_budget_planner.py +403 -0
- flexsds-0.2.0/tests/test_budget_transition_scenarios.py +251 -0
- flexsds-0.2.0/tests/test_cli_chat_command.py +79 -0
- flexsds-0.2.0/tests/test_cli_monitor_command.py +96 -0
- flexsds-0.2.0/tests/test_cli_output_encoding.py +158 -0
- flexsds-0.2.0/tests/test_cli_wizard_flow.py +24 -0
- flexsds-0.2.0/tests/test_colab_runner.py +34 -0
- flexsds-0.2.0/tests/test_compatibility_guard.py +117 -0
- flexsds-0.2.0/tests/test_cost_model_l4.py +132 -0
- flexsds-0.2.0/tests/test_cost_model_solver.py +232 -0
- flexsds-0.2.0/tests/test_credentials_manager.py +80 -0
- flexsds-0.2.0/tests/test_end_to_end_flow.py +175 -0
- flexsds-0.2.0/tests/test_entity_eval.py +219 -0
- flexsds-0.2.0/tests/test_evaluate_node1_lanes.py +177 -0
- flexsds-0.2.0/tests/test_extractor.py +659 -0
- flexsds-0.2.0/tests/test_flexsds_advisor.py +122 -0
- flexsds-0.2.0/tests/test_flexsds_baseline.py +199 -0
- flexsds-0.2.0/tests/test_flexsds_client.py +43 -0
- flexsds-0.2.0/tests/test_flexsds_integration.py +247 -0
- flexsds-0.2.0/tests/test_hardware_profiler_benchmark.py +76 -0
- flexsds-0.2.0/tests/test_invoice_models.py +76 -0
- flexsds-0.2.0/tests/test_invoice_sqlite_v2.py +119 -0
- flexsds-0.2.0/tests/test_lineage_startup.py +446 -0
- flexsds-0.2.0/tests/test_local_runner.py +84 -0
- flexsds-0.2.0/tests/test_lossless_verifier.py +170 -0
- flexsds-0.2.0/tests/test_m005_ab.py +454 -0
- flexsds-0.2.0/tests/test_m1_01_smoke_helpers.py +51 -0
- flexsds-0.2.0/tests/test_m1_telemetry_contract.py +182 -0
- flexsds-0.2.0/tests/test_m2_campaign.py +230 -0
- flexsds-0.2.0/tests/test_m2_harness_contract.py +66 -0
- flexsds-0.2.0/tests/test_m2_plots.py +121 -0
- flexsds-0.2.0/tests/test_m2_summary.py +358 -0
- flexsds-0.2.0/tests/test_m3_preflight.py +210 -0
- flexsds-0.2.0/tests/test_m4_colab_preflight.py +134 -0
- flexsds-0.2.0/tests/test_m4_cost_profiler.py +206 -0
- flexsds-0.2.0/tests/test_m4_cost_runner.py +352 -0
- flexsds-0.2.0/tests/test_memory_pressure_rule.py +137 -0
- flexsds-0.2.0/tests/test_modal_bench_jobs.py +474 -0
- flexsds-0.2.0/tests/test_modal_client.py +266 -0
- flexsds-0.2.0/tests/test_modal_probe.py +249 -0
- flexsds-0.2.0/tests/test_modal_profiler.py +199 -0
- flexsds-0.2.0/tests/test_modal_runner_cli.py +89 -0
- flexsds-0.2.0/tests/test_modal_runner_config.py +547 -0
- flexsds-0.2.0/tests/test_modal_smoke.py +139 -0
- flexsds-0.2.0/tests/test_modal_vram_join.py +96 -0
- flexsds-0.2.0/tests/test_model_metadata_cache.py +66 -0
- flexsds-0.2.0/tests/test_node2_runner.py +206 -0
- flexsds-0.2.0/tests/test_node3_report.py +140 -0
- flexsds-0.2.0/tests/test_openai_compatible_ready_wait.py +97 -0
- flexsds-0.2.0/tests/test_proposer_adapter.py +143 -0
- flexsds-0.2.0/tests/test_protocol_b.py +580 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary.py +531 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_early.py +412 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_gpu_resolution.py +99 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_kv.py +608 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_layer1.py +312 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_p177_attention_substitution.py +408 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_p177_k0_control.py +636 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_postwrite.py +613 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_tokenizer_revision.py +187 -0
- flexsds-0.2.0/tests/test_protocol_b_boundary_v2.py +244 -0
- flexsds-0.2.0/tests/test_run_node1_extractor.py +72 -0
- flexsds-0.2.0/tests/test_run_node1_lanes.py +279 -0
- flexsds-0.2.0/tests/test_run_pipeline_e2e.py +229 -0
- flexsds-0.2.0/tests/test_scalar_colab_git.py +230 -0
- flexsds-0.2.0/tests/test_scalar_colab_smoke.py +320 -0
- flexsds-0.2.0/tests/test_scalar_context.py +274 -0
- flexsds-0.2.0/tests/test_scalar_cost_capture.py +401 -0
- flexsds-0.2.0/tests/test_scalar_cost_evidence.py +230 -0
- flexsds-0.2.0/tests/test_scheduler_tree_glue.py +74 -0
- flexsds-0.2.0/tests/test_serving_profile_guard.py +85 -0
- flexsds-0.2.0/tests/test_sql_guard.py +96 -0
- flexsds-0.2.0/tests/test_t4_rowwise_attention.py +531 -0
- flexsds-0.2.0/tests/test_task_runner.py +89 -0
- flexsds-0.2.0/tests/test_tree_adaptive_controller.py +472 -0
- flexsds-0.2.0/tests/test_tree_topology.py +245 -0
- flexsds-0.2.0/tests/test_validation.py +280 -0
- flexsds-0.2.0/tests/test_vram_memory_lifecycle.py +145 -0
- flexsds-0.2.0/tests/test_w1_workload.py +91 -0
- flexsds-0.2.0/tests/test_w2_w3_workloads.py +60 -0
- 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
|
+
[](https://portal.ptit.edu.vn/)
|
|
22
|
+
[](https://python.org)
|
|
23
|
+
[](https://github.com/vllm-project/vllm)
|
|
24
|
+
[](https://modal.com)
|
|
25
|
+
[]()
|
|
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.
|
flexsds-0.2.0/README.md
ADDED
|
@@ -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
|
+
[](https://portal.ptit.edu.vn/)
|
|
11
|
+
[](https://python.org)
|
|
12
|
+
[](https://github.com/vllm-project/vllm)
|
|
13
|
+
[](https://modal.com)
|
|
14
|
+
[]()
|
|
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"]
|
flexsds-0.2.0/setup.cfg
ADDED
|
Binary file
|
|
@@ -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()
|