You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AzureML训练CV模型保存.pth checkpoint报设备空间不足错误

问题:AzureML训练模型时保存Checkpoint提示磁盘空间不足

我在AzureML上训练计算机视觉模型,之前用Python SDK提交Job遇到问题,改用Azure Storage Explorer把代码直接上传到Blob存储的AzureML存储账户文件夹后,Job能正常提交,但保存15MB左右的.pth checkpoint文件时,出现OSError: No space left on device错误。此前我完成过生成更多、更大文件的训练运行,求解决该问题。

环境信息

  • 数据存储在ADLS Gen2热层
  • Azure ML存储账户为100TiB文件共享
  • 文件大小:269KB(.log)、5.8MB(.pth)、15MB(.pth)、18KB(.py)
  • 计算实例:Standard_NC24ads_A100_v4

Job代码

training_job = command(
    inputs={
        'data':Input(
                type="uri_folder",
                path=f"{data_asset.id}",
                mode=InputOutputModes.RO_MOUNT
        )},
    outputs={
        'outputs':Output(
            type='uri_folder',
            path = f'azureml://datastores/workspaceartifactstore/paths/ExperimentRun/dcid.{command_name}/outputs',
            mode  =InputOutputModes.RW_MOUNT
        )},
    code=f'https://{storage_account}.blob.core.windows.net/job1-data/code/',
    command='python train.py',
    environment="{name}{version}".format(name=az_cfg['environment']['name'],version=az_cfg['environment']['version']),
    display_name=az_cfg['job']['display_name_train'],
    compute = ci_name,
    environment_variables={ 
      "DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED": True,
      "EXPERIMENT_NAME":az_cfg['mlflow']['experiment_name']
      },
    experiment_name=az_cfg['mlflow']['experiment_name'],
    name=command_name
      
)

补充说明

我使用MMPose和MMEngine框架,保存checkpoint的核心代码片段如下:

def put(self, obj: bytes, filepath: Union[str, Path]) -> None:
    """Write bytes to a given ``filepath`` with 'wb' mode.

    Note:
        ``put`` will create a directory if the directory of
        ``filepath`` does not exist.

    Args:
        obj (bytes): Data to be written.
        filepath (str or Path): Path to write data.

    Examples:
        >>> backend = LocalBackend()
        >>> filepath = '/path/of/file'
        >>> backend.put(b'hello world', filepath)
    """
    mmengine.mkdir_or_exist(osp.dirname(filepath))
    with open(filepath, 'wb') as f:
        f.write(obj)

错误日志

File "src/train.py", line 219, in <module>
    main()
  File "src/train.py", line 204, in main
    runner.train()
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/runner/runner.py", line 1777, in train
    model = self.train_loop.run()  # type: ignore
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/runner/loops.py", line 102, in run
    self.runner.val_loop.run()
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/runner/loops.py", line 375, in run
    self.runner.call_hook('after_val_epoch', metrics=metrics)
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/runner/runner.py", line 1839, in call_hook
    getattr(hook, fn_name)(self, **kwargs)
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/hooks/checkpoint_hook.py", line 361, in after_val_epoch
    self._save_best_checkpoint(runner, metrics)
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/hooks/checkpoint_hook.py", line 579, in _save_best_checkpoint
    self._save_checkpoint_with_step(runner, cur_time, meta)
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/hooks/checkpoint_hook.py", line 443, in _save_checkpoint_with_step
    runner.save_checkpoint(
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/dist/utils.py", line 427, in wrapper
    return func(*args, **kwargs)
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/runner/runner.py", line 2271, in save_checkpoint
    save_checkpoint(
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/runner/checkpoint.py", line 793, in save_checkpoint
    file_backend.put(f.getvalue(), filename)
  File "/opt/conda/envs/ptca/lib/python3.8/site-packages/mmengine/fileio/backends/local_backend.py", line 77, in put
    with open(filepath, 'wb') as f:
OSError: [Errno 28] No space left on device: '/mnt/azureml/cr/j/21f0a13bbecb4e2cb2bebba8539778b6/cap/data-capability/wd/outputs/epoch_1.pth'

解决方案

1. 排查本地临时磁盘空间

错误中的路径/mnt/azureml/cr/j/...是AzureML作业的本地临时运行目录,和你配置的100TiB存储账户无关。Standard_NC24ads_A100_v4的本地临时磁盘容量有限,可能被旧作业残留、数据集缓存或中间文件占满:

  • 在作业命令前添加磁盘检查:command='df -h && python train.py',查看/mnt路径的剩余空间。
  • 清理临时文件:修改训练代码,只保留最新的1-2个checkpoint,自动删除旧文件;或者在启动命令中添加清理逻辑:rm -rf /mnt/azureml/cr/j/* && python train.py。

2. 切换Output挂载模式为UPLOAD

当前Output使用RW_MOUNT模式,会将远程存储挂载到本地目录,写入操作依赖本地临时磁盘。改用UPLOAD模式,训练时先将checkpoint保存到本地临时目录,作业结束后自动同步到Blob存储:

outputs={
    'outputs':Output(
        type='uri_folder',
        path = f'azureml://datastores/workspaceartifactstore/paths/ExperimentRun/dcid.{command_name}/outputs',
        mode  =InputOutputModes.UPLOAD  # 替换为UPLOAD
    )},

同时在train.py中指定保存路径为环境变量AZUREML_OUTPUT_DIR对应的目录,该路径会自动关联到配置的Output存储位置。

3. 配置MMEngine直接写入Azure Blob存储

绕过本地磁盘,让MMEngine直接将checkpoint写入Azure Blob:

  • 安装依赖:pip install azure-storage-blob
  • 在MMEngine配置或代码中初始化AzureBlobBackend,替换默认的LocalBackend
  • 保存checkpoint时指定使用AzureBlobBackend,直接写入远程存储

4. 关闭或优化数据集缓存

你开启了DATASET_MOUNT_BLOCK_BASED_CACHE_ENABLED=True,数据集缓存可能占用大量本地空间:

  • 临时关闭缓存:将环境变量设为False,观察是否解决问题
  • 若需要缓存,配置缓存路径到更大的存储卷,或者定期清理缓存文件

内容的提问来源于stack exchange,提问作者Niki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:30:03