datawhalechina / self-llm

《开源大模型食用指南》基于Linux环境快速部署开源大模型,更适合中国宝宝的部署教程
Apache License 2.0
6.51k stars 798 forks source link

chatGLM3微调过程中报错TypeError: Object of type set is not JSON serializable #47

Closed CharlieZZss closed 4 months ago

CharlieZZss commented 5 months ago

image 如图所示,每次到训练到100步时就会报错TypeError,其余步骤与教程一样,生成的checkpoint-100文件夹中的adapter_config.json内容也是空的。完整报错如下:

TypeError Traceback (most recent call last) Cell In[18], line 1 ----> 1 trainer.train()

File ~/miniconda3/lib/python3.10/site-packages/transformers/trainer.py:1591, in Trainer.train(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs) 1589 hf_hub_utils.enable_progress_bars() 1590 else: -> 1591 return inner_training_loop( 1592 args=args, 1593 resume_from_checkpoint=resume_from_checkpoint, 1594 trial=trial, 1595 ignore_keys_for_eval=ignore_keys_for_eval, 1596 )

File ~/miniconda3/lib/python3.10/site-packages/transformers/trainer.py:1984, in Trainer._inner_training_loop(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval) 1981 self.state.epoch = epoch + (step + 1 + steps_skipped) / steps_in_epoch 1982 self.control = self.callback_handler.on_step_end(args, self.state, self.control) -> 1984 self._maybe_log_save_evaluate(tr_loss, model, trial, epoch, ignore_keys_for_eval) 1985 else: 1986 self.control = self.callback_handler.on_substep_end(args, self.state, self.control)

File ~/miniconda3/lib/python3.10/site-packages/transformers/trainer.py:2339, in Trainer._maybe_log_save_evaluate(self, tr_loss, model, trial, epoch, ignore_keys_for_eval) 2336 self.lr_scheduler.step(metrics[metric_to_check]) 2338 if self.control.should_save: -> 2339 self._save_checkpoint(model, trial, metrics=metrics) 2340 self.control = self.callback_handler.on_save(self.args, self.state, self.control)

File ~/miniconda3/lib/python3.10/site-packages/transformers/trainer.py:2396, in Trainer._save_checkpoint(self, model, trial, metrics) 2394 run_dir = self._get_output_dir(trial=trial) 2395 output_dir = os.path.join(run_dir, checkpoint_folder) -> 2396 self.save_model(output_dir, _internal_call=True) 2397 if self.is_deepspeed_enabled: 2398 # under zero3 model file itself doesn't get saved since it's bogus! Unless deepspeed 2399 # config stage3_gather_16bit_weights_on_model_save is True 2400 self.model_wrapped.save_checkpoint(output_dir)

File ~/miniconda3/lib/python3.10/site-packages/transformers/trainer.py:2901, in Trainer.save_model(self, output_dir, _internal_call) 2898 self.model_wrapped.save_checkpoint(output_dir) 2900 elif self.args.should_save: -> 2901 self._save(output_dir) 2903 # Push to the Hub when save_model is called by the user. 2904 if self.args.push_to_hub and not _internal_call:

File ~/miniconda3/lib/python3.10/site-packages/transformers/trainer.py:2959, in Trainer._save(self, output_dir, state_dict) 2957 torch.save(state_dict, os.path.join(output_dir, WEIGHTS_NAME)) 2958 else: -> 2959 self.model.save_pretrained( 2960 output_dir, state_dict=state_dict, safe_serialization=self.args.save_safetensors 2961 ) 2963 if self.tokenizer is not None: 2964 self.tokenizer.save_pretrained(output_dir)

File ~/miniconda3/lib/python3.10/site-packages/peft/peft_model.py:201, in PeftModel.save_pretrained(self, save_directory, safe_serialization, selected_adapters, **kwargs) 198 else: 199 auto_mapping_dict = None --> 201 peft_config.save_pretrained(output_dir, auto_mapping_dict=auto_mapping_dict) 202 peft_config.inference_mode = inference_mode

File ~/miniconda3/lib/python3.10/site-packages/peft/utils/config.py:92, in PeftConfigMixin.save_pretrained(self, save_directory, **kwargs) 90 # save it 91 with open(output_path, "w") as writer: ---> 92 writer.write(json.dumps(output_dict, indent=2, sort_keys=True))

File ~/miniconda3/lib/python3.10/json/init.py:238, in dumps(obj, skipkeys, ensure_ascii, check_circular, allow_nan, cls, indent, separators, default, sort_keys, kw) 232 if cls is None: 233 cls = JSONEncoder 234 return cls( 235 skipkeys=skipkeys, ensure_ascii=ensure_ascii, 236 check_circular=check_circular, allow_nan=allow_nan, indent=indent, 237 separators=separators, default=default, sort_keys=sort_keys, --> 238 kw).encode(obj)

File ~/miniconda3/lib/python3.10/json/encoder.py:201, in JSONEncoder.encode(self, o) 199 chunks = self.iterencode(o, _one_shot=True) 200 if not isinstance(chunks, (list, tuple)): --> 201 chunks = list(chunks) 202 return ''.join(chunks)

File ~/miniconda3/lib/python3.10/json/encoder.py:431, in _make_iterencode.._iterencode(o, _current_indent_level) 429 yield from _iterencode_list(o, _current_indent_level) 430 elif isinstance(o, dict): --> 431 yield from _iterencode_dict(o, _current_indent_level) 432 else: 433 if markers is not None:

File ~/miniconda3/lib/python3.10/json/encoder.py:405, in _make_iterencode.._iterencode_dict(dct, _current_indent_level) 403 else: 404 chunks = _iterencode(value, _current_indent_level) --> 405 yield from chunks 406 if newline_indent is not None: 407 _current_indent_level -= 1

File ~/miniconda3/lib/python3.10/json/encoder.py:438, in _make_iterencode.._iterencode(o, _current_indent_level) 436 raise ValueError("Circular reference detected") 437 markers[markerid] = o --> 438 o = _default(o) 439 yield from _iterencode(o, _current_indent_level) 440 if markers is not None:

File ~/miniconda3/lib/python3.10/json/encoder.py:179, in JSONEncoder.default(self, o) 160 def default(self, o): 161 """Implement this method in a subclass such that it returns 162 a serializable object for o, or calls the base implementation 163 (to raise a TypeError). (...) 177 178 """ --> 179 raise TypeError(f'Object of type {o.class.name} ' 180 f'is not JSON serializable')

TypeError: Object of type set is not JSON serializable

Hongru0306 commented 5 months ago

抱歉,我们也没遇到过类似的问题,可能是环境因素。由于我们这里也没有您的环境,无法复现bug。如果可以的话,欢迎您创建一个云服务器平台,我们会登录您的平台进一步探讨问题所在。

Hongru0306 commented 5 months ago

或者您可以将数据以及执行的文件发到git上,将链接发到此issue里,我们在我们的设备上再尝试一下。

CharlieZZss commented 4 months ago

把transformers更新到4.37.2,是版本问题。同时感谢开发团队的解答~