flashdreams-postprocessing

작성자: nvidia

FlashDreams 비디오 후처리 프로세서, 세션, 프리셋 및 러너 스트림 연결을 추가하거나 수정합니다. 새 VideoPostProcessorConfig /...를 구현할 때 사용합니다.

npx skills add https://github.com/nvidia/flashdreams --skill flashdreams-postprocessing

FlashDreams Post-Processing

Use this skill when adding a video post-processor or changing the runner post-processing stream. The reference implementation is integrations/flashvsr/flashvsr/postprocess.py.

Mental Model

A post-processor is usually three classes, not one class inheriting everything:

  • VideoPostProcessorConfig: serializable config and CLI surface. It sets _target to the processor factory and declares fields, output_spec(), requires_all_ranks(), and validate_execution().
  • VideoPostProcessor: lightweight factory created from config. Its job is start(spec) -> VideoPostProcessorSession.
  • VideoPostProcessorSession: mutable per-stream runtime. It owns buffers, caches, lazy model instances, counters, and process() / flush().

Keep stream state in the session. Do not store per-rollout mutable state on the config or processor factory.

Implementation Steps

  1. Pick a home:

    • Generic reusable post-processing belongs under flashdreams/flashdreams/infra/postprocess/.
    • Model-specific processors belong in their integration, for example integrations/<name>/<pkg>/postprocess.py.
  2. Define a config subclass:

    @dataclass(kw_only=True)
    class MyPostProcessorConfig(VideoPostProcessorConfig):
        _target: type["MyPostProcessor"] = field(
            default_factory=lambda: MyPostProcessor
        )
    
        scale: int = 2
    
        def output_spec(self, input_spec: VideoSpec) -> VideoSpec:
            return VideoSpec(
                height=input_spec.height * self.scale,
                width=input_spec.width * self.scale,
                fps=input_spec.fps,
                channels=input_spec.channels,
            )
    

    Override:

    • output_spec() when spatial size, channels, or timing changes.
    • requires_all_ranks() when the processor must run on nonzero ranks under torchrun.
    • validate_execution() to reject unsupported distributed or shape modes early.
  3. Define the processor factory:

    class MyPostProcessor(VideoPostProcessor[MyPostProcessorConfig]):
        def start(self, spec: VideoSpec) -> VideoPostProcessorSession:
            return _MyPostProcessorSession(self.config, spec)
    
  4. Define the session:

    class _MyPostProcessorSession(VideoPostProcessorSession):
        def __init__(self, config: MyPostProcessorConfig, spec: VideoSpec) -> None:
            self._config = config
            self._spec = spec
            self._buffer: Tensor | None = None
    
        def process(self, chunk: VideoChunk) -> list[VideoChunk]:
            ...
    
        def flush(self) -> list[VideoChunk]:
            ...
    

    process() is synchronous but may return []: that means it consumed the input chunk and is buffering frames until a later chunk or flush() can complete an output window.

  5. Handle layouts at the boundary:

    • Accept VideoChunk.tensor in chunk.layout.
    • Use to_bvtchw() only as a generic boundary helper.
    • Convert once into the processor's native layout, make it contiguous if the model kernels require that, and keep internal buffers in that native layout.
    • Document any forced .contiguous() because it can copy.
  6. Return VideoChunks:

    • Preserve [-1, 1] value range unless the API is intentionally changed.
    • Set the correct layout.
    • Carry metadata only if it helps downstream processors or provenance.
  7. Register presets when users should select it from CLI:

    [project.entry-points."flashdreams.postprocess_presets"]
    "my-postprocessor-v1" = "my_pkg.postprocess:POSTPROCESS_PRESET_MY_V1"
    

    The exported object must be a VideoPostProcessorConfig, for example:

    POSTPROCESS_PRESET_MY_V1 = MyPostProcessorConfig(...)
    

    Users select it with --postprocess.preset my-postprocessor-v1.

Runner Interaction

Runners create a VideoPostprocessStream through create_runner_postprocess_stream(). The stream:

  • creates one chain session for whole-stream processing, or one session per view when postprocess_per_view=True;
  • calls session.process(VideoChunk(...)) for each AR output;
  • turns [] into a zero-frame tensor so process() remains tensor-only;
  • skips collecting zero-time tensors in _append_if_nonempty();
  • calls flush() once at end-of-stream and appends any tail output.

Use postprocess_output_layout to describe the runner's decoded output layout. Use postprocess_per_view=True for bvtchw outputs when each camera/view needs an independent processor session.

Tests

Add CPU-safe tests unless the behavior genuinely requires a GPU:

  • Config/preset discovery: flashdreams/tests/test_postprocess_presets.py.
  • Stream contract and buffering: flashdreams/tests/test_postprocess_stream.py.
  • Processor-specific CPU fakes: integrations/<name>/tests/test_postprocess.py.
  • Runner distributed skip/all-rank behavior: flashdreams/tests/test_runner_postprocess.py.

Every pytest test must use exactly one marker: ci_cpu, ci_gpu, or manual. Prefer fake processor builders for CPU tests instead of loading checkpoints.

Useful focused validation:

uv run pytest flashdreams/tests/test_runner_postprocess.py \
  flashdreams/tests/test_postprocess_stream.py \
  flashdreams/tests/test_postprocess_presets.py \
  integrations/<name>/tests/test_postprocess.py

nvidia의 다른 스킬

compileiq-debug
nvidia
무언가 잘못되었을 때 사용: Search()가 멈추거나, 모든 평가가 INVALID_SCORE를 반환하거나, 점수가 개선되지 않거나, 모든 설정이 동일한 숫자를 반환하거나, ptxas 오류 등이 발생할 때
create-github-pr
nvidia
gh CLI를 사용하여 GitHub 풀 리퀘스트를 생성합니다. 사용자가 새 PR을 만들거나, 코드 리뷰를 제출하거나, 풀 리퀘스트를 열고자 할 때 사용합니다. 트리거 키워드 -…
nemoclaw-maintainer-cross-issue-sweep
nvidia
다른 열린 이슈들을 스캔하여 주어진 PR이 함께 수정하거나 실수로 망가뜨릴 수 있는 이슈를 찾습니다. 인접 수정 기회와 모순 위험을 file:line…과 함께 출력합니다.
fhir-basics
nvidia
에이전트에게 FHIR R4 API의 작동 방식, 사용 가능한 리소스, 검색 매개변수를 사용한 쿼리 방법, 모든 응답 형식을 올바르게 파싱하는 방법을 가르칩니다…
compileiq-validate-result
nvidia
검색이 완료된 후, 속도 향상을 청구하거나 ACF를 발송하기 전에 사용합니다. dump_results CSV를 로드하고, 상위 K개 후보(단일 목표)를 추출합니다…
changelog-audit
nvidia
릴리스 전에 Warp CHANGELOG.md를 감사합니다: 누락된 항목 복구, 사용자 영향별 정렬, 항목 언어 다듬기, 줄 바꿈, (릴리스 브랜치 모드) 비교 업데이트…
maintain-dynamic-plugins
nvidia
NeMo Relay 동적 플러그인 로더, 매니페스트, Rust 네이티브 SDK, gRPC 워커 프로토콜, Python 워커 SDK, 문서, 테스트 및 릴리스 워크플로 커버리지를 유지 관리합니다.
dgx-diagnose
nvidia
일반적인 DGX Station GB300 문제 진단 — CUDA 충돌, 잘못된 GPU 타겟팅, vLLM/SGLang 컨테이너 버그, MIG 상태 문제, NVLink/Fabric Manager 오류,…