MongoDB 服务器版本:3.6.8(WSL Ubuntu 20.04)
pymongo 4.1.0
我正在学习机器学习。因为我觉得 TensorBoard 很难使用,所以我尝试通过 MongoDB 和 pymongo 实现一个简单的“可追踪、可见的训练系统”(“tvts”),它具有 TensorBoard 的部分功能。我选择 MongoDB,因为它是基于文档的、NoSQL,更适合记录模型训练的任意属性。
以下是我如何用它来记录训练条件:
import tvts
# before training the modle
ts = tvts.tvts(NAME, '172.26.41.157', init_params={
'ver': VER,
'batch_size': N_BATCH_SIZE,
'lr': LR,
'n_epoch': N_EPOCH,
}, save_dir=SAVE_DIR, save_freq=SAVE_FREQ)
# after an epoch is done
ts.save(epoch, {
'cost': cost_avg,
'acc': metrics_avg[0][0],
'cost_val': cost_avg_val,
'acc_val': metrics_avg_val[0][0],
}, save_path)
我将所有这些数据写入 MondoDB 的集合中,然后我可以获得如下统计数据和图表:
Name: mnist_multi_clf_by_numpynet_mlp_softmax_ok from 172.26.41.157:27017 tvts.train_log
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| train_id | parent | cost(min:last) | LR(b-e:max-min) | epoch_count | existed save/save | from | to | duration |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| 1 | None-None | 1.01055:1.01055 | 0.1:0.1 | 100 | 10/10 | 2022-04-14 11:56:17.618000 | 2022-04-14 11:56:21.273000 | 0:00:03.655000 |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| 2 | 1-100 | 0.56357:0.56357 | 0.1:0.1 | 100 | 10/10 | 2022-04-14 12:00:53.170000 | 2022-04-14 12:00:56.705000 | 0:00:03.535000 |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| 3 | 2-100 | 0.15667:0.15667 | 0.1:0.1 | 300 | 15/15 | 2022-04-14 12:01:35.233000 | 2022-04-14 12:01:45.795000 | 0:00:10.562000 |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| 4 | 3-300 | 0.06820:0.06839 | 0.1:0.1 | 300 | 15/15 | 2022-04-14 18:16:08.720000 | 2022-04-14 18:16:19.606000 | 0:00:10.886000 |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| 5 | 2-100 | 0.03418:0.03418 | 0.5:0.5 | 200 | 10/10 | 2022-04-14 18:18:27.665000 | 2022-04-14 18:18:34.644000 | 0:00:06.979000 |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
| 6 | None-None | 1.68796:1.68858 | 0.001:0.001 | 3000 | 30/30 | 2022-04-16 09:15:56.085000 | 2022-04-16 09:18:01.608000 | 0:02:05.523000 |
+----------+-----------+-----------------+-----------------+-------------+-------------------+----------------------------+----------------------------+----------------+
我发现如果我同时密集地写入集合时尝试获取统计列表,就会卡住。 IE。我尝试即时获取训练的统计数据,每个训练周期都很短(大约 0.03 秒).
但是我发现当我密集地写入集合时,我仍然可以通过Stuido 3T(MongoDB的GUI)读出记录。
我用谷歌搜索了很多,但仍然无法解决。有人说写锁是独占的(如链接:mongodb写正在发生那么读必须等待还是不等待?),但是为什么Studio 3T可以做到?
实际上我是 MongoDB 的新手,我可以使用它,因为我对 MySQL 的经验很少,并且在这个“tvts”中只有插入和查询,即它是 MongoDB 的非常简单的用法。 MySQL 中是否有一些“并发插入”的等效概念? (如链接:MySQL中的并发读写)我想MongoDB在写入的同时读取它并不是一件很难的任务。
虽然是TensorBoard部分功能的简单模拟,但我已经写了近600行代码。所以,很抱歉更改数据库不是首选。
请帮助我。非常感谢!
难以置信!我在发布这个问题后几分钟就意外地解决了它。看来MongoDB集合即使有密集插入也能读取,我猜这是它的正常性能。我想我无法通过谷歌搜索答案,因为这不是一个真正的问题。 我的问题可能是由我使用的 IDE Pycharm 引起的。如果我在 Pycharm 中运行脚本,就会遇到问题。 在系统shell窗口运行就OK了。