linux 监控代码执行

问题1:

当前面对的问题,tf.train.MonitoredTrainingSession()按时间保存模型参数(checkpoint).而在训练的过程中,不同时间间隔都会保存checkpoint,当模型较为庞大的时候,保存checkpoint的内存将会很大,而我的服务器内存有限。

解决方案:

因此我想到了一种解决办法,利用Linux的定时任务crontab 命令实现,边保存检查点,边删除部分无用的检查点,从而节省内存。通过检查,在测试代码的时候需要的文件可以在3分钟之内保存完整,因此我想到的是,用一个定时任务时刻检查保存检查点(checkpoint)保存的文件夹,并实时检查文件的创建时间和当前时间的差距,差距超过3分钟的的检查点文件将被删除。

问题2:

但是这样又造成了另一个问题,就是当训练代码结束以后,检查点将不在生成,那么如果此时上面创建的定时任务将继续删除文件,这就导致了,我们的模型全部被删除。

解决方案2:

因此需要再次创建一个定时认任务,该任务执行一个脚本,时刻检查模型是否训练完成,如果完成,则终止删除文件任务的定时器。这样就能保障我的模型能很好的保存,并且不占用太大的内存。

该段代码是一个shell脚本,如果用linux定时器运行段代码,则会实现检查mycode.py 是否结束运行,如果结束则重新运行,如果能把红色部分改为crontab -r 则将实现对定时任务的结束操作,即删除用户的定时任务(即第二个解决方案)。

#!/bin/bash
count=`ps -ef |grep /home/fws/home/mycode.py |grep -v "grep" |wc -l`
echo $count
if [ 0 == $count ];then
nohup python  /home/fws/home/mycode.py  > /home/fws/home/mycode.log 2>&1 &
echo $count
fi

#!/bin/bash
count=`ps -ef |grep /home/fws/home/mycode.py |grep -v "grep" |wc -l`
echo $count
if [ 0 == $count ];then
crontab -r
fi


# 删除文件夹下修改时间超过3分钟的文件
#!/bin/bash
nowSoc=$(date '+%s')
c=0
for file in $(ls '/home/fws/home/alexnet/ckpt_dir/')
do
  filelist[$c]="$file"
  ((c++))
done
for i in ${filelist[@]};
do
echo $i
d=$(stat -c "%Z" '/home/fws/home/alexnet/ckpt_dir/'$i'')
#echo $(($d - $nowSoc))
if test $(($nowSoc - $d)) -ge 180; then
echo "##########"
rm -rf /home/fws/home/alexnet/ckpt_dir/$i
fi
done

版本一
delectcheckpoint.sh

#!/bin/bash
# 获取当前世界秒
nowSoc=$(date '+%s')
c=0

# 遍历指定目录下的文件,并用数组filelist[] 保存其文件名
for file in $(ls '/home/fws/home/alexnet/ckpt_dir/')
do
  filelist[$c]="$file"
  ((c++))
  echo $c
done
#遍历filelist[] 数组 并查找其修改时间,并判断修改时间和当前时间大与3分钟(180s)的文件,如果当前文件夹内多与5个文件,删除与当前时间大于3分钟的文件
#(此法漏洞,定时任务检测目录下的文件时,train.py正在保存模型,那么就会造成删除还没有来的及更新的文件,此时,由于删除后文件个数少于5个,或者修改时间没达到3分钟,此时就无法达到我们的目的)
for i in ${filelist[@]};
do
echo $i
# 读取当前文件的修改时间
d=$(stat -c "%Z" '/home/fws/home/alexnet/ckpt_dir/'$i'')
# 此句为了调试
echo "time  $(( $nowSoc - $d))" >> /home/fws/home/alexnet/check.txt
# 计算目录下的文件个数
count=$(find /home/fws/home/alexnet/ckpt_dir/  -type f | wc -l)
echo "count $count" >> /home/fws/home/alexnet/check.txt
#计算文件修改时间与当前时间的文件间隔
distance=($nowSoc - $d)
#判断是否满足删除条件
if [ $count -ge 6 ]&&[ $distance -ge 180 ];
then
echo "delect file" >> /home/fws/home/alexnet/check.txt
# 删除满足条件的文件
rm -rf /home/fws/home/alexnet/ckpt_dir/$i
fi
done

clearcrontab.sh

#!/bin/bash
# 计算train 是否运行
count=`ps -ef |grep /home/fws/home/alexnet/train.py |grep -v "grep" |wc -l`
# 下面这段代码也很靠谱, 当上面那段代码不可用时,尝试下面这段代码
# count=`ps -af |grep train.py |grep -v "grep" |wc -l`
echo $count
# 如果不运行 停止定时任务
if [ 0 == $count ];then
crontab -r
fi

命令解释

ps -ef |grep /home/fws/home/alexnet/train.py |grep -v "grep" |wc -l
ps -ef  : 按标准格式显示进程
grep /home/fws/home/alexnet/train.py (管道符传递过来的):找到含有train.py的进程。
grep -v "grep" (管道符传递过来的): 过滤掉含有"grep"的进程   (当在终端用 python train.py时, 此段可以去掉)
wc -l : 统计行数

版本二
delectcheckpoint.sh

#!/bin/bash

# 获取当前世纪秒
nowSoc=$(date '+%s')

# 获取指定路径下的文件个数
count=$(find /home/fws/home/alexnet/ckpt_dir/  -type f | wc -l)
# 输出重定向 (调试使用)
echo "count $count" >> /home/fws/home/alexnet/check.txt


# 判断开始
if [ $count -ge 9 ];
  then
  # 判断文件是否以model开始
  c=0
  for file in $(ls '/home/fws/home/alexnet/ckpt_dir/')
     do
     filelist[$c]="$file"
     ((c++))
     d=$(stat -c "%Z" '/home/fws/home/alexnet/ckpt_dir/'$file'')
     # 下面这两句调试使用  检测文件修改时间,以及文件路径的格式($file)
     #echo $d >> /home/fws/home/alexnet/check.txt
     #echo '/home/fws/home/alexnet/ckpt_dir/'$file'' >> /home/fws/home/alexnet/check.txt
     # shell算术运算的规则 $(($var_name - $var_name))
     distance=$(($nowSoc-$d))
     # 输出重定向  打印算术运算结果(调试使用)
     echo "time $distance" >> /home/fws/home/alexnet/check.txt
         #   删除文件的条件
     if [[ "$file" =~ ^model.* ]]&&[ $distance -ge 180 ];
        then
        #echo $distance >> /home/fws/home/alexnet/check.txt
        echo " remove file $file"  >> /home/fws/home/alexnet/check.txt
        rm -rf /home/fws/home/alexnet/ckpt_dir/$file
     fi
     done
fi

clearcrontab.sh

#!/bin/bash
# 计算train 是否运行
count=`ps -ef |grep /home/fws/home/alexnet/train.py |grep -v "grep" |wc -l`
# 下面这段代码也很靠谱, 当上面那段代码不可用时,尝试下面这段代码
# count=`ps -af |grep train.py |grep -v "grep" |wc -l`
echo $count
# 如果不运行 停止定时任务
if [ 0 == $count ];then
crontab -r
fi

执行定时任务

执行 crontab -e
将下列两行代码拷入定时任务列表


版本0
* * * * * /home/fws/home/alexnet/delectcheckpoint.sh
*/3 * * * * /home/fws/home/alexnet/clearcrontab.sh

版本1
* * * * * /home/fws/home/alexnet/delectcheckpoint_v1.sh
*/3 * * * * /home/fws/home/alexnet/clearcrontab.sh

tail -f check.txt
监控文件check.txt,查看监控状态

猜你喜欢

转载自blog.csdn.net/fws920910fws/article/details/87819719