创建脚本

脚本功能:脚本监控GPU使用率,并在GPU内存使用率低于20%时执行指定脚本

在任意位置创建mgpu

1
vim mgpu

把下面的内容粘贴上去

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#!/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}"


随后,放在全局可用的地方

1
sudo mv ./mgpu /usr/local/bin/mgpu

使用脚本

说明

1
log_file_global="/home/mgpu.log"  # 全局日志文件路径

这里设置了全局的日志文件位置,可以修改

全局日志会记录ID号、运行时刻,运行状态、目录、脚本名等信息

1
1716812372 - 2024-05-27 20:19:32 - dongli911 - /home/ - Executed script: 1picwait4extract.sh - Status: Running

脚本说明

1
2
3
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代码

1
2
3
4
5
6
7
8
9
#!/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,并空闲时执行代码

1
mgpu run_python.sh

代码输出的日志保存在~/test/目录下的run_python.log,如果多次运行,日志会自动排序run_python.log1,run_python.log2……