云计算¶
云计算为机器学习工作负载提供按需基础设施,无需自购硬件。本文件涵盖服务模型、主要云服务商、容器和Kubernetes、存储、云网络、无服务器计算、成本管理和基础设施即代码
- 训练一个前沿模型需要数千张GPU持续数月。没有创业公司拥有自己的硬件。云计算让你按小时租用,训练时扩容,推理时缩容,只为使用的部分付费。任何想要在笔记本电脑之外构建ML系统的人,都必须了解云基础设施。
云服务模型¶
- 云服务按照服务商管理程度进行分层:
| 模型 | 你管理 | 服务商管理 | 示例 |
|---|---|---|---|
| IaaS(基础设施) | 操作系统、运行时、应用 | 硬件、虚拟化、网络 | AWS EC2、GCP Compute Engine |
| PaaS(平台) | 应用、数据 | 操作系统、运行时、扩缩容、补丁 | AWS SageMaker、GCP Vertex AI |
| SaaS(软件) | 无(直接使用) | 全部 | OpenAI API、Weights & Biases |
| FaaS(函数) | 单个函数 | 其他所有 | AWS Lambda、GCP Cloud Functions |
- 对ML而言:大多数团队混合使用。IaaS用于自定义训练(完全控制GPU实例),PaaS用于托管训练和推理服务(SageMaker、Vertex AI处理编排),SaaS用于工具(W&B用于实验跟踪,OpenAI API用于基线对比)。
主要服务商¶
AWS(Amazon Web Services)¶
- 最大的云服务商(约占32%市场份额)。关键ML服务:
- EC2:虚拟机。GPU实例:p4d(A100)、p5(H100)、g5(A10G用于推理)。
- S3:对象存储。存储数据集和模型权重的标准。虚拟无限容量,约$0.023/GB/月。
- SageMaker:托管ML平台。处理训练、超参数调优、部署和监控。
- EKS:托管Kubernetes。
- Lambda:无服务器函数。不适合GPU工作负载,但对预处理和编排很有用。
GCP(Google Cloud Platform)¶
- Google云(约占11%市场份额)。关键ML服务:
- Compute Engine:虚拟机。包含A100、H100的GPU实例。TPU VM用于TPU访问。
- GCS:对象存储(类似S3)。
- Vertex AI:托管ML平台。原生JAX/TPU支持。
- GKE:托管Kubernetes(最成熟的K8s产品,因为Google创建了Kubernetes)。
- Cloud TPU:GCP独占。v5e和v5p用于大规模训练。
Azure(Microsoft)¶
- 微软云(约占23%市场份额)。关键ML服务:
- Azure VM:包含A100、H100的GPU实例。
- Azure Blob Storage:对象存储。
- Azure ML:托管ML平台。
- AKS:托管Kubernetes。
- OpenAI Service:通过Azure API独家访问OpenAI模型。
容器和Kubernetes¶
- 我们在第13章(OS)中概念性地讲解了容器(Docker),在第15章(部署)中进行了实践。这里我们关注云专用模式:
面向ML的Kubernetes¶
-
Kubernetes(K8s)在规模上编排容器。关键概念:
-
Pod:最小可部署单元。包含一个或多个共享网络和存储的容器。一个模型推理Pod可能包含:模型服务器容器 + 一个用于指标收集的Sidecar容器。
-
Deployment:管理一组相同的Pod。指定所需的副本数量。如果Pod崩溃,K8s自动创建替代Pod。
-
Service:一组Pod的稳定网络端点。客户端连接到Service;K8s路由到健康的Pod。类型:ClusterIP(内部)、NodePort(通过节点端口对外)、LoadBalancer(通过云负载均衡器对外)。
-
StatefulSet:类似Deployment但用于有状态工作负载。每个Pod获得持久标识和稳定存储。用于数据库和分布式训练(每个工作节点需要稳定标识以进行通信)。
-
DaemonSet:在每个节点上运行一个Pod。用于:监控代理(Prometheus节点导出器)、日志收集器(Fluentd)、GPU设备插件(NVIDIA设备插件)。
-
-
K8s中的GPU调度:NVIDIA设备插件将GPU暴露为K8s资源。Pod请求GPU:
- K8s将Pod调度到有2张可用GPU的节点上。这就是云ML平台为训练和推理分配GPU的方式。
自动扩缩容¶
-
水平Pod自动扩缩器(HPA):基于指标(CPU使用率、请求速率、自定义指标如GPU利用率或队列深度)扩缩Pod数量。
-
集群自动扩缩器:扩缩节点数量。如果Pod因节点不足而无法调度,集群自动扩缩器从云服务商处配置新的虚拟机。当节点利用率低时,排空并终止它们。
-
KEDA(Kubernetes事件驱动自动扩缩):基于外部事件源(Kafka队列深度、HTTP请求速率)扩缩。非常适合推理:当请求队列增长时扩容模型服务器,当队列为空时缩容。
存储¶
| 类型 | 特点 | 使用场景 | 示例 |
|---|---|---|---|
| 块存储 | 低延迟,挂载到一台虚拟机 | 操作系统磁盘、数据库 | AWS EBS、GCP Persistent Disk |
| 对象存储 | 无限容量,HTTP访问 | 数据集、模型权重、日志 | AWS S3、GCS、Azure Blob |
| 文件存储 | 跨虚拟机共享,POSIX | 共享训练数据 | AWS EFS、GCP Filestore、NFS |
| 数据湖 | 读取时应用schema,原始数据 | 分析、特征工程 | Delta Lake、Iceberg、Hudi |
-
对于ML训练:数据集存储在对象存储(S3/GCS)中。训练脚本从对象存储读取数据到RAM。对于快速随机访问(随机打乱的数据加载),要么:(1) 训练前将数据集下载到本地SSD,(2) 使用高吞吐量文件系统(Lustre、FSx),或(3) 使用能高效流式传输和缓存的数据加载库(WebDataset、FFCV)。
-
模型权重:存储在带版本控制的对象存储中。一个70B模型在FP16下约为140 GB。从S3以1 GB/s加载约需2.5分钟。缓存到本地SSD可减少推理的冷启动时间。
云网络¶
-
VPC(虚拟私有云):云中隔离的网络。你的虚拟机、数据库和服务在VPC内通信。外部流量通过负载均衡器或网关进入。
-
子网:将VPC划分为段。公有子网可访问互联网(用于API服务器)。私有子网不可访问(用于数据库、GPU工作节点)。这相当于网络层面的最小权限安全原则。
-
安全组(AWS)/ 防火墙规则(GCP):控制允许哪些流量。"允许来自任何地方的80端口入站HTTP。仅允许来自我的IP的22端口入站SSH。阻止其他所有流量。"配置错误的安全组是云安全事件的首要原因。
-
服务网格(Istio、Envoy):管理K8s内部的服务间通信。提供:mTLS加密(每个服务间调用都已加密)、流量路由(A/B测试:将10%流量路由到新模型)、重试、超时、熔断和可观测性(哪个服务调用了哪个,花了多长时间)。
无服务器¶
-
无服务器(AWS Lambda、GCP Cloud Functions):你上传函数,云服务商在触发时运行它。无需管理服务器,无需配置扩缩容。按调用付费(通常每100万次调用$0.20 + 计算时间)。
-
冷启动:不活动一段时间后的第一次调用需要更长时间(服务商必须分配容器并加载你的代码)。冷启动需要0.5-5秒,使无服务器不适合对延迟敏感的ML推理。
-
对于ML:无服务器适用于:预处理(在发送到模型之前调整图像大小)、后处理(格式化模型输出、发送通知)、编排(新数据到达时触发训练流水线)和轻量级推理(小型模型,可容忍冷启动)。
-
无服务器不适用于:GPU推理(大多数无服务器平台不支持GPU)、长时间运行的训练作业(Lambda超时限制15分钟)或有状态服务(调用之间没有持久状态)。
成本管理¶
-
云成本是ML团队的首要运维关注点。单张H100实例约\(8/小时。64-GPU的训练运行约\)500/小时。一个月的训练运行约$360,000。成本优化是工程,不是会计。
-
竞价/抢占式实例:以60-90%折扣出售的未使用云容量。服务商可以在30秒到2分钟内回收它们。用于:容错训练(频繁保存检查点,在新实例上恢复)、批量推理、数据预处理。不用于:对延迟敏感的推理服务(中断 = 停机)。
-
预留实例:承诺1-3年使用量以获得30-60%折扣。用于:已知基线负载的稳态推理服务。
-
自动扩缩容:高峰时段扩容,夜间/周末缩容。一个在高峰时需要10张GPU、夜间需要2张的模型服务器,通过自动扩缩比24/7运行10张GPU节省约60%。
-
合理选型:不要为7B模型使用H100,它在A10G上运行很好。将GPU与工作负载匹配。使用性能分析(第16章)确定最适合的GPU。
-
存储成本:对象存储很便宜(S3标准$0.023/GB/月),但会累积。一个存储所有训练检查点的团队(每个10 GB,每个实验100个,50个实验)累积50 TB = $1,150/月。设置生命周期策略自动删除旧检查点。
多区域部署¶
-
对于全球ML系统(服务全球用户),在单个区域部署意味着远程用户面临高延迟(东京用户访问美国服务器增加约150ms网络往返)和单点故障(如果该区域宕机,整个服务离线)。
-
多区域模式:
-
主备模式(Active-Passive):一个主区域处理所有流量。备用区域保持热备(已复制数据,准备接收流量)。主区域故障时,DNS切换到备用区域。故障切换期间的停机时间:30秒到数分钟。
-
双活模式(Active-Active):两个区域同时处理流量。用户被路由到最近的区域。两个区域都有最新数据(异步或同步复制)。单个区域故障无停机——流量自动重新路由。
-
-
数据复制:这是难点。模型权重可以轻松复制(复制到每个区域的S3)。特征存储数据必须以可接受的陈旧度复制。用户数据可能有数据驻留要求(GDPR:欧洲用户数据必须留在欧洲)。
-
GPU云价格对比(近似值,2026年):
| GPU | AWS | GCP | Azure | 典型用途 |
|---|---|---|---|---|
| A10G(24 GB) | $1.00/小时(g5) | $0.90/小时 | $0.90/小时 | 小模型推理 |
| A100(80 GB) | $4.10/小时(p4d) | $3.70/小时 | $3.40/小时 | 训练、大规模推理 |
| H100(80 GB) | $8.00/小时(p5) | $7.50/小时 | $7.00/小时 | 前沿训练 |
| TPU v5e | 不适用 | $1.20/小时 | 不适用 | 规模化JAX训练 |
- 竞价/抢占式定价通常是这些费率的60-70%折扣。价格因区域和可用性而异。
基础设施即代码¶
-
IaC在版本控制的配置文件中定义基础设施(虚拟机、网络、数据库、K8s集群)。不是点击AWS控制台中的按钮,而是编写描述你需求的代码,工具来创建它。
-
Terraform(HashiCorp):标准的IaC工具。支持所有主流云服务商。声明式:你描述期望状态,Terraform决定创建/修改/删除什么来达到这个状态。
# main.tf — 为推理创建GPU虚拟机
resource "aws_instance" "model_server" {
ami = "ami-0abcdef1234567890" # Deep Learning AMI
instance_type = "g5.xlarge" # A10G GPU
tags = {
Name = "model-server-prod"
}
}
resource "aws_s3_bucket" "model_weights" {
bucket = "my-model-weights-prod"
versioning {
enabled = true
}
}
terraform init # 下载服务商插件
terraform plan # 显示将要更改的内容
terraform apply # 创建基础设施
terraform destroy # 拆除所有基础设施
-
为什么需要IaC:可重现性(从代码重建整个基础设施)、审计(git历史显示谁改了什么都)、灾难恢复(用相同配置在不同区域重建)和环境对等(开发、预发和生产使用相同模板但不同参数)。
-
Pulumi:类似Terraform但使用真正的编程语言(Python、TypeScript、Go)而非HCL。当基础设施逻辑复杂时有用(条件语句、循环、动态配置)。