MicroFish/PERFORMANCE_TUNING.md

10 KiB
Raw Blame History

Performance Tuning — Tăng tốc pipeline khi có resource lớn

Tài liệu này liệt kê các param có thể nâng lên để chạy nhanh hơn khi bạn có máy/GPU/LLM-server mạnh hơn. Mỗi mục ghi rõ: file + dòng, giá trị hiện tại, giá trị đề xuất, và giúp nhanh ở bước nào.

⚠️ Nút thắt thật không nằm ở code mà ở 2 server LLM/embedding. Toàn bộ semaphore/concurrency bên dưới bị giới hạn bởi số request đồng thời mà

  • LLM server (LLM_BASE_URL, vd localhost:8027) và
  • embedding server (EMBEDDING_BASE_URL, vd localhost:8026)

chịu được. Tăng các con số vượt quá khả năng 2 server này sẽ gây timeout / 429 / 400, KHÔNG nhanh hơn. Quy tắc: nâng dần, theo dõi log, dừng khi bắt đầu thấy lỗi.


ĐÃ ÁP DỤNG — cấu hình cho 2 model hiện tại (cập nhật mới nhất)

Server hiện tại:

  • LLM: Qwen/Qwen3.6-27B @ localhost:8027max_model_len = 262144 (256K)
  • Embedding: Qwen/Qwen3-Embedding-4B @ localhost:8026max_model_len = 40960 (40K)

⚠️ Đã fix tên model: .env trước ghi Qwen/Qwen3.6-27B-FP8 (sai → gây 404). Server chỉ phục vụ Qwen/Qwen3.6-27B.

Các giá trị đã set (tận dụng cửa sổ context lớn 256K):

Param File:dòng Cũ → Mới Lý do
LLM_MODEL_NAME .env:6 …-27B-FP8…-27B Fix 404 (bắt buộc)
SEMAPHORE_LIMIT .env:26 1030 Build graph nhanh hơn
CHUNK_TOKEN_SIZE .env:27 30008000 Ít chunk hơn (< embed 40960)
max_tokens ×2 backend/app/utils/llm_client.py:44, :91 1600032000 Output dài hơn
MAX_TEXT_LENGTH_FOR_LLM backend/app/services/ontology_generator.py:291 40000400000 Ontology đọc nhiều text hơn (~100K token)
token_limit / message_window_size backend/scripts/run_parallel_simulation.py:1128 24000/25150000/50 Agent nhớ nhiều hơn, ít bị cắt
parallel_profile_count backend/app/services/simulation_manager.py:352 315 Sinh profile song song
parallel_count (default) backend/app/services/oasis_profile_generator.py:1198 515 (đồng bộ với trên)
semaphore ×2 (oasis.make) backend/scripts/run_parallel_simulation.py:1340, :1535 830 Nhiều agent gọi LLM/round
batch_size (build) backend/app/api/graph.py:459 38 Ít round-trip khi nạp chunk

Cần làm sau khi sửa: restart backend để .env có hiệu lực (cd backend && FLASK_PORT=5002 uv run python run.py).


🎯 TL;DR — Sửa 3 thứ này trước (ăn nhất)

Ưu tiên Param File:dòng Hiện tại Đề xuất (máy mạnh) Tăng tốc bước
1 SEMAPHORE_LIMIT .env:26 10 30 Build graph (chậm nhất)
2 parallel_profile_count backend/app/services/simulation_manager.py:352 3 15 Sinh agent profile
3 semaphore (oasis.make) backend/scripts/run_parallel_simulation.py:1340, :1535 8 30 Simulation (nhiều agent gọi LLM)

🟢 Nhóm 1 — Build knowledge graph (bước chậm nhất)

1.1 SEMAPHORE_LIMIT quan trọng nhất

  • File: .env:26SEMAPHORE_LIMIT=10
  • Là gì: số thao tác LLM/embedding đồng thờigraphiti_core chạy khi build graph. (Đọc bởi thư viện tại graphiti_core/helpers.py, default lib = 20.)
  • Đề xuất: 2050 (giới hạn bởi sức chịu của LLM + embedding server).
  • Giúp gì: Build graph là bước tốn thời gian nhất (extract entity + embedding cho từng chunk). Đây là đòn bẩy lớn nhất.

1.2 USE_PARALLEL_RUNTIME

  • File: .env:28USE_PARALLEL_RUNTIME=false
  • Là gì: bật Neo4j parallel runtime cho các Cypher query.
  • Đề xuất: trueCHỈ khi dùng Neo4j Enterprise (Community Edition không hỗ trợ, bật vô tác dụng).
  • Giúp gì: truy vấn graph nhanh hơn khi Neo4j có nhiều core.

1.3 CHUNK_TOKEN_SIZE

  • File: .env:27CHUNK_TOKEN_SIZE=3000
  • Là gì: kích thước mỗi chunk (token) khi graphiti tự chia text.
  • Đề xuất: 50008000CHỈ khi LLM/embedding có cửa sổ context lớn (model hiện tại 32K nên cẩn thận).
  • Giúp gì: chunk to hơn → ít chunk hơn → ít vòng LLM call hơn khi build. (Đánh đổi: mỗi call nặng hơn.)

1.4 batch_size khi build (hardcode — phải sửa code)


🟡 Nhóm 2 — Simulation (bước chậm thứ 2)

2.1 parallel_profile_count — sinh agent profile song song

2.2 semaphore trong oasis.make() — LLM call đồng thời mỗi round


🔵 Nhóm 3 — Token / context (chỉ nâng SAU KHI đổi sang model cửa sổ lớn)

⚠️ Mấy param này đã được hạ xuống để vừa model 32K hiện tại (max_total_tokens=32768). Chúng không tăng tốc trực tiếp, mà tăng throughput mỗi call → ít vòng lặp/ít bị cắt context. Nâng lên sẽ gây lỗi HTTP 400 nếu model vẫn là 32K. Chỉ nâng khi đã trỏ sang model/endpoint cửa sổ lớn (vd 128K).

Param File:dòng Hiện tại Khi model lớn Vai trò
max_tokens (chat) backend/app/utils/llm_client.py:44 16000 3200050000 output tối đa mỗi call
max_tokens (chat_json) backend/app/utils/llm_client.py:91 16000 3200050000 output JSON (ontology)
MAX_TEXT_LENGTH_FOR_LLM backend/app/services/ontology_generator.py:291 40000 100000+ số ký tự input cho ontology (hiện cắt bớt)
token_limit (agent memory) backend/scripts/run_parallel_simulation.py:1128 24000 100000+ context history mỗi agent giữ lại
message_window_size backend/scripts/run_parallel_simulation.py:1128 25 50+ số message agent nhớ

⚙️ Nhóm 4 — Throughput-vs-độ-sâu (đánh đổi chất lượng/tốc độ, không phải resource)

Mấy cái này không cần máy mạnh — chúng đổi độ sâu xử lý lấy tốc độ. Giảm xuống = nhanh hơn nhưng kết quả nông hơn.

Param File:dòng Hiện tại Để chạy nhanh
OASIS_DEFAULT_MAX_ROUNDS backend/app/config.py:55 (env OASIS_DEFAULT_MAX_ROUNDS) 10 giảm còn 35 khi test nhanh
REPORT_AGENT_MAX_TOOL_CALLS backend/app/config.py:69 5 giảm → report nhanh hơn, ít truy vấn graph hơn
REPORT_AGENT_MAX_REFLECTION_ROUNDS backend/app/config.py:70 2 giảm còn 1 → report nhanh hơn

📌 Lưu ý vận hành

  1. Sửa .env → phải restart backend (biến môi trường chỉ đọc lúc khởi động; Flask reloader KHÔNG reload .env).
    cd backend && FLASK_PORT=5002 uv run python run.py
    
  2. Sửa code .py → Flask reloader tự nạp lại (nếu debug mode bật), không cần restart.
  3. Nâng dần, đừng nhảy vọt. Tăng semaphore → xem log có 429/timeout/400 không → nếu có thì hạ lại.
  4. Trần trên = sức chịu của LLM + embedding server, không phải code. Đó mới là nút thắt thật.