How to run PuLID on a cloud GPU

Rent a GPU on Deploy, then open a terminal in JupyterLab or over SSH. Install PuLID from the official ToTheBeginning/PuLID repository, download the FLUX or SDXL files that repository documents, and run the Gradio app for the variant you chose. Copy the image off the instance before you destroy it, because destroying the instance deletes its disk.

Identity from a different repository: How to run InstantID on a cloud GPU. Image prompts in ComfyUI: How to use IPAdapter in ComfyUI on a cloud GPU. The ComfyUI FLUX.1-dev install is How to run FLUX.1-dev in ComfyUI on a cloud GPU. How published FLUX and SDXL weight sizes are read: How much VRAM do I need for FLUX and SDXL. If the process runs out of memory: How to fix CUDA out of memory on a cloud GPU. The tunnel for the Gradio app is How to use SSH port forwarding on a cloud GPU.

Use a face you have the right to use. The README disclaimer says users are expected to comply with local laws and use the tool responsibly, and that the developers do not assume responsibility for misuse. The repository LICENSE file is the Apache License, Version 2.0, January 2004, and the appendix copyright line is still the unfilled template Copyright [yyyy] [name of copyright owner]. The GitHub license field on 2026-11-13 was Apache-2.0. The model card for guozinan/PuLID that day had top-level license null, cardData.license apache-2.0, and gated false, lastModified 2024-10-31T16:02:47.000Z. The README author line names an organization. This page does not print that name. docs/pulid_for_flux.md says that as long as you use the FLUX.1-dev model, you should follow the FLUX.1-dev model license, and it links model_licenses/LICENSE-FLUX1-dev. That file is titled FLUX.1 [dev] Non-Commercial License v1.1.1. Section 2.b says you may use the model only for Non-Commercial Purposes. The definition of Non-Commercial Purpose includes the condition that you do not receive any direct or indirect payment arising from the use of the model. The model API for black-forest-labs/FLUX.1-dev on 2026-11-13 returned gated auto, top-level license null, and cardData.license other, lastModified 2025-06-27T16:22:19.000Z. black-forest-labs/FLUX.1-Krea-dev returned gated auto, top-level license null, and cardData.license other, lastModified 2025-07-31T14:33:39.000Z. This page did not read a separate Krea license file. Read each file before you redistribute the program or the weights.

The commands below are copied from the upstream files named in each step. They were not run on a CloudGPU instance for this page. Anything this page adds around them is marked.

What the README and the FLUX doc say about memory

The README checklist says PuLID-FLUX can run on a 16GB graphic card, and that the local Gradio demo supports a 12GB graphic card. docs/pulid_for_flux.md prints the peak-memory sentences for these commands (read 2026-11-13):

Command the doc prints Peak memory the doc prints
python app_flux.py under 45GB
python app_flux.py --offload under 30GB
python app_flux.py --offload --fp8 --onnx_provider cpu under 15GB, for a GPU with 16GB memory
python app_flux.py --offload --fp8 under 17GB, for 24GB graphic memory
python app_flux.py --aggressive_offload --fp8 --onnx_provider cpu about 11GB, for 12GB graphic memory
python app_flux.py --aggressive_offload around 23GB

The same doc says aggressive offload is very slow because of memory transfers between CPU and GPU at each timestep, and that fp8 and bf16 differ in image quality. Those sentences are the doc’s. This page did not remeasure them. The README, requirements.txt, and requirements_fp8.txt print no separate GPU GB figure.

GET /v1/public/compute-capabilities does not list GPUs. It returns feature flags. The memory column is vram_gb from gpu-prices.json, updated_at 2026-11-13T07:04:10.079Z. GET /v1/public/gpu-catalog the same day (generated_at 2026-11-13T07:04:10.751Z) listed the same names and the same vram_gb values, plus Ascend 910B at 64, which is not in gpu-prices.json and is not listed here. The catalog response also includes an availability field. This page does not copy it. Every prices row has gpu_count 1. Catalog RTX 3080 Ti is 12. Catalog RTX 2080 Ti is 11. Catalog RTX 3080 is 10. Catalog RTX 2080 is 8, which is below the README’s 12GB sentence. Catalog V100 16G is 16. Catalog RTX 4090 is 24. Those catalog numbers are not the peak-memory cells. This page did not run PuLID and does not mark a row as enough. Which listing you can start is on Deploy.

The catalog template list had no PuLID template.

Catalog name vram_gb
RTX 2080 8
RTX 3080 10
RTX 2080 Ti 11
RTX 3080 Ti 12
V100 16G 16
A30 24
RTX 3090 24
RTX 4090 24
RTX 4090D 24
RTX 4080 SUPER 32G 32
RTX 5090 32
RTX 5090D 32
V100 32G 32
A100 40G 40
A800 40G 40
A40 48
RTX 4090 48G 48
RTX 4090D 48G 48
RTX A6000 48
NVIDIA RTX PRO 5000 72G 72
RTX PRO 5000 72G 72
A100 80G 80
A800 80G 80
H800 80
RTX 6000D 83
H20 96G 96
RTX PRO 6000 96G 96
RTX PRO 6000 Max-Q 96
H20-3e 141G 141

Install

On Deploy, choose Raw GPU. The README says Python >= 3.9, and PyTorch >= 2.0 if you do not need flux-dev-fp8, otherwise PyTorch >= 2.4.1. The install block, copied:

# clone PuLID repo
git clone https://github.com/ToTheBeginning/PuLID.git
cd PuLID
# create conda env
conda create --name pulid python=3.10
# activate env
conda activate pulid
# Install dependent packages
# 1. if you don't need flux-fp8, e.g., you are using xl or flux-bf16, install the following requirements.txt
pip install -r requirements.txt
# 2. if you need flux-fp8 (to put flux on consumer-grade gpu), install the following requirements_fp8.txt
pip install -r requirements_fp8.txt

requirements.txt pins torch==2.0.1, torchvision==0.15.2, diffusers==0.25.0, transformers==4.43.3, and gradio>=4.0.0. It does not print a CUDA index URL. requirements_fp8.txt pins torch==2.4.1, torchvision==0.19.1, diffusers==0.30.0, transformers==4.43.3, optimum-quanto==0.2.4, and gradio>=4.0.0. It does not print a CUDA index URL. The FLUX doc says to install requirements-fp8.txt. The filename in the repository is requirements_fp8.txt, which is the name the README install block prints. This page did not install either file. The commits API for the default branch main listed 1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa, committed 2025-07-31T18:08:25Z. The commits API for README.md listed 75d225a557635d2534e37cdc9ce092bd0d0f4d22, committed 2025-05-08T14:59:00Z. requirements.txt was 5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638, committed 2024-10-31T20:08:30Z. requirements_fp8.txt was 057ea7b504aeea739876f18a28254467199943f5, committed 2024-09-14T09:01:37Z.

The RTX 5090 guide says that card is compute capability 12.0 (sm_120) and that PyTorch 2.7 and later, on a build for CUDA 12.8 or newer, is the line that announced support. Neither requirements file pins that line. This page did not re-test PuLID on an RTX 5090. Catalog RTX 5090 and RTX 5090D are 32. That is the catalog number only.

The documented FLUX and SDXL variants

The README model zoo, copied:

Version Base Model File the README links
PuLID-v1 SDXL pulid_v1.bin
PuLID-v1.1 SDXL pulid_v1.1.safetensors
PuLID-FLUX-v0.9.0 FLUX pulid_flux_v0.9.0.safetensors
PuLID-FLUX-v0.9.1 FLUX pulid_flux_v0.9.1.safetensors

The README says PuLID-FLUX-v0.9.1 improved the quantitative metric of ID similarity by about 5 percentage points compared with v0.9.0. That sentence is the README’s. This page did not remeasure it. The four links point at guozinan/PuLID on Hugging Face. pulid/pipeline.py downloads pulid_v1.bin into models. pulid/pipeline_v1_1.py downloads pulid_v1.1.safetensors into models. pulid/pipeline_flux.py load_pretrain downloads pulid_flux_{version}.safetensors into models. The default version argument in that function is v0.9.0. app_flux.py defaults --version to v0.9.1, with choices v0.9.0 and v0.9.1.

The FLUX doc says to download flux1-dev.safetensors, if you want bf16 rather than fp8, and ae.safetensors from black-forest-labs/FLUX.1-dev. It says the PuLID-FLUX model is downloaded from guozinan/PuLID. flux/util.py sets flux-dev repo_id to black-forest-labs/FLUX.1-dev, repo_flow to flux1-dev.safetensors, and repo_ae to ae.safetensors. It sets flux-krea-dev repo_id to black-forest-labs/FLUX.1-Krea-dev, repo_flow to flux1-krea-dev.safetensors, and repo_ae to ae.safetensors. The FLUX doc’s 2025.08.01 note says to add --name flux-krea-dev when running app_flux.py. app_flux.py defaults --name to flux-dev, with choices flux-dev and flux-krea-dev. The help string on that argument says “currently only support flux-dev”. For fp8, the doc says the flux-dev-fp8 checkpoint from XLabs-AI/flux-dev-fp8 is downloaded automatically, or you can put it in the models folder. The function that loads it is named load_flow_model_quintized. It downloads flux-dev-fp8.safetensors and flux_dev_quantization_map.json from XLabs-AI/flux-dev-fp8. The model API for that repo on 2026-11-13 returned gated false, top-level license null, and cardData.license other. load_t5 uses xlabs-ai/xflux_text_encoders. load_clip passes a hub id this page does not print. Copy that call from flux/util.py.

For the SDXL v1 app, pulid/pipeline.py sets sdxl_base_repo to stabilityai/stable-diffusion-xl-base-1.0 and calls from_pretrained with torch.float16 and variant="fp16". The model API for that repo on 2026-11-13 returned gated false, top-level license null, and cardData.license openrail++, lastModified 2023-10-30T16:03:47.000Z. The same file sets sdxl_lightning_repo to a hub id this page does not print, and hf_hub_download fetches sdxl_lightning_4step_unet.safetensors from that id. Copy that assignment from pulid/pipeline.py. It also calls snapshot_download('DIAMONIK7777/antelopev2', local_dir='models/antelopev2'). The model API for DIAMONIK7777/antelopev2 on 2026-11-13 returned gated false and no license field in the card metadata this page read. pipeline_flux.py and pipeline_v1_1.py call the same snapshot_download.

docs/pulid_v1.1.md says PuLID-v1.1 was tested on Juggernaut-XL, RealVisXL, and DreamShaper-XL-Lightning. Its usage block says --base can be RunDiffusion/Juggernaut-XL-v9 or Lykon/dreamshaper-xl-lightning. app_v1_1.py defaults --base to RunDiffusion/Juggernaut-XL-v9. The choices are those two ids. A third choice, for RealVisXL, is commented and the comment says “will add it later”. This page does not uncomment it. When the base id contains lightning, the script sets args.sampler to dpmpp_sde, default_cfg to 2.0, and default_steps to 5. Otherwise it sets dpmpp_2m, 7.0, and 25. It then calls PuLIDPipeline(sdxl_repo=args.base, sampler=args.sampler). pipeline_v1_1.py defaults its constructor sdxl_repo to Lykon/dreamshaper-xl-lightning. The app passes args.base, so that constructor default is not the app default.

Gradio

The README’s local demo commands are python app.py for v1 and python app_v1.1.py --base BASE_MODEL for v1.1. The repository file is app_v1_1.py. The comment and the underscore filename below are this page’s correction. docs/pulid_v1.1.md prints the same dotted name.

# for v1 version
python app.py

# for v1.1 version
# The README prints app_v1.1.py. The file in the repository is app_v1_1.py.
python app_v1_1.py --base BASE_MODEL

The v1.1 usage lines under the README command say -base can be RunDiffusion/Juggernaut-XL-v9 or Lykon/dreamshaper-xl-lightning. BASE_MODEL in the fence is the README’s placeholder. app.py calls demo.launch(server_name='0.0.0.0') and does not pass a port. app_v1_1.py defaults --port to 7860 and calls demo.launch(server_name='0.0.0.0', server_port=args.port).

The FLUX doc’s four commands are the table above. app_flux.py defaults --port to 8080, --device to cuda, --onnx_provider to gpu, and --version to v0.9.1. It calls demo.launch(server_name='0.0.0.0', server_port=args.port). --offload, --aggressive_offload, and --fp8 are store-true flags. The commits API listed app.py at cce7cdd65b5bf283c1a39c29f2726902a3c135ca (2024-09-12T06:56:44Z), app_v1_1.py at 5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638 (2024-10-31T20:08:30Z), and app_flux.py at 1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa (2025-07-31T18:08:25Z). This page did not start any of the three apps. Forward the local URL the process prints with how to use SSH port forwarding on a cloud GPU. The image comes back to the Gradio widget. These three files do not assign a project output directory.

ComfyUI

The README Related Resources list calls two ComfyUI repositories third-party implementations: cubiq/PuLID_ComfyUI and ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO. The GitHub license field on 2026-11-13 was Apache-2.0 for the first and GPL-3.0 for the second. This page did not copy their install commands. docs/pulid_for_flux.md says “Please stay tuned for the community implementation” and does not link those two repositories. Installing ComfyUI itself is How to install ComfyUI and ComfyUI-Manager on a cloud GPU. The ComfyUI examples top-level directory list on 2026-11-13 had no directory named for this project. Examples HEAD was f9431bb000ce792094ff345446e22cac1ea6cef3, committed 2025-11-26T20:33:58Z.

When it fails

CUDA out of memory. The FLUX doc’s response is one of the commands in the table above. The SDXL scripts this page read do not print a second low-memory flag. If the process raises that error, use how to fix CUDA out of memory on a cloud GPU.

“CUDA error: no kernel image is available for execution on the device” on an RTX 5090. See the install section. This page did not re-test the package on that card.

fp8 requirements filename. The README install block prints requirements_fp8.txt. The FLUX doc prints requirements-fp8.txt. The file in the repository is requirements_fp8.txt.

Save the image, then destroy

Download the image from the Gradio widget before you destroy the instance. The launch scripts this page read do not set a project output directory. The models directory is the weight download path, not the generated image. Save your work before you destroy a cloud GPU is the checklist. The terms say data on local instance storage is permanently deleted when the instance is destroyed.

The pricing page FAQ states the billing rule in these words:

Per-minute options have a 1-minute minimum; unused prepaid minutes are refunded when you destroy the instance. Some configurations use whole-hour billing with a 1-hour minimum; unused time within a charged hour is not refunded on voluntary stop. The billing period, minimum charge and initial prepayment are shown before confirmation. No subscription.

Frequently asked questions

Which peak-memory figures does the PuLID FLUX doc print?

The README checklist says PuLID-FLUX can run on a 16GB graphic card and that the local Gradio demo supports a 12GB graphic card. docs/pulid_for_flux.md prints under 45GB for python app_flux.py, under 30GB with --offload, under 15GB for a 16GB GPU with --offload --fp8 --onnx_provider cpu, under 17GB for 24GB graphic memory with --offload --fp8, about 11GB for 12GB graphic memory with --aggressive_offload --fp8 --onnx_provider cpu, and around 23GB with --aggressive_offload. Catalog RTX 2080 is 8, which is below the 12GB sentence. Catalog V100 16G is 16. Catalog RTX 4090 is 24. Those are catalog numbers, not the peak-memory cells. This page did not run PuLID and does not mark a catalog row as enough. Which listing you can start is on https://cloudgpu.app/deploy.

Which FLUX and SDXL files does the repository document?

The README model zoo lists pulid_v1.bin and pulid_v1.1.safetensors on SDXL, and pulid_flux_v0.9.0.safetensors and pulid_flux_v0.9.1.safetensors on FLUX, all linked from guozinan/PuLID. The FLUX doc says to download flux1-dev.safetensors and ae.safetensors from black-forest-labs/FLUX.1-dev for bf16, and it says the fp8 checkpoint comes from XLabs-AI/flux-dev-fp8. flux/util.py also names black-forest-labs/FLUX.1-Krea-dev. The FLUX doc says to add --name flux-krea-dev. app_flux.py defaults --version to v0.9.1. For SDXL v1, pulid/pipeline.py sets sdxl_base_repo to stabilityai/stable-diffusion-xl-base-1.0. It also downloads sdxl_lightning_4step_unet.safetensors from a hub id this page does not print. Copy that assignment from pulid/pipeline.py. app_v1_1.py defaults --base to RunDiffusion/Juggernaut-XL-v9, and the other choice is Lykon/dreamshaper-xl-lightning.

Which command starts Gradio, and what does the README say about ComfyUI?

The README prints python app_v1.1.py for v1.1. The file in the repository is app_v1_1.py, so the command is python app_v1_1.py --base BASE_MODEL. v1 is python app.py. app.py calls demo.launch(server_name=‘0.0.0.0’) and does not pass a port. app_v1_1.py defaults --port to 7860. The FLUX doc starts app_flux.py, and that file defaults --port to 8080. All three bind server_name 0.0.0.0. This page did not start them. The README lists cubiq/PuLID_ComfyUI and ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO as third-party implementations. The FLUX doc says to stay tuned for the community implementation and does not link those two repositories. The ComfyUI examples top-level directory list on 2026-11-13 had no directory named for this project.

Which license covers the PuLID code and the FLUX.1-dev weights?

The repository LICENSE file is the Apache License, Version 2.0, January 2004, and the appendix copyright line is still the unfilled template. The GitHub license field on 2026-11-13 was Apache-2.0. The guozinan/PuLID card had cardData.license apache-2.0, top-level license null, and gated false. docs/pulid_for_flux.md says FLUX.1-dev use follows the FLUX.1-dev model license. That file is the FLUX.1 [dev] Non-Commercial License v1.1.1. Section 2.b limits use to Non-Commercial Purposes, and the definition includes the condition that you do not receive any direct or indirect payment from that use. The FLUX.1-dev model API returned gated auto and cardData.license other. This page did not read a separate Krea license file. Read each file before you redistribute the program or the weights.

Sources (read 2026-11-13, Asia/Shanghai)

  • PuLID README (clone, conda, requirements.txt, requirements_fp8.txt, model zoo, python app.py, the printed python app_v1.1.py which is the file app_v1_1.py, 16GB and 12GB checklist, third-party ComfyUI links, Apache-2.0, disclaimer): https://github.com/ToTheBeginning/PuLID/blob/main/README.md commit 75d225a557635d2534e37cdc9ce092bd0d0f4d22. Repository HEAD 1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa, committed 2025-07-31T18:08:25Z
  • docs/pulid_for_flux.md (peak-memory commands, black-forest-labs/FLUX.1-dev, XLabs-AI/flux-dev-fp8, --name flux-krea-dev, about 5 percentage points, FLUX.1-dev license link, “stay tuned” ComfyUI sentence): commit 1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa
  • docs/pulid_v1.1.md (--base ids, Juggernaut-XL, RealVisXL, DreamShaper-XL-Lightning): commit a66a6a1901729897fa1dc11d10397943caf15470
  • requirements.txt and requirements_fp8.txt: commits 5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638 and 057ea7b504aeea739876f18a28254467199943f5
  • app.py, app_v1_1.py, app_flux.py (launch host and ports, --base default, --version default v0.9.1, --port default 8080): commits cce7cdd65b5bf283c1a39c29f2726902a3c135ca, 5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638, 1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa
  • pulid/pipeline.py (stabilityai/stable-diffusion-xl-base-1.0, pulid_v1.bin, DIAMONIK7777/antelopev2; the lightning hub id is not printed here): commit 30ff5912f09cfea2a762ce0fc1c5c9bfee8746c4
  • pulid/pipeline_v1_1.py (pulid_v1.1.safetensors, constructor default Lykon/dreamshaper-xl-lightning): commit 5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638
  • pulid/pipeline_flux.py (pulid_flux_{version}.safetensors, default version v0.9.0): commit 5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638
  • flux/util.py (black-forest-labs/FLUX.1-dev, black-forest-labs/FLUX.1-Krea-dev, XLabs-AI/flux-dev-fp8, xlabs-ai/xflux_text_encoders; load_clip hub id not printed here): commit 1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa
  • LICENSE (Apache-2.0, unfilled copyright template): commit 6bfef55bb7467be5107cf6c756164a9a7de8e5bd. GitHub license field Apache-2.0
  • FLUX.1 [dev] Non-Commercial License v1.1.1: https://github.com/black-forest-labs/flux/blob/main/model_licenses/LICENSE-FLUX1-dev commit 474dc4205306cb76c46ba510e35eec7bbed5efd1
  • Model cards guozinan/PuLID (apache-2.0, gated false), black-forest-labs/FLUX.1-dev and FLUX.1-Krea-dev (gated auto, cardData.license other), XLabs-AI/flux-dev-fp8 (gated false, cardData.license other), stabilityai/stable-diffusion-xl-base-1.0 (openrail++, gated false), DIAMONIK7777/antelopev2 (gated false, no license field read on the card), read 2026-11-13
  • cubiq/PuLID_ComfyUI (GitHub license field Apache-2.0) and ZHO-ZHO-ZHO/ComfyUI-PuLID-ZHO (GitHub license field GPL-3.0). This page did not copy their install commands
  • ComfyUI examples top-level directories (no PuLID directory): https://github.com/comfyanonymous/ComfyUI_examples commit f9431bb000ce792094ff345446e22cac1ea6cef3
  • Public GPU memory: https://cloudgpu.app/gpu-prices.json (updated_at 2026-11-13T07:04:10.079Z) and https://cloudgpu.app/v1/public/gpu-catalog (generated_at 2026-11-13T07:04:10.751Z). GET /v1/public/compute-capabilities returned feature flags and no GPU list. The catalog had no PuLID template

Cards you can start are on the Deploy page. Prices are on https://cloudgpu.app/pricing and are not repeated here.

Last updated: 2026-11-13 (Asia/Shanghai).