Skip to content

Commit bbbdf90

Browse files
update
1 parent 2c418f7 commit bbbdf90

4 files changed

Lines changed: 127 additions & 15 deletions

File tree

containers/llm-orchestrator-min/api.py

Lines changed: 46 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,42 +8,62 @@
88
# Ścieżka do modelu
99
MODEL_PATH = "/app/models/tinyllama"
1010

11-
# Ładowanie modelu i tokenizera
11+
# Konfiguracja optymalizacji
12+
USE_INT8 = os.environ.get('USE_INT8', 'true').lower() == 'true'
13+
DEVICE = "cpu"
14+
1215
print("Ładowanie modelu TinyLlama-1.1B...")
16+
print(f"Optymalizacje: USE_INT8={USE_INT8}, DEVICE={DEVICE}")
17+
18+
# Ładowanie tokenizera
1319
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
20+
21+
# Ładowanie modelu z optymalizacjami
1422
model = AutoModelForCausalLM.from_pretrained(
1523
MODEL_PATH,
1624
torch_dtype=torch.float32, # Używamy float32 dla CPU
17-
low_cpu_mem_usage=True
25+
low_cpu_mem_usage=True,
26+
load_in_8bit=USE_INT8, # Kwantyzacja int8 dla mniejszego zużycia pamięci
27+
device_map=DEVICE
1828
)
19-
print("Model załadowany!")
29+
30+
# Optymalizacja pamięci po załadowaniu modelu
31+
torch.cuda.empty_cache() if torch.cuda.is_available() else None
32+
print("Model załadowany i zoptymalizowany!")
2033

2134
@app.route('/api/generate', methods=['POST'])
2235
def generate():
2336
try:
2437
data = request.json
2538
prompt = data.get('prompt', '')
2639
max_length = data.get('max_length', 256)
40+
temperature = data.get('temperature', 0.7)
41+
top_p = data.get('top_p', 0.9)
2742

2843
# Formatowanie promptu dla modelu czatowego
2944
chat_prompt = f"<human>: {prompt}\n<assistant>:"
3045

31-
# Generowanie odpowiedzi
32-
inputs = tokenizer(chat_prompt, return_tensors="pt")
33-
outputs = model.generate(
34-
inputs.input_ids,
35-
max_length=max_length,
36-
temperature=0.7,
37-
top_p=0.9,
38-
do_sample=True
39-
)
46+
# Generowanie odpowiedzi z optymalizacją pamięci
47+
with torch.no_grad(): # Wyłączamy gradient dla oszczędności pamięci
48+
inputs = tokenizer(chat_prompt, return_tensors="pt")
49+
outputs = model.generate(
50+
inputs.input_ids,
51+
max_length=max_length,
52+
temperature=temperature,
53+
top_p=top_p,
54+
do_sample=True
55+
)
4056

4157
# Dekodowanie odpowiedzi
4258
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
4359

4460
# Wyodrębnienie odpowiedzi asystenta
4561
assistant_response = response.split("<assistant>:")[-1].strip()
4662

63+
# Zwolnienie pamięci
64+
del inputs, outputs
65+
torch.cuda.empty_cache() if torch.cuda.is_available() else None
66+
4767
return jsonify({
4868
"response": assistant_response,
4969
"success": True
@@ -56,7 +76,19 @@ def generate():
5676

5777
@app.route('/api/health', methods=['GET'])
5878
def health():
59-
return jsonify({"status": "ok"})
79+
# Dodajemy informacje o zużyciu pamięci
80+
import psutil
81+
memory_info = {
82+
"total_memory_gb": round(psutil.virtual_memory().total / (1024**3), 2),
83+
"used_memory_gb": round(psutil.virtual_memory().used / (1024**3), 2),
84+
"percent_used": psutil.virtual_memory().percent
85+
}
86+
87+
return jsonify({
88+
"status": "ok",
89+
"memory_info": memory_info
90+
})
6091

6192
if __name__ == '__main__':
62-
app.run(host='0.0.0.0', port=5000)
93+
# Używamy threaded=False dla mniejszego zużycia pamięci w przypadku małych modeli
94+
app.run(host='0.0.0.0', port=5000, threaded=False)

containers/llm-orchestrator-min/requirements.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,5 @@ flask==2.3.3
99
numpy==1.24.3
1010
requests==2.31.0
1111
python-dotenv==1.0.0
12+
psutil==5.9.5
13+
bitsandbytes==0.40.2

docker-compose.min.yml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,24 @@ services:
44
llm-orchestrator-min:
55
build:
66
context: ./containers/llm-orchestrator-min
7+
args:
8+
- BUILDKIT_INLINE_CACHE=1
79
container_name: llm-orchestrator-min
810
volumes:
911
- ./volumes/models:/app/models
1012
- ./volumes/config:/app/config
1113
- pip-cache:/root/.cache/pip
14+
environment:
15+
- USE_INT8=true
16+
- PYTHONUNBUFFERED=1
17+
- FLASK_ENV=production
18+
deploy:
19+
resources:
20+
limits:
21+
memory: 2G
22+
reservations:
23+
memory: 1G
24+
restart: unless-stopped
1225
ports:
1326
- "5000:5000" # API LLM
1427
networks:
@@ -17,12 +30,20 @@ services:
1730
browser-service:
1831
build:
1932
context: ./containers/browser-service
33+
args:
34+
- BUILDKIT_INLINE_CACHE=1
2035
container_name: browser-service
2136
volumes:
2237
- ./volumes/recordings:/app/recordings
2338
- pip-cache:/root/.cache/pip
2439
environment:
2540
- DISPLAY=:99
41+
- PYTHONUNBUFFERED=1
42+
deploy:
43+
resources:
44+
limits:
45+
memory: 1G
46+
restart: unless-stopped
2647
ports:
2748
- "5900:5900" # VNC
2849
networks:
@@ -31,7 +52,14 @@ services:
3152
novnc:
3253
build:
3354
context: ./containers/novnc
55+
args:
56+
- BUILDKIT_INLINE_CACHE=1
3457
container_name: novnc
58+
deploy:
59+
resources:
60+
limits:
61+
memory: 256M
62+
restart: unless-stopped
3563
ports:
3664
- "8080:8080" # noVNC Web UI
3765
networks:

runmin.sh

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@ echo -e "- Prosty model LLM działający na CPU (do 2B parametrów)"
1313
echo -e "- Przeglądarka dostępna przez noVNC"
1414
echo -e "- Brak menedżerów haseł, pipelines i sterowania głosowego"
1515
echo -e "- Zoptymalizowane cacheowanie paczek"
16+
echo -e "- Kwantyzacja int8 dla mniejszego zużycia pamięci"
17+
echo -e "- Limity zasobów dla kontenerów"
18+
19+
# Włączenie BuildKit dla szybszego budowania
20+
export DOCKER_BUILDKIT=1
21+
export COMPOSE_DOCKER_CLI_BUILD=1
1622

1723
# Sprawdzenie czy Docker jest zainstalowany
1824
if ! command -v docker &> /dev/null; then
@@ -41,10 +47,27 @@ else
4147
echo -e "${GREEN}Wolumen pip-cache już istnieje.${NC}"
4248
fi
4349

50+
# Sprawdzenie dostępnej pamięci
51+
MEM_TOTAL=$(free -g | awk '/^Mem:/{print $2}')
52+
echo -e "${YELLOW}Dostępna pamięć: ${MEM_TOTAL}GB${NC}"
53+
54+
if [ "$MEM_TOTAL" -lt 4 ]; then
55+
echo -e "${RED}Uwaga: Dostępna pamięć poniżej 4GB. Wydajność może być ograniczona.${NC}"
56+
# Zmniejszamy limity pamięci dla kontenerów
57+
sed -i 's/memory: 2G/memory: 1G/g' docker-compose.min.yml
58+
sed -i 's/memory: 1G/memory: 512M/g' docker-compose.min.yml
59+
sed -i 's/memory: 256M/memory: 128M/g' docker-compose.min.yml
60+
echo -e "${YELLOW}Limity pamięci zostały automatycznie zmniejszone.${NC}"
61+
fi
62+
4463
# Zatrzymanie istniejących kontenerów, jeśli istnieją
4564
echo -e "${YELLOW}Zatrzymywanie istniejących kontenerów, jeśli istnieją...${NC}"
4665
docker-compose -f docker-compose.min.yml down 2>/dev/null
4766

67+
# Czyszczenie nieużywanych obrazów i wolumenów dla oszczędności miejsca
68+
echo -e "${YELLOW}Czyszczenie nieużywanych zasobów Docker...${NC}"
69+
docker system prune -f --volumes 2>/dev/null
70+
4871
# Budowanie i uruchamianie kontenerów
4972
echo -e "${GREEN}Budowanie i uruchamianie kontenerów...${NC}"
5073
echo -e "${YELLOW}Pierwsze uruchomienie może potrwać dłużej, kolejne będą szybsze dzięki cache.${NC}"
@@ -85,7 +108,28 @@ open_browser() {
85108

86109
# Czekanie na uruchomienie usług
87110
echo -e "${YELLOW}Czekanie na uruchomienie usług...${NC}"
88-
sleep 10
111+
echo -e "${YELLOW}Sprawdzanie statusu API LLM...${NC}"
112+
113+
# Sprawdzanie, czy API jest gotowe
114+
MAX_RETRIES=30
115+
RETRY_COUNT=0
116+
API_READY=false
117+
118+
while [ $RETRY_COUNT -lt $MAX_RETRIES ]; do
119+
if curl -s http://localhost:5000/api/health | grep -q "status.*ok"; then
120+
API_READY=true
121+
break
122+
fi
123+
echo -n "."
124+
RETRY_COUNT=$((RETRY_COUNT+1))
125+
sleep 2
126+
done
127+
128+
if [ "$API_READY" = true ]; then
129+
echo -e "\n${GREEN}API LLM jest gotowe!${NC}"
130+
else
131+
echo -e "\n${YELLOW}Upłynął limit czasu oczekiwania na API LLM. Kontynuowanie mimo to...${NC}"
132+
fi
89133

90134
# Otwieranie noVNC w przeglądarce
91135
echo -e "${GREEN}Otwieranie noVNC w przeglądarce...${NC}"
@@ -94,6 +138,12 @@ open_browser "http://localhost:8080/vnc.html?autoconnect=true&password=secret"
94138
echo -e "${GREEN}=== coBoarding - Minimalna Wersja uruchomiona ===${NC}"
95139
echo -e "noVNC dostępny pod adresem: http://localhost:8080/vnc.html?autoconnect=true&password=secret"
96140
echo -e "API LLM dostępne pod adresem: http://localhost:5000"
141+
142+
# Wyświetlanie informacji o zużyciu zasobów
143+
echo -e "${YELLOW}Informacje o zużyciu zasobów:${NC}"
144+
docker stats --no-stream
145+
97146
echo -e "${YELLOW}Aby zatrzymać, użyj: docker-compose -f docker-compose.min.yml down${NC}"
98147
echo -e "${GREEN}Informacja o cache:${NC} Paczki Pythona są przechowywane w wolumenie Docker 'coboarding-pip-cache'"
99148
echo -e "Dzięki temu kolejne uruchomienia będą znacznie szybsze."
149+
echo -e "${GREEN}Optymalizacje:${NC} Kwantyzacja int8, limity pamięci, BuildKit, cacheowanie paczek"

0 commit comments

Comments
 (0)