在您掌握了不同的云定价模型后,下一步就是运用这些知识。简单地选择一个定价模型是被动行为;主动管理您的资源才能实现显著的成本节约。本节详细介绍了几种实用的策略,用于降低您的云算力开销,同时不影响您的模型开发和部署目标。善用竞价实例进行容错训练云服务提供商通常拥有大量未使用的算力容量。为了将其变现,他们会以大幅折扣提供这些容量,有时甚至比按需价格低90%。这些被称为 竞价实例 (AWS)、竞价虚拟机 (GCP) 或 竞价虚拟机 (Azure)。然而,有一个条件:云服务提供商可以随时回收这些容量,通常只提前两分钟通知。这使得竞价实例不适合生产推理端点或其他无法容忍中断的重要任务。然而,许多机器学习训练任务却非常适合。深度学习模型通常训练数小时甚至数天,而且这个过程是迭代的。如果训练运行中断,通常可以从上次保存的状态恢复。这使得训练成为一种容错型工作负载。为了在模型训练中有效使用竞价实例,您必须在训练过程中融入弹性:实现检查点: 您的训练脚本必须定期保存其状态。这不仅包括模型权重,还包括优化器状态、当前轮次(epoch)数以及数据加载器位置。PyTorch 和 TensorFlow 等大多数现代框架都提供工具来便地实现此功能。创建从检查点恢复的逻辑: 您的脚本需要一种机制来在启动时检测是否存在检查点。如果存在,它应该加载状态并从该点恢复训练,而不是从头开始。使用托管式竞价服务: 不要只请求单个竞价实例,而是使用托管服务,例如 AWS Spot Fleet 或配置为使用竞价实例的自动扩缩组。如果您当前的竞价实例被回收,这些服务可以自动从不同的容量池请求新的竞价实例,从而提高您工作负载的稳定性。检查点保存频率: 选择保存检查点的频率涉及权衡。保存过于频繁会增加 I/O 开销并可能减慢训练速度。保存过于不频繁则意味着当实例被抢占时,您将损失更多工作量。一种常见策略是在每个轮次(epoch)结束时保存检查点。对于非常长的轮次,您可以考虑每 N 个批次保存一次。通过将训练作业设计为可恢复,您可以充分利用竞价实例的巨大成本节约,大幅降低模型实验和开发的费用。为推理端点实施自动扩缩对于模型推理,您的算力需求通常直接与用户流量挂钩,而用户流量可能显著波动。您可能在营业时间经历高需求,而夜间流量则很少。全天候预置足够的实例来处理峰值负载是一个常见且昂贵的错误。解决方案是使用自动扩缩。自动扩缩组会根据实时需求自动调整一个池中算力实例的数量。您定义规则,云平台处理执行。以下是它在机器学习推理场景中的工作原理:定义扩缩指标: 您选择一个准确反映推理服务器负载的指标。常见选择包括:CPU 使用率: 一个很好的通用指标。GPU 使用率: 对于 GPU 加速的模型更具体有效。每个目标请求数: 基于每个实例处理的请求数量。队列长度: 如果您使用队列(如 SQS)来缓冲传入请求,队列中的消息数量是一个很好的扩缩触发器。设置阈值: 您为所选指标定义一个目标值。例如,您可以将组配置为“保持平均 GPU 使用率在 60%”。如果平均使用率高于此目标,组会添加新实例(扩容)。如果低于目标,则会移除实例(缩容)。建立冷却期: 冷却期可防止自动扩缩组在之前的扩缩活动生效之前启动或终止额外实例。这可以避免被称为“抖动”的快速、浪费的波动。digraph G { rankdir=TB; splines=ortho; node [shape=box, style="rounded,filled", fillcolor="#a5d8ff"]; edge [color="#495057"]; bgcolor="transparent"; "用户流量" [shape=cloud, fillcolor="#ced4da"]; "负载均衡器" [fillcolor="#91a7ff"]; subgraph cluster_asg { label="自动扩缩组"; color="#adb5bd"; style="dashed"; bgcolor="#e9ecef"; "推理实例 1"; "推理实例 2"; "推理实例 3" [style="rounded,filled,dotted", label="实例 3 (新增)", fontcolor="#868e96", color="#adb5bd"]; } "云监控服务" [fillcolor="#96f2d7"]; "用户流量" -> "负载均衡器"; "负载均衡器" -> "推理实例 1"; "负载均衡器" -> "推理实例 2"; "负载均衡器" -> "推理实例 3"; { "推理实例 1", "推理实例 2", "推理实例 3" } -> "云监控服务" [style=dashed, arrowhead=none]; "云监控服务" -> "负载均衡器" [label=" 扩容信号 (高负载)", color="#f03e3e", fontcolor="#d6336c"]; }自动扩缩组通过向池中添加新实例来服务流量,以此响应由监控服务检测到的高负载。通过使用自动扩缩,您可以确保在任何特定时刻只支付您实际需要的算力容量,使您的开销直接与应用程序的需求匹配。安排并关闭空闲资源最直接但有效的成本节约措施之一,就是在资源不使用时简单地将其关闭。开发、预发布和实验环境很少需要全天候运行。一个在周末持续运行的 GPU 实例可能会不必要地花费数百美元。实施调度策略以自动化此过程:标签管理: 首先,为您的资源建立一致的标签策略。例如,像 environment: dev 或 owner: data-scientist-x 这样的标签可以识别适合关闭的非生产资源。自动化工具: 使用云原生服务,如 AWS 实例调度器、Azure 自动化 Runbooks,或控制机上的简单 cron 作业,根据时间表自动停止实例(例如,工作日晚上 7 点停止,周末全天停止)。这些工具也可以配置为在工作日开始前再次启动它们。此策略确保您只在有效工作时间为开发资源付费,从而消除常见的预算浪费来源。{"layout":{"xaxis":{"title":{"text":"一天中的小时"},"tickmode":"array","tickvals":[0,4,8,12,16,20,23]},"yaxis":{"title":{"text":"每小时算力成本 ($)"},"range":[0,5.5]},"bargap":0,"title":{"text":"实例调度对成本的影响"}},"data":[{"x":[8,9,10,11,12,13,14,15,16,17,18],"y":[4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.8],"type":"bar","name":"活跃 (开启)","marker":{"color":"#ff8787"}},{"x":[0,1,2,3,4,5,6,7,19,20,21,22,23],"y":[0,0,0,0,0,0,0,0,0,0,0,0,0],"type":"bar","name":"空闲 (关闭)","marker":{"color":"#ced4da"}}]}此图表显示了开发实例的每小时成本。通过在核心工作时间(上午 8 点至晚上 7 点)之外自动停止它,一天中很大一部分时间的成本将降至零。这些策略并非相互排斥。全面的成本优化计划通常涉及使用竞价实例进行训练、使用自动扩缩组进行生产推理,以及对所有非生产环境进行积极的调度。这使得成本管理从被动行为转变为您 MLOps 实践中主动、自动化的组成部分。