Save training checkpoint Arguments: save_dir: Required. Directory for saving the checkpoint tag: Optional. Checkpoint tag used as a unique identifier for the checkpoint, global step is used if not provided. Tag name must be the same across all ranks.
(self, save_dir, tag=None, client_state={}, save_latest=True, exclude_frozen_parameters=False)
| 4857 | logger.warning(msg) |
| 4858 | |
| 4859 | def save_checkpoint(self, save_dir, tag=None, client_state={}, save_latest=True, exclude_frozen_parameters=False): |
| 4860 | """Save training checkpoint |
| 4861 | |
| 4862 | Arguments: |
| 4863 | save_dir: Required. Directory for saving the checkpoint |
| 4864 | tag: Optional. Checkpoint tag used as a unique identifier for the checkpoint, global step is |
| 4865 | used if not provided. Tag name must be the same across all ranks. |
| 4866 | client_state: Optional. State dictionary used for saving required training states in the client code. |
| 4867 | save_latest: Optional. Save a file 'latest' pointing to the latest saved checkpoint. |
| 4868 | exclude_frozen_parameters: Optional. Exclude frozen parameters from checkpointed state. |
| 4869 | Important: all processes must call this method and not just the process with rank 0. It is |
| 4870 | because each process needs to save its master weights and scheduler+optimizer states. This |
| 4871 | method will hang waiting to synchronize with other processes if it's called just for the |
| 4872 | process with rank 0. |
| 4873 | |
| 4874 | """ |
| 4875 | if not save_dir: |
| 4876 | raise ValueError(f"save_dir must be a non-empty string, got {save_dir!r}") |
| 4877 | |
| 4878 | if self._optimizer_has_ckpt_event_prologue(): |
| 4879 | # Custom preparation for checkpoint save, if applicable |
| 4880 | self.optimizer.checkpoint_event_prologue() |
| 4881 | |
| 4882 | rank = self.local_rank if self.use_node_local_storage() else self.global_rank |
| 4883 | |
| 4884 | # This is to make sure the checkpoint names are created without collision |
| 4885 | # There seems to be issue creating them in parallel |
| 4886 | |
| 4887 | # Ensure save_dir directory exists |
| 4888 | if rank == 0: |
| 4889 | self.checkpoint_engine.makedirs(save_dir, exist_ok=True) |
| 4890 | dist.barrier() |
| 4891 | |
| 4892 | if tag is None: |
| 4893 | tag = f"global_step{self.global_steps}" |
| 4894 | |
| 4895 | # Ensure tag is a string |
| 4896 | tag = str(tag) |
| 4897 | commit_info = CheckpointCommitInfo(tag=tag, save_dir=save_dir, save_latest=save_latest) |
| 4898 | |
| 4899 | self.checkpoint_engine.create(commit_info) |
| 4900 | |
| 4901 | # Ensure checkpoint tag is consistent across ranks |
| 4902 | self._checkpoint_tag_validation(tag) |
| 4903 | |
| 4904 | if self.has_moe_layers: |
| 4905 | self.save_non_zero_checkpoint = False |
| 4906 | self._create_checkpoint_file(save_dir, tag, False) |
| 4907 | self._save_moe_checkpoint(save_dir, |
| 4908 | tag, |
| 4909 | client_state=client_state, |
| 4910 | exclude_frozen_parameters=exclude_frozen_parameters) |
| 4911 | |
| 4912 | # We distribute the task of saving layer checkpoint files among |
| 4913 | # data parallel instances, so all procs should call _save_checkpoint. |
| 4914 | # All procs then call module_state_dict(), but only procs of data |
| 4915 | # parallel rank 0 save the general model params. |
| 4916 | if not self.has_moe_layers: |