今天总结一下tqdm模块以及pytorch框架选择GPU运行程序遇到的一个小问题。
tqdm模块,是一个python进度条模块,简单已用。
tqdm文档 github 推荐看github中的README了解如何使用,这个文档好像有点老旧。
pytorch框架选择GPU运行程序
pytorch框架选择GPU运行程序,发现os.environ["CUDA_VISIBLE_DEVICES"]="0"放置位置是有讲究的,需要放在倒入torch模块之前,才行。
经过测试,发现没有这个问题,之前我们遇到的问题是,程序没有用我自己设定的gpu跑代码,我调整了config文件(注:config文件中有语句os.environ["CUDA_VISIBLE_DEVICES"]="0")的导入顺序之后,发现解决了问题,因此我错误的认为os.environ["CUDA_VISIBLE_DEVICES"]="0"需要在torch模块之前导入才行。
tqdm模块
tqdm.tqdm类
tqdm.__init__(iterable=None,
desc=None,
total=None,
leave=True,
file=None,
ncols=None,
mininterval=0.1,
maxinterval=10.0,
miniters=None,
ascii=None,
disable=False,
unit='it',
unit_scale=False,
dynamic_ncols=False,
smoothing=0.3,
bar_format=None,
initial=0,
position=None,
postfix=None,
unit_divisor=1000,
write_bytes=None,
lock_args=None,
nrows=None,
gui=False)
所有的参数都是可选的,初始化方法返回一个已经装饰了的可迭代器。
iterable参数
需要用进度条装饰的可迭代的对象,list等等都可以。
desc参数
desc是进度条的前缀,字符串。如下图红框所示。

total参数
迭代的总次数,不设置的话,就等于可迭代对象的长度len(iterable),具体用法如下,常用于手动设置更新迭代次数。
with tqdm(total=100) as pbar:
for i in range(10):
sleep(0.1)
pbar.update(10)
pbar = tqdm(total=100)
for i in range(10):
sleep(0.1)
pbar.update(10)
pbar.close()
leave参数
布尔类型,默认为True,leave参数表示在迭代结束之后,是否保留进度条状态,如果设置为False或者None,则在迭代之后,不会保留最后的状态,而变成0,如下图所示。

file参数
io.TextIOWrapper或者io.StringIO,默认为sys.stderr,表示将进度条信息输出到那里。如下图所示。

ncols参数
输出信息所占的宽度,不指定,则为进度条的整个宽度,指定则为指定的宽度,如下图。

mininterval参数
进度条更新的最小时间间隔,默认为0.1秒。如下图。

更新进度条,其实就是说重新出来一个进度条。
maxinterval参数
进度条更新的最大时间间隔,默认为10秒,与mininterval类似。
miniters参数
进度条更新的最小迭代次数,当设置为0时,根据CPU性能自适应,指定了最小迭代次数,则经过了多少次迭代之后就会更新进度条。
ascii参数
bool或者str,如果不指定或者指定为False,会有滑块填充,如上面的图,有黑色的滑块,如果指定ascii参数,则不会有滑块出现,而是以#填充,并且没有进行完的地方会以数字滚动显示。
disable参数
bool,默认为False,如果指定为True则禁用了整个进度条,如果设置为None,在不是TTY(Teletypes,可以理解为在终端或者控制台上,不会禁用进度条)的情况下,禁用进度条。
经过尝试,在终端中设置为None,依然还是会显示进度条,而在jupyter notebook不会显示进度条。
unit参数
str,表示迭代次数的单位,默认是it,如下红色框框所示。

unit_scale参数
如果设定为1或者True,则会自适应数字单位,如下面的三万多变成了37.5k。

dynamic_ncols参数
默认为False,如果设置了,则会自适应输出的宽ncols和高nrows。
smoothing参数
默认为0.3,设置范围在0到1之间,表示速度估算的指数移动平均平滑因子,0为平均速度,1是当前速度/瞬时速度,表示的是在进度条变化的时候,显示的多少次迭代每秒是平均速度还是瞬时速度。(原话:Exponential moving average smoothing factor for speed estimates)
bar_format参数
进度条的格式,str,不同的进度条格式设置会影响性能,默认的格式是{l_bar}{bar}{r_bar},其中l_bar是{desc}: {percentage:3.0f}%|,r_bar是|{n_fmt}/{total_fmt} [{elapsed}<{remaining},''{rate_fmt}{postfix},这里可以设置很多参数,如下vars: l_bar, bar, r_bar, n, n_fmt, total, total_fmt, percentage, elapsed, elapsed_s, ncols, nrows, desc, unit, rate, rate_fmt, rate_noinv, rate_noinv_fmt, rate_inv, rate_inv_fmt, postfix, unit_divisor, remaining, remaining_s。
当没有设置desc参数的时候,后面的冒号:会被自动去掉。
initial参数
默认值为0,表示初始的迭代次数,常用于新开始一个进度条。如下图,从3开始,最后变成50003次迭代。

position参数
默认为0,如果设置为其他数(记为N),它会在进度条前,先输出N个空行。
postfix参数
与desc参数相似,desc是前缀,postfix是后缀

unit_divisor参数
迭代次数的除数,也可以理解为单位,默认为1000,当unit_scale参数为True的时候,忽略这个参数。
write_bytes参数
表示写入二进制字节编码还是unicode编码,默认为写入unicode编码,当write_bytes参数为True时,写入二进制字节编码。
lock_args参数
tuple类型,刷新中间输出,通过tqdm.refresh()方法,获得中间输出.
nrows参数
与ncols参数类似,表示显示进度条的高度.
gui参数
将进度条使用matplotlib去画,进度条从字符串变成了图片。
不过不建议使用改参数,已经被tqdm.gui.tqdm(...)取代。
tqdm.update(n=1)方法
默认n=1,常用于手动更新迭代次数。
tqdm.close()方法
清除进度条,如果指定了leave=False,则进度条会被清理掉,反之还会留着。
tqdm.refresh(nolock=False, lock_args=None)方法
刷新进度条的显示。
tqdm.unpause()方法
重新开始打印时间,从上次停止的时间开始。
tqdm.reset(total=None)方法
重设total参数
tqdm.set_description(desc=None, refresh=True)方法
tqdm.set_description_str(desc=None, refresh=True)方法
重新设置desc参数,set_description_str方法,没有冒号:跟在desc参数后。
后面的一系列方法不再说明,大多数是重新设置初始化方法中的参数。
tqdm.trange()
与tqdm.tqdm()类似,tqdm.trange()代替了tqdm(range(*args), **kwargs)
tqdm.notebook.tqdm()与tqdm.notebook.trange()

在IPython和Jupyter Notebook中显示好看一些的进度条,使用方法和tqdm.tqdm()、tqdm.trange()类似。
tqdm.gui.tqdm()与tqdm.gui.trange()
用于GUI的进度条,使用方法和tqdm.tqdm()、tqdm.trange()类似。
实验性模块
好像暂时还不能用。
tqdm.contrib.tenumerate()
类似于python内建的enumerate方法
tqdm.contrib.tzip()
类似于python内建的zip方法
tqdm.contrib.tmap()
类似于python内建的tmap方法
自适应打印
from tqdm.auto import tqdm, trange
会根据环境的不同,输出不同样式的进度条。如下图所示。


小结
依旧比较啰嗦,其实主要知道tqdm, trange的用法就行。
from tqdm.auto import tqdm, trange