由于我的工作函数中需要多个参数,所以我使用了星图,但是如何使用 tqdm 显示进度?
from itertools import repeat
from multiprocessing import Pool
def func(i, a, b, c):
print(i, a, b, c)
if __name__ == '__main__':
pool = Pool(thread_num)
a, b, c = 'a', 'b', 'c'
pool.starmap(func, zip(range(100), repeat(a), repeat(b), repeat(c)))
pool.close()
pool.join()
Run Code Online (Sandbox Code Playgroud)
那么如何使用 tqdm 来显示进度?
我试图找出一种在 gdal.Warp() 中使用进度条来显示完成了多少工作的方法。对于进度条,我使用 Tqdm 和 gdal.Warp() 用于从远程 URL 裁剪图像
def getSubArea(url):
vsicurl_url = '/vsicurl/' + url
output_file = 'someID_subarea.tif'
gdal.SetConfigOption('GDAL_HTTP_UNSAFESSL', 'YES')
gdal.Warp(output_file, vsicurl_url, dstSRS='EPSG:4326', cutlineDSName='area.geojson', cropToCutline=True)
Run Code Online (Sandbox Code Playgroud)
我知道有一个callback论点报告从 0 到 1 的进度,但它仅在 gdal.warp 完成下载裁剪图像后才调用。
在使用Keras训练模型时,我尝试使用keras-tqdm在我的 Jupyter 笔记本中获取进度条,但我遇到了以下错误消息:
无法显示 HBox 类型的 Jupyter 小部件。
如果您在 Jupyter Notebook 或 JupyterLab Notebook 中阅读此消息,则可能意味着小部件 JavaScript 仍在加载。如果此消息仍然存在,则可能意味着未安装或未启用小部件 JavaScript 库。有关设置说明,请参阅Jupyter 小部件文档。
如果您正在另一个前端(例如,GitHub 或 NBViewer 上的静态渲染)阅读此消息,则可能意味着您的前端当前不支持小部件。
我访问了他们链接到的文档页面并执行了他们的命令。似乎没有任何效果,我不知道下一步是什么。
早些时候它只是说我有一个旧版本的 JavaScript 小部件,我需要一个更新的小部件。我按照各种说明尝试更新 JavaScript 小部件,这就是发生的原因。
需要明确的是,这是文档中的命令:
conda install -c conda-forge ipywidgets
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到以下信息:
# All requested packages already installed.
# packages in environment at C:\ProgramData\Anaconda2\envs\py36:
#
ipywidgets 7.1.1 py36_0 conda-forge
Run Code Online (Sandbox Code Playgroud)
其中 py36 是我正在使用的环境。
我接下来可以做什么?
我正在实现我自己的迭代器。tqdm 不显示进度条,因为它不知道列表中元素的总数。我不想使用“total=”,因为它看起来很丑。相反,我更愿意在我的迭代器中添加一些 tqdm 可以用来计算总数的东西。
class Batches:
def __init__(self, batches, target_input):
self.batches = batches
self.pos = 0
self.target_input = target_input
def __iter__(self):
return self
def __next__(self):
if self.pos < len(self.batches):
minibatch = self.batches[self.pos]
target = minibatch[:, :, self.target_input]
self.pos += 1
return minibatch, target
else:
raise StopIteration
def __len__(self):
return self.batches.len()
Run Code Online (Sandbox Code Playgroud)
这甚至可能吗?在上面的代码中添加什么...
使用 tqdm 如下所示..
for minibatch, target in tqdm(Batches(test, target_input)):
output = lstm(minibatch)
loss = criterion(output, target)
writer.add_scalar('loss', loss, tensorboard_step)
Run Code Online (Sandbox Code Playgroud) 我想知道是否可以将自定义变量添加到 tqdm 栏,其中该值有时会随着每次迭代而更新。例如:
exception_count = 0
for _ in tqdm(range(1000), bar_format="Exceptions: counthere | Elapsed: {elapsed} |{rate_fmt}"):
try:
do_stuff()
except Exception:
exception_count += 1
Run Code Online (Sandbox Code Playgroud)
我想exception_count在bar_format参数的某处添加变量作为自定义错误计数器的类型。
我正在用 Python 3.7 编写一个脚本,该脚本使用multiprocessing.Process(每个内核一个任务)启动多个并行任务。为了跟踪每个进程的进度,我使用了tqdm实现进度条的库。我的代码如下所示:
with tqdm(total=iterator_size) as progress_bar:
for row in tqdm(batch):
process_batch(batch)
progress_bar.update(1)
Run Code Online (Sandbox Code Playgroud)
进度条确实会相应地更新,但由于多个进程运行上面的代码,每个进程都会覆盖控制台上的进度条,如下面的屏幕截图所示。
完成后,控制台正确显示完成的进度条:
我的目标是让进度条更新而不会相互覆盖。有没有办法实现这一目标?
一个可能的解决方案是只在需要最长的进程上显示进度条(我事先知道哪个是),但最好的情况是根据第二张图片为每个进程更新一个。
所有解决方案在线地址multiprocess.Pool,但我不打算改变我的架构,因为我可以充分利用multiprocess.Process.
我使用 tqdm 打印带有 hyperopt 的长时间运行优化过程的进度条。这个过程调用一个函数 500 次,每次调用大约需要 10 到 20 分钟,所以我开始让进度显示更精细一点,并tqdm.update在循环中添加了一些 -语句,逐步推进进度条以避免有两个嵌套的进度条,同时仍然能够立即看到到目前为止执行了多少函数调用。
现在丑陋的结果是这样的:
15%|???? | 73.69999999999993/500 [7:40:31<102:54:08, 868.98s/it, evaluating fold 2 of 2 folds...]Iteration 1, loss = 2.50358388
Run Code Online (Sandbox Code Playgroud)
你可以在上面看到,这是函数的第 73 次调用,第 73 次函数调用大约完成了 70%。事实上,我只是估计了m函数中子步骤的数量(可能因调用而异)并使用分数1/m来更新进度条。然后在函数调用之后,我只是将进度条同步回一个完整的整数,以避免添加舍入错误。
当然,准确性在这里根本不是问题。但我想显示 73.70 而不是 73.69999999999993。我已经尝试将我的更新值四舍五入到两个小数位,这并不能解决问题,因为浮点数的精度问题,如果一个数字不能完全用浮点数表示,那么它又变得丑陋了。根据tqdm的文档,这部分隐藏在r_bar整个格式字符串的部分中,但我找不到设置它的方法。你能帮我解决这个问题吗?
根据文档r_bar默认为:
r_bar='| {n_fmt}/{total_fmt} [{elapsed}<{remaining}, '
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
with tqdm(iterable=None, initial=num_trials, maxinterval=maxinterval, total=max_evals, ascii=False, disable=show_progressbar is False) as progress_bar:
def fn_to_minimize(*args, **kwargs):
return fn(*args, **kwargs, _progress_bar=progress_bar)
for num_trials in range(num_trials, …Run Code Online (Sandbox Code Playgroud) Jupyter 小部件,如 HTML 进度条,会在笔记本浏览器窗口刷新时(或远程重新连接到笔记本时)消失。我正在尝试查看如何在刷新窗口时使它们持久化并重新呈现。
假设我为 Jupyter 设置了这样的小部件:
jupyter nbextension enable --py widgetsnbextension
Run Code Online (Sandbox Code Playgroud)
然后我启动一个这样的笔记本:
import time
import ipykernel
import ipywidgets
import IPython
import jupyter
import notebook
import tqdm
import tqdm.notebook
import widgetsnbextension
print('ipykernel version: ', ipykernel.__version__)
print('ipywidgets version: ', ipywidgets.__version__)
print('IPython version: ', IPython.__version__)
print('Jupyter version: ', jupyter.__version__)
print('Jupyter notebook version: ', notebook.__version__)
print('tqdm version: ', tqdm.__version__)
print('widgetsnbextension version: ', widgetsnbextension.__version__)
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到的版本打印如下:
ipykernel version: 5.1.3
ipywidgets version: 7.5.1
IPython version: 7.9.0
Jupyter version: 1.0.0
Jupyter notebook version: 6.0.2
tqdm version: 4.40.0 …Run Code Online (Sandbox Code Playgroud) 我在 Jupyter Notebook 中使用tqdm模块。假设我有以下带有嵌套 for 循环的代码。
import time
from tqdm.notebook import tqdm
for i in tqdm(range(3)):
for j in tqdm(range(5)):
time.sleep(1)
Run Code Online (Sandbox Code Playgroud)
输出如下所示:
100%|??????????| 3/3 [00:15<00:00, 5.07s/it]
100%|??????????| 5/5 [00:10<00:00, 2.02s/it]
100%|??????????| 5/5 [00:05<00:00, 1.01s/it]
100%|??????????| 5/5 [00:05<00:00, 1.01s/it]
Run Code Online (Sandbox Code Playgroud)
是否有任何选项,如何在运行期间仅显示当前 j进度条?那么,完成迭代后的最终输出会是这样吗?
100%|??????????| 3/3 [00:15<00:00, 5.07s/it]
100%|??????????| 5/5 [00:05<00:00, 1.01s/it]
Run Code Online (Sandbox Code Playgroud) 我正在使用 Kubernetes,并且一个训练作业在集群上运行。我使用 TQDM 作为进度条,但与我预期的不同,当我检查 Kubernetes Pod 日志时,进度条没有显示。有没有人有解决这个问题的方法?
tqdm ×10
python ×5
python-3.x ×3
jupyter ×2
concurrency ×1
gdal ×1
ipywidgets ×1
kubeflow ×1
kubernetes ×1
python-2.7 ×1
widget ×1