Daydream Cloud: Remote GPU Processing in Scope#397
Open
emranemran wants to merge 24 commits intomainfrom
Open
Conversation
Add fal.ai serverless wrapper (fal_app.py) that runs Scope server on fal.ai GPU infrastructure (H100): - Start Scope server as subprocess on fal runner - WebSocket endpoint for WebRTC signaling and API proxying - Session data cleanup on disconnect (prevents data leakage) - Connection ID for correlating logs across client and server - Base64 encoding for binary file uploads/downloads - Assets directory configuration for fal environment Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Add modules enabling local Scope server to act as WebRTC client to cloud for GPU processing: - CloudConnectionManager: WebSocket connection with request/response correlation - CloudWebRTCClient: Peer connection from local server to cloud - CloudTrack: MediaStreamTrack for bidirectional video through cloud - Request keyframe (PLI) on track received for VP8 decoder stability - Cloud-related Pydantic schemas for API requests/responses Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Modify FrameProcessor to support cloud mode (cloud processing): - Route frames to cloud via WebRTC when connected - Receive processed frames from cloud callback - Spout sender/receiver work transparently in both modes - WebRTC manager handles cloud mode offers - Fix Spout integration in cloud mode Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Add REST API endpoints for cloud connection management: - POST /api/v1/cloud/connect - Connect to cloud - POST /api/v1/cloud/disconnect - Disconnect from cloud - GET /api/v1/cloud/status - Get connection status - Proxy model download requests to cloud in cloud mode - Proxy hardware API calls to cloud - Reference image upload handling in cloud mode - Recording download support in cloud mode Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Add UI components for managing cloud connection: - CloudModeToggle: Connection status, connect/disconnect buttons - Connection ID display with copy-to-clipboard - Disable controls during cloud connection attempt - Disable LoRA selection in cloud mode (not supported) - Show connecting/disconnecting state with spinner Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Add React hooks and utilities for cloud mode WebRTC: - useUnifiedWebRTC: Unified hook supporting both local and cloud modes - useApi: API request hook with cloud mode support - usePipelines: Refresh pipeline list on cloud mode toggle - usePipeline: Remove duplicate status polling - cloudAdapter/cloudContext: Cloud SDK integration Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Pipeline changes for text-to-video mode: - Skip video input for text-to-video pipelines - Input mode detection in wan2_1 pipeline Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
Add GitHub Actions workflow to build Docker images for feature branches. Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
…connections
Implements a maximum connection duration limit to control cloud GPU costs.
Connections are automatically closed after 60 minutes regardless of activity.
Changes:
- Add MAX_CONNECTION_DURATION_SECONDS (3600s) and TIMEOUT_CHECK_INTERVAL_SECONDS (60s) constants
- Track connection_start_time when WebSocket connects
- Add check_max_duration_exceeded() helper that sends a graceful "closing" message with reason "max_duration" before disconnect
- Use asyncio.wait_for() with timeout on ws.receive_text() to enable periodic duration checks during idle periods
- Also check duration after each received message to catch high-activity scenarios
The client receives a JSON message {"type": "closing", "reason": "max_duration", "elapsed_seconds": ...} before disconnection, allowing graceful handling.
Signed-off-by: emranemran <emran.mah@gmail.com>
Signed-off-by: Max Holland <max@livepeer.org>
Integrates Daydream authentication and adds comprehensive event tracking via Kafka for both local and cloud modes. Frontend: - Add OAuth sign-in flow with Daydream authentication - Show cloud mode toggle only when authenticated - Pass user ID to backend for log correlation Backend: - Add kafka_publisher module for async Kafka event publishing - Publish stream lifecycle events (stream_started, stream_stopped, stream_error) - Track user_id through cloud connections for log correlation Cloud (fal_app.py): - Add KafkaPublisher class for WebSocket event tracking - Publish websocket_connected/disconnected events with user context - Support set_user_id message for log correlation Signed-off-by: emranemran <emran.mah@gmail.com> Signed-off-by: Max Holland <max@livepeer.org>
- Add PipelinesProvider wrapper in App.tsx - Fix ReportBugDialog prop (onClose vs onOpenChange) - Add vaeTypes to PipelineInfo type - Add refreshPipelines to PipelinesContext - Install @radix-ui/react-tabs dependency
- Add DaydreamAccountSection component with auth + cloud mode toggle - Move cloud mode from StreamPage right panel to Settings General tab - Add Switch UI component for toggle - Remove sign in/sign out buttons from Header (now in Settings) - Delete unused CloudModeToggle component
load_params in PipelineLoadRequest is already dict[str, Any], not a Pydantic model, so calling model_dump() on it fails.
The method is handle_offer_with_relay, not handle_offer_with_cloud.
Method was renamed in cloud_connection.py but frame_processor.py was still calling the old name, causing frames not to be sent in video mode.
5857021 to
73dac11
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Daydream Cloud: Remote GPU Processing in Scope
Summary
This PR adds a Cloud Mode toggle to Scope, enabling users to run video generation pipelines on remote cloud GPUs (H100s for now) instead of requiring a local GPU. Aside from Plugins and LoRAs, Local and Cloud mode are at feature parity.
Architecture Overview
Local Mode (Current)
Cloud Mode
When to use: Desktop app where Spout I/O or local frame processing is needed.
How to enable: Start Scope, sign in, click "Connect to Cloud" in UI.
Key Components
Backend (scope-server)
cloud_connection.pycloud_webrtc_client.pycloud_track.pyframe_processor.pywebrtc.pyCloud (fal.ai)
fal_app.pyFAL_DEPLOYMENT.mdFrontend
cloudAdapter.tscloudContext.tsxuseUnifiedWebRTC.tsuseApi.tsCloudModeToggle.tsxAPI Endpoints
New endpoints for cloud connection management:
When connected to cloud, existing endpoints are automatically proxied:
POST /api/v1/pipeline/load→ proxied to cloudGET /api/v1/pipeline/status→ proxied to cloudGET /api/v1/pipelines/schemas→ proxied to cloudPOST /api/v1/webrtc/offer→ handled locally (relay mode)Features
Core Functionality
Authentication
Cloud mode requires Daydream authentication: