Nodes/ComfyUI-SyncReward/SyncReward Loader
ComfyUI Node

SyncReward Loader

Empty Checkpoint Dropdown? Your 15 GB of SyncReward Files Aren't Where ComfyUI Is Looking

By hiroki-abe-58·Created 2 days ago·Updated about 15 hours ago· 0
SyncReward Loader
    • model
    ◄checkpoint▾►
    ◄encoder▾►
    ◄deviceauto►
    ◄keep_loadedtrue►

    More video models ship sound now - LTX-2.3 generates picture and audio in one pass, Ovi and Seedance do it too, and when they don't, people bolt on MMAudio or a TTS stage and hope the two halves line up. They often don't, exactly, and until recently you had no way to check except watching the clip and squinting. SyncReward is a reward model that puts a number on it: 0 means the sound and the picture are doing unrelated things, 2 means they're locked together. The Loader is where you plug the thing in.

    Fair warning before you start: this is not a small dependency. Two checkpoints, roughly 15 GB together, a 1.66 B-parameter model that runs in fp32 on your GPU, and about 10 GB of VRAM while it scores. If you were hoping for a 300 MB quality-check node, this isn't it.

    What this node actually does (which is less than you'd think)

    The Loader doesn't load weights. Hit queue with just this node wired to nothing and you'll see no VRAM used, no progress, nothing - because all it does is resolve your two folders and your device choice into a SYNCREWARD_MODEL handle. The real loading happens further down the graph, the first time SyncReward Score or SyncReward Select Best runs. Then the model is cached in a single resident slot, keyed on checkpoint + encoder + device. Ask for the same combination again and it's free; ask for a different one and the old model gets dropped to make room. You get exactly one SyncReward in memory, which is fine, because you only ever need one.

    That lazy loading explains a confusing first experience: a new workflow's first run takes about ten seconds longer than later ones, and switching device makes you pay it again.

    The four inputs

    checkpoint and encoder are dropdowns, and they're a happy-path-only list - the pack scans ComfyUI/models/syncreward/ (plus anything you've added for syncreward in extra_model_paths.yaml) and lists a folder only if it has the right marker files. For the checkpoint that's a config.json with "model_type": "syncreward" plus model.safetensors; for the encoder it's "model_type": "pe_audio_video" plus the processor files. A folder that's 90% downloaded and missing preprocessor_config.json won't appear at all.

    device is auto, cuda or cpu. auto quietly falls back to CPU when there's no CUDA, and CPU is genuinely slow - the author measured 103 seconds for a single five-second clip, loading included. Picking cuda explicitly on a machine without CUDA throws instead of crawling, which is the better failure.

    keep_loaded defaults to true. That's right for a batch where you're scoring clip after clip. Turn it off and the model is released after every job - which you want when the SyncReward graph sits in the middle of a workflow and a video model needs that 10 GB back afterwards.

    The single output is model, and it only goes into SyncReward Score or SyncReward Select Best.

    Install

    Search "SyncReward" in ComfyUI Manager, or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/hiroki-abe-58/ComfyUI-SyncReward
    python -m pip install -r ComfyUI-SyncReward/requirements.txt
    

    That requirements file is short - transformers>=5.1.0, timm>=1.0.26, PyYAML - because the heavy lifting (PyAV for decoding, torch) already comes with ComfyUI. The transformers floor is not negotiable: the PE-AV encoder only exists in 5.1.0 and later.

    Then the weights:

    python custom_nodes/ComfyUI-SyncReward/tools/download_models.py --models-dir ComfyUI/models/syncreward
    

    You'll get syncreward-stage2 (~6.2 GB, from Guan123/SyncReward) and pe-av-large (~8.9 GB, Meta's encoder). The script pins the revisions the pack was verified against and checks SHA-256, so a truncated download fails loudly instead of producing a cryptic error at scoring time. Restart ComfyUI after both steps. workflows/gui/ ships example graphs, but their Load Video points at example.mp4, so swap in your own clip.

    Where it goes wrong

    Empty dropdowns are the number one issue, and it's almost always path or completeness - check that the folder is directly under models/syncreward/ and not nested one level deeper (a pe-av-large/pe-av-large/ from a manual download is a classic).

    The other one is quieter. On transformers 5.20 the PE-AV config gets read with 2 classifier labels instead of 1024 and the vision head comes out the wrong shape. The pack patches this before building the encoder, so you don't have to do anything - but if you see padding_mask_videos is part of ... get_video_features's signature, but not documented in the log during load, that's transformers being noisy, not a failure. Also expect your system commit charge to spike to 37–39 GiB while the encoder loads; the checkpoint gets read whole before the Stage-2 weights replace its towers. That's normal, and a machine with less RAM than that will struggle.

    One last thing to keep straight: this pack is an independent integration by hiroki-abe-58, not something Tencent or Meta publishes. The model code is vendored from the official repo (Apache-2.0), the node code is MIT, and the weights are yours to download separately.

    Categoryloaders/syncreward

    Inputs (4)

    NameTypeDefaultDescription
    checkpointCOMBOThe syncreward-stage2 folder of Guan123/SyncReward in models/syncreward
    encoderCOMBOThe facebook/pe-av-large folder in models/syncreward
    deviceCOMBOauto3 options: auto, cuda, cpu
    keep_loadedBOOLEANtrueKeep the model in memory after the job. Turn off to free VRAM for other models after every run.

    Outputs (1)

    NameTypeDescription
    modelSYNCREWARD_MODEL—