一、 GPU 节点的启停调度方案(从手动到全自动)
在云上,算力空转等于公司在流血。针对不同的业务阶段,我们采用以下四种梯度的调度方案:
1. 手动管理(适合:入职第一周的极早期联调)
-
具体做法: 运维登录 AWS 控制台,找到 EC2 实例,右键点击
Stop instance(关机)。 -
老兵点评: 最简陋的方式。极容易因为周五下班忘记点,导致周末白烧几千美金。生产环境严禁依赖此方式。
2. Terraform 调度(适合:基建代码化阶段)
-
具体做法: 利用 Terraform 的
aws_ec2_instance_state资源来控制开关机,而不是销毁。# 在变量中定义状态 variable "gpu_state" { default = "stopped" } # 需要开机时改为 "running" resource "aws_ec2_instance_state" "ai_node_state" { instance_id = aws_instance.gpu_worker.id state = var.gpu_state } -
操作: 运维只需执行
terraform apply -var="gpu_state=stopped",即可优雅关机。保留了代码的一致性。
3. AWS 打标签调度(适合:规律作息的算法团队)
-
具体做法: 使用 AWS 官方开源方案 Instance Scheduler。
-
通过 CloudFormation 一键部署这个工具。
-
在配置表里写好规则,比如
OfficeHours: Mon-Fri 09:00-22:00。 -
运维给指定的 EC2 机器打上一个 Tag:
Key=Schedule, Value=OfficeHours。
-
-
效果: 机器会严格按照设定的时间表自动开关机,完全无需人工干预。
4. Lambda 定时与条件触发(适合:极度成熟的 AIOps 体系)
-
具体做法: 编写一段 Python (boto3) 代码部署到 AWS Lambda。利用 EventBridge(类似高级版 Crontab)每小时触发一次。
-
实操细节: Lambda 脚本不仅看时间,还会调取 CloudWatch 监控指标。如果发现 GPU 利用率(
DCGM_FI_DEV_GPU_UTIL)连续 2 小时低于 5%,则判定为"算法在摸鱼或任务已挂",自动调用ec2.stop_instances强制关机,并往飞书/钉钉发一条告警。
二、 存储保命机制(对付最贵的 FSx 与 S3 归档)
FSx 极贵且无法关机,我们只能用 S3 作为"数据防空洞"。关于数据回推,解答你的灵魂拷问:
1. 代码层:异步推 S3(算法与运维的交接点)
-
推的是什么? 推的是模型的 Checkpoint(检查点)。里面包含神经网络当前的权重(Weights)、优化器状态和训练轮数(Epoch)。
-
会影响机器性能吗? 绝对会! 一个大模型(如 70B)的 Checkpoint 可能高达 100GB+。如果算法代码写得烂,采用"同步阻塞"式写入,保存的那几分钟内,GPU 会因为等待 IO 而处于 0% 负载,这叫"卡死"。
-
具体落地方案: 必须要求算法组使用**异步保存(Async Saving)**技术。
-
步骤 A: 代码将 Checkpoint 快速写入本地挂载的 FSx(NVMe 级速度,几秒钟搞定,不卡 GPU)。
-
步骤 B: 代码触发一个后台独立线程(Background Thread),使用 AWS boto3 的
upload_file(开启多线程分片上传 multipart upload),悄悄把 FSx 里的文件传到 S3。 -
结果: GPU 继续跑下一轮训练,后台网络慢慢推 S3,互不干扰。
-
2. 系统层:定时托底机制
-
具体做法: 针对那些"忘记写后台推 S3 代码"的笨蛋,运维在系统层面兜底。
-
操作细节: 在 EC2 上配置
crontab -e:# 每 2 小时的第 0 分钟,强制把 FSx 目录下的变动同步到 S3 0 */2 * * * sudo lfs hsm_archive /mnt/fsx/checkpoints/ >> /var/log/fsx_archive.log 2>&1
3. 基建层:关机/销毁前的"生死门"
无论是人工关机,还是 Lambda 自动关机,都必须加一个前置校验拦截器。
-
手动操作的方案: 运维在执行 Destroy 前,必须进机器敲
lfs hsm_action /mnt/fsx/checkpoints/。如果输出为空,说明全部归档完毕;如果还有列表,必须干等。 -
Lambda 自动化方案(高阶):
-
Lambda 决定关机前,先通过 AWS Systems Manager (SSM) Run Command 远程向 EC2 发送一条指令。
-
指令内容:强行执行
lfs hsm_archive并检测状态。 -
如果 SSM 返回结果说"还有 50GB 在传",Lambda 就会放弃本次关机动作,并输出日志:"归档未完成,推迟到下个周期关机"。这完美堵死了数据丢失的漏洞。
-