订阅以接收新文章的通知:

Cloudflare R2 与 MosaicML 合作,支持用户在世界各地的任意计算机上训练 LLM,转换成本为零

2023-05-16

2 分钟阅读时间
这篇博文也有 EnglishDeutsch日本語EspañolFrançais版本。

构建支持生成式人工智能的大型语言模型(LLM)和扩散模型需要庞大的基础架构。最明显的组成部分是计算——数百到数千个 GPU,但同样关键(而且往往被忽视)的组成部分是**数据存储基础设施。**训练数据集的大小可以达到 TB 到 PB 的规模,这些数据需要由数千个进程并行读取。此外,在训练过程中需要经常保存模型检查点,对于 LLM 来说,每个检查点的大小可能都达到数百 GB!

为了管理存储成本和可扩展性,许多机器学习团队已经开始使用对象存储来托管其数据集和检查点。不幸的是,大多数对象存储提供商通过出口费用来将用户“锁定”在其平台上。这样一来,利用多个云提供商的 GPU 容量,或者利用其他地方更低/动态的价格变得非常困难,因为数据和模型检查点的移动成本太高。在云 GPU 稀缺、新硬件选项进入市场之际,保持灵活性比以往任何时候都更加重要。

除了高昂的出口费用之外,以对象存储为中心的机器学习训练还存在一个技术障碍。在对象存储和计算集群之间读写数据需要高吞吐量、高效利用网络带宽、确定性和弹性(能够使用不同数量的 GPU 进行训练)。构建能够正确、可靠地处理所有这些问题的训练软件并非易事!

今天,我们怀着兴奋之情,向大家展示如何结合使用 MosaicML 的工具和 Cloudflare R2 来解决以上挑战。首先,利用 MosaicML 开源的 StreamingDatasetComposer 库,您可以轻松地流式传输训练数据,并将模型检查点读/写回 R2。您只需要互联网连接。其次,得益于 R2 的零出口费用,您可以根据计算提供商的 GPU 可用性和价格的变化启动/停止/移动/调整作业,而无需支付任何数据传输费用。MosaicML 训练平台使得在多个云之间编排此类训练作业变得非常简单。

Cloudflare 和 MosaicML 相结合使您能够在全球_任何地方_、_任何_计算资源上训练 LLM,而且零切换成本。这意味着训练速度更快,成本更低,而且避免了供应商锁定 :)

“通过 MosaicML 训练平台,客户可以高效使用 R2 作为持久性存储后端,在任何计算提供商上训练 LLM,而且没有任何出口费用。AI 公司面临着惊人的云成本,正在寻找能够为自己提供速度和灵活性的工具,以最优惠的价格训练出最好的模型。”Naveen Rao,CEO 兼联合创始人,MosaicML

使用 StreamingDataset 从 R2 读取数据

要高效、确定地从 R2 读取数据,可以使用 MosaicML 的 StreamingDataset 库。首先,使用提供的 Python API 将训练数据(图像、文本、视频等任何内容)写入 '.mds' shard 文件中:

在数据集转换完成后,您可以将其上传到 R2。下面我们用 `awscli` 命令行工具进行演示,但您也可以使用 `wrangler ` 或任何您选择的 S3 兼容工具。StreamingDataset 库很快也将支持直接云写入 R2!

import numpy as np
from PIL import Image
from streaming import MDSWriter

# Local or remote directory in which to store the compressed output files
data_dir = 'path-to-dataset'

# A dictionary mapping input fields to their data types
columns = {
    'image': 'jpeg',
    'class': 'int'
}

# Shard compression, if any
compression = 'zstd'

# Save the samples as shards using MDSWriter
with MDSWriter(out=data_dir, columns=columns, compression=compression) as out:
    for i in range(10000):
        sample = {
            'image': Image.fromarray(np.random.randint(0, 256, (32, 32, 3), np.uint8)),
            'class': np.random.randint(10),
        }
        out.write(sample)

最后,您可以将数据读取到任何具有 R2 存储桶读取权限的设备上。您可以获取单个样本,遍历整个数据集,并将其输送到标准的 PyTorch dataloader 中。

$ aws s3 cp --recursive path-to-dataset s3://my-bucket/folder --endpoint-url $S3_ENDPOINT_URL

StreamingDataset 库内置了高性能、具有弹性确定性、快速恢复和多 worker 支持。它还使用智能混洗和分发来确保最小化下载带宽。在各种工作负载(例如 LLMs 和扩散模型)中,我们发现从像 R2 这样的对象存储中进行训练时,没有对训练吞吐量产生影响(没有数据加载器瓶颈)。如果您想了解更多信息,请查看 StreamingDataset 公告博客

from torch.utils.data import DataLoader
from streaming import StreamingDataset

# Make sure that R2 credentials and $S3_ENDPOINT_URL are set in your environment    
# e.g. export S3_ENDPOINT_URL="https://[uid].r2.cloudflarestorage.com"

# Remote path where full dataset is persistently stored
remote = 's3://my-bucket/folder'

# Local working dir where dataset is cached during operation
local = '/tmp/path-to-dataset'

# Create streaming dataset
dataset = StreamingDataset(local=local, remote=remote, shuffle=True)

# Let's see what is in sample #1337...
sample = dataset[1337]
img = sample['image']
cls = sample['class']

# Create PyTorch DataLoader
dataloader = DataLoader(dataset)

使用 Composer 读取/写入模型检查点到 R2

将数据流式传输到您的训练循环中解决了一半的问题,但是如何加载/保存您的模型检查点呢?幸运的是,如果您使用像 Composer 这样的训练库,只需指向一个 R2 路径即可!

Composer 使用异步上传来最小化在训练期间保存检查点时的等待时间。它还支持多 GPU 和多节点训练,而且不需要共享文件系统。这意味着您可以跳过为计算集群设置昂贵的 EFS/NFS 系统,从而每个月在公共云上节省数千美元或更多。您只需要互联网连接和适当的凭据,您的检查点就可以安全地到达 R2 存储桶,为您的私有模型提供可扩展和安全的存储。

from composer import Trainer
...

# Make sure that R2 credentials and $S3_ENDPOINT_URL are set in your environment
# e.g. export S3_ENDPOINT_URL="https://[uid].r2.cloudflarestorage.com"

trainer = Trainer(
        run_name='mpt-7b',
        model=model,
        train_dataloader=train_loader,
        ...
        save_folder=s3://my-bucket/mpt-7b/checkpoints,
        save_interval='1000ba',
        # load_path=s3://my-bucket/mpt-7b-prev/checkpoints/ep0-ba100-rank0.pt,
    )

使用 MosaicML 和 R2 在任何地方进行有效训练

使用上述工具以及 Cloudflare R2,用户可以在任何计算提供商上运行训练工作负载,享有完全的自由,而且没有任何切换成本。

作为演示,在图 X 中,我们使用 MosaicML 训练平台在 Oracle Cloud Infrastructure 上启动一个 LLM 训练作业,数据流式传输进入并将检查点上传回 R2。在训练过程中,我们暂停了作业,并在 Amazon Web Services 上的另一套 GPU 集群上无缝恢复了作业。Composer 从 R2 中的最后一个保存的检查点加载模型权重,而流式数据加载器立即恢复到正确的批次。训练过程保持确定性。最后,我们再一次将作业迁移到 Google Cloud 上以完成运行。

当我们在三个云服务提供商上训练 LLM 时,只需要支付 GPU 计算和数据存储的成本。得益于 Cloudflare R2,我们不需要支付数据出口费用,也不必担心供应商锁定。

使用 MosaicML 训练平台和 Cloudflare R2 在三个不同的云服务提供商上运行 LLM 训练作业,零数据出口费用。

Using the MosaicML training platform with Cloudflare R2 to run an LLM training job across three different cloud providers, with zero egress fees.

使用 MCLI 命令行工具管理计算集群、密钥和提交作业。

$ mcli get clusters
NAME            PROVIDER      GPU_TYPE   GPUS             INSTANCE                   NODES
mml-1            MosaicML   │  a100_80gb  8             │  mosaic.a100-80sxm.1        1    
                            │  none       0             │  cpu                        1    
gcp-1            GCP        │  t4         -             │  n1-standard-48-t4-4        -    
                            │  a100_40gb  -             │  a2-highgpu-8g              -    
                            │  none       0             │  cpu                        1    
aws-1            AWS        │  a100_40gb  ≤8,16,...,32  │  p4d.24xlarge               ≤4   
                            │  none       0             │  cpu                        1    
oci-1            OCI        │  a100_40gb  8,16,...,64   │  oci.bm.gpu.b4.8            ≤8  
                            │  none       0             │  cpu                        1    

$ mcli create secret s3 --name r2-creds --config-file path/to/config --credentials-file path/to/credentials
✔  Created s3 secret: r2-creds      

$ mcli create secret env S3_ENDPOINT_URL="https://[uid].r2.cloudflarestorage.com"
✔  Created environment secret: s3-endpoint-url      
               
$ mcli run -f mpt-125m-r2.yaml --follow
✔  Run mpt-125m-r2-X2k3Uq started                                                                                    
i  Following run logs. Press Ctrl+C to quit.                                                                            
                                                                                                                        
Cloning into 'llm-foundry'...

一个 MCLI 指定运行名称、Docker 镜像、一组命令以及要用于运行的计算集群。

### mpt-125m-r2.yaml ###
# set up secrets once with `mcli create secret ...`
# and they will be present in the environment in any subsequent run

integrations:
- integration_type: git_repo
  git_repo: mosaicml/llm-foundry
  git_branch: main
  pip_install: -e .[gpu]

image: mosaicml/pytorch:1.13.1_cu117-python3.10-ubuntu20.04

command: |
  cd llm-foundry/scripts
  composer train/train.py train/yamls/mpt/125m.yaml \
    data_remote=s3://bucket/path-to-data \
    max_duration=100ba \
    save_folder=s3://checkpoints/mpt-125m \
    save_interval=20ba

run_name: mpt-125m-r2

gpu_num: 8
gpu_type: a100_40gb
cluster: oci-1  # can be any compute cluster!

立即开始使用!

MosaicML 平台是一个非常有用的工具,帮助将您的训练提升到一个新的水平。本文探讨了 Cloudflare R2 如何让您能够在任何或所有计算提供商上使用自己的数据训练模型。通过消除数据出口费用,R2 存储成为 MosaicML训练一个极具成本效益的补充,提供最大的自主权和控制。结合这两个工具,您可以随时在云服务提供商之间切换,以适应组织需求随时间的变化。

如果希望进一步了解如何使用 MosaicML 在自己的数据上训练定制的最先进人工智能模型,请访问这里联系我们

我们保护整个企业网络,帮助客户高效构建互联网规模的应用程序,加速任何网站或互联网应用程序抵御 DDoS 攻击,防止黑客入侵,并能协助您实现 Zero Trust 的过程

从任何设备访问 1.1.1.1,以开始使用我们的免费应用程序,帮助您更快、更安全地访问互联网。要进一步了解我们帮助构建更美好互联网的使命,请从这里开始。如果您正在寻找新的职业方向,请查看我们的空缺职位
Developer Week开发人员合作伙伴R2 StorageEgressConnectivity Cloud

在 X 上关注

Abhinav Venigalla (Guest Author)|@abhi_venigalla
Phillip Jones|@akaphill
Abhi Das|@abhidasone
Cloudflare|@cloudflare

相关帖子