跳转至

Kimodo-SMPLX-RP Headless Demo Runbook

本文档记录如何下载 Kimodo-SMPLX-RP-v1、运行 sample motion generation,并 headless 渲染成本地 MP4。

模型版本判断

当前目标模型应继续使用:

nvidia/Kimodo-SMPLX-RP-v1

原因是 NVIDIA 官方 Hugging Face model card 明确写的是:

Model Version: Kimodo-SMPLX-RP-v1

官方 Kimodo-v1 collection 里也列出了 nvidia/Kimodo-SMPLX-RP-v1Kimodo-SOMA-RP-v1.1 是 SOMA skeleton 的 RP 模型,不是 SMPLX-body skeleton 的模型;不能用它替代本任务要求的 SMPLX-RP。

官方 Hugging Face Space nvidia/Kimodo 也不能作为 SMPLX-RP fallback。Space 的 metadata / startup 脚本对应的是 Kimodo-SOMA-RP-v1Kimodo-G1-RP-v1 demo path,不是 Kimodo-SMPLX-RP-v1;因此即使 Space 能运行 demo,也不能证明本任务要求的 SMPLX-RP checkpoint 已下载或本地 SMPLX-RP demo 已跑通。

参考链接:

https://huggingface.co/nvidia/Kimodo-SMPLX-RP-v1
https://huggingface.co/collections/nvidia/kimodo-v1
https://huggingface.co/spaces/nvidia/Kimodo

当前 blocker

nvidia/Kimodo-SMPLX-RP-v1 是 Hugging Face gated model。当前机器上的 token 对应账号是 AJ623,能访问 repo metadata 和公开文件,但还不能下载 gated files:

.gitattributes
config.yaml
model.safetensors
stats/motion/body/{mean,std}.npy
stats/motion/global_root/{mean,std}.npy
stats/motion/local_root/{mean,std}.npy

model card 中的 license metadata 是:

license_name: nvidia-internal-scientific-research-and-development-model-license
license_link: https://www.nvidia.com/en-us/agreements/enterprise-software/nvidia-internal-scientific-research-and-development-model-license/

model card 还说明 Kimodo-SMPLX-RP 是 non-commercial research use only。因此这里的 blocker 是该账号对这个具体 gated repo / license terms 的 access 没有完成,而不是公开 repo metadata 不可见。

如果下载这些 gated files 仍返回 403 GatedRepoError,说明目标还没有完成。需要先在 browser 里用同一个 Hugging Face 账号登录并同意/申请 access:

https://huggingface.co/nvidia/Kimodo-SMPLX-RP-v1

Hugging Face 的 user-side gated access request 必须从 browser 完成;API 只支持 repo owner 管理 access requests。2026-05-17 复核官方文档后结论不变:用户侧请求 access 需要登录 HF user account,并且只能从 browser 发起;脚本侧 token 只用于 access 已完成后的文件下载。官方文档对应说明:

https://huggingface.co/docs/hub/en/models-gated#access-gated-models-as-a-user

本机安装的 huggingface_hub==0.36.2 也已经检查过,HfApi 只暴露 repo owner 侧的 gated access 管理接口:

accept_access_request
cancel_access_request
grant_access
list_accepted_access_requests
list_pending_access_requests
list_rejected_access_requests
reject_access_request

没有 user-side request_access 方法。因此不能用当前 token 在 CLI 里合法替代 browser 端的条款接受/申请授权流程;需要用户在网页完成 access,或提供已经有权限的 token / 完整 snapshot。

当前 token 诊断结果:

user: AJ623
token role: fineGrained
canReadGatedRepos: True
token_scope: entity=user:AJ623 permissions=repo.content.read,repo.access.read,repo.write,...

所以当前不是 “token 完全不能读 gated repos”。如果 direct access probe 仍然是 403 GatedRepoError,优先判断为 账号还没有对 nvidia/Kimodo-SMPLX-RP-v1 这个具体 gated repo 完成条款接受/审批,或 fine-grained token 的 repo scope 没有包含这个 repo 的 read 权限,而不是脚本没有读取 token。access 通过后,同一个 watcher 会自动继续下载 gated files。

如果使用的是 Hugging Face fine-grained token,还需要确认这个 token 的允许范围包含:

nvidia/Kimodo-SMPLX-RP-v1

否则即使账号本身已经有 gated repo access,CLI / snapshot_download 仍可能返回 403 GatedRepoError。最稳妥的做法是:在完成网页 access 后,用同一账号新建一个能 read 该 repo 的 token,然后覆盖默认 token file。

当前状态脚本会显式打印 fine-grained scope 诊断。如果看到类似下面的 warning,说明当前 token scope 没有列出 nvidia entity;这不取代 browser-side gated access 判断,但如果网页已经显示 access approved 而 CLI 仍然 403,应优先重新创建/安装一个 read scope 覆盖 nvidia/Kimodo-SMPLX-RP-v1 的 token:

token_scope_warning: fine-grained token scopes do not list the nvidia entity; if browser-side repo access is already approved but 403 persists, create/install a token whose read scope covers nvidia/Kimodo-SMPLX-RP-v1

进一步诊断结果:

model_info: OK
model_id: nvidia/Kimodo-SMPLX-RP-v1
sha: 1419ba56b734c48bbafb41fefa84088ca94583b5
gated: auto
private: false
has config.yaml in sibling list: true
has model.safetensors in sibling list: true
README.md download: OK
config.yaml download: 403 GatedRepoError
model.safetensors download: 403 GatedRepoError
direct HTTP response:
  Access to model nvidia/Kimodo-SMPLX-RP-v1 is restricted and you are not in the authorized list.

这说明模型名、repo sha、文件名和 token 读取路径都不是当前 blocker。list_pending_access_requests / list_accepted_access_requests / list_rejected_access_requests 是 repo owner-side API;当前账号不是 nvidia repo owner,不能用这些 API 查询或推进 request 状态。

当前 Kimodo registry 中的 model name 解析也已经验证:

Kimodo-SMPLX-RP-v1 -> kimodo-smplx-rp -> nvidia/Kimodo-SMPLX-RP-v1
kimodo-smplx-rp -> kimodo-smplx-rp -> nvidia/Kimodo-SMPLX-RP-v1
SMPLX -> kimodo-smplx-rp -> nvidia/Kimodo-SMPLX-RP-v1

因此 run_smplx_rp_headless_demo.sh 里的 --model Kimodo-SMPLX-RP-v1 不是 blocker。

注意:用 Authorization: Bearer <HF_TOKEN> 请求 Hugging Face 网页本身时,网页端仍会把 RepoGatedModal 渲染为 isLoggedIn=false,并提示:

You need to agree to share your contact information to access this model

这说明接受条款依赖 browser login/session cookie,不是普通 HF token 可以直接完成的动作。token 用于后续 CLI / snapshot_download 下载;条款接受仍需在 browser 中完成。

自动 watcher

后台 watcher 已经配置为轮询 gated access:

tools/kimodo/wait_for_smplx_rp_access_and_run.sh

推荐用下面的 wrapper 启动/重启后台 watcher;它会用 setsid 脱离当前 shell、写入 pid file,并把日志写到 output/kimodo_smplx_rp_headless_demo/wait_for_access.log

tools/kimodo/start_smplx_rp_access_watcher.sh

这个 wrapper 会先停止旧 watcher,等待旧进程退出,再删除旧进程 shutdown trap 可能写出的 stale wait_status.txt。这样重启后 wait_status.txt 会由新 watcher 重新写入,避免旧 watcher 的 state=stopped 覆盖新 watcher 的真实状态。

默认行为:

每 60 秒重新读取 TOKEN_FILE,默认最多等待 10080 次(约 7 天;可用 MAX_ATTEMPTS 覆盖)
-> 如果本地 HF hub cache 已经有完整 Kimodo-SMPLX-RP-v1 snapshot,直接继续
-> probe config.yaml / model.safetensors
-> access OK 后 exec run_smplx_rp_headless_demo.sh
-> 下载 checkpoint
-> 运行 Kimodo generation
-> headless render MP4
-> 运行 audit

默认 token 文件:

/mnt/data/PhysHSI/.cache/huggingface/token

如果 repo-local token 不存在,脚本会 fallback 到已有共享路径:

/home/user/.cache/huggingface/token
/mnt/data/.cache/mingxuan/huggingface/token
/mnt/data2/huggingface/token

如果要换 token,推荐安装到 repo-local token 文件。watcher 每轮都会重新解析 token 路径,优先级是:

explicit TOKEN_FILE env
repo-local token: /mnt/data/PhysHSI/.cache/huggingface/token
repo-local stored tokens: /mnt/data/PhysHSI/.cache/huggingface/stored_tokens
home/user token: /home/user/.cache/huggingface/token
home/user stored tokens: /home/user/.cache/huggingface/stored_tokens
fallback token: /mnt/data/.cache/mingxuan/huggingface/token
fallback stored tokens: /mnt/data/.cache/mingxuan/huggingface/stored_tokens
fallback token: /mnt/data2/huggingface/token
fallback stored tokens: /mnt/data2/huggingface/stored_tokens

watcher / runner 会从 tokenstored_tokens 文件里解析 hf_... token-like value,按 token value 去重后 probe,并先用 whoami 跳过 invalid token。当前状态下,/mnt/data/.cache/mingxuan/huggingface/token/mnt/data2/huggingface/token 内容相同;stored_tokens 里还包含一个 invalid token,因此日志会显示:

access_probe_failed_for_token: file:/mnt/data/.cache/mingxuan/huggingface/token ... 403
access_probe_skipped_invalid_token: file:/mnt/data/.cache/mingxuan/huggingface/stored_tokens ... Invalid user token

这不是漏测其它路径;而是可用的 distinct token value 只有 AJ623 这个未授权 token。要切换到不同账号或不同 fine-grained scope,推荐安装到 repo-local token:

/mnt/data/PhysHSI/.cache/huggingface/token

因此,如果 watcher 启动时 repo-local token 还不存在,之后手动创建 /mnt/data/PhysHSI/.cache/huggingface/token 也会在下一轮 probe 自动被拾取。

如果 browser 里完成 gated access 的账号不是当前 token 对应的 AJ623,必须为那个账号创建新的 Hugging Face token,并安装到 repo-local token 文件:

/mnt/data/PhysHSI/.cache/huggingface/token

推荐不要把 token literal 直接写进 shell history;把 token 放进一个临时文件后运行:

tools/kimodo/install_smplx_rp_hf_token.sh /path/to/hf_token_file

也可以从 stdin 安装,避免创建临时 token 文件:

read -rsp "HF token: " HF_TOKEN_VALUE
printf '\n'
printf '%s\n' "${HF_TOKEN_VALUE}" | tools/kimodo/install_smplx_rp_hf_token.sh -
unset HF_TOKEN_VALUE

该脚本会复制 token 到 repo-local token file、设置 0600 权限、验证 whoami,并诊断 config.yaml access,然后用这个 token file 重启 watcher。config.yaml access 失败不会阻止安装,因为同一个账号可能还在等待 browser-side gated access 生效;真正的完成条件仍然是后续 watcher / runner 下载完整 checkpoint 并跑通 demo。然后 watcher 下一轮会自动读取新 token。start_smplx_rp_access_watcher.sh 启动时会清空继承的 HF_TOKEN / HUGGINGFACE_HUB_TOKEN,避免旧环境变量覆盖 token file。 install_smplx_rp_hf_token.sh 会先用临时文件验证 whoami,验证通过后才原子替换 repo-local token;无效 token 不会覆盖现有 token,也不会重启 watcher。

如果想用其他 token 文件手动检查:

TOKEN_FILE=/path/to/hf_token \
  tools/kimodo/check_smplx_rp_headless_demo_status.sh

脚本显式设置以下 cache env,确保 Kimodo checkpoint、Hugging Face hub cache 和 local LLM2Vec text encoder 使用同一 cache layout:

HF_HOME=/mnt/data/PhysHSI/.cache/huggingface
HF_HUB_CACHE=/mnt/data/PhysHSI/.cache/huggingface/hub
HUGGINGFACE_CACHE_DIR=/mnt/data/PhysHSI/.cache/huggingface/hub
TEXT_ENCODER_MODE=local

run_smplx_rp_headless_demo.sh 会把已存在的 local LLM / LLM2Vec cache 链接到 repo-local HF hub cache。如果目标位置已有半残 cache directory,runner 会将这些明确的 external text-encoder cache entries 替换成 symlink,避免读取到不完整模型。 TEXT_ENCODER_MODE 默认设为 local,避免 headless/offline demo 依赖 localhost text encoder API;如果确实要使用 API,可以在调用脚本前显式覆盖这个 env。

已验证的本地前置条件

这些检查已经通过;如果 demo 仍未跑通,优先看 gated checkpoint access,而不是先怀疑本地环境:

disk: /mnt/data 约 492G free, /mnt/data2 约 846G free
gpu: 2 x NVIDIA GeForce RTX 3090, driver 570.195.03
torch: 2.4.1+cu121, cuda_available=True, cuda_device_count=2
ffmpeg: /usr/bin/ffmpeg
python deps: imageio, imageio_ffmpeg, PIL, torch, kimodo available
SMPLX asset: baseline/interscene/InterScene/body_models/smplx/SMPLX_NEUTRAL.npz readable, has v_template and f
SMPLX skin path: build_skeleton(22) -> SMPLXSkeleton22; SMPLXSkin initializes
text encoder cache: Meta-Llama-3-8B-Instruct base cache and LLM2Vec adapter caches available
Kimodo CLI: python -m kimodo.demo --help imports successfully

如果从其他有权限的机器手动拷贝 Kimodo-SMPLX-RP-v1 checkpoint,请优先放到这个 hub cache layout:

/mnt/data/PhysHSI/.cache/huggingface/hub/models--nvidia--Kimodo-SMPLX-RP-v1/snapshots/1419ba56b734c48bbafb41fefa84088ca94583b5/

也可以放到非 hub cache layout:

/mnt/data/PhysHSI/.cache/huggingface/models--nvidia--Kimodo-SMPLX-RP-v1/snapshots/1419ba56b734c48bbafb41fefa84088ca94583b5/

这两个目录之一必须包含 completion checklist 里的所有 checkpoint files。watcher 和 runner 都会优先检查这两个本地 snapshot layout;如果任意一个本地 snapshot 完整,即使当前 token 后续无法联网读取 gated files,也可以继续 generation / render。

推荐用导入脚本来避免漏文件或放错目录:

tools/kimodo/import_smplx_rp_snapshot.sh \
  /path/to/Kimodo-SMPLX-RP-v1/snapshots/1419ba56b734c48bbafb41fefa84088ca94583b5

它会先调用 snapshot validator,校验所有 required checkpoint files、broken symlink、stats .npy 可读性和 model.safetensors metadata 可打开,然后同步到本仓库使用的 HF hub cache 位置。 导入脚本会先停止后台 watcher,清理旧 watcher pid/status,再调用 run_smplx_rp_headless_demo.sh,因此会直接开始 sample generation 和 headless MP4 render。 导入时会 dereference Hugging Face snapshot symlinks,并写入 refs/main,使后续 snapshot_download(..., local_files_only=True) 能识别这个本地 cache。 导入优先使用 rsync -aL --delete;如果目标机器没有 rsync,会 fallback 到 tar --dereference pipeline,同样会把 snapshot symlink 展开成自包含文件。 run_smplx_rp_headless_demo.sh 和 watcher 在发现完整 local snapshot 时也会自动补写对应 cache layout 的 refs/main,避免手动放置 snapshot 时漏掉 refs。

如果从有权限机器拿到的是 tarball,而不是已经解压的 snapshot directory,可以直接用 archive importer:

tools/kimodo/import_smplx_rp_snapshot_archive.sh \
  /path/to/Kimodo-SMPLX-RP-v1-snapshot.tar.gz

这个脚本会在临时目录解压 tarball,自动寻找包含 model.safetensorsconfig.yaml 和 stats files 的 snapshot directory,先运行 validator,然后调用 import_smplx_rp_snapshot.sh 导入并启动 demo。若只想检查 tarball 是否完整,不想导入或运行 demo:

tools/kimodo/import_smplx_rp_snapshot_archive.sh \
  --validate-only /path/to/Kimodo-SMPLX-RP-v1-snapshot.tar.gz

ALLOW_SYNTHETIC_SNAPSHOT=1 只能配合 --validate-only 使用,不能走真实导入路径。这样内部测试 fixture 不会被误导入为真实模型。

如果本地 snapshot 已经完整,run_smplx_rp_headless_demo.sh 不再强制要求 HF token。也就是说,离线拷贝 checkpoint 后,即使当前 token 没有 gated repo access,也可以继续 generation / render。 runner 在通过 checkpoint 检查后会设置 CHECKPOINT_DIR 指向已验证 snapshot 的 parent 目录,让 Kimodo loader 优先从这个目录加载,避免 Hugging Face hub cache 中已有的半残 snapshot 干扰 generation。

如果只想校验 snapshot,不立刻导入或运行 demo:

tools/kimodo/validate_smplx_rp_snapshot.sh \
  /path/to/Kimodo-SMPLX-RP-v1/snapshots/1419ba56b734c48bbafb41fefa84088ca94583b5

validator 会检查 required checkpoint files、broken symlink、.npy 可读性、model.safetensors 可打开且有 tensor,并且默认拒绝明显过小的 placeholder checkpoint:

config.yaml < 100 bytes -> rejected
model.safetensors < 1 MiB -> rejected

这避免把 tiny synthetic checkpoint 或占位文件误判成真实 Kimodo-SMPLX-RP-v1。内部 smoke fixture 只有显式设置 ALLOW_SYNTHETIC_SNAPSHOT=1 才会跳过尺寸门槛;completion verifier 不会设置这个变量。

validator 已用 tiny synthetic snapshot 覆盖过默认失败路径和 ALLOW_SYNTHETIC_SNAPSHOT=1 的内部成功路径,也用当前半残 SMPLX-RP cache 覆盖过失败路径。synthetic validator pass 只说明校验脚本工作,不代表真实模型 checkpoint 可用。

Download dependency preflight

isaac-sim Python 环境已经确认包含 Hugging Face 大文件下载和 checkpoint 校验所需依赖:

hf_xet: OK
huggingface_hub: OK
safetensors: OK
requests: OK

因此 access 生效后,snapshot_download 预期可以处理 Hugging Face Xet/LFS-backed model.safetensors。如果后续仍然下载失败,应优先看具体 HTTP / Xet error,而不是先假设缺 Python package。

如果需要从另一台有权限机器打包完整 snapshot,推荐在有权限机器的同路径 repo 中运行:

tools/kimodo/pack_smplx_rp_snapshot.sh \
  /path/to/Kimodo-SMPLX-RP-v1/snapshots/1419ba56b734c48bbafb41fefa84088ca94583b5 \
  Kimodo-SMPLX-RP-v1-snapshot.tar.gz

这个脚本会先 validate snapshot,再用 tar --dereference 生成 self-contained tarball,避免只拷贝 snapshots/<sha> 时丢失 Hugging Face blobs 目录或产生 broken symlink。pack / extract / validate 流程已用 tiny synthetic snapshot 覆盖成功路径;这仍然不代表真实 checkpoint 已经可用。

手动运行

access 生效后,也可以手动运行完整 demo:

tools/kimodo/run_smplx_rp_headless_demo.sh

手动 runner 会先检查本地完整 snapshot;如果没有完整 snapshot,会按 HF_TOKEN / HUGGINGFACE_HUB_TOKEN / TOKEN_FILE / repo-local token / fallback token 的顺序尝试所有 distinct token value。这样即使默认 fallback token 还没有 repo-specific access,也可以用 TOKEN_FILE=/path/to/authorized_token 直接运行。

它会使用:

model: Kimodo-SMPLX-RP-v1
prompt: "A person walks forward and waves."
duration: 3.0
diffusion_steps: 25
num_samples: 1
seed: 7

输出目录:

output/kimodo_smplx_rp_headless_demo/

目标输出:

run_status.txt
run_success.flag
smplx_rp_sample.npz
smplx_rp_sample_amass.npz
smplx_rp_sample.mp4
smplx_rp_headless_demo_manifest.json

Quick Commands

查看紧凑状态:

/home/user/anaconda3/envs/isaac-sim/bin/python -m \
  utils.kimodo.scripts.print_smplx_rp_headless_demo_summary

运行完整 verifier:

tools/kimodo/check_smplx_rp_headless_demo_status.sh

安装新 Hugging Face token:

tools/kimodo/install_smplx_rp_hf_token.sh /path/to/hf_token_file

导入完整 snapshot directory 并运行 demo:

tools/kimodo/import_smplx_rp_snapshot.sh \
  /path/to/Kimodo-SMPLX-RP-v1/snapshots/1419ba56b734c48bbafb41fefa84088ca94583b5

导入完整 snapshot tarball 并运行 demo:

tools/kimodo/import_smplx_rp_snapshot_archive.sh \
  /path/to/Kimodo-SMPLX-RP-v1-snapshot.tar.gz

Status / verifier

一键检查当前状态:

tools/kimodo/check_smplx_rp_headless_demo_status.sh

这个脚本会检查:

watcher process 状态信息
token file / env token 状态信息
checkpoint files in both HF cache layouts
checkpoint validator for any complete local snapshot
run_status.txt / run_success.flag 状态信息
demo artifacts
local artifact audit
direct access probe diagnostic
watcher log tail

每次运行 status script 还会刷新一个机器可读摘要:

output/kimodo_smplx_rp_headless_demo/blocked_summary.json

这个 JSON 记录:

wait_status
checkpoint_layouts / missing checkpoint files
required artifacts / missing artifacts
token whoami / fine-grained scope
direct HTTP status/body for config.yaml and model.safetensors
completion.verifier_exit_code
completion.complete

completion.complete 只在 check_smplx_rp_headless_demo_status.sh 退出码为 0 时才会是 true;它不会仅因为文件存在就误判完成。

如果只需要看紧凑摘要,不想滚动完整 status 输出:

/home/user/anaconda3/envs/isaac-sim/bin/python -m \
  utils.kimodo.scripts.print_smplx_rp_headless_demo_summary

退出码语义:

0: 完整且通过 validator 的 HF snapshot、sample npz、AMASS npz、MP4、runner manifest、local artifact audit 都通过
非 0: 仍未完成

如果当前输出类似下面这样,说明 watcher 正常但目标仍未完成:

state=waiting_for_hf_gated_access
direct_http_failed: config.yaml 403 Access to model ... is restricted and you are not in the authorized list.
MISSING .../config.yaml
MISSING .../model.safetensors
MISSING .../smplx_rp_sample.mp4
CHECK_EXIT_CODE=1

access 生效后,watcher 会自动从 waiting_for_hf_gated_access 进入 runner;最终完成时应看到:

output/kimodo_smplx_rp_headless_demo/run_success.flag
output/kimodo_smplx_rp_headless_demo/smplx_rp_sample.npz
output/kimodo_smplx_rp_headless_demo/smplx_rp_sample_amass.npz
output/kimodo_smplx_rp_headless_demo/smplx_rp_sample.mp4
output/kimodo_smplx_rp_headless_demo/smplx_rp_headless_demo_manifest.json
CHECK_EXIT_CODE=0

注意:watcher process 本身不是完成条件。access 生效且 demo 跑完后,watcher 可能正常退出;这不应该导致 verifier 失败。

同理,direct access probe 只是诊断信息,不是完成条件。目标要求的是模型已经下载并且 demo 已经跑通;如果 checkpoint 和 artifacts 已经本地存在并通过 local audit,即使后续 token 被删除或 access 被撤销,也不应该误判为未完成。

check_smplx_rp_headless_demo_status.sh 的 access probe 会按如下优先级选择 token:

HF_TOKEN env
HUGGINGFACE_HUB_TOKEN env
explicit TOKEN_FILE env
repo-local token: /mnt/data/PhysHSI/.cache/huggingface/token
repo-local stored tokens: /mnt/data/PhysHSI/.cache/huggingface/stored_tokens
home/user token: /home/user/.cache/huggingface/token
home/user stored tokens: /home/user/.cache/huggingface/stored_tokens
fallback token: /mnt/data/.cache/mingxuan/huggingface/token
fallback stored tokens: /mnt/data/.cache/mingxuan/huggingface/stored_tokens
fallback token: /mnt/data2/huggingface/token
fallback stored tokens: /mnt/data2/huggingface/stored_tokens

脚本只报告 token source、账号、token role、canReadGatedRepos 标志、candidate count、distinct value count 和每个 value group 的来源路径;不会打印 token 值。

Environment smoke test

为了排除本机 Kimodo CLI / local LLM2Vec cache / GPU 环境问题,已经用本地已有的 Kimodo-SOMA-RP-v1.1 做过一次隔离 smoke test:

CUDA_VISIBLE_DEVICES=1 \
HF_HOME=/mnt/data/.cache/mingxuan/huggingface \
HF_HUB_CACHE=/mnt/data/.cache/mingxuan/huggingface/hub \
HUGGINGFACE_CACHE_DIR=/mnt/data/.cache/mingxuan/huggingface/hub \
LOCAL_CACHE=True \
PYTHONPATH=/mnt/data/PhysHSI/submodules/kimodo:/mnt/data/PhysHSI \
TEXT_ENCODER_MODE=local \
/home/user/anaconda3/envs/isaac-sim/bin/python -m kimodo.scripts.generate \
  "A person waves." \
  --model kimodo-soma-rp \
  --duration 0.5 \
  --diffusion_steps 2 \
  --num_samples 1 \
  --seed 11 \
  --no-postprocess \
  --output output/kimodo_smplx_rp_headless_demo_smoke/soma_smoke

结果:

output/kimodo_smplx_rp_headless_demo_smoke/soma_smoke.npz
posed_joints: (15, 77, 3)
global_rot_mats: (15, 77, 3, 3)

这个 smoke test 不是 completion evidence,因为它使用的是 SOMA-RP,不是 Kimodo-SMPLX-RP-v1。它只说明当前 Python env、Kimodo CLI、LLM2Vec local cache、GPU 和基础 .npz output path 可以工作。SMPLX-RP 目标仍然必须以 Kimodo-SMPLX-RP-v1 checkpoint、smplx_rp_sample.npzsmplx_rp_sample_amass.npzsmplx_rp_sample.mp4 作为完成证据。

repo-local HF cache layout 下的 LLM2Vec text encoder 也已单独验证可加载:

HF_HOME=/mnt/data/PhysHSI/.cache/huggingface
HF_HUB_CACHE=/mnt/data/PhysHSI/.cache/huggingface/hub
HUGGINGFACE_CACHE_DIR=/mnt/data/PhysHSI/.cache/huggingface/hub

返回结构:

encoded_type: tuple
encoded_item 0: Tensor torch.Size([1, 1, 4096]) torch.float32
encoded_item 1: list

这仍然 不是 completion evidence;它只说明 runner 使用的 repo-local cache 能加载 local text encoder。

headless renderer / artifact audit 也已经用 synthetic SMPLX-shaped artifacts 做过一次隔离验证:

/home/user/anaconda3/envs/isaac-sim/bin/python -m \
  utils.kimodo.scripts.audit_smplx_rp_headless_demo \
  --out-dir output/smplx_rp_goal_smoke/audit_synthetic

结果:

Audit OK
motion=output/smplx_rp_goal_smoke/audit_synthetic/smplx_rp_sample.npz
amass=output/smplx_rp_goal_smoke/audit_synthetic/smplx_rp_sample_amass.npz
video=output/smplx_rp_goal_smoke/audit_synthetic/smplx_rp_sample.mp4

这个 synthetic audit 不是 completion evidence,因为这些文件不是由真实 Kimodo-SMPLX-RP-v1 checkpoint 生成。它只说明 headless MP4 写出和 audit 逻辑本身可用。

只有这个 verifier 返回 0,才可以认为 active goal 完成。

Completion checklist

目标是:

下载 SMPLX-RP Kimodo 模型
完全跑通 sample motion generation demo
headless 可视化成 MP4 并保存

必须同时满足:

.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../config.yaml exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../model.safetensors exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../.gitattributes exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../stats/motion/body/mean.npy exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../stats/motion/body/std.npy exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../stats/motion/global_root/mean.npy exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../stats/motion/global_root/std.npy exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../stats/motion/local_root/mean.npy exists
.cache/huggingface/.../Kimodo-SMPLX-RP-v1/.../stats/motion/local_root/std.npy exists
output/kimodo_smplx_rp_headless_demo/smplx_rp_sample.npz exists
output/kimodo_smplx_rp_headless_demo/smplx_rp_sample_amass.npz exists
output/kimodo_smplx_rp_headless_demo/smplx_rp_sample.mp4 exists
output/kimodo_smplx_rp_headless_demo/smplx_rp_headless_demo_manifest.json exists
tools/kimodo/audit_smplx_rp_headless_demo.py --require-manifest passes
tools/kimodo/check_smplx_rp_headless_demo_status.sh returns 0

smplx_rp_headless_demo_manifest.json 记录 runner、repo_idmodel、checkpoint sha、prompt、duration、diffusion steps、seed 和 artifact 路径。run_success.flag 是调试辅助,不是唯一完成条件。最终仍以本地 checkpoint、artifacts、manifest 和 audit 为准。

不要把以下信号当成完成:

README.md / LICENSE 下载成功
model_info 能访问
watcher 正在运行
SOMA-RP-v1.1 checkpoint 存在
synthetic SMPLX render smoke test 通过

这些只能证明部分环境可用,不能证明 Kimodo-SMPLX-RP-v1 已下载并跑通。

相关脚本

tools/kimodo/start_smplx_rp_access_watcher.sh
tools/kimodo/wait_for_smplx_rp_access_and_run.sh
tools/kimodo/run_smplx_rp_headless_demo.sh
tools/kimodo/install_smplx_rp_hf_token.sh
tools/kimodo/import_smplx_rp_snapshot.sh
tools/kimodo/validate_smplx_rp_snapshot.sh
tools/kimodo/pack_smplx_rp_snapshot.sh
tools/kimodo/audit_smplx_rp_headless_demo.py
tools/kimodo/check_smplx_rp_headless_demo_status.sh
tools/kimodo/legacy/render_kimodo_motion_headless.py