ludwig 关键错误在比较性能可视化中,因为"loss"不在metric_names中(visualize.py第1497行)

w6lpcovy  于 4个月前  发布在  其他
关注(0)|答案(3)|浏览(77)

描述bug

在训练了两个(mistral)模型(使用model_typellmecd)后,我想通过ludwig visualize --visualization compare_performance --test_statistics dir1/training_statistics.json dir2/training_statistics.json创建一个compare_performance可视化,但我得到了以下错误:

Traceback (most recent call last):
  File "/workspace/anaconda3/envs/ludwig310/bin/ludwig", line 8, in <module>
    sys.exit(main())
  File "/workspace/anaconda3/envs/ludwig310/lib/python3.10/site-packages/ludwig/cli.py", line 191, in main
    CLI()
  File "/workspace/anaconda3/envs/ludwig310/lib/python3.10/site-packages/ludwig/cli.py", line 71, in __init__
    getattr(self, args.command)()
  File "/workspace/anaconda3/envs/ludwig310/lib/python3.10/site-packages/ludwig/cli.py", line 116, in visualize
    visualize.cli(sys.argv[2:])
  File "/workspace/anaconda3/envs/ludwig310/lib/python3.10/site-packages/ludwig/visualize.py", line 4174, in cli
    vis_func(**vars(args))
  File "/workspace/anaconda3/envs/ludwig310/lib/python3.10/site-packages/ludwig/visualize.py", line 355, in compare_performance_cli
    compare_performance(test_stats_per_model, **kwargs)
  File "/workspace/anaconda3/envs/ludwig310/lib/python3.10/site-packages/ludwig/visualize.py", line 1497, in compare_performance
    metric_names.remove(LOSS)
KeyError: 'loss'

重现问题

按照以下方式创建两个training_statistics.json:
然后上述可视化调用会导致visualize.py的第1497行出现KeyError,从而导致metric_names.remove(LOSS)的错误。
有关详细信息,包括导致上述错误的yaml,请参见training_statistics.json

预期行为

没有错误,但会生成包含模型比较可视化的pdf文件。

环境信息(请填写以下信息):

  • OS:Ubuntu
  • 版本:22.04.3 LTS
  • Python版本:Python 3.10.13
  • Ludwig版本:v0.8.6
    附加上下文

环境是一个runpod:

  • 1 x RTX A6000 (16 vCPU 58 GB RAM)
  • 镜像:runpod/pytorch:2.1.0-py3.10-cuda11.8.0-devel-ubuntu22。
gg58donl

gg58donl2#

我相信由使用 model_type 训练模型生成的上述 training_statistics.json ,对于 visualize.py 中的 compare_performance() 不是适用的:

  1. 参数 test_stats_per_model 变为 [{'evaluation_frequency': {'frequency': 1, 'period': 'epoch'}, 'test': {'combined': {'loss': [6.1890668869018555]}, 'output': {'accuracy': [0.780337929725647], 'accuracy_micro': [0.9599999785423279], 'loss': [6.1890668869018555], 'roc_auc': [0.8079876899719238]}}, 'training': {'combined': {'loss': [24.924232482910156]}, 'output': {'accuracy': [0.7352941036224365], 'accuracy_micro': [0.9324324131011963], 'loss': [24.924232482910156], 'roc_auc': [0.7261029481887817]}}, 'validation': {}}, {'evaluation_frequency': {'frequency': 1, 'period': 'epoch'}, 'test': {'combined': {'loss': [6.1890668869018555]}, 'output': {'accuracy': [0.780337929725647], 'accuracy_micro': [0.9599999785423279], 'loss': [6.1890668869018555], 'roc_auc': [0.8079876899719238]}}, 'training': {'combined': {'loss': [24.924232482910156]}, 'output': {'accuracy': [0.7352941036224365], 'accuracy_micro': [0.9324324131011963], 'loss': [24.924232482910156], 'roc_auc': [0.7261029481887817]}}, 'validation': {}}]
  2. convert_to_list(test_stats_per_model) 产生相同的结构,因此 test_stats_per_model_list == test_stats_per_model
  3. 因此,output_feature_names 变为 {'training', 'evaluation_frequency', 'test', 'validation'}
  4. metric_names 变为 {'output', 'combined'}
  5. 因此,第 1497 行的 metric_names.remove(LOSS) 导致了 KeyError: 'loss'。如果你改为执行 metric_names.discard(LOSS) :
  6. metrics_dict 将不会将 metric_names Map到度量值列表,而是Map到包含 loss 和可能还有其他键的字典列表:{'output': [{'accuracy': [0.7352941036224365], 'accuracy_micro': [0.9324324131011963], 'loss': [24.924232482910156], 'roc_auc': [0.7261029481887817]}, {'accuracy': [0.7352941036224365], 'accuracy_micro': [0.9324324131011963], 'loss': [24.924232482910156], 'roc_auc': [0.7261029481887817]}], 'combined': [{'loss': [24.924232482910156]}, {'loss': [24.924232482910156]}]}
  7. 在第 1517 行对这样的字典列表取最小值会导致 TypeError: '<' not supported between instances of 'dict' and 'dict'
    在修复第 1497 行和第 1517 行之前,如果有传递给 --test_statistics 参数的文件的 JSON schema,或者 visualize.py 的第一个参数 test_stats_per_model 的结构定义,将会非常有帮助。
csbfibhn

csbfibhn3#

正确的。应该传入test_statistics.json而不是train_statistics.json。这个文件是由model.eval或model.experiment生成的。这应该能解决键错误问题。

相关问题