本教程介绍如何在 Google Cloud上的多节点、多 GPU Slurm 集群中微调 mistralai/Mixtral-8x7B-v0.1 模型。该集群使用两个 a4-highgpu-8g 虚拟机 (VM) 实例,每个实例都有 8 个 NVIDIA B200 GPU。
本教程中介绍的两个主要流程如下:
- 使用Google Cloud Cluster Toolkit 部署生产级高性能 Slurm 集群。在此部署过程中,您将创建一个预先安装了必要软件的自定义虚拟机映像。您还可以设置共享 Lustre 文件系统并配置高速网络。
- 部署集群后,您可以使用本教程随附的一组脚本来运行分布式微调作业。该作业利用 PyTorch 完全分片数据并行 (FSDP),您可以通过 Hugging Face Transformer Reinforcement Learning (TRL) 库访问该功能。
本教程适用于机器学习 (ML) 工程师、研究人员、平台管理员和运维人员,以及对在多个节点和 GPU 之间分配 AI 工作负载感兴趣的数据和 AI 专家。
目标
- 使用 Hugging Face 访问 Mixtral
- 安装 Cluster Toolkit
- 准备环境
- 创建并部署生产级 A4 High-GPU Slurm 集群。
- 配置多节点环境,以使用 FSDP 进行分布式训练。
- 使用 Hugging Face
trl.SFTTrainer类微调 Mixtral 模型。 - 将数据暂存到本地 SSD。
- 监控作业。
- 清理。
费用
在本文档中,您将使用 Google Cloud的以下收费组件:
如需根据您的预计使用情况来估算费用,请使用价格计算器。
准备工作
- 登录您的 Google Cloud 账号。如果您是 Google Cloud新手,请 创建一个账号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
-
创建项目:如需创建项目,您需要拥有 Project Creator 角色 (
roles/resourcemanager.projectCreator),该角色包含resourcemanager.projects.create权限。了解如何授予角色。
-
创建 Google Cloud 项目:
gcloud projects create PROJECT_ID
将
PROJECT_ID替换为您要创建的 Google Cloud 项目的名称。 -
选择您创建的 Google Cloud 项目:
gcloud config set project PROJECT_ID
将
PROJECT_ID替换为您的 Google Cloud 项目名称。
启用所需的 API:
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com
-
安装 Google Cloud CLI。
-
如果您使用的是外部身份提供方 (IdP),则必须先使用联合身份登录 gcloud CLI。
-
如需初始化 gcloud CLI,请运行以下命令:
gcloud init -
选择或创建项目所需的角色
- 选择项目:选择项目不需要特定的 IAM 角色,您可以选择已获授角色的任何项目。
-
创建项目:如需创建项目,您需要拥有 Project Creator 角色 (
roles/resourcemanager.projectCreator),该角色包含resourcemanager.projects.create权限。了解如何授予角色。
-
创建 Google Cloud 项目:
gcloud projects create PROJECT_ID
将
PROJECT_ID替换为您要创建的 Google Cloud 项目的名称。 -
选择您创建的 Google Cloud 项目:
gcloud config set project PROJECT_ID
将
PROJECT_ID替换为您的 Google Cloud 项目名称。
启用所需的 API:
启用 API 所需的角色
如需启用 API,您需要拥有
serviceusage.services.enable权限。如果您创建了项目,则可能已经通过 Owner 角色 (roles/owner) 获得了此权限。否则,您可以通过 Service Usage Admin 角色 (roles/serviceusage.serviceUsageAdmin) 获得此权限。了解如何授予角色。gcloud services enable compute.googleapis.com file.googleapis.com logging.googleapis.com cloudresourcemanager.googleapis.com servicenetworking.googleapis.com lustre.googleapis.com
-
向您的用户账号授予角色。对以下每个 IAM 角色运行以下命令一次:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmingcloud projects add-iam-policy-binding PROJECT_ID --member="user:USER_IDENTIFIER" --role=ROLE
替换以下内容:
PROJECT_ID:您的项目 ID。USER_IDENTIFIER:您的用户 账号的标识符。例如,myemail@example.com。ROLE:您向用户账号授予的 IAM 角色。
- 为您的 Google Cloud 项目启用默认服务账号:
gcloud iam service-accounts enable PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --project=PROJECT_ID
将 PROJECT_NUMBER 替换为您的项目编号。如需查看项目编号,请参阅 获取现有项目。
- 向默认服务账号授予 Editor 角色 (
roles/editor):gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role=roles/editor
- 为您的用户账号创建本地身份验证凭据:
gcloud auth application-default login
- 为项目启用 OS Login:
gcloud compute project-info add-metadata --metadata=enable-oslogin=TRUE
- 登录或创建 Hugging Face 账号。
- 安装使用 Cluster Toolkit 所需的依赖项。
使用 Hugging Face 访问 Mixtral
如需使用 Hugging Face 访问 Mixtral,请执行以下操作:
- 登录 Hugging Face 并探索 Mixtral 模型。
- 创建 Hugging Face
read访问令牌。 - 复制并保存令牌值。您将在本教程的后面部分用到它。
安装 Cluster Toolkit
Cluster Toolkit 是一款开源工具,可简化在 Google Cloud上部署高性能计算 (HPC)、人工智能 (AI) 和机器学习 (ML) 工作负载的过程。如需详细了解如何使用 gcluster 和管理集群,请参阅 Cluster Toolkit 概览。
准备 Cluster Toolkit 版本:
下载版本:
定义
gcluster路径:
准备环境
如需准备环境,请按照以下步骤操作:
设置默认环境变量:
替换以下内容:
YOUR_PROJECT_ID:您要在其中创建 Slurm 集群的 Google Cloud 项目的名称。YOUR_ZONE:预留所在的可用区。YOUR_REGION:预留所在的区域。YOUR_RESERVATION_NAME:您要用于创建 Slurm 集群的预留的网址或名称。YOUR_CLUSTER_NAME:部署的名称。使用仅包含字母和数字的简称(例如a4high)。此名称还会分配给部署创建的 Slurm 集群。YOUR_GCS_BUCKET:用于存储训练检查点结果的存储桶的名称。指定现有存储桶或创建新存储桶。在创建存储桶之前,请先熟悉存储桶命名要求。YOUR_HF_TOKEN:您在之前的步骤中创建的 Hugging Face 令牌。
创建 Cloud Storage 存储分区,请运行以下命令:
创建 A4 Slurm 集群
如需创建 A4 Slurm 集群,请执行以下操作:
运行以下命令,使用环境变量覆盖
examples/machine-learning/a4-highgpu-8g目录中的a4high-slurm-deployment.yaml文件:打开
examples/machine-learning/a4-highgpu-8g目录中的a4high-slurm-blueprint.yaml文件,并对其进行修改,以使用 Managed Lustre 作为共享/home目录,如下所示:- 使用
source: modules/file-system/filestore移除默认的homefs模块块。 - 启用
lustrefs(含remote_mount: lustrefs的homefs块)和private-service-access模块。 - 在
vars代码块中,配置以下内容:- 将
/var/tmp/slurm_vars.json中install_managed_lustre的值更改为true。 - 将
per_unit_storage_throughput参数设置为500。 - 将
lustre_size_gib参数设置为36000。 - 对
lustre_instance_id: lustre-instance取消注释。 - 注释掉或移除未使用的
filestore_ip_range。
- 将
- 使用
部署集群:
./gcluster deploy命令会启动一个两阶段流程,如下所示:- 第一阶段会构建一个预先安装了所有软件的自定义映像,这可能需要长达 35 分钟的时间才能完成。
- 第二阶段使用该自定义映像部署集群。此流程应比第一阶段更快完成。
准备工作负载
如需准备工作负载,请按以下步骤操作:
创建工作负载脚本
如需创建微调工作负载将使用的脚本,请按以下步骤操作:
如需设置 Python 虚拟环境,请创建包含以下内容的
install_environment.sh文件:如需为训练脚本指定 Python 依赖项,请创建一个包含以下内容的
requirements-fsdp.txt文件:指定
train-mixtral.py作为主要训练脚本:如需指定作业在 Slurm 集群上运行的任务,请创建包含以下内容的
train-mixtral.sh文件:
将脚本上传到 Slurm 集群
如需将您在上一部分中创建的脚本上传到 Slurm 集群,请按以下步骤操作:
通过检索集群的登录节点名称来设置
LOGIN_NODE变量:LOGIN_NODE变量存储的值类似于${DEPLOYMENT_NAME}-login-001。创建防火墙规则:
将脚本上传到登录节点的主目录:
连接到 Slurm 集群
通过 SSH 连接到登录节点,从而连接到 Slurm 集群:
安装框架和工具
连接到登录节点后,在计算节点上运行安装脚本,以安装所需的框架和工具:
此命令会设置虚拟环境、安装所有依赖项,并将 Mixtral 模型权重下载到 ~/Mixtral-8x7B-v0.1 中。完成此步骤需要花费 30 分钟。
通过 srun 运行此步骤会将安装脚本从登录节点委托给分配的计算节点,从而允许脚本在编译期间访问 GPU 驱动程序。
启动微调工作负载
如需开始训练工作负载,请执行以下操作:
将作业提交给 Slurm 调度程序:
监控工作负载
如需监控微调作业的进度,请使用以下方法:
在 Slurm 集群的登录节点上,您可以通过检查
home目录中创建的输出文件来监控作业的进度:如果作业成功开始,
.err文件会显示一个进度条,该进度条会随着作业的进展而更新。该作业分为两个主要阶段:
- 将大型基础模型复制到每个计算节点的本地 SSD。
- 训练作业,在模型复制完成后开始。
整个作业大约需要 60 分钟才能运行完毕。
您还可以监控 Slurm 集群中 GPU 的使用情况,以验证微调作业是否在高效运行。为此,请在浏览器中打开以下链接:
https://console.cloud.google.com/monitoring/metrics-explorer?project=YOUR_PROJECT_ID&pageState=%7B%22xyChart%22%3A%7B%22dataSets%22%3A%5B%7B%22timeSeriesFilter%22%3A%7B%22filter%22%3A%22metric.type%3D%5C%22agent.googleapis.com%2Fgpu%2Futilization%5C%22%20resource.type%3D%5C%22gce_instance%5C%22%22%2C%22perSeriesAligner%22%3A%22ALIGN_MEAN%22%7D%2C%22plotType%22%3A%22LINE%22%7D%5D%7D%7D或者,您也可以直接在终端中输入命令:
监控工作负载时,您可以看到以下内容:
GPU 使用率:对于运行良好的微调作业,您应该会看到所有 16 个 GPU(集群中每个虚拟机有 8 个 GPU)的使用率在整个训练过程中上升并稳定在特定水平。
作业时长:此作业大约需要 1 小时才能完成。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除资源
运行以下命令以删除您在本教程中创建的资源:
如需删除 Slurm 集群,请前往
cluster-toolkit目录并运行以下命令:删除存储桶:
如需删除 Packer 映像,请打开网络浏览器,前往以下页面,搜索您的特定映像,然后点击“删除”。
删除项目
删除 Google Cloud 项目:
gcloud projects delete PROJECT_ID
后续步骤
- 重新部署 Slurm 集群
- 测试 Slurm 集群的网络性能
- 监控 Slurm 集群中的虚拟机
- 创建服务端点:获得微调后的模型后,您可以使用 Google Kubernetes Engine (GKE) 或 Vertex AI 将其部署到服务端点,以便进行推理。
- 了解建议用于 AI 和机器学习工作负载的存储服务