Windows 本地部署 IDM-VTON 虚拟试衣:排障版教程
这不是一篇单纯照搬 README 执行命令的常规部署文档,而是结合真实落地排障经验整理的专业技术指南。本文不讲空泛理论,严格按照工程排障流程,拆解 Windows 本地运行 IDM-VTON 的高频报错根源、成因以及针对性解决方案。
一、问题背景
IDM-VTON 原生项目并非为 Windows 本地环境量身设计,原生适配场景偏向:
- Linux CUDA 专属运行环境
- Hugging Face Space 在线部署场景
- 预下载完整模型缓存 & Checkpoint 的标准环境
因此直接在 Windows 照搬官方命令操作,极易出现典型困境:
依赖安装完成、源码文件齐全、执行命令无误,但项目始终无法正常运行。
这类故障属于多层问题叠加导致,核心诱因包含:
- 项目启动入口选择错误
- Checkpoint 权重文件缺失 / 占位无效
- 主模型强依赖 Hugging Face 官方仓库联网拉取
- 本地模型缓存未被程序优先调用
- Gradio 框架与周边依赖版本组合存在兼容性冲突
二、分清项目启动入口
项目仓库内存在易混淆的入口文件,选错入口会让后续所有排障工作偏离方向:
gradio_demo/app.py
✅ Windows 本地正确启动方式
python gradio_demo/app.py
三、基础运行环境推荐
硬件 & 系统要求
- 系统:Windows 10 / Windows 11 64 位
- Python:3.10 稳定版本
- 显卡:NVIDIA 独立显卡,显存≥8GB
- 基础依赖:CUDA 可用的 PyTorch 环境、Git
虚拟环境搭建
git clone https://github.com/yisol/IDM-VTON.git
cd IDM-VTON
支持 venv / Conda 两种方案,本次 Windows 实测稳定可用版本为 Python3.10 虚拟环境。
-
1. Venv 方式(本次实测)
python -m venv .venv
..venv\Scripts\activate -
2. Conda 方式
conda env create -f environment.yaml
conda activate idm
四、项目依赖标准安装顺序
优先安装匹配 CUDA 版本的 PyTorch,再安装项目其余依赖,顺序不可颠倒:
官方推荐的配置
# 安装 CUDA11.8 适配 PyTorch(依赖项和版本要求在 environment.yaml 文件中)
我们实际使用的配置:
# 安装 CUDA12.6 适配 PyTorch
pip install torch==2.6.0 torchvision==0.21.0 torchaudio==2.6.0 --index-url https://download.pytorch.org/whl/cu126
# 安装项目基础依赖
pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cu126
实测稳定运行后导出的 requirements.txt 文件内容
absl-py==2.4.0
accelerate==0.25.0
addict==2.4.0
aiofiles==23.2.1
altair==5.5.0
annotated-doc==0.0.4
annotated-types==0.7.0
antlr4-python3-runtime==4.9.3
anyio==4.13.0
argcomplete==3.6.2
argon2-cffi @ file:///opt/conda/conda-bld/argon2-cffi_1645000214183/work
argon2-cffi-bindings @ file:///C:/b/abs_f11axiliot/croot/argon2-cffi-bindings_1736182463870/work
asttokens @ file:///C:/b/abs_9662ywy9fp/croot/asttokens_1743630464377/work
async-lru @ file:///C:/b/abs_e0hjkvwwb5/croot/async-lru_1699554572212/work
attrs @ file:///C:/b/abs_89hmquz5ga/croot/attrs_1734533130810/work
av==17.0.0
babel @ file:///C:/b/abs_ffzt1bmjth/croot/babel_1737454394148/work
backports.tarfile==1.2.0
basicsr==1.4.2
beautifulsoup4 @ file:///C:/b/abs_95vq944bnw/croot/beautifulsoup4-split_1756453107890/work
bitsandbytes==0.39.0
bleach @ file:///C:/b/abs_925i9psm3u/croot/bleach_1732292896852/work
brotlicffi @ file:///C:/b/abs_f4lixvzmxt/croot/brotlicffi_1736183286104/work
build==1.3.0
CacheControl==0.14.3
cachetools==6.2.0
certifi==2026.2.25
cffi @ file:///C:/b/abs_29_b57if3f/croot/cffi_1736184144340/work
chardet==5.2.0
charset-normalizer @ file:///croot/charset-normalizer_1721748349566/work
cleo==2.1.0
click==8.3.1
cloudpickle==3.1.2
colorama==0.4.6
coloredlogs==15.0.1
colorlog==6.9.0
comm @ file:///C:/b/abs_67a8058udb/croot/comm_1709322909844/work
contourpy==1.3.2
crashtest==0.4.1
cycler==0.12.1
debugpy @ file:///C:/miniconda3/conda-bld/debugpy_1757067176466/work
decorator @ file:///C:/miniconda3/conda-bld/decorator_1757341256088/work
defusedxml @ file:///tmp/build/80754af9/defusedxml_1615228127516/work
dependency-groups==1.3.1
diffusers==0.25.0
distlib==0.4.0
dulwich==0.22.8
einops==0.7.0
exceptiongroup==1.3.1
executing @ file:///C:/miniconda3/conda-bld/executing_1757061252959/work
fastapi==0.135.2
fastjsonschema @ file:///C:/b/abs_4ev90296ly/croot/python-fastjsonschema_1731939386416/work
ffmpy==1.0.0
filelock==3.25.2
findpython==0.6.3
flatbuffers==25.12.19
fonttools==4.62.1
fsspec==2026.2.0
future==1.0.0
fvcore==0.1.5.post20221221
gradio==4.24.0
gradio_client==0.14.0
grpcio==1.78.0
h11==0.16.0
hatch==1.14.1
hatchling==1.27.0
hf-xet==1.4.2
httpcore==1.0.9
httpx==0.28.1
huggingface-hub==0.25.2
humanfriendly==10.0
hyperlink==21.0.0
idna==3.11
ImageIO==2.37.3
importlib_metadata==8.7.0
importlib_resources==6.5.2
installer==0.7.0
iopath==0.1.10
ipykernel @ file:///C:/b/abs_6c9ggygp01/croot/ipykernel_1737660720620/work
ipython @ file:///C:/b/abs_8eyhzleyrk/croot/ipython_1734548134403/work
jaraco.classes==3.4.0
jaraco.context==6.0.1
jaraco.functools==4.3.0
jedi @ file:///C:/b/abs_3a2kbnlclc/croot/jedi_1733987412687/work
Jinja2==3.0.3
json5 @ file:///C:/b/abs_743lprxrv5/croot/json5_1730786818336/work
jsonschema @ file:///C:/b/abs_4d8dstds3t/croot/jsonschema_1753206424024/work
jsonschema-specifications @ file:///C:/b/abs_0brvm6vryw/croot/jsonschema-specifications_1699032417323/work
jupyter-events @ file:///C:/b/abs_9cm3qlticu/croot/jupyter_events_1741184612840/work
jupyter-lsp @ file:///C:/b/abs_7171flzdkg/croot/jupyter-lsp-meta_1745827033118/work
jupyter_client @ file:///C:/b/abs_149bw133if/croot/jupyter_client_1737570986926/work
jupyter_core @ file:///C:/b/abs_7c6fipznw3/croot/jupyter_core_1751991383524/work
jupyter_server @ file:///C:/b/abs_cdpu8und98/croot/jupyter_server_1751996637146/work
jupyter_server_terminals @ file:///C:/b/abs_adjrm9dtns/croot/jupyter_server_terminals_1744706714294/work
jupyterlab @ file:///C:/b/abs_c7v27765d6/croot/jupyterlab_1756453154931/work
jupyterlab_pygments @ file:///C:/b/abs_d5alfet8m6/croot/jupyterlab_pygments_1741124274578/work
jupyterlab_server @ file:///C:/b/abs_fdi5r_tpjc/croot/jupyterlab_server_1725865372811/work
keyring==25.6.0
kiwisolver==1.5.0
lazy-loader==0.5
lightning-utilities==0.15.3
lmdb==2.1.1
Markdown==3.10.2
markdown-it-py==4.0.0
MarkupSafe==2.1.3
matplotlib==3.10.8
matplotlib-inline @ file:///C:/ci/matplotlib-inline_1661934094726/work
mdurl==0.1.2
mistune @ file:///C:/b/abs_77yql3poyz/croot/mistune_1741124004410/work
more-itertools==10.8.0
mpmath==1.3.0
msgpack==1.1.1
narwhals==2.18.1
nbclient @ file:///C:/b/abs_a09c4t3h8x/croot/nbclient_1741124030330/work
nbconvert @ file:///C:/b/abs_c27_60dzt8/croot/nbconvert-meta_1741191385337/work
nbformat @ file:///C:/b/abs_c2jkw46etm/croot/nbformat_1728050303821/work
nest-asyncio @ file:///C:/b/abs_65d6lblmoi/croot/nest-asyncio_1708532721305/work
networkx==3.4.2
notebook @ file:///C:/b/abs_ddnsjx06fh/croot/notebook_1756709315423/work
notebook_shim @ file:///C:/b/abs_9ctyfgpncn/croot/notebook-shim_1741707829491/work
nox==2025.5.1
numpy==1.26.4
omegaconf==2.3.0
onnxruntime-gpu==1.16.2
opencv-python==4.11.0.86
orjson==3.11.7
overrides @ file:///C:/b/abs_cfh89c8yf4/croot/overrides_1699371165349/work
packaging==26.0
pandas==2.3.3
pandocfilters @ file:///C:/miniconda3/conda-bld/pandocfilters_1756977625119/work
parso @ file:///C:/b/abs_834b4mj92b/croot/parso_1733963322289/work
pathspec==0.12.1
pbs-installer==2025.9.2
pexpect==4.9.0
pillow==10.4.0
pipenv==2025.0.4
pipx==1.7.1
pkginfo==1.12.1.2
platformdirs==4.4.0
pluggy==1.6.0
poetry==2.1.4
poetry-core==2.1.3
poetry-plugin-shell==1.0.1
portalocker==3.2.0
prometheus_client @ file:///C:/b/abs_8b175q_ub8/croot/prometheus_client_1744271638821/work
prompt-toolkit @ file:///C:/b/abs_68uwr58ed1/croot/prompt-toolkit_1704404394082/work
protobuf==7.34.1
psutil @ file:///C:/miniconda3/conda-bld/psutil_1757104557256/work
ptyprocess==0.7.0
pure_eval @ file:///C:/miniconda3/conda-bld/pure_eval_1757067068391/work
pycocotools==2.0.11
pycparser @ file:///C:/miniconda3/conda-bld/pycparser_1757496059965/work
pydantic==2.12.5
pydantic_core==2.41.5
pydub==0.25.1
Pygments==2.19.2
pyparsing==3.3.2
pyproject-api==1.9.1
pyproject_hooks==1.2.0
pyreadline3==3.5.4
PySocks @ file:///C:/ci_310/pysocks_1642089375450/work
python-dateutil==2.9.0.post0
python-json-logger @ file:///C:/b/abs_0cm_mnox0z/croot/python-json-logger_1734370042436/work
python-multipart==0.0.22
pytz==2026.1.post1
pywin32 @ file:///C:/b/abs_6c9w_vp9zi/croot/pywin32_1754670534373/work
pywin32-ctypes==0.2.3
pywinpty @ file:///C:/b/abs_883wh7sts8/croot/pywinpty_1741871674963/work
PyYAML==6.0.3
pyzmq @ file:///C:/b/abs_f3yte6j5yn/croot/pyzmq_1734711069724/work
RapidFuzz==3.14.1
referencing @ file:///C:/b/abs_09f4hj6adf/croot/referencing_1699012097448/work
regex==2026.2.28
requests @ file:///C:/b/abs_f53smfvswb/croot/requests_1756709376206/work
requests-toolbelt==1.0.0
rfc3339-validator @ file:///C:/b/abs_ddfmseb_vm/croot/rfc3339-validator_1683077054906/work
rfc3986-validator @ file:///C:/b/abs_6e9azihr8o/croot/rfc3986-validator_1683059049737/work
rich==14.3.3
rpds-py @ file:///C:/b/abs_0c6z5kcdb6/croot/rpds-py_1736545465023/work
ruff==0.15.7
safetensors==0.7.0
scikit-image==0.24.0
scipy==1.11.1
semantic-version==2.10.0
Send2Trash @ file:///C:/b/abs_7e73ol18dl/croot/send2trash_1736542724140/work
shellingham==1.5.4
six==1.17.0
sniffio @ file:///C:/b/abs_3akdewudo_/croot/sniffio_1705431337396/work
soupsieve @ file:///C:/b/abs_bbsvy9t4pl/croot/soupsieve_1696347611357/work
stack_data @ file:///C:/miniconda3/conda-bld/stack_data_1757067051465/work
starlette==1.0.0
sympy==1.13.1
tabulate==0.10.0
tb-nightly==2.21.0a20251023
tensorboard-data-server==0.7.2
termcolor==3.3.0
terminado @ file:///C:/b/abs_25nakickad/croot/terminado_1671751845491/work
tifffile==2025.5.10
tinycss2 @ file:///C:/b/abs_df38owi5ma/croot/tinycss2_1738337725183/work
tokenizers==0.15.2
tomli @ file:///C:/b/abs_88e598m6o8/croot/tomli_1753774604115/work
tomli_w==1.2.0
tomlkit==0.12.0
torch==2.6.0+cu126
torchaudio==2.6.0+cu126
torchmetrics==1.2.1
torchvision==0.21.0+cu126
tornado @ file:///C:/b/abs_7dzpc171lf/croot/tornado_1748956950306/work
tox==4.30.2
tqdm==4.67.3
traitlets @ file:///C:/b/abs_bfsnoxl4pq/croot/traitlets_1718227069245/work
transformers==4.36.2
triton-windows==3.6.0.post26
trove-classifiers==2025.9.9.12
typer==0.24.1
typing-inspection==0.4.2
typing_extensions==4.15.0
tzdata==2025.3
urllib3==2.6.3
userpath==1.9.2
uv==0.8.17
uvicorn==0.42.0
virtualenv==20.32.0
wcwidth @ file:///C:/b/abs_0c8p4c33bp/croot/wcwidth_1750352902378/work
webencodings==0.5.1
websocket-client @ file:///C:/b/abs_5dmnxxoci9/croot/websocket-client_1715878351319/work
websockets==11.0.3
Werkzeug==3.1.7
win-inet-pton @ file:///C:/ci_310/win_inet_pton_1642658466512/work
yacs==0.1.8
yapf==0.43.0
zipp==3.23.0
zstandard==0.24.0
关键纠正:Gradio 版本误区
多数教程单纯建议将 Gradio 降级至 3.50.2,这并非 Windows 稳定运行的核心解法 。本次实战通跑成功,不靠粗暴降级依赖,而是通过代码层补丁修复 Gradio 原生兼容漏洞,切勿将问题简化归类为版本降级即可解决。
五、前置校验:优先检查 Checkpoint 完整性
Windows 部署 80% 基础故障并非代码逻辑问题,而是本地权重资源残缺。启动项目前务必核对以下文件真实存在(运行 python gradio_demo/app.py 自动下载后,仍需手动检查文件大小及真实性,如模型权重缺失则需手动搜索并下载补齐):
ckpt/densepose/model_final_162be9.pklckpt/humanparsing/parsing_atr.onnxckpt/humanparsing/parsing_lip.onnxckpt/openpose/ckpts/body_pose_model.pthckpt/ip_adapter/ip-adapter-plus_sdxl_vit-h.binckpt/image_encoder/config.jsonckpt/image_encoder/model.safetensors
超高危坑点提醒
以下两个文件最常为空白占位文件(仅目录 & 文件名存在,无真实模型数据):
ckpt/ip_adapter/ip-adapter-plus_sdxl_vit-h.binckpt/image_encoder/model.safetensors
文件内部仅标注提示文本:
put ip adapter ckpt hereput image encoder ckpt here
隐患:程序初始阶段不会提示缺模型,只会在 from_pretrained() 加载、AI 推理链路中隐性崩溃,排查难度翻倍。
核心原则:补齐权重 → 校验完整性 → 再启动项目

六、模型加载底层逻辑:不止依赖本地目录
即便手动补齐全部 ckpt 权重,项目仍会远程拉取核心基础模型:yisol/IDM-VTON该模型不存放于本地 ckpt 文件夹,默认通过 Hugging Face Hub 机制联网加载。
真实故障成因
代码写法:from_pretrained("yisol/IDM-VTON")看似简单调用,实际极易失败:
- 配置 HF 镜像站点异常
- 本地缓存目录优先级失效
- 网络限制无法远程下载模型
实测有效环境变量配置
HF_ENDPOINT=https://hf-mirror.com
HF_HOME=G:\huggingface_cache
HUGGINGFACE_HUB_CACHE=G:\huggingface_cache
本地路径已缓存:G:\huggingface_cache\models--yisol--IDM-VTON故障本质:本地已有完整缓存,但代码未优先读取本地快照,仍强制走远程请求链路。
七、Windows 稳定优化:强制优先本地快照加载
原生危险写法(易联网报错)
base_path = "yisol/IDM-VTON"
工程级稳定修复方案
- 读取系统
HF_HOME/ 默认缓存路径 - 定位目录下
models--yisol--IDM-VTON - 精准指向内部
snapshots真实模型目录 - 将本地绝对快照路径传入
from_pretrained()
价值:切断不稳定远程请求链路,全程离线调用本地缓存,是 Windows 部署稳定性核心优化点。
八、Gradio 专属报错区分:勿误判模型故障
权重 & 基础模型全部就绪后,服务可正常拉起,但访问网页时大概率触发 Gradio 框架原生报错,极易让人误以为模型损坏。
典型报错一
报错信息:TypeError: unhashable type: 'dict'根源:旧版 Gradio + Starlette 版本冲突,TemplateResponse 模板渲染逻辑不兼容,与 AI 推理无关。
典型报错二
报错信息:TypeError: argument of type 'bool' is not iterable根源:Gradio 生成 /info 接口 API 概要时,ImageEditor 组件参数解析异常。
避坑总结
两类报错均属于前端服务层兼容问题,和 Diffusion 推理、OpenPose、DensePose、人体解析等核心算法链路完全无关。
九、核心解决方案:定制兼容补丁文件
摒弃传统降级依赖的低效方案,统一新增 startup_utils.py 兼容工具文件,一站式解决全量问题:
- 本地模拟
spaces模块兼容,规避原生在线环境依赖 - 项目启动自动校验 Checkpoint 真伪,拦截占位无效文件
- 封装模型加载逻辑,报错精准提示权重缺失原因
- 自动解析 Hugging Face 本地快照路径,优先离线加载
- 补丁修复模板渲染:解决
dict不可哈希报错 - 补丁修复 API 结构解析:规避布尔值迭代异常
十、入口文件工程化规范调整
针对 gradio_demo/app.py 做本地调试适配改造:
- 通过
if __name__ == "__main__":标准化控制启动逻辑 - 模块支持单独导入调试,分层定位问题
- 默认关闭公网共享,纯本地局域网运行
- 统一读取本地快照模型绝对路径
- 标准化全局 CUDA 设备识别参数
优化意义:项目从「无脑启动 / 直接崩溃」升级为「分层可测、逐段校验」,大幅降低排障成本。
十一、验收标准:不只看服务启动,必测完整推理链路
❌ 错误验收:网页正常打开 = 部署成功✅ 标准验收:调用底层试衣接口跑通全业务链
实测验证调用 start_tryon() 函数全覆盖流程:
- 原始人物 / 服装图像读取预处理
- OpenPose 姿态检测
- Human Parsing 人体区域分割
- DensePose 密集姿态映射
- 蒙版 Mask 精准生成
- 正向提示词 Prompt 编码解析
- SDXL Diffusion 核心扩散推理
- 最终合成图像回显输出
全链路无崩溃、无异常抛出,才代表后端 AI 管线彻底打通。
十二、部署成功标准状态
启动命令
python gradio_demo/app.py
正常日志提示
Running on local URL: http://127.0.0.1:7860
浏览器访问地址:http://127.0.0.1:7860
推理正常进度标识
终端输出:
1/130/30属于预处理 & 扩散迭代正常进度日志,并非报错;浏览器最终加载出合成效果图,即为部署完全达标。


十三、日志甄别:区分警告 Warning & 致命 Error
Windows 终端输出繁杂,必须精准过滤无效信息:
✅ 无害非阻塞警告(忽略即可)
FutureWarning版本迭代提示torch.meshgrid参数调用提醒torch.cuda.amp.autocast弃用告知Some weights ... were not used冗余权重提示
以上不影响运行稳定,仅为后续优化清理的技术遗留问题。
❌ 必须优先解决的致命故障
Traceback全链路异常堆栈RuntimeError/OSError运行时系统错误TypeError代码参数类型错误- 服务无法启动、网页空白打不开
- 页面可访问,点击生成瞬间崩溃
- Checkpoint 权重缺失 / 主模型加载失败
十四、极简稳定落地流程汇总
- Git 克隆官方项目源码至本地
- 创建 Python3.10 专属虚拟环境并激活
- 按顺序安装 CUDA 版 PyTorch + 项目全部依赖
- 人工核验 ckpt 目录关键权重,剔除占位无效文件
- 确认本机 HF 缓存已预存
yisol/IDM-VTON完整模型 - 导入兼容补丁,配置代码优先读取本地快照离线模型
- 执行标准启动命令:
python gradio_demo/app.py - 浏览器访问本地地址:
http://127.0.0.1:7860 - 上传参考人物图 + 目标服装图,发起试衣推理
- 核验前端正常输出合成效果图,部署收尾
十五、全文总结
本次 Windows 本地落地 IDM-VTON,并非修复单一小 Bug,而是系统性解决整套工程适配难题:
- 纠正启动入口选择误区
- 彻底补齐校验残缺 Checkpoint 权重
- 规避 Hugging Face 远程联网不稳定风险
- 优化本地模型缓存调用优先级
- 代码补丁搞定 Gradio 多层版本兼容
- 分层校验服务框架 & AI 推理双链路
最终落地效果闭环达标:服务正常常驻 → 网页流畅访问 → 基础模型离线加载 → 姿态 / 分割预处理无误 → Diffusion 扩散推理稳定运行 → 浏览器正常输出高清试衣结果,实现 IDM-VTON 在 Windows 环境下的稳定可用。
十六、 精简速查表
IDM-VTON Windows 部署・精简速查表 + 报错关键词排障手册
一、极简标准部署流程(10 步速通)
-
- 克隆项目源码,本地解压
-
- 新建 Python3.10 虚拟环境并激活
-
1) venv:
python -m venv .venv& 激活 -
2) conda:
conda env create -f environment.yaml conda activate idm
-
- 优先安装 CUDA11.8 适配 PyTorch
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
-
4. pip install -r requirements.txt(需从 environment.yaml 文件转写或参考我们导出的版本) -
- 校验
ckpt/下所有权重,删除占位文本文件
- 校验
-
- 配置 HF 本地缓存环境变量,确认已有
yisol/IDM-VTON缓存
- 配置 HF 本地缓存环境变量,确认已有
-
-
引入
startup_utils.py兼容补丁,优先读取本地 snapshotfrom future import annotations
from pathlib import Path
from typing import Any, Callable
import osPROJECT_ROOT = Path(file).resolve().parent
class _LocalSpaces:
@staticmethod
def GPU(fn: Callable[..., Any]) -> Callable[..., Any]:
return fndef load_spaces_module() -> Any:
try:
import spaces # type: ignore
except ModuleNotFoundError:
return _LocalSpaces()
return spacesdef _is_placeholder_file(path: Path) -> bool:
if not path.is_file():
return False
if path.stat().st_size > 1024:
return False
try:
content = path.read_text(encoding="utf-8").strip().lower()
except UnicodeDecodeError:
return False
return content.startswith("put ") and " ckpt here" in contentdef validate_required_checkpoints() -> None:
required_files = {
"densepose checkpoint": PROJECT_ROOT / "ckpt" / "densepose" / "model_final_162be9.pkl",
"human parsing ATR checkpoint": PROJECT_ROOT / "ckpt" / "humanparsing" / "parsing_atr.onnx",
"human parsing LIP checkpoint": PROJECT_ROOT / "ckpt" / "humanparsing" / "parsing_lip.onnx",
"openpose checkpoint": PROJECT_ROOT / "ckpt" / "openpose" / "ckpts" / "body_pose_model.pth",
"IP-Adapter checkpoint": PROJECT_ROOT / "ckpt" / "ip_adapter" / "ip-adapter-plus_sdxl_vit-h.bin",
"image encoder config": PROJECT_ROOT / "ckpt" / "image_encoder" / "config.json",
"image encoder checkpoint": PROJECT_ROOT / "ckpt" / "image_encoder" / "model.safetensors",
}missing = [f"{name}: {path}" for name, path in required_files.items() if not path.exists()] placeholders = [ f"{name}: {path}" for name, path in required_files.items() if _is_placeholder_file(path) ] if not missing and not placeholders: return problems = [] if missing: problems.append("Missing required files:\n- " + "\n- ".join(missing)) if placeholders: problems.append("Placeholder files detected:\n- " + "\n- ".join(placeholders)) raise RuntimeError( "Local startup prerequisites are incomplete.\n" + "\n\n".join(problems) + "\n\nDownload the real checkpoints into the ckpt directory before starting the app." )def load_component(component_name: str, loader: Any, base_path: str, **kwargs: Any) -> Any:
try:
return loader.from_pretrained(base_path, **kwargs)
except Exception as exc:
raise RuntimeError(
f"Failed to load '{component_name}' from '{base_path}'. "
"This app expects the Hugging Face model repository 'yisol/IDM-VTON' to be reachable "
"or already cached locally."
) from excdef resolve_model_base_path(repo_id: str) -> str:
cache_roots = [
os.environ.get("HUGGINGFACE_HUB_CACHE"),
os.environ.get("HF_HOME"),
str(Path.home() / ".cache" / "huggingface" / "hub"),
]
repo_dirname = "models--" + repo_id.replace("/", "--")for cache_root in cache_roots: if not cache_root: continue for hub_root in (Path(cache_root), Path(cache_root) / "hub"): repo_dir = hub_root / repo_dirname snapshots_dir = repo_dir / "snapshots" if not snapshots_dir.is_dir(): continue snapshots = [path for path in snapshots_dir.iterdir() if path.is_dir()] if snapshots: return str(max(snapshots, key=lambda path: path.stat().st_mtime)) return repo_iddef get_launch_kwargs() -> dict[str, Any]:
return {
"share": os.environ.get("IDM_VTON_SHARE", "0") == "1",
"show_api": False,
"server_name": os.environ.get("IDM_VTON_HOST", "127.0.0.1"),
}def patch_gradio_template_response() -> None:
import gradio.routestemplates = gradio.routes.templates original = templates.TemplateResponse if getattr(original, "_idm_vton_compat", False): return def compat_template_response(*args: Any, **kwargs: Any) -> Any: if ( len(args) >= 2 and isinstance(args[0], str) and isinstance(args[1], dict) and "request" in args[1] ): context = dict(args[1]) request = context.pop("request") return original(request, args[0], context, *args[2:], **kwargs) return original(*args, **kwargs) compat_template_response._idm_vton_compat = True # type: ignore[attr-defined] templates.TemplateResponse = compat_template_responsedef patch_gradio_api_info() -> None:
import gradio.blocksoriginal = gradio.blocks.Blocks.get_api_info if getattr(original, "_idm_vton_compat", False): return def compat_get_api_info(self: Any) -> Any: try: return original(self) except TypeError as exc: message = str(exc) if "bool" not in message and "iterable" not in message: raise return {"named_endpoints": {}, "unnamed_endpoints": {}} compat_get_api_info._idm_vton_compat = True # type: ignore[attr-defined] gradio.blocks.Blocks.get_api_info = compat_get_api_info
-
-
- 正确启动入口:
python gradio_demo/app.py
- 正确启动入口:
-
- 访问:
http://127.0.0.1:7860
- 访问:
-
- 上传图测试全链路推理出图即可
二、核心关键要点速记
- ✅ 用
gradio_demo/app.py - 禁止无脑降级 Gradio,用代码兼容补丁修复冲突
- 两大高危占位权重:
ip-adapterxxx.bin/model.safetensors必核验 - 核心模型走HF 本地缓存绝对 snapshot 路径,规避联网失败
- 看日志:
1/1、30/30是正常推理进度,非报错 - Warning 类提示可忽略;Traceback / 运行报错才需处理
三、高频报错关键词 + 根因 + 一键方案
| 报错关键词 | 核心根因 | 快速解决办法 |
|---|---|---|
| TypeError: unhashable type: 'dict' | Gradio+starlette 模板渲染不兼容 | 加载 startup_utils.py 兼容补丁,不降级版本 |
| TypeError: bool not iterable | Gradio ImageEditor 解析 API schema 异常 | 复用统一 Gradio 兼容修复层 |
| 模型卡在 from_pretrained 超时 | 优先走远程、未读取本地 HF 缓存 | 硬编码指向 HF_HOME 下 snapshot 真实目录 |
| 提示缺少 xxx.pth/.onnx | ckpt 权重缺失 / 为占位文件 | 重新下载完整权重,逐文件校验大小 |
| spaces module not found | 误用根目录 app.py 启动 | 切换为:python gradio_demo/app.py |
| CUDA out of memory | 显存不足 | 8G 以上显卡;降低推理分辨率、batch 设 1 |
| 依赖版本冲突连环报错 | 安装顺序颠倒 | 先装指定 PyTorch,再装 requirements 依赖 |
| 服务启动成功,页面点生成无响应 | 缓存未命中、模型路径错误 | 强制本地离线 snapshot 加载逻辑 |