Spaces:
Paused
Paused
| # 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 | |