快速低成本搭建云 AI 集群:从资源准备到模型上线全流程

2 阅读1分钟

分享一套低成本、可复用、一键式的云 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

六、成本优化额外建议

  1. 训练任务尽量在云厂商 “闲时” 执行(如凌晨),抢占式实例价格更低;
  2. 小批量数据先在单卡验证代码正确性,再扩集群,避免浪费;
  3. 使用云厂商 “按量付费转包年包月” 折扣,长期训练可降低成本;
  4. 模型训练完成后,立即执行terraform destroy销毁所有资源,杜绝闲置计费。

总结

  1. 低成本核心:通过 Terraform 按需创建抢占式 GPU 实例,训练完成一键销毁,避免无效开销;
  2. 效率核心:用 Ansible 批量初始化环境,容器化统一训练依赖,实现 “一次配置,多次复用”;
  3. 流程核心:标准化训练启动、模型验证、上传流程,降低人工操作成本,提升集群使用效率。

这套方案可适配不同云厂商(仅需修改 Terraform Provider),成本相比传统集群降低 70% 以上,非常适合个人开发者和中小团队快速开展 AI 模型训练。