本教程介绍如何在 Google Cloud上的多节点、多 GPU Slurm 集群上训练大语言模型 (LLM)。本教程中使用的模型基于 Qwen2 15 亿参数模型。Slurm 集群使用两台 a4-highgpu-8g 虚拟机 (VM),每台虚拟机都有 8 个 NVIDIA B200 GPU。
本教程中介绍的两个主要流程如下:
- 使用Google Cloud Cluster Toolkit 部署生产级高性能 Slurm 集群。在此部署过程中,您将创建一个预先安装了必要软件的自定义虚拟机映像。您还可以设置共享 Filestore 实例,并配置高速 RDMA 网络。
- 集群部署完毕后,您可以使用本教程随附的一组脚本来运行分布式预训练作业。该作业利用了 Hugging Face Accelerate 库。
本教程适用于机器学习 (ML) 工程师、研究人员、平台管理员和运维人员,以及对在 Google Cloud 上部署高性能 Slurm 集群来训练 LLM 感兴趣的数据和 AI 专家。
目标
- 使用 Hugging Face 访问 Qwen2 模型。
- 准备环境。
- 创建并部署生产级 A4 Slurm 集群。
- 使用 Accelerate 库训练 Qwen2 模型。
- 监控作业。
- 清理。
费用
在本文档中,您将使用 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
-
安装 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
-
向您的用户账号授予角色。对以下每个 IAM 角色运行以下命令一次:
roles/compute.admin, roles/iam.serviceAccountUser, roles/file.editor, roles/storage.admin, roles/serviceusage.serviceUsageAdmin, roles/compute.osAdminLogin, roles/iap.tunnelResourceAccessorgcloud 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 账号。
使用 Hugging Face 访问 Qwen2
如需使用 Hugging Face 访问 Qwen2,请执行以下操作:
安装 Cluster Toolkit
Cluster Toolkit 是一款开源工具,可简化在 Google Cloud上部署高性能计算 (HPC)、人工智能 (AI) 和机器学习 (ML) 工作负载的过程。如需详细了解如何使用 gcluster 和管理集群,请参阅 Cluster Toolkit 概览。
准备 Cluster Toolkit 版本:
下载版本:
定义
gcluster路径:
准备环境
如需准备环境,请按照以下步骤操作:
设置默认环境变量:
替换以下内容:
YOUR_PROJECT_ID:您要在其中创建 GKE 集群的 Google Cloud 项目 的名称。YOUR_CLUSTER_NAME:您要创建的 Slurm 集群的名称。YOUR_ZONE:预留所在的可用区。YOUR_REGION,:预留所在的区域。RESERVATION_NAME:您要用于创建 Slurm 集群的预留的网址或名称。YOUR_GCS_BUCKET:用于存储训练检查点结果的存储桶的名称。在创建存储桶之前,请先熟悉存储桶命名要求。YOUR_HF_TOKEN:您在之前的步骤中创建的 Hugging Face 令牌。
创建 Cloud Storage 存储分区,请运行以下命令:
创建 A4 Slurm 集群
如需创建 A4 Slurm 集群,请按照以下步骤操作:
创建
a4high-slurm-deployment.yaml文件:创建 Terraform 清单:
修补清单:
部署集群:
gcluster deploy命令是一个两阶段的过程,如下所示:第一阶段会构建一个预先安装了所有软件的自定义映像,这可能需要长达 50 分钟的时间才能完成。
第二阶段使用该自定义映像部署集群。此过程通常比第一阶段花费的时间更少。
如果第一阶段成功,但第二阶段失败,您可以尝试跳过第一阶段,再次部署 Slurm 集群:
准备工作负载
如需准备工作负载,请按以下步骤操作:
创建工作负载脚本
如需创建训练工作负载将使用的脚本,请按照以下步骤操作:
如需设置 Python 虚拟环境,请创建包含以下内容的
install_environment.sh文件:如需为微调作业指定配置,请创建包含以下内容的
accelerate_config.yaml文件:如需指定作业在 Slurm 集群上运行的任务,请创建
submit.slurm文件并添加以下内容:如需为微调作业指定依赖项,请创建一个包含以下内容的
requirements.txt文件:
注意:本教程未使用最新版本的 NVIDIA 和 Pytorch 依赖项。如果您需要更新的依赖项,请参阅 NVIDIA 文档和 Pytorch 文档。如需下载、分词并预处理数据集,使其成为可用于训练的格式,请创建一个
preprocess_data.py文件,并在该文件中添加以下内容:如需为作业指定指令,请创建一个
train.py文件,其中包含以下内容:
将脚本上传到 Slurm 集群
如需将您在上一部分中创建的脚本上传到 Slurm 集群,请按以下步骤操作:
通过检索集群的登录节点名称来设置
LOGIN_NODE变量:LOGIN_NODE变量存储的值类似于${CLUSTER_NAME}-login-001。创建防火墙规则:
将脚本上传到登录节点的主目录:
连接到 Slurm 集群
通过 SSH 连接到登录节点,从而连接到 Slurm 集群:
安装框架和工具
连接到登录节点后,请执行以下操作来安装框架和工具:
设置包含所有必需依赖项的 Python 虚拟环境:
开始预训练工作负载
如需开始训练工作负载,请执行以下操作:
将作业提交给 Slurm 调度程序:
在 Slurm 集群的登录节点上,您可以通过检查
home目录中创建的输出文件来监控作业的进度:如果作业成功开始,
.err文件会显示一个进度条,该进度条会随着作业的进展而更新。
监控工作负载
您可以监控 Slurm 集群中 GPU 的使用情况,以验证微调作业是否在高效运行。为此,请在浏览器中打开以下链接:
https://console.cloud.google.com/monitoring/metrics-explorer?project=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 小时才能完成。
下载模型
作业成功运行后,训练好的模型会保存在登录节点上的 ~/qwen2-from-scratch-on-smollm-fineweb/ 目录中。由于此持久共享目录已装载到集群中的所有节点,因此即使作业完成或计算节点被取消分配,您的模型检查点仍可供使用。
您可以使用 gcloud compute scp 命令将已保存的模型从登录节点下载到本地机器,如以下示例所示:
下载模型后,您可以执行以下操作:
- 加载模型以进行推理:使用 Hugging Face Transformers 框架加载
qwen2-trained-model/目录,并使用新训练的 Qwen2 模型执行推理。 - 进一步微调:使用保存的检查点作为起点,对更具体的数据集进行进一步微调。
- 将模型推送到 Hugging Face Hub:通过将训练好的模型推送到 Hugging Face Hub 来分享该模型。
清理
为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。
删除您的资源
如需删除 Slurm 集群,请按以下步骤操作:
如需删除 Cloud Storage 存储桶,请按以下步骤操作:
如需删除 Packer 映像,请打开网络浏览器,前往以下页面,搜索您的特定映像,然后点击“删除”。
如需删除与项目关联的所有 VPC 网络、防火墙规则、路由器、IP 和子网,请执行以下操作:
删除项目
删除 Google Cloud 项目:
gcloud projects delete PROJECT_ID