AWS发布Ray Train深度学习容器,在EKS上用两个节点八张L4 GPU做分布式训练
AWS称该容器已把CUDA、NCCL、EFA和AWS OFI NCCL插件打成一体并在Amazon ECR Public发布,用户无需自建镜像;示例用两个g6.12xlarge实例共八张L4 GPU微调Qwen2.5-1.5B,AWS给出的运行成本约每小时9.50美元。
AI解读:AWS Machine Learning博客介绍了一个可直接使用的Ray Train深度学习容器(DLC),标签为public.ecr.aws/deep-learning-containers/ray:train-ml-cuda-v1.1,内含Ray 2.58.0、PyTorch 2.13.0、CUDA 13.0.2、NCCL 2.29.7以及EFA和AWS OFI NCCL插件等组件。
适用范围是Amazon EKS上的多节点PyTorch训练:示例用KubeRay在EKS建集群,一个CPU系统节点运行KubeRay operator和Ray head,两个g6.12xlarge各跑一个Ray worker pod,共八张NVIDIA L4 GPU。
读者需要弄清的一点是:这个容器省去的是镜像构建和组件对齐,网络传输、GPU与EFA资源申请、角色配置仍需在RayCluster清单里显式设置;例如没有申请vpc.amazonaws.com/efa,NCCL会退回TCP sockets,任务仍能完成但速度大幅下降(AWS说法)。
主体动作:AWS组装并测试该镜像、在ECR Public发布并持续打补丁;博客作者是Sunita Koppar。文中示例仅验证FSDP集合通信跨两个节点且任务完成,训练用的是随机token,并未给出微调效果数据。
限制与前置条件:需要96个G系列按需vCPU配额,AWS估算GPU实例运行期间约每小时9.50美元,含两个实例、EKS控制平面和NAT Gateway;文中称全新Region部署约20到30分钟。
AWS Machine Learning博客发布一篇教程,介绍使用已发布的Ray Train深度学习容器(DLC)在Amazon EKS上做多节点PyTorch训练,示例任务是用PyTorch FSDP在两个g6.12xlarge实例的八张NVIDIA L4 GPU上微调Qwen2.5-1.5B,全程不构建镜像。文章作者为Sunita Koppar。
容器里装了什么
博客把Ray Train DLC描述为“PyTorch训练镜像加上Ray训练库”,示例拉取的标签是public.ecr.aws/deep-learning-containers/ray:train-ml-cuda-v1.1。AWS称该镜像把分布式运行时、PyTorch编译版本、CUDA/cuDNN/NCCL、EFA安装包与libfabric、aws-ofi-nccl插件,以及DeepSpeed、flash-attn、Transformer Engine、PyTorch Lightning和Hugging Face库一起构建并测试。
- Ray 2.58.0,含Train、Tune和Data框架
- PyTorch 2.13.0、torchvision 0.28.0
- CUDA 13.0.2、NCCL 2.29.7
- EFA最新版、AWS OFI NCCL插件、GDRCopy
- all_reduce_perf等NCCL测试工具已在路径中
集群与网络配置
示例的集群布局为:一个m7i.xlarge系统节点承载KubeRay operator和Ray head(不分配GPU),两个g6.12xlarge各运行一个Ray worker pod,每个pod申请4张GPU和该节点唯一的EFA接口,八张GPU对应rank 0–7。两个GPU实例被放在同一可用区,博客称EFA流量不跨可用区。
博客强调,EFA相关库若配置不一致,NCCL不会报错,而是退回TCP sockets继续运行;因此在worker清单里显式设置FI_PROVIDER、NCCL_NET_PLUGIN、NCCL_SOCKET_IFNAME和NCCL_DEBUG四个环境变量,并通过Kubernetes资源请求vpc.amazonaws.com/efa让EFA设备插件把接口挂进容器。
- 同一个镜像标签同时用于head和worker,角色由KubeRay的rayStartParams决定
- head设置NVIDIA_VISIBLE_DEVICES=void,避免无GPU节点上的运行时钩子报错
- requests与limits相等,使worker进入Kubernetes Guaranteed QoS类
- num-gpus与GPU请求取自同一变量,保证Ray与Kubernetes的容量视图一致
示例做了什么、没做什么
训练代码是一个传给TorchTrainer的函数,通过ray.train.torch.prepare_model以FSDP并行策略拆分模型。博客称Qwen2.5-1.5B的bfloat16权重、梯度、优化器状态和副本合计约12GB,八路分片后每张L4约1.5GB;FSDP在每步都要跨rank收集权重并reduce-scatter梯度,这部分跨实例通信由EFA承载。
该示例的输入是随机token ID,博客明确说其判断标准是“真实FSDP集合通信跨过两个节点且任务完成”,并未给出微调质量或吞吐对比数据。对于真实微调,文章建议把随机张量换成Ray Data或DataLoader流水线,训练函数其余部分不变。
前置条件与成本
博客列出运行前置条件:AWS CLI v2、eksctl、kubectl、Helm和GNU gettext的envsubst;96个G系列按需vCPU配额,或已有的按需容量预留;AWS估算GPU实例运行期间每小时约9.50美元,覆盖两个GPU实例、EKS控制平面和NAT Gateway。脚本deploy_all.sh会先探测有g6.12xlarge容量的Region和可用区,四个部署步骤在全新Region约需20到30分钟。
- 镜像标签vX.Y随安全重建更新,vX.Y.Z冻结在原始发布构建,需要逐字节复现时应固定digest
- 默认不运行训练任务,deploy_all.sh只准备基础设施
- 已有集群或节点组会被检测并复用