Load PuLID Model
The PuLID model file isn't magic — this node just makes it loadable
- PULID
One dropdown, one PULID object, the whole pack downstream
Load PuLID Model is the boring node in this pack, and that's a compliment. It has a single input - a dropdown of model files - and a single output of type PULID. Everything else in cubiq's PuLID_ComfyUI pack hangs off what it hands you: the Apply PuLID node refuses to do anything until a PULID object walks in the door.
What it's actually doing: reading a .safetensors checkpoint and turning it into a PulidModel - an IDEncoder plus a set of per-layer linear projections (To_KV) that know how to shove an identity embedding into SDXL's cross-attention. Worth knowing: the loader builds the whole thing up front, on purpose. There's a comment in the source saying it takes longer to load but saves you from re-initializing the model every time you twiddle a weight in the Apply node. That's why the first run feels slow and every run after is fine.
The file it expects
The dropdown reads ComfyUI/models/pulid/, and there's exactly one file you want there for this pack: ip-adapter_pulid_sdxl_fp16.safetensors, courtesy of huchenlei, who converted the original weights into IP-Adapter format so cubiq's code could consume them. It doesn't ship with the repo - you download it and drop it in:
# from your ComfyUI root
mkdir -p models/pulid
# grab ip-adapter_pulid_sdxl_fp16.safetensors from huchenlei/ipadapter_pulid on Hugging Face
# and put it in models/pulid/
Restart ComfyUI and the file appears in the dropdown. If the dropdown is empty, that's the whole story: nothing in models/pulid, nothing to load.
The wider picture
Quick reality check, because the naming trips people up constantly: this is the SDXL version of PuLID. If you landed here wanting a face on Flux, you're in the wrong repo - the Flux port is a different node pack entirely (balazik's, later lldacing's "PuLID Flux II"). This one, ByteDance's original "Classic" line for SDXL, is what you reach for when you're on an SDXL, Illustrious or Pony workflow and want a specific face injected without training a LoRA. It's the same contrastive-alignment trick that made PuLID's name: identity injection that doesn't wreck prompt adherence, because a parallel training branch keeps the conditioned output close to the unconditioned one.
The author is cubiq - Matteo, the same person behind ComfyUI_IPAdapter_plus, the de-facto standard IP-Adapter implementation. He's stated the repo is in maintenance-only mode since April 2025, which for a finished loader like this is fine: it does its one job and nothing in it needs daily attention.
Install and gotchas
Install is the same for every node in this pack, and it's the usual two-liner:
cd ComfyUI/custom_nodes
git clone https://github.com/cubiq/PuLID_ComfyUI
Restart ComfyUI, or use ComfyUI Manager and search "PuLID". The real work is the dependencies and the other two models (InsightFace's antelopev2 and the EVA-CLIP that auto-downloads) - see the Load InsightFace and Load Eva Clip articles, because this loader is useless until those are in place. One honest warning: InsightFace's install is where people get burned; expect to fight with it at least once. And the antelopev2 face models are non-commercial, so if the output is going to be sold, that license follows you.
Inputs (1)
| Name | Type | Default | Description |
|---|---|---|---|
| pulid_file | COMBO | 0 options: |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| PULID | PULID | — |