Foundry/swarm/docker/docker-stack.yml

220 lines
5.5 KiB
YAML

# Foundry Swarm - Docker Stack for production Swarm deployment
#
# Prerequisites:
# 1. Initialize swarm: docker swarm init
# 2. Join other nodes: docker swarm join --token <token> <manager-ip>:2377
# 3. Label nodes by capability:
# docker node update --label-add hw=server <server-node>
# docker node update --label-add hw=desktop <desktop-node>
# docker node update --label-add hw=laptop <laptop-node>
# docker node update --label-add hw=rpi <rpi-node>
#
# Deployment:
# docker stack deploy -c docker-stack.yml foundry
#
# Scaling:
# docker service scale foundry_worker-desktop=5
# docker service scale foundry_worker-rpi=10
#
# Monitoring:
# docker service logs -f foundry_coordinator
# docker service ps foundry_worker-rpi
version: "3.8"
services:
# ============================================================
# COORDINATOR - Runs on the most powerful server
# ============================================================
coordinator:
image: foundry/swarm-coordinator:latest
ports:
- target: 7100
published: 7100
protocol: tcp
mode: host # Host mode for better performance
volumes:
- checkpoints:/app/checkpoints
- logs:/app/logs
- type: bind
source: ./config
target: /app/config
read_only: true
environment:
- SW_PORT=7100
- SW_MIN_WORKERS=10
- SW_LEARNING_RATE=1e-4
- SW_TOTAL_STEPS=500000
- SW_CHECKPOINT_EVERY=5000
- SW_HEARTBEAT_TIMEOUT=120 # Longer timeout for WiFi latency
- SW_SYNC_EVERY_N_GRADS=5 # Don't wait for all workers
networks:
- swarm-overlay
deploy:
mode: replicated
replicas: 1
placement:
constraints:
- node.labels.hw == server
resources:
limits:
cpus: "8"
memory: 32G
reservations:
cpus: "2"
memory: 8G
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
# ============================================================
# WORKERS - Different configs per hardware class
# ============================================================
# Server workers - highest throughput
worker-server:
image: foundry/swarm-worker:latest
volumes:
- training-data:/app/data:ro
- logs:/app/logs
environment:
- SW_COORDINATOR_HOST=coordinator
- SW_COORDINATOR_PORT=7100
- SW_DATA_PATH=/app/data
- SW_BATCH_SIZE=256
- SW_NUM_THREADS=0
- SW_COMPRESSION=topk
- SW_TOPK_RATIO=0.1
networks:
- swarm-overlay
deploy:
mode: replicated
replicas: 2
placement:
constraints:
- node.labels.hw == server
resources:
limits:
cpus: "16"
memory: 64G
reservations:
cpus: "4"
memory: 8G
restart_policy:
condition: on-failure
# Desktop workers - medium throughput
worker-desktop:
image: foundry/swarm-worker:latest
volumes:
- training-data:/app/data:ro
- logs:/app/logs
environment:
- SW_COORDINATOR_HOST=coordinator
- SW_COORDINATOR_PORT=7100
- SW_DATA_PATH=/app/data
- SW_BATCH_SIZE=64
- SW_NUM_THREADS=0
- SW_COMPRESSION=topk
- SW_TOPK_RATIO=0.1
networks:
- swarm-overlay
deploy:
mode: replicated
replicas: 10
placement:
constraints:
- node.labels.hw == desktop
resources:
limits:
cpus: "4"
memory: 16G
reservations:
cpus: "1"
memory: 2G
restart_policy:
condition: on-failure
# Laptop workers - lower throughput, battery-aware
worker-laptop:
image: foundry/swarm-worker:latest
volumes:
- training-data:/app/data:ro
- logs:/app/logs
environment:
- SW_COORDINATOR_HOST=coordinator
- SW_COORDINATOR_PORT=7100
- SW_DATA_PATH=/app/data
- SW_BATCH_SIZE=32
- SW_NUM_THREADS=2 # Limit threads for battery
- SW_COMPRESSION=topk
- SW_TOPK_RATIO=0.1
networks:
- swarm-overlay
deploy:
mode: replicated
replicas: 5
placement:
constraints:
- node.labels.hw == laptop
resources:
limits:
cpus: "2"
memory: 8G
reservations:
cpus: "0.5"
memory: 1G
restart_policy:
condition: on-failure
# Raspberry Pi workers - low throughput, many nodes
worker-rpi:
image: foundry/swarm-worker:arm64
volumes:
- training-data:/app/data:ro
- logs:/app/logs
environment:
- SW_COORDINATOR_HOST=coordinator
- SW_COORDINATOR_PORT=7100
- SW_DATA_PATH=/app/data
- SW_BATCH_SIZE=8
- SW_NUM_THREADS=4
- SW_COMPRESSION=topk
- SW_TOPK_RATIO=0.05 # More aggressive compression
networks:
- swarm-overlay
deploy:
mode: replicated
replicas: 20
placement:
constraints:
- node.labels.hw == rpi
resources:
limits:
cpus: "4"
memory: 3G
reservations:
cpus: "1"
memory: 512M
restart_policy:
condition: on-failure
delay: 10s
networks:
swarm-overlay:
driver: overlay
attachable: true
volumes:
checkpoints:
driver: local
logs:
driver: local
training-data:
driver: local
driver_opts:
type: nfs
o: addr=${NFS_SERVER},rw,nolock
device: ":${NFS_PATH}"