HY-Motion 1.0入门指南:如何修改start.sh适配自定义端口与GPU绑定
1. 为什么你需要改start.sh?——从默认启动到生产就绪的一步之遥
你刚下载完HY-Motion 1.0镜像,执行bash /root/build/HY-Motion-1.0/start.sh,浏览器打开http://localhost:7860/,界面出来了,模型也加载成功了。但很快你就遇到几个现实问题:
- 公司内网环境里,7860端口已被其他服务占用;
- 服务器上插着4张A100,但默认只用第0号GPU,显存浪费严重;
- 团队多人协作时,需要同时跑多个实例,每个实例得对应不同端口和GPU;
- 你想把服务暴露给局域网同事调试,但默认只监听127.0.0.1。
这些问题,都不需要重装模型、不需改Python代码、更不用碰模型权重——它们全在一行脚本里:start.sh。
这行看似简单的启动脚本,其实是连接你和HY-Motion能力的“控制闸门”。它不负责模型推理,却决定了谁能访问、用哪块卡、走哪个端口、是否支持跨域、日志怎么输出……换句话说:它管的是“怎么用”,而不是“能不能用”。
本文不讲DiT架构原理,也不展开Flow Matching数学推导。我们聚焦一个工程师每天都会面对的真实动作:打开终端,编辑一个shell文件,保存,运行,立刻生效。全程无需重启容器、不依赖Docker Compose编排、不涉及CUDA版本切换——就是最朴素的手动配置。
你会学到:
start.sh里真正起作用的5个关键变量;- 如何安全地绑定指定GPU(不止是
CUDA_VISIBLE_DEVICES=0那种粗暴写法); - 怎样让Gradio服务既能在本地访问,也能被同网段同事打开;
- 为什么直接改端口可能报错,以及两个必须同步调整的位置;
- 一个防手误的检查清单,避免改完启动失败却找不到原因。
所有操作均基于官方镜像原始结构,不破坏原有部署逻辑,改完即可复用社区提供的全部提示词模板和测试案例。
2. 拆解start.sh:5个决定服务行为的核心参数
先别急着改。我们先看清它的本来面目。进入镜像后执行:
cat /root/build/HY-Motion-1.0/start.sh你会看到类似这样的内容(已简化注释,实际脚本更长):
#!/bin/bash export PYTHONPATH="/root/build/HY-Motion-1.0:$PYTHONPATH" cd /root/build/HY-Motion-1.0 # 👇 这行才是真正启动Gradio的命令 python app.py \ --share \ --server-name 127.0.0.1 \ --server-port 7860 \ --enable-xformers \ --num-gpus 1注意:这不是伪代码,而是真实脚本中最精简但完全可运行的核心片段。其中真正影响服务行为的,只有以下5个参数,其余如--enable-xformers属于性能优化项,不影响端口/GPU绑定逻辑。
2.1--server-name:谁可以访问你的服务?
- 默认值:
127.0.0.1 - 含义:Gradio服务监听的网络接口地址
- 常见误区:以为设成
0.0.0.0就能外网访问 → 错!这只是放开监听范围,还受防火墙和云服务器安全组限制 - 安全建议:
- 本地单机开发:保持
127.0.0.1(最安全) - 局域网协作调试:改为
0.0.0.0 - 生产环境暴露:必须配合Nginx反向代理 + Basic Auth,绝不直接暴露0.0.0.0
- 本地单机开发:保持
正确做法示例(局域网调试):
--server-name 0.0.0.0❌ 危险写法(暴露公网且无防护):
--server-name 0.0.0.0 # 未配防火墙/Nginx时禁用2.2--server-port:端口不是改一个地方就够
- 默认值:
7860 - 关键事实:这个参数只控制Gradio内部HTTP服务端口,不控制外部映射端口
- 隐形依赖:如果你用
docker run -p 8080:7860启动容器,那么:- 外部访问用
http://your-ip:8080 - 脚本里
--server-port仍必须是7860(否则容器内服务不响应)
- 外部访问用
- 唯一例外:裸机部署(非Docker),此时改这里就等于改最终端口
推荐做法(Docker环境):
- 容器外映射端口由
docker run -p决定 start.sh中--server-port保持默认7860,避免混淆
推荐做法(裸机部署):
- 直接修改此处为你想要的端口,例如
--server-port 8000
2.3--num-gpus:控制并行推理卡数,不是显存分配开关
- 默认值:
1 - 真实作用:告诉HY-Motion主程序“启动几个GPU进程”,每个进程独占一块卡
- 重要限制:该值不能超过你物理GPU数量,也不能超过
CUDA_VISIBLE_DEVICES可见设备数 - 常见错误:设成
--num-gpus 2但没设置CUDA_VISIBLE_DEVICES="0,1"→ 程序报错找不到设备
正确组合示例(用第1、2号GPU):
export CUDA_VISIBLE_DEVICES="1,2" python app.py --num-gpus 2 ...注意:--num-gpus值必须与CUDA_VISIBLE_DEVICES中逗号分隔的ID数量严格一致。
2.4CUDA_VISIBLE_DEVICES:GPU可见性控制的黄金法则
- 默认:未显式设置 → 系统自动识别所有GPU
- 本质:Linux环境变量,在进程启动前屏蔽/暴露特定GPU
- 为什么不能只靠
--num-gpus?因为HY-Motion底层PyTorch调用torch.cuda.device_count()获取可用卡数,而这个函数读取的就是CUDA_VISIBLE_DEVICES的值
安全写法(绑定第0、3号GPU):
export CUDA_VISIBLE_DEVICES="0,3" python app.py --num-gpus 2 ...单卡极致性能写法(强制只用第1号GPU,避免多卡通信开销):
export CUDA_VISIBLE_DEVICES="1" python app.py --num-gpus 1 ...❌ 危险写法(ID不存在):
export CUDA_VISIBLE_DEVICES="99" # 服务器根本没有99号GPU2.5--share:临时公网链接的双刃剑
- 默认:启用(生成
xxx.gradio.live链接) - 用途:快速分享给他人体验,适合演示/临时评审
- 风险:生成的链接可被任何人访问,且无法设置密码
- 替代方案:局域网内用
--server-name 0.0.0.0+ 内网IP访问,更可控
生产环境建议:删除--share参数,改用内网IP访问
3. 实战修改:三步完成端口与GPU绑定定制
现在我们动手改。整个过程不需要任何编译、不安装新包、不重启系统,改完即生效。
3.1 第一步:备份原脚本(防手抖)
cp /root/build/HY-Motion-1.0/start.sh /root/build/HY-Motion-1.0/start.sh.bak小技巧:
.bak后缀能让大多数编辑器自动识别为备份文件,避免误删
3.2 第二步:编辑start.sh,注入自定义配置
用你喜欢的编辑器打开(推荐nano或vim):
nano /root/build/HY-Motion-1.0/start.sh找到python app.py \这一行(通常在文件末尾),将其替换为以下模板(根据你的需求选择一种):
场景A:单机开发,想用8000端口 + 只用第2号GPU
export CUDA_VISIBLE_DEVICES="2" python app.py \ --server-name 127.0.0.1 \ --server-port 8000 \ --num-gpus 1 \ --enable-xformers场景B:团队服务器,4张A100,需同时跑2个实例(实例1用卡0/1,实例2用卡2/3)
提示:两个实例需分别放在不同目录,或修改各自
start.sh中的端口
实例1(卡0/1,端口7860):
export CUDA_VISIBLE_DEVICES="0,1" python app.py \ --server-name 0.0.0.0 \ --server-port 7860 \ --num-gpus 2 \ --enable-xformers实例2(卡2/3,端口7861):
export CUDA_VISIBLE_DEVICES="2,3" python app.py \ --server-name 0.0.0.0 \ --server-port 7861 \ --num-gpus 2 \ --enable-xformers场景C:云服务器部署,需通过域名访问(假设已配Nginx反代到80端口)
export CUDA_VISIBLE_DEVICES="0" python app.py \ --server-name 127.0.0.1 \ --server-port 7860 \ --num-gpus 1 \ --enable-xformers此时Nginx配置示例(供参考):
location / { proxy_pass http://127.0.0.1:7860; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }
3.3 第三步:验证修改是否生效
执行修改后的脚本:
bash /root/build/HY-Motion-1.0/start.sh观察终端输出,重点确认三处:
GPU识别日志:应出现类似
Found 1 CUDA device(s): [GeForce RTX 4090](数字与你设置的CUDA_VISIBLE_DEVICES一致)端口监听日志:应显示
Running on local URL: http://127.0.0.1:8000(端口号与你设置一致)无报错启动:最后几行应是Gradio的
To create a public link, set --share提示,而非CUDA out of memory或Address already in use
验证访问:
- 本地开发:打开
http://localhost:8000 - 局域网:打开
http://[服务器IP]:7860 - Nginx反代:打开
https://your-domain.com
4. 进阶技巧:让配置更灵活、更健壮
上面的修改已满足90%场景,但如果你希望更工程化,可以加入这些增强项。
4.1 使用环境变量替代硬编码(推荐)
修改start.sh,把端口/GPU等参数抽成变量:
#!/bin/bash # 👇 自定义配置区(只需改这里) export SERVER_PORT=${SERVER_PORT:-7860} export GPU_IDS=${GPU_IDS:-"0"} export SERVER_NAME=${SERVER_NAME:-"127.0.0.1"} export CUDA_VISIBLE_DEVICES="$GPU_IDS" python app.py \ --server-name "$SERVER_NAME" \ --server-port "$SERVER_PORT" \ --num-gpus $(echo "$GPU_IDS" | tr ',' '\n' | wc -l) \ --enable-xformers启动时这样用,无需改脚本:
SERVER_PORT=8000 GPU_IDS="1,2" bash /root/build/HY-Motion-1.0/start.sh4.2 添加GPU健康检查(防静默失败)
在python app.py前插入检测逻辑:
# 检查CUDA_VISIBLE_DEVICES指定的GPU是否存在 for gpu_id in $(echo "$GPU_IDS" | tr ',' ' '); do if ! nvidia-smi -i "$gpu_id" --query-gpu=name --format=csv,noheader 2>/dev/null; then echo "❌ GPU $gpu_id not found. Check nvidia-smi output." exit 1 fi done4.3 日志分离:避免终端刷屏干扰
将Gradio日志重定向到文件,方便排查:
python app.py ... 2>&1 | tee -a /root/build/HY-Motion-1.0/logs/start_$(date +%Y%m%d).log5. 常见问题速查表(改完启动失败?先看这里)
| 现象 | 最可能原因 | 快速解决 |
|---|---|---|
Address already in use | 端口被占用,或上一个进程未退出 | lsof -i :7860→kill -9 <PID>,或换端口 |
CUDA out of memory | --num-gpus>CUDA_VISIBLE_DEVICES中GPU数 | 检查nvidia-smi,确保--num-gpus与可见GPU数量一致 |
| 页面空白/加载失败 | --server-name设为0.0.0.0但防火墙拦截 | sudo ufw allow 7860(Ubuntu)或检查云服务器安全组 |
| 启动后立即退出 | app.py路径错误或权限不足 | ls -l /root/build/HY-Motion-1.0/app.py,确认存在且可执行 |
| GPU识别为0块 | CUDA_VISIBLE_DEVICES格式错误(空格/中文逗号) | 改为英文逗号,如"0,1",不要"0,1" |
终极排查命令(一行搞定):
echo "GPU可见数: $(nvidia-smi -L \| wc -l), 当前可见: $CUDA_VISIBLE_DEVICES, Python检测: $(python3 -c "import torch; print(torch.cuda.device_count())")"
6. 总结:你掌握的不只是改脚本,而是服务治理的第一课
改一个start.sh,表面看是技术操作,背后是你对AI服务部署逻辑的完整理解:
- 你明白了网络层(server-name/port)与资源层(CUDA_VISIBLE_DEVICES/num-gpus)的分离设计;
- 你区分了开发便利性(--share)与生产安全性(0.0.0.0 + 防火墙)的本质差异;
- 你建立了配置即代码的意识——所有环境差异,都应收敛到可版本管理的文本中;
- 你获得了故障自愈能力——当服务异常,不再盲目重启,而是看日志、查GPU、验端口、比配置。
HY-Motion 1.0的强大,在于十亿参数带来的动作表现力;而你的强大,在于能把它稳稳地、恰当地、按需地,落到每一台服务器、每一块GPU、每一个端口上。
下一步,你可以:
- 把修改后的
start.sh提交到Git,实现配置版本化; - 编写
stop.sh脚本,用pkill -f "python app.py"优雅终止; - 尝试用
systemd将服务注册为系统守护进程; - 或者,直接跳到提示词工程,用你刚刚搭好的服务,生成第一个电影级3D动作。
真正的AI落地,从来不在模型参数里,而在你敲下的每一行配置中。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。