
监控GPU是否可用
创建脚本
脚本功能:脚本监控GPU使用率,并在GPU内存使用率低于20%时执行指定脚本
在任意位置创建mgpu
vim mgpu把下面的内容粘贴上去
#!/bin/bash
param1=$1
param2=$2
# ANSI color codes
GREEN="\033[0;32m"
RED="\033[0;31m"
BLUE="\033[0;34m"
RESET="\033[0m"
threshold=20
log_file_global="/home/dongli911/mgpu.log" # 全局日志文件路径
# 生成一个基于时间戳的唯一ID
script_id=$(date +%s)
# 检查是否请求查看当前运行的脚本
if [[ "$param1" == "ps" ]]; then
echo -e "${BLUE}当前正在运行的脚本:${RESET}"
grep "Status: Running" $log_file_global
exit
fi
# 如果输入了-g参数,根据后续参数生成模板并退出
if [[ "$param1" == "-g" ]]; then
script_name="${param2:-run_python}"
template_path="./${script_name}.sh"
echo -e "正在当前目录${template_path}生成 ${GREEN} ${script_name}.sh ${RESET} 模板..."
cat > "$template_path" << EOF
#!/bin/bash
# 激活 Conda 环境 (不要删除下面这行!)
source /opt/anaconda3/etc/profile.d/conda.sh
# 选择要激活的环境 (修改下一行以激活你偏好的环境)
conda activate sdv3
# 执行 Python 脚本, 后面可以接参数
python ~/.wan/aigc/main.py
EOF
chmod +x "$template_path"
echo -e "${GREEN}模板 '${script_name}.sh' ${RESET} 已创建并设置为可执行状态,位于当前目录。"
# 记录生成模板操作
echo "$script_id - $(date '+%Y-%m-%d %H:%M:%S') - ${USER} - ${PWD} - Generated script template: ${script_name}.sh" >> $log_file_global
exit
fi
# 检查是否有输入参数或者是否输入了 -h
if [[ -z "$param1" || "$param1" == "-h" ]]; then
echo -e "${BLUE}此脚本监控GPU使用率,并在GPU内存使用率低于20%时执行指定脚本。${RESET}\n"
echo -e "生成脚本模板"
echo -e "用法: ${GREEN}$0 -g [script_name]${RESET}"
echo -e " 如: ${GREEN}$0 -g lthero${RESET},则生成lthero.sh"
echo -e " 如: ${GREEN}$0 -g ${RESET},则生成默认名run_python.sh\n"
echo -e "运行脚本"
echo -e "用法: ${GREEN}$0 <要执行的脚本>${RESET}"
echo -e " 如: ${GREEN}$0 lthero.sh${RESET}"
echo -e " 如: ${GREEN}$0 run_python.sh${RESET}\n"
echo -e "查看正在运行的脚本"
echo -e "用法: ${GREEN}$0 ps${RESET}"
exit
fi
# 检查文件是否存在
if [ -f "$param1" ]; then
echo -e "如果GPU可用,将执行脚本 ${GREEN} $param1${RESET}"
else
echo -e "${RED}错误:未找到脚本 $param1 或脚本不可执行。${RESET}"
exit
fi
# 设置日志文件
log_file="./${param1%.*}.log"
counter=0
while [[ -f "$log_file" ]]; do
let counter+=1
log_file="./${param1%.*}$counter.log"
done
# 记录执行脚本操作
echo "$script_id - $(date '+%Y-%m-%d %H:%M:%S') - ${USER} - ${PWD} - Executed script: $param1 - Status: Running" >> $log_file_global
# 持续检测GPU占用,并将输出重定向到日志文件
(
while true; do
usage=$(nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits | awk '{print ($1/$2)*100}')
usage_lt_threshold=$(echo "$usage < $threshold " | bc)
echo "当前GPU内存使用率为 $usage%" >> "$log_file"
if [ "$usage_lt_threshold" -eq 1 ]; then
echo "当前GPU内存使用率低于${threshold}%,将执行脚本" >> "$log_file"
bash $param1 >> "$log_file" 2>&1
echo "${GREEN}脚本 $param1 已执行。${RESET}" >> "$log_file"
sed -i "/$script_id/c\\$script_id - $(date '+%Y-%m-%d %H:%M:%S') - ${USER} - ${PWD} - Executed script: $param1 - Status: Completed" $log_file_global
break
fi
sleep 60
done
) &
echo -e "${GREEN}脚本已转至后台运行。${RESET}"随后,放在全局可用的地方
sudo mv ./mgpu /usr/local/bin/mgpu使用脚本
说明
log_file_global="/home/mgpu.log" # 全局日志文件路径这里设置了全局的日志文件位置,可以修改
全局日志会记录ID号、运行时刻,运行状态、目录、脚本名等信息
1716812372 - 2024-05-27 20:19:32 - dongli911 - /home/ - Executed script: 1picwait4extract.sh - Status: Running脚本说明
mgpu
# 或
mgpu -h生成脚本模板
用法: /usr/local/bin/mgpu -g [script_name]
如 mgpu -g lthero 会生成:lthero.sh
如 mgpu -g 会生成默认名:run_python.sh
运行脚本
用法: /usr/local/bin/mgpu <要执行的脚本>
如 /usr/local/bin/mgpu lthero.sh
举例
进入要运行的py目录,如~/test/目录下有main.py,需要的conda环境为sdv3
生成脚本模板
先进入输入mgpu -g,随后在~/test/目录下有run_python.sh文件,打开run_python.sh进行编辑,在第6行修改成需要用的环境,第9行修改成需要运行的main.py代码
#!/bin/bash
# 激活 Conda 环境 (不要删除下面这行!)
source /opt/anaconda3/etc/profile.d/conda.sh
# 选择要激活的环境 (修改下一行以激活你偏好的环境)
conda activate sdv3 # 修改这行内容
# 执行 Python 脚本, 后面可以接参数
python ~/.wan/aigc/main.py # 修改这行内容修改好后,保存这个run_python.sh文件
运行定制脚本
在~/test/目录下运行以下代码即可在后台监控GPU,并空闲时执行代码
mgpu run_python.sh代码输出的日志保存在~/test/目录下的run_python.log,如果多次运行,日志会自动排序run_python.log1,run_python.log2……
- 文章作者:
- Lthero博客
- 版权声明:
- 本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0许可协议。转载请注明来自 Lthero博客!



