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 printedpython app_v1.1.pywhich is the fileapp_v1_1.py, 16GB and 12GB checklist, third-party ComfyUI links, Apache-2.0, disclaimer): https://github.com/ToTheBeginning/PuLID/blob/main/README.md commit75d225a557635d2534e37cdc9ce092bd0d0f4d22. Repository HEAD1aa2fc7df4bf51080df39f355f9abdc1cbfefbaa, 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): commit1aa2fc7df4bf51080df39f355f9abdc1cbfefbaadocs/pulid_v1.1.md(--baseids, Juggernaut-XL, RealVisXL, DreamShaper-XL-Lightning): commita66a6a1901729897fa1dc11d10397943caf15470requirements.txtandrequirements_fp8.txt: commits5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638and057ea7b504aeea739876f18a28254467199943f5app.py,app_v1_1.py,app_flux.py(launch host and ports,--basedefault,--versiondefaultv0.9.1,--portdefault8080): commitscce7cdd65b5bf283c1a39c29f2726902a3c135ca,5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638,1aa2fc7df4bf51080df39f355f9abdc1cbfefbaapulid/pipeline.py(stabilityai/stable-diffusion-xl-base-1.0,pulid_v1.bin,DIAMONIK7777/antelopev2; the lightning hub id is not printed here): commit30ff5912f09cfea2a762ce0fc1c5c9bfee8746c4pulid/pipeline_v1_1.py(pulid_v1.1.safetensors, constructor defaultLykon/dreamshaper-xl-lightning): commit5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638pulid/pipeline_flux.py(pulid_flux_{version}.safetensors, defaultversionv0.9.0): commit5f746e075da1fdd1f46d57a2b6adb9f2fe8bf638flux/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_cliphub id not printed here): commit1aa2fc7df4bf51080df39f355f9abdc1cbfefbaaLICENSE(Apache-2.0, unfilled copyright template): commit6bfef55bb7467be5107cf6c756164a9a7de8e5bd. 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,gatedfalse),black-forest-labs/FLUX.1-devandFLUX.1-Krea-dev(gatedauto,cardData.licenseother),XLabs-AI/flux-dev-fp8(gatedfalse,cardData.licenseother),stabilityai/stable-diffusion-xl-base-1.0(openrail++,gatedfalse),DIAMONIK7777/antelopev2(gatedfalse, 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_at2026-11-13T07:04:10.079Z) and https://cloudgpu.app/v1/public/gpu-catalog (generated_at2026-11-13T07:04:10.751Z).GET /v1/public/compute-capabilitiesreturned 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).