Skip to content

Commit 8a374f3

Browse files
update
1 parent ce42d24 commit 8a374f3

5 files changed

Lines changed: 461 additions & 9 deletions

File tree

containers/llm-orchestrator-min/Dockerfile

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ENV PYTHONDONTWRITEBYTECODE=1 \
3333
# Instalacja podstawowych zależności systemowych
3434
RUN apt-get update && apt-get install -y --no-install-recommends \
3535
wget \
36+
curl \
3637
&& rm -rf /var/lib/apt/lists/*
3738

3839
# Utworzenie katalogu aplikacji
@@ -46,14 +47,11 @@ COPY requirements.txt .
4647
RUN pip install --no-index --find-links=/app/wheels -r requirements.txt && \
4748
rm -rf /app/wheels
4849

50+
# Tworzenie katalogów dla aplikacji
51+
RUN mkdir -p /app/models/tinyllama /app/scripts
52+
4953
# Kopiowanie kodu aplikacji
5054
COPY api.py ./
51-
COPY model-configs/ ./model-configs/ || true
52-
COPY data/ ./data/ || true
53-
54-
# Pobieranie modelu
55-
ARG MODEL_VERSION=1.0
56-
RUN mkdir -p /app/models/tinyllama
5755

5856
# Skrypt do pobierania modelu
5957
RUN echo '#!/bin/bash \n\
@@ -69,9 +67,16 @@ else \n\
6967
echo "Model TinyLlama już istnieje, pomijanie pobierania." \n\
7068
fi' > /app/download_model.sh && chmod +x /app/download_model.sh
7169

72-
# Dodanie skryptów diagnostycznych i naprawczych
73-
COPY scripts/ /app/scripts/ || true
74-
RUN chmod +x /app/scripts/*.sh || echo "No scripts to make executable"
70+
# Kopiowanie skryptów (pojedynczo, aby uniknąć problemów z nieistniejącymi plikami)
71+
COPY scripts/*.sh /app/scripts/
72+
COPY scripts/*.py /app/scripts/
73+
74+
# Nadanie uprawnień wykonywania dla skryptów
75+
RUN find /app/scripts -name "*.sh" -exec chmod +x {} \;
76+
77+
# Skrypt healthcheck
78+
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
79+
CMD curl -f http://localhost:${API_PORT}/api/health || exit 1
7580

7681
# Ekspozycja portu API
7782
EXPOSE ${API_PORT}
Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
# Architektura mikrousług dla llm-orchestrator
2+
3+
Ten dokument opisuje propozycję migracji z monolitycznego kontenera Docker do rozproszonej architektury mikrousług zarządzanej przez Terraform i Ansible.
4+
5+
## Problemy obecnej architektury
6+
7+
1. **Długi czas budowania i uruchamiania** - monolityczny kontener zawiera wszystkie komponenty, co wydłuża czas budowy
8+
2. **Trudności w skalowaniu** - nie można niezależnie skalować poszczególnych komponentów
9+
3. **Problemy z zależnościami** - wszystkie zależności muszą być kompatybilne w jednym kontenerze
10+
4. **Utrudniona diagnostyka** - problemy w jednym komponencie wpływają na cały system
11+
12+
## Proponowana architektura mikrousług
13+
14+
Proponujemy podział systemu na następujące mikrousługi:
15+
16+
1. **model-service** - odpowiedzialny tylko za obsługę modelu LLM
17+
2. **api-gateway** - zarządzanie zapytaniami API i routingiem
18+
3. **cache-service** - przechowywanie i zarządzanie cache'em
19+
4. **monitoring-service** - zbieranie metryk i monitorowanie
20+
5. **storage-service** - zarządzanie plikami i danymi
21+
22+
### Schemat architektury
23+
24+
```
25+
┌─────────────┐
26+
│ │
27+
┌─────────────┐ │ API Gateway │ ┌─────────────┐
28+
│ │ │ │ │ │
29+
│ Klient ├───► (Traefik) ├───►Model Service│
30+
│ │ │ │ │ │
31+
└─────────────┘ └──────┬──────┘ └─────────────┘
32+
33+
34+
┌───────────┼───────────┐
35+
│ │ │
36+
┌───────▼──┐ ┌─────▼────┐ ┌────▼─────┐
37+
│ │ │ │ │ │
38+
│ Cache │ │ Storage │ │Monitoring│
39+
│ Service │ │ Service │ │ Service │
40+
│ │ │ │ │ │
41+
└──────────┘ └──────────┘ └──────────┘
42+
```
43+
44+
## Korzyści z nowej architektury
45+
46+
1. **Szybsze wdrożenia** - można budować i aktualizować usługi niezależnie
47+
2. **Lepsza skalowalność** - możliwość skalowania tylko potrzebnych komponentów
48+
3. **Izolacja błędów** - problemy w jednej usłudze nie wpływają na pozostałe
49+
4. **Elastyczność technologiczna** - możliwość używania różnych technologii dla różnych usług
50+
5. **Łatwiejsze testowanie** - możliwość testowania komponentów niezależnie
51+
52+
## Implementacja z użyciem Terraform i Ansible
53+
54+
### Terraform (zarządzanie infrastrukturą)
55+
56+
Terraform będzie odpowiedzialny za:
57+
- Tworzenie i zarządzanie infrastrukturą (serwery, sieci, load balancery)
58+
- Konfigurację grup bezpieczeństwa i reguł dostępu
59+
- Zarządzanie skalowaniem automatycznym
60+
61+
```hcl
62+
# Przykładowy kod Terraform dla model-service
63+
resource "aws_ecs_service" "model_service" {
64+
name = "model-service"
65+
cluster = aws_ecs_cluster.llm_cluster.id
66+
task_definition = aws_ecs_task_definition.model_service.arn
67+
desired_count = 2
68+
69+
load_balancer {
70+
target_group_arn = aws_lb_target_group.model_service.arn
71+
container_name = "model-service"
72+
container_port = 5000
73+
}
74+
75+
capacity_provider_strategy {
76+
capacity_provider = "FARGATE_SPOT"
77+
weight = 1
78+
}
79+
}
80+
```
81+
82+
### Ansible (konfiguracja i wdrożenie)
83+
84+
Ansible będzie odpowiedzialny za:
85+
- Konfigurację serwerów i środowiska
86+
- Wdrażanie aplikacji i ich aktualizacje
87+
- Zarządzanie zależnościami i konfiguracją usług
88+
89+
```yaml
90+
# Przykładowy playbook Ansible dla model-service
91+
- name: Deploy model service
92+
hosts: model_servers
93+
tasks:
94+
- name: Pull model service image
95+
docker_image:
96+
name: registry.example.com/model-service:latest
97+
source: pull
98+
99+
- name: Start model service container
100+
docker_container:
101+
name: model-service
102+
image: registry.example.com/model-service:latest
103+
state: started
104+
restart_policy: always
105+
ports:
106+
- "5000:5000"
107+
env:
108+
MODEL_PATH: "/models/tinyllama"
109+
USE_INT8: "true"
110+
```
111+
112+
## Alternatywy dla Nginx
113+
114+
Zamiast Nginx, proponujemy użycie **Traefik** jako reverse proxy i API gateway:
115+
116+
### Zalety Traefik:
117+
1. **Automatyczna konfiguracja** - wykrywa zmiany w usługach i aktualizuje routing
118+
2. **Integracja z Docker/Kubernetes** - natywna integracja z kontenerami
119+
3. **Let's Encrypt** - automatyczne zarządzanie certyfikatami SSL
120+
4. **Middleware** - łatwe dodawanie funkcji jak rate limiting, autentykacja
121+
5. **Dashboard** - wbudowany panel do monitorowania
122+
123+
```yaml
124+
# Przykładowa konfiguracja Traefik
125+
services:
126+
traefik:
127+
image: traefik:v2.5
128+
command:
129+
- "--api.insecure=true"
130+
- "--providers.docker=true"
131+
- "--providers.docker.exposedbydefault=false"
132+
- "--entrypoints.web.address=:80"
133+
ports:
134+
- "80:80"
135+
- "8080:8080"
136+
volumes:
137+
- "/var/run/docker.sock:/var/run/docker.sock:ro"
138+
139+
model-service:
140+
image: model-service:latest
141+
labels:
142+
- "traefik.enable=true"
143+
- "traefik.http.routers.model.rule=PathPrefix(`/api/model`)"
144+
- "traefik.http.services.model.loadbalancer.server.port=5000"
145+
```
146+
147+
## Plan migracji
148+
149+
1. **Faza 1**: Podział monolitycznego kontenera na mikrousługi
150+
2. **Faza 2**: Wdrożenie Traefik jako API gateway
151+
3. **Faza 3**: Konfiguracja infrastruktury za pomocą Terraform
152+
4. **Faza 4**: Automatyzacja wdrożeń za pomocą Ansible
153+
5. **Faza 5**: Wdrożenie monitoringu i logowania
154+
155+
## Podsumowanie
156+
157+
Migracja do architektury mikrousług z wykorzystaniem Terraform i Ansible pozwoli na:
158+
- Skrócenie czasu budowania i wdrażania
159+
- Lepszą skalowalność i niezawodność
160+
- Łatwiejsze zarządzanie i diagnostykę
161+
- Elastyczność w wyborze technologii
162+
163+
Traefik jako alternatywa dla Nginx zapewni łatwiejszą konfigurację i lepszą integrację z kontenerami.
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
# Szybki start z llm-orchestrator-min
2+
3+
Ten dokument zawiera instrukcje uruchomienia minimalnej wersji orkiestratora LLM, która jest lżejszą alternatywą dla pełnej wersji systemu.
4+
5+
## Wymagania wstępne
6+
7+
- Docker
8+
- Git
9+
- Bash (dla skryptów pomocniczych)
10+
11+
## Szybkie uruchomienie
12+
13+
Aby szybko uruchomić minimalną wersję orkiestratora LLM, wykonaj następujące kroki:
14+
15+
```bash
16+
# Sklonuj repozytorium (jeśli jeszcze tego nie zrobiłeś)
17+
git clone https://github.com/coboarding/python.git
18+
cd python/containers/llm-orchestrator-min
19+
20+
# Zbuduj i uruchom kontener
21+
./scripts/manage_container.sh build
22+
./scripts/manage_container.sh run [opcjonalny_port] # domyślnie 5000
23+
```
24+
25+
Po uruchomieniu, API będzie dostępne pod adresem `http://localhost:[port]/api/`.
26+
27+
## Testowanie
28+
29+
Aby przetestować API po uruchomieniu:
30+
31+
```bash
32+
# Uruchom podstawowe testy
33+
./scripts/run_tests_after_startup.sh --url=http://localhost:[port]
34+
35+
# Lub uruchom kompleksowe testy
36+
python3 ./scripts/comprehensive_test.py --url=http://localhost:[port]
37+
```
38+
39+
## Struktura projektu
40+
41+
```
42+
llm-orchestrator-min/
43+
├── api.py # Główny plik API
44+
├── Dockerfile # Definicja kontenera
45+
├── requirements.txt # Zależności Pythona
46+
├── docs/ # Dokumentacja
47+
│ ├── TESTING.md # Szczegółowa dokumentacja testów
48+
│ └── QUICKSTART.md # Ten dokument
49+
└── scripts/ # Skrypty pomocnicze
50+
├── manage_container.sh # Zarządzanie kontenerem
51+
├── test_api.sh # Podstawowe testy API
52+
└── ...
53+
```
54+
55+
## Rozwiązywanie problemów
56+
57+
Jeśli napotkasz problemy podczas uruchamiania kontenera:
58+
59+
1. **Port jest już zajęty**: Użyj innego portu w poleceniu `./scripts/manage_container.sh run [inny_port]`
60+
2. **Problemy z budowaniem**: Sprawdź logi budowania: `docker logs $(docker ps -a | grep llm-orchestrator-min | awk '{print $1}')`
61+
3. **API nie odpowiada**: Uruchom skrypt diagnostyczny: `./scripts/diagnose_api.sh`
62+
63+
## Konfiguracja
64+
65+
Możesz dostosować działanie API poprzez zmienne środowiskowe:
66+
67+
- `API_PORT`: Port, na którym działa API (domyślnie 5000)
68+
- `USE_INT8`: Używaj kwantyzacji INT8 dla modelu (domyślnie true)
69+
70+
Przykład:
71+
```bash
72+
docker run -e API_PORT=8080 -e USE_INT8=false -p 8080:8080 llm-orchestrator-min
73+
```
74+
75+
## Rozwój
76+
77+
Aby dowiedzieć się więcej o testowaniu i rozwoju, zapoznaj się z dokumentem [TESTING.md](./TESTING.md).
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
FROM python:3.9-slim as builder
2+
3+
# Ustawienie zmiennych środowiskowych
4+
ENV PYTHONDONTWRITEBYTECODE=1 \
5+
PYTHONUNBUFFERED=1 \
6+
PIP_NO_CACHE_DIR=0 \
7+
PIP_DISABLE_PIP_VERSION_CHECK=1
8+
9+
# Instalacja podstawowych zależności systemowych
10+
RUN apt-get update && apt-get install -y --no-install-recommends \
11+
build-essential \
12+
&& rm -rf /var/lib/apt/lists/*
13+
14+
# Utworzenie katalogu aplikacji
15+
WORKDIR /app
16+
17+
# Kopiowanie tylko pliku requirements.txt, aby wykorzystać cache Docker
18+
COPY requirements.txt .
19+
20+
# Instalacja zależności Pythona z wykorzystaniem cache
21+
RUN pip install --upgrade pip && \
22+
pip wheel --wheel-dir=/app/wheels -r requirements.txt
23+
24+
# Druga faza - obraz docelowy
25+
FROM python:3.9-slim
26+
27+
# Ustawienie zmiennych środowiskowych
28+
ENV PYTHONDONTWRITEBYTECODE=1 \
29+
PYTHONUNBUFFERED=1 \
30+
USE_INT8=true \
31+
MODEL_SERVICE_PORT=5000
32+
33+
# Instalacja podstawowych zależności systemowych
34+
RUN apt-get update && apt-get install -y --no-install-recommends \
35+
wget \
36+
curl \
37+
&& rm -rf /var/lib/apt/lists/*
38+
39+
# Utworzenie katalogu aplikacji
40+
WORKDIR /app
41+
42+
# Kopiowanie skompilowanych pakietów z poprzedniej fazy
43+
COPY --from=builder /app/wheels /app/wheels
44+
COPY requirements.txt .
45+
46+
# Instalacja pakietów z lokalnych plików wheel
47+
RUN pip install --no-index --find-links=/app/wheels -r requirements.txt && \
48+
rm -rf /app/wheels
49+
50+
# Tworzenie katalogów dla aplikacji
51+
RUN mkdir -p /app/models/tinyllama
52+
53+
# Kopiowanie kodu aplikacji
54+
COPY model_service.py ./
55+
56+
# Skrypt do pobierania modelu
57+
COPY download_model.sh /app/
58+
RUN chmod +x /app/download_model.sh
59+
60+
# Skrypt healthcheck
61+
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
62+
CMD curl -f http://localhost:${MODEL_SERVICE_PORT}/health || exit 1
63+
64+
# Ekspozycja portu API
65+
EXPOSE ${MODEL_SERVICE_PORT}
66+
67+
# Uruchomienie aplikacji
68+
CMD ["/bin/bash", "-c", "/app/download_model.sh && python -u model_service.py"]

0 commit comments

Comments
 (0)