375 lines
16 KiB
YAML
375 lines
16 KiB
YAML
services:
|
|
prepare:
|
|
image: alpine:3.21.2
|
|
container_name: tail2-pose-prepare
|
|
restart: "no"
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server:/target
|
|
- ./:/source:ro
|
|
command:
|
|
- /bin/sh
|
|
- -ec
|
|
- |
|
|
install -d -m 0755 /target/app /target/config /target/models /target/logs /target/secrets
|
|
test ! -e /target/.foreign-project || { echo 'foreign project marker found'; exit 1; }
|
|
cp -a /source/app/. /target/app/
|
|
cp -a /source/config/. /target/config/
|
|
cp -a /source/tests /target/
|
|
cp /source/compose.yaml /source/Dockerfile /source/requirements.lock /source/DEPLOYMENT.md /target/
|
|
if [ ! -s /target/secrets/api-token ]; then
|
|
umask 077
|
|
printf 'tail2_%s' "$$(head -c 48 /dev/urandom | base64 | tr -d '\n=/+')" > /target/secrets/api-token
|
|
fi
|
|
chmod 600 /target/secrets/api-token
|
|
touch /target/.tail2-pose-server-managed
|
|
|
|
models:
|
|
image: curlimages/curl:8.11.1
|
|
container_name: tail2-pose-models
|
|
restart: "no"
|
|
user: "0:0"
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models
|
|
command:
|
|
- /bin/sh
|
|
- -ec
|
|
- |
|
|
fetch() {
|
|
if [ ! -s "$$2" ]; then
|
|
curl --fail --location --retry 5 --output "$$2.part" "$$1"
|
|
test -s "$$2.part"
|
|
mv "$$2.part" "$$2"
|
|
fi
|
|
}
|
|
fetch https://github.com/open-mmlab/mmdetection/archive/refs/tags/v3.2.0.tar.gz /models/mmdetection-v3.2.0.tar.gz
|
|
fetch https://github.com/open-mmlab/mmpose/archive/refs/tags/v1.3.2.tar.gz /models/mmpose-v1.3.2.tar.gz
|
|
test -d /models/mmdetection/configs || { mkdir -p /models/mmdetection && tar -xzf /models/mmdetection-v3.2.0.tar.gz --strip-components=1 -C /models/mmdetection; }
|
|
test -d /models/mmpose/configs || { mkdir -p /models/mmpose && tar -xzf /models/mmpose-v1.3.2.tar.gz --strip-components=1 -C /models/mmpose; }
|
|
fetch https://download.openmmlab.com/mmdetection/v3.0/rtmdet/rtmdet_m_8xb32-300e_coco/rtmdet_m_8xb32-300e_coco_20220719_112220-229f527c.pth /models/rtmdet_m_8xb32-300e_coco_20220719_112220-229f527c.pth
|
|
fetch https://download.openmmlab.com/mmdetection/v3.0/rtmdet/rtmdet_tiny_8xb32-300e_coco/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth /models/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth
|
|
fetch https://download.openmmlab.com/mmpose/v1/projects/rtmw/rtmw-dw-x-l_simcc-cocktail14_270e-256x192-20231122.pth /models/rtmw-dw-x-l_simcc-cocktail14_270e-256x192-20231122.pth
|
|
fetch https://download.openmmlab.com/mmpose/v1/projects/rtmw/rtmw-dw-l-m_simcc-cocktail14_270e-256x192-20231122.pth /models/rtmw-dw-l-m_simcc-cocktail14_270e-256x192-20231122.pth
|
|
fetch_zip() {
|
|
url="$$1"; directory="$$2"; stable="$$3"
|
|
archive="/models/$$(basename "$$directory").zip"
|
|
fetch "$$url" "$$archive"
|
|
if [ ! -s "$$stable" ]; then
|
|
mkdir -p "$$directory"
|
|
unzip -o "$$archive" -d "$$directory"
|
|
found=$$(find "$$directory" -type f -name '*.onnx' | head -1)
|
|
test -n "$$found"
|
|
cp "$$found" "$$stable"
|
|
fi
|
|
}
|
|
fetch_zip https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/onnx_sdk/yolox_m_8xb8-300e_humanart-c2c7a14a.zip /models/yolox-m-humanart /models/yolox-m-humanart.onnx
|
|
fetch_zip https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/onnx_sdk/rtmpose-m_simcc-body7_pt-body7_420e-256x192-e48f03d0_20230504.zip /models/rtmpose-m-body17 /models/rtmpose-m-body17.onnx
|
|
fetch_zip https://download.openmmlab.com/mmpose/v1/projects/rtmposev1/onnx_sdk/rtmpose-m_simcc-ucoco_dw-ucoco_270e-256x192-c8b76419_20230728.zip /models/dwpose-m-wholebody /models/dwpose-m-wholebody.onnx
|
|
fetch_zip https://download.openmmlab.com/mmpose/v1/projects/rtmw/onnx_sdk/rtmw-dw-x-l_simcc-cocktail14_270e-256x192_20231122.zip /models/rtmw-l-wholebody /models/rtmw-l-wholebody.onnx
|
|
sha256sum /models/*.pth > /models/SHA256SUMS
|
|
chmod -R a-w /models
|
|
|
|
tail2-pose-server:
|
|
image: tail2-pose-server:0.1.0
|
|
build:
|
|
context: .
|
|
dockerfile: Dockerfile
|
|
container_name: tail2-pose-server
|
|
network_mode: host
|
|
gpus: all
|
|
init: true
|
|
restart: unless-stopped
|
|
shm_size: 2gb
|
|
read_only: true
|
|
depends_on:
|
|
prepare:
|
|
condition: service_completed_successfully
|
|
models:
|
|
condition: service_completed_successfully
|
|
tmpfs:
|
|
- /tmp:size=512m,mode=1777
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- /mnt/user/appdata/tail2-pose-server/config:/config:ro
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models:ro
|
|
- /mnt/user/appdata/tail2-pose-server/logs:/logs
|
|
- /mnt/user/appdata/tail2-pose-server/secrets/api-token:/run/secrets/api-token:ro
|
|
environment:
|
|
PYTHONPATH: /app
|
|
API_BIND: 0.0.0.0
|
|
API_PORT: "18120"
|
|
API_TOKEN_FILE: /run/secrets/api-token
|
|
NDI_SOURCE_NAME: TAIL 2_1621D2 (OBSBOT)
|
|
NDI_SOURCE_IP: 192.168.50.207
|
|
MODEL_BACKEND: rtmlib_body
|
|
MODEL_PROFILE: rtmlib_body
|
|
BENCHMARK_PROFILE: rtmlib_body_yolox-m_rtmpose-m_gpu1
|
|
MAX_PEOPLE: "4"
|
|
DETECTION_THRESHOLD: "0.35"
|
|
NMS_IOU_THRESHOLD: "0.60"
|
|
FRAME_QUEUE_SIZE: "1"
|
|
LATEST_FRAME_ONLY: "true"
|
|
SAVE_FRAMES: "false"
|
|
SAVE_CROPS: "false"
|
|
LOG_COORDINATES: "false"
|
|
RUN_STARTUP_BENCHMARK: "false"
|
|
OMP_NUM_THREADS: "4"
|
|
MKL_NUM_THREADS: "4"
|
|
OPENBLAS_NUM_THREADS: "4"
|
|
CV2_NUM_THREADS: "4"
|
|
CUDA_VISIBLE_DEVICES: "1"
|
|
DETECTOR_NAME: yolox-m-humanart-coco-640x640
|
|
DET_CONFIG: ""
|
|
DET_CHECKPOINT: /models/yolox-m-humanart.onnx
|
|
POSE_NAME: rtmpose-m-body17-256x192
|
|
POSE_CONFIG: ""
|
|
POSE_CHECKPOINT: /models/rtmpose-m-body17.onnx
|
|
healthcheck:
|
|
test: ["CMD", "python", "-c", "import json,pathlib,urllib.request; t=pathlib.Path('/run/secrets/api-token').read_text().strip(); r=urllib.request.Request('http://127.0.0.1:18120/v1/health',headers={'Authorization':'Bearer '+t}); raise SystemExit(0 if json.load(urllib.request.urlopen(r,timeout=3))['ready'] else 1)"]
|
|
interval: 15s
|
|
timeout: 10s
|
|
retries: 6
|
|
start_period: 180s
|
|
|
|
gpu-audit:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-gpu-audit
|
|
gpus: all
|
|
restart: "no"
|
|
volumes:
|
|
- /:/host:ro
|
|
- ./validation:/validation
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
command:
|
|
- |
|
|
set -euo pipefail
|
|
out=/validation/gpu-audit
|
|
mkdir -p "$$out"
|
|
nvidia-smi --query-gpu=index,uuid,pstate,utilization.gpu,utilization.memory,memory.used,memory.total,power.draw,clocks.current.sm,temperature.gpu --format=csv,noheader,nounits > "$$out/snapshot.csv"
|
|
nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name,used_gpu_memory --format=csv,noheader,nounits > "$$out/processes.csv"
|
|
{
|
|
echo 'timestamp_utc,index,uuid,utilization_gpu_pct,utilization_memory_pct,memory_used_mib,pstate,power_draw_w,clocks_sm_mhz,temperature_c'
|
|
for i in $$(seq 1 60); do
|
|
ts=$$(date -u +%FT%T.%3NZ)
|
|
nvidia-smi --query-gpu=index,uuid,utilization.gpu,utilization.memory,memory.used,pstate,power.draw,clocks.current.sm,temperature.gpu --format=csv,noheader,nounits | sed "s/^/$$ts,/"
|
|
sleep 1
|
|
done
|
|
} > "$$out/utilization-60s.csv"
|
|
{
|
|
echo 'pid,comm,cgroup'
|
|
tail -n +1 "$$out/processes.csv" | while IFS=, read -r uuid pid name mem; do
|
|
pid=$$(echo "$$pid" | tr -d ' ')
|
|
comm=$$(cat "/host/proc/$$pid/comm" 2>/dev/null || echo unavailable)
|
|
cgroup=$$(tr '\n' ';' < "/host/proc/$$pid/cgroup" 2>/dev/null || true)
|
|
printf '%s,%s,%s\n' "$$pid" "$$comm" "$$cgroup"
|
|
done
|
|
} > "$$out/process-map.csv"
|
|
chmod -R a+rX,u+w "$$out"
|
|
|
|
gpu-final-snapshot:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-gpu-final-snapshot
|
|
gpus: all
|
|
restart: "no"
|
|
volumes:
|
|
- ./validation:/validation
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
command:
|
|
- |
|
|
nvidia-smi --query-gpu=index,uuid,pstate,utilization.gpu,utilization.memory,memory.used,memory.total,power.draw,clocks.current.sm,temperature.gpu --format=csv,noheader,nounits > /validation/gpu-final-snapshot.csv
|
|
nvidia-smi --query-compute-apps=gpu_uuid,pid,process_name,used_gpu_memory --format=csv,noheader,nounits > /validation/gpu-final-processes.csv
|
|
chmod 0666 /validation/gpu-final-snapshot.csv /validation/gpu-final-processes.csv
|
|
|
|
benchmark-rtmlib-body:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-benchmark-rtmlib-body
|
|
gpus: all
|
|
restart: "no"
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
depends_on:
|
|
models:
|
|
condition: service_completed_successfully
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models:ro
|
|
- ./validation:/validation
|
|
environment:
|
|
PYTHONPATH: /app
|
|
CUDA_VISIBLE_DEVICES: "1"
|
|
MODEL_BACKEND: rtmlib_body
|
|
BENCHMARK_PROFILE: rtmlib_body_yolox-m_rtmpose-m_gpu1_threads2_iobinding
|
|
BENCHMARK_OUTPUT: /validation/benchmark-rtmlib-body-iobinding.json
|
|
DETECTION_THRESHOLD: "0.35"
|
|
NMS_IOU_THRESHOLD: "0.60"
|
|
MAX_PEOPLE: "4"
|
|
DET_CHECKPOINT: /models/yolox-m-humanart.onnx
|
|
POSE_CHECKPOINT: /models/rtmpose-m-body17.onnx
|
|
OMP_NUM_THREADS: "2"
|
|
MKL_NUM_THREADS: "2"
|
|
OPENBLAS_NUM_THREADS: "2"
|
|
CV2_NUM_THREADS: "2"
|
|
command:
|
|
- |
|
|
python -c 'from tail2.models import Models; from tail2.offline_benchmark import run_offline_benchmark; m=Models(); m.load(); run_offline_benchmark(m, .35, 4)'
|
|
|
|
benchmark-rtmlib-wholebody:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-benchmark-rtmlib-wholebody
|
|
gpus: all
|
|
restart: "no"
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
depends_on:
|
|
models:
|
|
condition: service_completed_successfully
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models:ro
|
|
- ./validation:/validation
|
|
environment:
|
|
PYTHONPATH: /app
|
|
CUDA_VISIBLE_DEVICES: "1"
|
|
MODEL_BACKEND: rtmlib_wholebody
|
|
BENCHMARK_PROFILE: rtmlib_wholebody_yolox-m_dwpose-m_gpu1_threads2_iobinding
|
|
BENCHMARK_OUTPUT: /validation/benchmark-rtmlib-wholebody-iobinding.json
|
|
DETECTION_THRESHOLD: "0.35"
|
|
NMS_IOU_THRESHOLD: "0.60"
|
|
MAX_PEOPLE: "4"
|
|
DET_CHECKPOINT: /models/yolox-m-humanart.onnx
|
|
POSE_CHECKPOINT: /models/dwpose-m-wholebody.onnx
|
|
OMP_NUM_THREADS: "2"
|
|
MKL_NUM_THREADS: "2"
|
|
OPENBLAS_NUM_THREADS: "2"
|
|
CV2_NUM_THREADS: "2"
|
|
command:
|
|
- |
|
|
python -c 'from tail2.models import Models; from tail2.offline_benchmark import run_offline_benchmark; m=Models(); m.load(); run_offline_benchmark(m, .35, 4)'
|
|
|
|
benchmark-threads:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-benchmark-threads
|
|
gpus: all
|
|
restart: "no"
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
depends_on:
|
|
models:
|
|
condition: service_completed_successfully
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models:ro
|
|
- ./validation:/validation
|
|
environment:
|
|
PYTHONPATH: /app
|
|
CUDA_VISIBLE_DEVICES: "1"
|
|
MODEL_BACKEND: rtmlib_body
|
|
DETECTION_THRESHOLD: "0.35"
|
|
NMS_IOU_THRESHOLD: "0.60"
|
|
MAX_PEOPLE: "4"
|
|
DET_CHECKPOINT: /models/yolox-m-humanart.onnx
|
|
POSE_CHECKPOINT: /models/rtmpose-m-body17.onnx
|
|
command:
|
|
- |
|
|
set -euo pipefail
|
|
for threads in 1 2 4; do
|
|
OMP_NUM_THREADS=$$threads MKL_NUM_THREADS=$$threads OPENBLAS_NUM_THREADS=$$threads CV2_NUM_THREADS=$$threads \
|
|
BENCHMARK_PROFILE="rtmlib_body_threads$${threads}" BENCHMARK_OUTPUT="/validation/benchmark-threads-$${threads}.json" \
|
|
python -c 'from tail2.models import Models; from tail2.offline_benchmark import run_offline_benchmark; m=Models(); m.load(); run_offline_benchmark(m, .35, 4)'
|
|
done
|
|
|
|
benchmark-openmmlab:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-benchmark-openmmlab
|
|
gpus: all
|
|
restart: "no"
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
depends_on:
|
|
models:
|
|
condition: service_completed_successfully
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models:ro
|
|
- ./validation:/validation
|
|
environment:
|
|
PYTHONPATH: /app:/models/mmdetection:/models/mmpose
|
|
CUDA_VISIBLE_DEVICES: "1"
|
|
MODEL_BACKEND: openmmlab
|
|
BENCHMARK_PROFILE: openmmlab_rtmdet-tiny_rtmw-m_gpu1_threads4
|
|
BENCHMARK_OUTPUT: /validation/benchmark-openmmlab.json
|
|
DETECTION_THRESHOLD: "0.35"
|
|
NMS_IOU_THRESHOLD: "0.60"
|
|
MAX_PEOPLE: "4"
|
|
DET_CONFIG: /models/mmdetection/configs/rtmdet/rtmdet_tiny_8xb32-300e_coco.py
|
|
DET_CHECKPOINT: /models/rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth
|
|
POSE_CONFIG: /models/mmpose/configs/wholebody_2d_keypoint/rtmpose/cocktail14/rtmw-m_8xb1024-270e_cocktail14-256x192.py
|
|
POSE_CHECKPOINT: /models/rtmw-dw-l-m_simcc-cocktail14_270e-256x192-20231122.pth
|
|
OMP_NUM_THREADS: "4"
|
|
MKL_NUM_THREADS: "4"
|
|
OPENBLAS_NUM_THREADS: "4"
|
|
CV2_NUM_THREADS: "4"
|
|
command:
|
|
- |
|
|
python -c 'from tail2.models import Models; from tail2.offline_benchmark import run_offline_benchmark; m=Models(); m.load(); run_offline_benchmark(m, .35, 4)'
|
|
|
|
validate:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-validate
|
|
network_mode: host
|
|
gpus: all
|
|
restart: "no"
|
|
environment:
|
|
DETECTOR_NAME: rtmdet-tiny-person
|
|
BENCHMARK_PROFILE: rtmdet-tiny_rtmw-m_gpu1_fp32_final
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
depends_on:
|
|
tail2-pose-server:
|
|
condition: service_healthy
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- ./tests:/tests:ro
|
|
- /mnt/user/appdata/tail2-pose-server/models:/models:ro
|
|
- /mnt/user/appdata/tail2-pose-server/logs:/logs:ro
|
|
- /mnt/user/appdata/tail2-pose-server/secrets/api-token:/run/secrets/api-token:ro
|
|
- ./validation:/validation
|
|
command:
|
|
- |
|
|
set -euo pipefail
|
|
chmod -R a+rwX /validation
|
|
python -m pytest -q /tests > /validation/unit-tests.txt 2>&1
|
|
python /app/tail2/validate_runtime.py > /validation/runtime.json
|
|
python -m pip freeze | sort > /validation/pip-freeze.txt
|
|
python /app/tail2/version_report.py > /validation/runtime-versions.json
|
|
find / -xdev -type f -name 'libndi.so*' -print > /validation/ndi-runtime-files.txt 2>/dev/null || true
|
|
nvidia-smi --query-gpu=name,driver_version,memory.total,memory.used,temperature.gpu --format=csv,noheader > /validation/gpu.csv
|
|
sha256sum /models/*.pth > /validation/model-sha256.txt
|
|
cp /logs/offline-benchmark-$${BENCHMARK_PROFILE:-unknown}.json /validation/offline-benchmark.json
|
|
chmod 0666 /validation/*.txt /validation/*.json /validation/*.csv
|
|
|
|
soak:
|
|
profiles: ["validation"]
|
|
image: tail2-pose-server:0.1.0
|
|
container_name: tail2-pose-soak
|
|
network_mode: host
|
|
restart: "no"
|
|
environment:
|
|
DETECTOR_NAME: rtmdet-tiny-person
|
|
BENCHMARK_PROFILE: rtmdet-tiny_rtmw-m_gpu1_fp32_final
|
|
entrypoint: ["/bin/bash", "-lc"]
|
|
depends_on:
|
|
tail2-pose-server:
|
|
condition: service_healthy
|
|
volumes:
|
|
- /mnt/user/appdata/tail2-pose-server/app:/app:ro
|
|
- /mnt/user/appdata/tail2-pose-server/secrets/api-token:/run/secrets/api-token:ro
|
|
- ./validation:/validation
|
|
command:
|
|
- |
|
|
set -euo pipefail
|
|
chmod -R a+rwX /validation
|
|
test -s /validation/soak-$${BENCHMARK_PROFILE}-10m.json || python /app/tail2/soak.py
|
|
chmod 0666 /validation/soak-$${BENCHMARK_PROFILE}-10m.json
|