Ubuntu 16.04启动时GPU功耗限制脚本仅单卡生效问题求助
解决Ubuntu 16.04多GPU功耗限制脚本仅单卡生效的问题
看起来你遇到了多GPU环境下init.d脚本只对gpu0生效的麻烦,我来帮你排查几个常见原因和对应的解决办法:
1. 脚本本身只针对单卡操作,未遍历所有GPU
这是最常见的问题——如果你的脚本里只写了针对gpu0的命令(比如nvidia-smi -i 0 -pl 150),那自然只有第一张卡会被修改。你需要改成遍历所有可用GPU的逻辑:
修改你的脚本,加入循环处理所有显卡:
#!/bin/bash # 定义目标功耗值,替换成你需要的数值 TARGET_POWER=100 # 获取所有GPU的索引,遍历执行功耗设置 for gpu_index in $(nvidia-smi --query-gpu=index --format=csv,noheader); do echo "Setting power limit for GPU $gpu_index to $TARGET_POWER W" /usr/bin/nvidia-smi -i $gpu_index -pl $TARGET_POWER done
这里用nvidia-smi的查询命令获取所有GPU索引,确保不会遗漏任何一张卡,同时指定nvidia-smi的绝对路径避免环境变量问题。
2. init.d脚本启动时机过早,显卡驱动未完全加载
Ubuntu 16.04的init.d脚本启动顺序由符号链接的前缀数字决定(比如S20xxx里的20),如果你的脚本启动时其他GPU的驱动还没初始化完成,命令就无法作用于这些显卡。
解决办法:
- 修改符号链接的优先级,把链接名改成
S99gpu-powerlimit(数字越大,启动越晚),确保脚本在显卡驱动完全加载后执行:# 先删除旧链接 sudo rm /etc/rc1.d/S*gpu-powerlimit /etc/rc3.d/S*gpu-powerlimit # 创建新的高优先级链接 sudo ln -s /etc/init.d/your-script.sh /etc/rc1.d/S99gpu-powerlimit sudo ln -s /etc/init.d/your-script.sh /etc/rc3.d/S99gpu-powerlimit - 更可靠的方式是改用systemd服务(Ubuntu 16.04已经支持systemd):
创建/etc/systemd/system/gpu-powerlimit.service文件,内容如下:
然后执行以下命令启用服务:[Unit] Description=Set Power Limits for All GPUs After=nvidia-persistenced.service multi-user.target [Service] Type=oneshot ExecStart=/path/to/your/gpu-power-script.sh RemainAfterExit=yes User=root [Install] WantedBy=multi-user.target
这个配置会在nvidia持久化服务和多用户环境启动后再执行脚本,确保所有GPU都已就绪。sudo systemctl daemon-reload sudo systemctl enable gpu-powerlimit.service
3. Crontab @reboot 环境变量不足导致失效
如果用crontab的@reboot执行脚本,默认的环境变量非常有限,可能找不到nvidia-smi的正确路径,或者无法访问显卡驱动接口。
解决办法:
- 在crontab里指定完整的环境和脚本路径:
编辑crontab:sudo crontab -e,添加一行:
这里指定了PATH,同时把输出日志写入@reboot /bin/bash -c 'export PATH=/usr/bin:/usr/local/bin; /path/to/your/gpu-power-script.sh >> /var/log/gpu-cron.log 2>&1'/var/log/gpu-cron.log,方便后续排查错误。
4. 脚本执行权限或日志排查
如果以上方法都不行,建议在脚本里添加日志输出,看看具体执行时有没有报错:
在脚本开头加入日志配置:
LOG_FILE="/var/log/gpu-powerlimit.log" echo "=== $(date) Starting GPU power limit setup ===" >> $LOG_FILE
然后在每个nvidia-smi命令后追加日志:
/usr/bin/nvidia-smi -i $gpu_index -pl $TARGET_POWER >> $LOG_FILE 2>&1
重启后查看日志:cat /var/log/gpu-powerlimit.log,如果某张卡有报错,就能针对性解决(比如驱动未加载、权限不足等)。
内容的提问来源于stack exchange,提问作者Tyler S
相关产品推荐
相关产品推荐

