关于图片数据处理类工具看我的另一篇博客:CV笔记:图片数据处理_X-ocean的博客-CSDN博客
目录
记录日志
python自带logging模块
import logging
logger = logging.getLogger('XX模型指标记录器')
file_handler = logging.FileHandler(
filename='./draft/test.log', # 日志记录文件
encoding='utf-8', # 日志文件编码方式
mode='a' # 日志文件打开模式:a代表追加,w代表覆盖
)
formatter = logging.Formatter("%(asctime)s - %(name)s-%(levelname)s %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
logger.debug('debug,用来打印一些调试信息,级别最低')
logger.info('info,用来打印一些正常的操作信息')
logger.warning('waring,用来用来打印警告信息')
logger.error('error,一般用来打印一些错误信息')
logger.critical('critical,用来打印一些致命的错误信息,等级最高')
然后会生成test.log文件,内容如下:
2022-11-28 13:06:46,056 - XX模型指标记录器-DEBUG debug,用来打印一些调试信息,级别最低
2022-11-28 13:06:46,056 - XX模型指标记录器-INFO info,用来打印一些正常的操作信息
2022-11-28 13:06:46,056 - XX模型指标记录器-WARNING waring,用来用来打印警告信息
2022-11-28 13:06:46,056 - XX模型指标记录器-ERROR error,一般用来打印一些错误信息
2022-11-28 13:06:46,056 - XX模型指标记录器-CRITICAL critical,用来打印一些致命的错误信息,等级最高
如果只是想在控制台输出,不输出到文件,则直接:
import logging
logging.basicConfig(format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s-%(funcName)s',
level=logging.INFO)
logging.debug('debug,用来打印一些调试信息,级别最低')
logging.info('info,用来打印一些正常的操作信息')
logging.warning('waring,用来用来打印警告信息')
logging.error('error,一般用来打印一些错误信息')
logging.critical('critical,用来打印一些致命的错误信息,等级最高')
如果想获得日志文件的完整路径,可以使用下面代码得到一个路径字符串:
logger.handlers[0].baseFilename
如果想要输出tranceback错误信息,可以这样做:
try:
# code
except Exception as e:
logger.error("err info",exc_info = True)
下面封装好一个函数,拿来即可用:
import logging,os,time
from config import args
def get_logger(log_folder = args.log_file_path):
log_file_name = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time.time())) + '.log'
logger = logging.getLogger('')
file_handler = logging.FileHandler(
filename=os.path.join(log_folder,log_file_name), # 日志记录文件
encoding='utf-8', # 日志文件编码方式
mode='a' # 日志文件打开模式:a代表追加,w代表覆盖
)
formatter = logging.Formatter("%(asctime)s - %(levelname)s: %(message)s")
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.setLevel(logging.INFO)
return logger
logging可以参考:
格式化输出时间
这里给出自己最喜欢最常用的一种:
import time
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))
# 输出:'2022-12-03 19:17:24'
查看运行中占用的显存大小
使用如下代码
import torch
print(torch.cuda.max_memory_allocated())
单位是字节,如果想要转换成更常用的MB,还需要除以(1024*1014)。
在学校的Slurm超算系统上查看显存占用情况:
- 首先登录到计算结点:SSH g00xx
- 然后输入nvidia-smi命令查看显卡占用情况
多GPU训练
Tensorboard
启动tensorboard查看数据:
tensorboard --logdir=<directory_name>
进度条tqdm
参考视频:【实用模块-5-tqdm进度条】 https://www.bilibili.com/video/BV1ZG411M7Ge
1. 最简单直接用法:直接用tqdm包裹可迭代对象
import time
from tqdm import tqdm,trange
# 最简单的例子:计算50的阶乘
p = 1
# 直接用tqdm包裹range
for i in tqdm(range(50)):
p *= (i+1)
time.sleep(0.05)
print("finish!")
2. trange: 类似于range
import time
from tqdm import tqdm,trange
# 直接用trange也可以
p = 1
for i in trange(50):
p *= (i+1)
time.sleep(0.05)
print("finish!")
3. 设置进度条前缀和后缀
# 设置进度条信息: 显示前缀和后缀
proc_bar = tqdm(range(50))
p = 1
for i in proc_bar:
# 显示前缀
# proc_bar.set_description(F"正在计算:")
# 显示后缀,要求传入字典,因为可以显示多条信息
proc_bar.set_postfix({"正在处理":F"{int(i)}","processing":F"{int(i)+1}"})
time.sleep(0.05)
4. 自定义更新进度
# 自定义控制:适用于不希望改变for语句的写法
proc_bar = tqdm(total=100) # 达到total时为100%
n = 40
for i in range(n):
proc_bar.update(100/n)
time.sleep(0.05)
# 关闭进度条,释放资源
proc_bar.close()
5. 图形化进度条
5.1 tk
# 弹出一个窗口显示,估计是用自带的tkinter写的
from tqdm.tk import tqdm
from time import sleep
for i in tqdm(range(50)):
sleep(0.05)
5.2 rich
# 控制台彩色的线条,需要pip install rich
from tqdm.rich import tqdm
from time import sleep
for i in tqdm(range(50)):
sleep(0.05)
5.3 gui
# 使用matplotlib来绘制, 流畅度不高
from tqdm.gui import tqdm
from time import sleep
for i in tqdm(range(50)):
sleep(0.05)