分享一套低成本、可复用、一键式的云 AI 集群搭建方案,基于 Terraform 实现资源编排,结合自动化脚本完成环境初始化与训练任务,全程无需复杂运维。
一、前期准备:低成本核心原则与环境前置
通过按需创建、弹性伸缩、资源复用降低无效开销,同时做好基础环境准备。
1.1 核心低成本策略
- 选择按需计费云服务器(而非包年包月),训练完成立即销毁;
- 优先选用云厂商 “抢占式实例”(如阿里云抢占式 ECS、AWS Spot 实例),成本仅为按量计费的 10%-30%;
- 统一使用容器化环境,避免重复配置;
- 模型数据存储在对象存储(如 OSS/S3),而非高成本云盘。
- 提前准备训练数据,验证训练脚本
1.2 前置环境准备
本地机器需安装以下工具(以 Linux/macOS 为例):
bash
运行
# 1. 安装Terraform(基础设施即代码工具)
brew install terraform # macOS
# CentOS/Ubuntu可参考官网:https://developer.hashicorp.com/terraform/downloads
# 2. 安装云厂商CLI(以阿里云为例)
pip install aliyun-cli
aliyun configure # 配置AccessKey(子账号,仅授予ECS/OSS权限)
# 3. 安装Docker(用于容器化训练环境)
curl -fsSL https://get.docker.com | sh
# 4. 安装ansible(批量初始化集群节点)
pip install ansible
二、Terraform 编排:一键创建集群资源
Terraform 的核心价值是代码化定义云资源,避免手动点击控制台创建,且支持一键销毁,彻底杜绝 “忘记关机导致的成本浪费”。
2.1 编写 Terraform 配置文件
新建terraform目录,创建main.tf(以阿里云为例,其他云厂商仅需替换 provider):
hcl
# main.tf - AI集群资源定义
terraform {
required_providers {
alicloud = {
source = "aliyun/alicloud"
version = "~> 1.200.0"
}
}
}
# 配置阿里云Provider
provider "alicloud" {
region = "cn-hangzhou" # 选择就近区域,降低网络延迟
# AccessKey可通过环境变量传入(避免硬编码)
access_key = var.access_key
secret_key = var.secret_key
}
# 定义变量(创建variables.tf)
variable "access_key" {
type = string
description = "阿里云AccessKey"
}
variable "secret_key" {
type = string
description = "阿里云SecretKey"
}
variable "instance_type" {
type = string
default = "ecs.gn6v-c8g1.2xlarge" # 2卡V100,抢占式实例
description = "GPU实例规格"
}
variable "node_count" {
type = number
default = 2 # 集群节点数,可按需调整
description = "AI集群节点数量"
}
# 创建VPC和交换机(网络隔离)
resource "alicloud_vpc" "ai_vpc" {
vpc_name = "ai-training-vpc"
cidr_block = "172.16.0.0/16"
}
resource "alicloud_vswitch" "ai_vswitch" {
vswitch_name = "ai-training-vswitch"
vpc_id = alicloud_vpc.ai_vpc.id
cidr_block = "172.16.1.0/24"
zone_id = "cn-hangzhou-i"
}
# 创建安全组(开放SSH和训练端口)
resource "alicloud_security_group" "ai_sg" {
name = "ai-training-sg"
vpc_id = alicloud_vpc.ai_vpc.id
description = "AI集群安全组"
# 开放SSH(22端口)
ingress {
protocol = "tcp"
port_range = "22/22"
cidr_ip = "0.0.0.0/0"
description = "SSH访问"
}
# 开放集群通信端口(NCCL通信)
ingress {
protocol = "all"
port_range = "0/65535"
cidr_ip = alicloud_vswitch.ai_vswitch.cidr_block
description = "集群内部通信"
}
}
# 批量创建GPU实例(核心资源)
resource "alicloud_instance" "ai_nodes" {
count = var.node_count
instance_name = "ai-training-node-${count.index}"
image_id = "ubuntu_20_04_x64_20G_alibase_20240220.vhd" # Ubuntu 20.04
instance_type = var.instance_type
security_groups = [alicloud_security_group.ai_sg.id]
vswitch_id = alicloud_vswitch.ai_vswitch.id
internet_charge_type = "PayByTraffic" # 按流量计费,降低成本
internet_max_bandwidth_out = 100
system_disk_category = "cloud_essd"
system_disk_size = 100
# 抢占式实例配置(核心低成本点)
spot_strategy = "SpotWithPriceLimit"
spot_price_limit = "1.5" # 最高出价,超过则释放
spot_duration = 0 # 无固定时长
# 初始化脚本:安装基础依赖
user_data = <<-EOF
#!/bin/bash
apt update && apt install -y openssh-server python3-pip
echo "root:YourSecurePassword" | chpasswd # 替换为安全密码
sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
systemctl restart sshd
EOF
}
# 输出集群节点IP(方便后续连接)
output "node_ips" {
value = [alicloud_instance.ai_nodes.*.public_ip]
}
2.2 一键创建 / 销毁资源
bash
运行
# 进入terraform目录
cd terraform
# 初始化Terraform(下载阿里云Provider)
terraform init
# 预览要创建的资源(检查是否符合预期)
terraform plan -var "access_key=你的AccessKey" -var "secret_key=你的SecretKey"
# 一键创建资源(约5分钟完成)
terraform apply -var "access_key=你的AccessKey" -var "secret_key=你的SecretKey" -auto-approve
# 训练完成后,一键销毁所有资源(避免计费)
terraform destroy -auto-approve
三、环境初始化:批量配置集群节点
资源创建完成后,需要统一配置 GPU 驱动、CUDA、训练框架等环境,这里用 Ansible 实现批量自动化。
3.1 编写 Ansible Inventory 文件
新建ansible/hosts,填入 Terraform 输出的节点 IP:
ini
[ai_cluster]
123.xxx.xxx.1 ansible_ssh_user=root ansible_ssh_pass=YourSecurePassword
123.xxx.xxx.2 ansible_ssh_user=root ansible_ssh_pass=YourSecurePassword
[ai_cluster:vars]
ansible_python_interpreter=/usr/bin/python3
3.2 编写 Ansible Playbook(环境初始化)
新建ansible/init_env.yml:
yaml
- hosts: ai_cluster
gather_facts: yes
tasks:
# 1. 安装GPU驱动和CUDA(以NVIDIA Tesla V100为例)
- name: 安装NVIDIA驱动依赖
apt:
name: ["gcc", "make", "linux-headers-$(uname -r)"]
state: present
- name: 安装NVIDIA驱动
shell: |
wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.104.05/NVIDIA-Linux-x86_64-535.104.05.run
chmod +x NVIDIA-Linux-x86_64-535.104.05.run
./NVIDIA-Linux-x86_64-535.104.05.run -s
rm -f NVIDIA-Linux-x86_64-535.104.05.run
- name: 安装CUDA 11.8
shell: |
wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux.run
sh cuda_11.8.0_520.61.05_linux.run --silent --toolkit
echo "export PATH=/usr/local/cuda-11.8/bin:\$PATH" >> /root/.bashrc
echo "export LD_LIBRARY_PATH=/usr/local/cuda-11.8/lib64:\$LD_LIBRARY_PATH" >> /root/.bashrc
rm -f cuda_11.8.0_520.61.05_linux.run
# 2. 安装Docker和nvidia-docker(容器化训练)
- name: 安装nvidia-docker
shell: |
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list > /etc/apt/sources.list.d/nvidia-docker.list
apt update
apt install -y nvidia-docker2
systemctl restart docker
# 3. 安装Python依赖
- name: 安装训练框架
pip:
name: ["torch==2.1.0", "torchvision==0.16.0", "transformers==4.35.2", "accelerate==0.24.1"]
executable: pip3
3.3 一键执行环境初始化
bash
运行
cd ansible
ansible-playbook -i hosts init_env.yml
四、一键启动训练:标准化训练脚本
环境配置完成后,编写统一的训练脚本,支持单机多卡 / 多机多卡训练,且与集群节点解耦。
4.1 编写训练启动脚本(start_train.sh)
bash
运行
#!/bin/bash
# 一键启动训练脚本
set -e
# 配置参数
CLUSTER_IPS=("123.xxx.xxx.1" "123.xxx.xxx.2") # 集群节点IP
MASTER_IP=${CLUSTER_IPS[0]} # 主节点IP
MASTER_PORT=29500 # 通信端口
NODE_RANK=$1 # 节点序号(从0开始)
TRAIN_DATA_PATH="oss://your-bucket/train-data/" # 数据存储在OSS
OUTPUT_PATH="oss://your-bucket/model-output/" # 模型输出到OSS
# 拉取训练镜像(提前构建好,包含所有依赖)
docker pull registry.cn-hangzhou.aliyuncs.com/your-namespace/ai-train:v1.0
# 启动训练容器
docker run --gpus all --network host \
-e MASTER_ADDR=$MASTER_IP \
-e MASTER_PORT=$MASTER_PORT \
-e NODE_RANK=$NODE_RANK \
-e WORLD_SIZE=${#CLUSTER_IPS[@]} \
-v /root/.ossutilconfig:/root/.ossutilconfig \ # OSS配置文件
registry.cn-hangzhou.aliyuncs.com/your-namespace/ai-train:v1.0 \
python train.py \
--train_data $TRAIN_DATA_PATH \
--output_dir $OUTPUT_PATH \
--per_device_train_batch_size 32 \
--num_train_epochs 10 \
--gradient_accumulation_steps 4 \
--fp16 # 混合精度训练,提升速度
4.2 批量启动训练
编写batch_start.sh,在所有节点上并行启动:
bash
运行
#!/bin/bash
CLUSTER_IPS=("123.xxx.xxx.1" "123.xxx.xxx.2")
# 循环在每个节点启动训练
for i in "${!CLUSTER_IPS[@]}"; do
IP=${CLUSTER_IPS[$i]}
echo "启动节点 $i ($IP) 训练..."
ssh root@$IP "bash -s" < start_train.sh $i &
done
# 等待所有训练进程完成
wait
echo "所有节点训练完成!"
执行启动命令:
bash
运行
chmod +x start_train.sh batch_start.sh
./batch_start.sh
五、模型验证与上传:标准化流程
训练完成后,需要验证模型效果,并将合格模型上传到模型仓库(如阿里云 PAI-EAS、Hugging Face Hub)。
5.1 模型验证脚本(validate_model.sh)
bash
运行
#!/bin/bash
# 模型验证脚本
set -e
# 下载模型到本地
ossutil cp -r oss://your-bucket/model-output/latest /tmp/model
# 验证模型精度
docker run --gpus all \
-v /tmp/model:/model \
-v /tmp/val-data:/val-data \
registry.cn-hangzhou.aliyuncs.com/your-namespace/ai-train:v1.0 \
python validate.py \
--model_path /model \
--val_data /tmp/val-data \
--metric accuracy
# 验证通过后,上传到模型仓库
if [ $? -eq 0 ]; then
echo "模型验证通过,开始上传..."
# 上传到Hugging Face Hub
huggingface-cli upload your-username/your-model /tmp/model --token your-hf-token
# 或上传到阿里云PAI模型仓库
pai model upload \
--model-name your-model \
--model-path /tmp/model \
--framework PyTorch \
--model-version 1.0
echo "模型上传完成!"
else
echo "模型验证失败,请检查训练数据或参数!"
exit 1
fi
5.2 执行验证与上传
bash
运行
chmod +x validate_model.sh
./validate_model.sh
六、成本优化额外建议
- 训练任务尽量在云厂商 “闲时” 执行(如凌晨),抢占式实例价格更低;
- 小批量数据先在单卡验证代码正确性,再扩集群,避免浪费;
- 使用云厂商 “按量付费转包年包月” 折扣,长期训练可降低成本;
- 模型训练完成后,立即执行
terraform destroy销毁所有资源,杜绝闲置计费。
总结
- 低成本核心:通过 Terraform 按需创建抢占式 GPU 实例,训练完成一键销毁,避免无效开销;
- 效率核心:用 Ansible 批量初始化环境,容器化统一训练依赖,实现 “一次配置,多次复用”;
- 流程核心:标准化训练启动、模型验证、上传流程,降低人工操作成本,提升集群使用效率。
这套方案可适配不同云厂商(仅需修改 Terraform Provider),成本相比传统集群降低 70% 以上,非常适合个人开发者和中小团队快速开展 AI 模型训练。