Skip to content

Commit bac8f47

Browse files
update
1 parent 8d0c2d5 commit bac8f47

File tree

5 files changed

+257
-0
lines changed

5 files changed

+257
-0
lines changed
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
FROM python:3.9-slim
2+
3+
# Instalacja zależności systemowych
4+
RUN apt-get update && apt-get install -y --no-install-recommends \
5+
build-essential \
6+
git \
7+
curl \
8+
wget \
9+
ca-certificates \
10+
&& rm -rf /var/lib/apt/lists/*
11+
12+
WORKDIR /app
13+
14+
# Kopiowanie tylko pliku requirements.txt najpierw, aby lepiej wykorzystać cache
15+
COPY requirements.txt .
16+
17+
# Ustawienie zmiennych środowiskowych dla pip, aby zoptymalizować cache
18+
ENV PIP_NO_CACHE_DIR=0 \
19+
PIP_DISABLE_PIP_VERSION_CHECK=1 \
20+
PYTHONDONTWRITEBYTECODE=1 \
21+
PYTHONUNBUFFERED=1
22+
23+
# Utworzenie katalogu cache dla pip i instalacja zależności
24+
RUN mkdir -p /root/.cache/pip && \
25+
pip install -r requirements.txt
26+
27+
# Kopiowanie pozostałych plików aplikacji
28+
COPY api.py ./
29+
COPY model-configs/ ./model-configs/
30+
COPY data/ ./data/
31+
32+
# Utworzenie potrzebnych katalogów
33+
RUN mkdir -p /app/models /app/config
34+
RUN mkdir -p /app/model-configs /app/data
35+
36+
# Pobieranie małego modelu LLM (TinyLlama-1.1B)
37+
# Używamy ARG, aby wymusić przebudowanie tej warstwy przy zmianie wersji modelu
38+
ARG MODEL_VERSION=1.0
39+
RUN mkdir -p /app/models/tinyllama && \
40+
cd /app/models/tinyllama && \
41+
wget -q https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0/resolve/main/tokenizer.model && \
42+
wget -q https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0/resolve/main/tokenizer_config.json && \
43+
wget -q https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0/resolve/main/config.json && \
44+
wget -q https://huggingface.co/TinyLlama/TinyLlama-1.1B-Chat-v1.0/resolve/main/pytorch_model.bin
45+
46+
# Ekspozycja portu API
47+
EXPOSE 5000
48+
49+
# Uruchomienie API
50+
CMD ["python", "-u", "api.py"]
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import os
2+
import torch
3+
from flask import Flask, request, jsonify
4+
from transformers import AutoModelForCausalLM, AutoTokenizer
5+
6+
app = Flask(__name__)
7+
8+
# Ścieżka do modelu
9+
MODEL_PATH = "/app/models/tinyllama"
10+
11+
# Ładowanie modelu i tokenizera
12+
print("Ładowanie modelu TinyLlama-1.1B...")
13+
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
14+
model = AutoModelForCausalLM.from_pretrained(
15+
MODEL_PATH,
16+
torch_dtype=torch.float32, # Używamy float32 dla CPU
17+
low_cpu_mem_usage=True
18+
)
19+
print("Model załadowany!")
20+
21+
@app.route('/api/generate', methods=['POST'])
22+
def generate():
23+
try:
24+
data = request.json
25+
prompt = data.get('prompt', '')
26+
max_length = data.get('max_length', 256)
27+
28+
# Formatowanie promptu dla modelu czatowego
29+
chat_prompt = f"<human>: {prompt}\n<assistant>:"
30+
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+
)
40+
41+
# Dekodowanie odpowiedzi
42+
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
43+
44+
# Wyodrębnienie odpowiedzi asystenta
45+
assistant_response = response.split("<assistant>:")[-1].strip()
46+
47+
return jsonify({
48+
"response": assistant_response,
49+
"success": True
50+
})
51+
except Exception as e:
52+
return jsonify({
53+
"error": str(e),
54+
"success": False
55+
}), 500
56+
57+
@app.route('/api/health', methods=['GET'])
58+
def health():
59+
return jsonify({"status": "ok"})
60+
61+
if __name__ == '__main__':
62+
app.run(host='0.0.0.0', port=5000)
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
torch==2.0.1
2+
transformers==4.30.2
3+
accelerate==0.20.3
4+
sentencepiece==0.1.99
5+
pydantic==1.10.8
6+
fastapi==0.100.0
7+
uvicorn==0.22.0
8+
flask==2.3.3
9+
numpy==1.24.3
10+
requests==2.31.0
11+
python-dotenv==1.0.0

docker-compose.min.yml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
version: '3.8'
2+
3+
services:
4+
llm-orchestrator-min:
5+
build:
6+
context: ./containers/llm-orchestrator-min
7+
container_name: llm-orchestrator-min
8+
volumes:
9+
- ./volumes/models:/app/models
10+
- ./volumes/config:/app/config
11+
- pip-cache:/root/.cache/pip
12+
ports:
13+
- "5000:5000" # API LLM
14+
networks:
15+
- autoformfiller-min-network
16+
17+
browser-service:
18+
build:
19+
context: ./containers/browser-service
20+
container_name: browser-service
21+
volumes:
22+
- ./volumes/recordings:/app/recordings
23+
- pip-cache:/root/.cache/pip
24+
environment:
25+
- DISPLAY=:99
26+
ports:
27+
- "5900:5900" # VNC
28+
networks:
29+
- autoformfiller-min-network
30+
31+
novnc:
32+
build:
33+
context: ./containers/novnc
34+
container_name: novnc
35+
ports:
36+
- "8080:8080" # noVNC Web UI
37+
networks:
38+
- autoformfiller-min-network
39+
depends_on:
40+
- browser-service
41+
42+
networks:
43+
autoformfiller-min-network:
44+
driver: bridge
45+
46+
volumes:
47+
pip-cache:
48+
name: coboarding-pip-cache

runmin.sh

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#!/bin/bash
2+
3+
# Kolory do formatowania wyjścia
4+
GREEN='\033[0;32m'
5+
YELLOW='\033[1;33m'
6+
RED='\033[0;31m'
7+
NC='\033[0m' # No Color
8+
9+
echo -e "${GREEN}=== coBoarding - Minimalna Wersja ===${NC}"
10+
echo -e "${YELLOW}Uruchamianie minimalnej wersji coBoarding z prostym modelem LLM (TinyLlama-1.1B)${NC}"
11+
echo -e "${YELLOW}Ta wersja zawiera tylko podstawowe funkcje:${NC}"
12+
echo -e "- Prosty model LLM działający na CPU (do 2B parametrów)"
13+
echo -e "- Przeglądarka dostępna przez noVNC"
14+
echo -e "- Brak menedżerów haseł, pipelines i sterowania głosowego"
15+
16+
# Sprawdzenie czy Docker jest zainstalowany
17+
if ! command -v docker &> /dev/null; then
18+
echo -e "${RED}Docker nie jest zainstalowany. Instaluję Docker...${NC}"
19+
curl -fsSL https://get.docker.com -o get-docker.sh
20+
sudo sh get-docker.sh
21+
rm get-docker.sh
22+
fi
23+
24+
# Sprawdzenie czy Docker Compose jest zainstalowany
25+
if ! command -v docker-compose &> /dev/null; then
26+
echo -e "${RED}Docker Compose nie jest zainstalowany. Instaluję Docker Compose...${NC}"
27+
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
28+
sudo chmod +x /usr/local/bin/docker-compose
29+
fi
30+
31+
# Tworzenie katalogów dla wolumenów
32+
mkdir -p ./volumes/models ./volumes/config ./volumes/recordings
33+
34+
# Zatrzymanie istniejących kontenerów, jeśli istnieją
35+
echo -e "${YELLOW}Zatrzymywanie istniejących kontenerów, jeśli istnieją...${NC}"
36+
docker-compose -f docker-compose.min.yml down 2>/dev/null
37+
38+
# Budowanie i uruchamianie kontenerów
39+
echo -e "${GREEN}Budowanie i uruchamianie kontenerów...${NC}"
40+
docker-compose -f docker-compose.min.yml up --build -d
41+
42+
# Sprawdzenie statusu kontenerów
43+
echo -e "${YELLOW}Sprawdzanie statusu kontenerów...${NC}"
44+
docker-compose -f docker-compose.min.yml ps
45+
46+
# Funkcja do otwierania przeglądarki
47+
open_browser() {
48+
local url="$1"
49+
echo -e "${GREEN}Otwieranie przeglądarki: $url${NC}"
50+
51+
# Wykrywanie systemu operacyjnego i otwieranie URL w przeglądarce
52+
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
53+
if command -v xdg-open &>/dev/null; then
54+
xdg-open "$url" &>/dev/null &
55+
elif command -v gnome-open &>/dev/null; then
56+
gnome-open "$url" &>/dev/null &
57+
else
58+
echo -e "${YELLOW}Nie można automatycznie otworzyć przeglądarki. Otwórz ręcznie URL: $url${NC}"
59+
return 1
60+
fi
61+
elif [[ "$OSTYPE" == "darwin"* ]]; then
62+
open "$url" &>/dev/null &
63+
elif [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
64+
start "" "$url" &>/dev/null &
65+
else
66+
echo -e "${YELLOW}Nieobsługiwany system. Otwórz URL ręcznie: $url${NC}"
67+
return 1
68+
fi
69+
70+
# Daj przeglądarce czas na otwarcie
71+
sleep 3
72+
return 0
73+
}
74+
75+
# Czekanie na uruchomienie usług
76+
echo -e "${YELLOW}Czekanie na uruchomienie usług...${NC}"
77+
sleep 10
78+
79+
# Otwieranie noVNC w przeglądarce
80+
echo -e "${GREEN}Otwieranie noVNC w przeglądarce...${NC}"
81+
open_browser "http://localhost:8080/vnc.html?autoconnect=true&password=secret"
82+
83+
echo -e "${GREEN}=== coBoarding - Minimalna Wersja uruchomiona ===${NC}"
84+
echo -e "noVNC dostępny pod adresem: http://localhost:8080/vnc.html?autoconnect=true&password=secret"
85+
echo -e "API LLM dostępne pod adresem: http://localhost:5000"
86+
echo -e "${YELLOW}Aby zatrzymać, użyj: docker-compose -f docker-compose.min.yml down${NC}"

0 commit comments

Comments
 (0)