foundationpose / deploy.sh
Georg
Optimized Docker build to fix OOM errors
3968781
Raw
History Blame
5.23 kB
#!/bin/bash
# FoundationPose deployment script (optimized for HuggingFace)
set -e
IMAGE_NAME="gpue/foundationpose-base"
TAG="latest"
PLATFORM="linux/amd64"
HF_SPACE="gpue/foundationpose"
HF_TOKEN_FILE="../training/.env.local"
echo "==================================="
echo "FoundationPose Deployment"
echo "==================================="
echo ""
# Stage 1: Build and push base image
echo "Stage 1: Building base image"
echo "Platform: ${PLATFORM}"
echo "Image: ${IMAGE_NAME}:${TAG}"
echo ""
# Check Docker login
if [ ! -f ~/.docker/config.json ] || ! grep -q "index.docker.io" ~/.docker/config.json 2>/dev/null; then
echo "Error: Not logged in to DockerHub"
echo "Please run: docker login"
exit 1
fi
echo "✓ DockerHub authentication verified"
echo ""
echo "Building base image..."
docker build --platform ${PLATFORM} -f Dockerfile.base -t ${IMAGE_NAME}:${TAG} .
echo ""
echo "✓ Base image built successfully"
echo ""
# Show image size
IMAGE_SIZE=$(docker images ${IMAGE_NAME}:${TAG} --format "{{.Size}}")
echo "Image size: ${IMAGE_SIZE}"
echo ""
echo "Pushing to DockerHub..."
docker push ${IMAGE_NAME}:${TAG}
echo ""
echo "✓ Base image pushed to DockerHub: ${IMAGE_NAME}:${TAG}"
echo ""
# Stage 2: Deploy to HuggingFace
echo "Stage 2: Deploying to HuggingFace Space"
echo ""
# Initialize git repo if needed
if [ ! -d .git ]; then
echo "Initializing git repository..."
git init
git remote add origin https://huggingface.co/spaces/${HF_SPACE}
echo "✓ Git repository initialized"
echo ""
fi
# Check if there are changes to commit
if [[ -n $(git status -s) ]]; then
echo "Committing changes..."
git add Dockerfile Dockerfile.base requirements.txt deploy.sh app.py client.py estimator.py
git commit -m "Optimized Docker build to fix OOM errors"
echo "✓ Changes committed"
else
echo "No changes to commit"
fi
# Push to HuggingFace
echo ""
echo "Pushing to HuggingFace Space: ${HF_SPACE}"
git push https://huggingface.co/spaces/${HF_SPACE} main --force
echo ""
echo "✓ Pushed to HuggingFace"
echo ""
echo "HuggingFace will now:"
echo " 1. Pull base image from DockerHub (${IMAGE_NAME}:${TAG})"
echo " 2. Install build tools temporarily"
echo " 3. Build C++ extensions with GPU"
echo " 4. Remove build tools"
echo " 5. Download model weights (246MB)"
echo " 6. Start the Gradio app"
echo ""
# Follow build logs
echo "Following build logs..."
echo "Press Ctrl+C to stop watching"
echo ""
# Load HF token
if [ -f "${HF_TOKEN_FILE}" ]; then
HF_TOKEN=$(grep "^HUGGINGFACE_TOKEN=" "${HF_TOKEN_FILE}" | cut -d'=' -f2)
if [ -n "${HF_TOKEN}" ]; then
curl -N -H "Authorization: Bearer ${HF_TOKEN}" \
"https://huggingface.co/api/spaces/${HF_SPACE}/logs/build" 2>/dev/null | \
while IFS= read -r line; do
# Parse JSON and extract data field
echo "$line" | grep -o '"data":"[^"]*"' | sed 's/"data":"//;s/"$//' | sed 's/\\n/\n/g'
done
echo ""
echo "===================================="
echo "Build Status Check"
echo "===================================="
echo ""
# Wait a moment for status to update
sleep 2
# Check final build status
STATUS_JSON=$(curl -s -H "Authorization: Bearer ${HF_TOKEN}" \
"https://huggingface.co/api/spaces/${HF_SPACE}")
STAGE=$(echo "$STATUS_JSON" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('runtime', {}).get('stage', 'UNKNOWN'))" 2>/dev/null)
ERROR_MSG=$(echo "$STATUS_JSON" | python3 -c "import sys, json; data=json.load(sys.stdin); print(data.get('runtime', {}).get('errorMessage', ''))" 2>/dev/null)
echo "Final Status: ${STAGE}"
if [ "${STAGE}" = "RUNNING" ]; then
echo "✓ Deployment successful!"
echo ""
echo "Space URL: https://${HF_SPACE/\//-}.hf.space"
echo "API URL: https://${HF_SPACE/\//-}.hf.space/gradio_api/info"
echo ""
echo "Test with: cd ../training && make test-perception-api"
elif [ "${STAGE}" = "BUILD_ERROR" ]; then
echo "✗ Build failed!"
if [ -n "${ERROR_MSG}" ]; then
echo "Error: ${ERROR_MSG}"
fi
echo ""
echo "If still getting OOM errors, consider:"
echo " - Moving weights to runtime download (not build time)"
echo " - Requesting larger build instance from HuggingFace"
echo " - Using only CUDA arch 7.5 (T4 only)"
exit 1
else
echo "Status: ${STAGE}"
if [ -n "${ERROR_MSG}" ]; then
echo "Message: ${ERROR_MSG}"
fi
fi
else
echo "Warning: HF_TOKEN not found in ${HF_TOKEN_FILE}"
echo "To follow logs manually:"
echo " curl -N -H \"Authorization: Bearer \$HF_TOKEN\" \"https://huggingface.co/api/spaces/${HF_SPACE}/logs/build\""
fi
else
echo "Warning: ${HF_TOKEN_FILE} not found"
echo "To follow logs manually:"
echo " curl -N -H \"Authorization: Bearer \$HF_TOKEN\" \"https://huggingface.co/api/spaces/${HF_SPACE}/logs/build\""
fi