无服务器 GPU 计算的最佳做法

本文介绍了在笔记本和作业中使用无服务器 GPU 计算的最佳做法建议。

按照这些建议,你将在 Azure Databricks 上提高工作负荷的工作效率、成本效益和可靠性。

使用正确的计算

  • 使用无服务器 GPU 计算。 此选项附带针对兼容性优化的 torch、cuda 和 torchvision。 确切的包版本将取决于 环境版本
  • 在环境侧面板中选择加速器。
    • 对于远程分布式训练工作负载,建议使用 A10 GPU,它将作为客户端,稍后把作业发送到远程的 H100。
    • 若要在笔记本本身上运行大型交互式作业,可以将笔记本附加到 H100,这将占用 1 个节点(8 H100 GPU)。
  • 为了避免占用 GPU,可以将笔记本附加到 CPU 群集,以便执行一些作,例如 git 克隆并将 Spark 数据帧转换为马赛克数据分片(MDS)格式。

MLflow 建议

若要获得最佳 ML 开发周期,请使用 Databricks 上的 MLflow 3。 请按照以下提示作:

  • 将环境的 MLflow 升级到版本 3.6 或更高版本,并遵循 MLflow 3 深度学习工作流中的 MLflow 深度学习流。

  • step中将MLFlowLogger参数设为合理的批次数量。 MLflow 的指标步骤限制为 1000 万个,可以记录。 请参阅资源限制

  • 如果使用Pytorch Lightning作为训练器,则启用mlflow.pytorch.autolog()

  • 通过将模型训练代码封装在 mlflow.start_run() API 范围内,来自定义 MLflow 运行名称。 这样你就可以控制运行名称,并能够从以前的运行中重启。可以使用run_name参数在mlflow.start_run(run_name="your-custom-name")中或在支持 MLflow 的第三方库(例如 Hugging Face Transformers)中自定义运行名称。 否则,默认运行名称为 jobTaskRun-xxxxx

    from transformers import TrainingArguments
    args = TrainingArguments(
        report_to="mlflow",
        run_name="llama7b-sft-lr3e5",  # <-- MLflow run name
        logging_steps=50,
    )
    
  • 无服务器 GPU API 启动 MLflow 试验来记录系统指标。 默认情况下,它使用名称 /Users/{WORKSPACE_USER}/{get_notebook_name()} ,除非用户用环境变量 MLFLOW_EXPERIMENT_NAME覆盖它。

    • 设置 MLFLOW_EXPERIMENT_NAME 环境变量时,请使用绝对路径。 例如,/Users/<username>/my-experiment
    • 试验名称不得包含现有文件夹名称。 例如,如果 my-experiment 为现有文件夹,则上面的示例将出错。
    import os
    from serverless_gpu import distributed
    os.environ['MLFLOW_EXPERIMENT_NAME'] = '/Users/{WORKSPACE_USER}/my_experiment'
    @distributed(gpus=num_gpus, gpu_type=gpu_type, remote=True)
    def run_train():
    # my training code
    
  • 若要从先前的运行中继续训练,请指定该运行的MLFLOW_RUN_ID,如下所示。

    import os
    os.environ[‘MLFLOW_RUN_ID’] = <previous_run_id>
    run_train.distributed()
    

多用户协作

  • 为了确保所有用户都可以访问共享代码(例如帮助程序模块、environment.yaml),请在 /Workspace/Repos/Workspace/Shared 而不是特定于用户的文件夹(例如 /Workspace/Users/<your_email>/)中创建 git 文件夹。
  • 对于处于活动开发中的代码,请使用特定于用户的文件夹中 /Workspace/Users/<your_email>/ 的 Git 文件夹并推送到远程 Git 存储库。 这样,多个用户就可以拥有特定于用户的克隆(和分支),但仍使用远程 Git 存储库进行版本控制。 请参阅有关在 Databricks 上使用 Git 的 最佳做法
  • 协作者可以 共享和评论 笔记本。

在修饰器中 @distributed 加载数据

使用 无服务器 GPU API 进行分布式训练时,在 @distributed 修饰器内移动数据加载代码。 数据集大小可以超出 pickle 允许的最大大小,因此建议在装饰器内生成数据集,如下所示:

from serverless_gpu import distributed

# this may cause pickle error
dataset = get_dataset(file_path)
@distributed(gpus=8, remote=True)
def run_train():
  # good practice
  dataset = get_dataset(file_path)
  ....

Databricks 中的全局限制

请参阅资源限制