gpu真的很贵吗?基于数据集群推理的gpu基准测试
2021年12月15日 在工程的博客
众所周知,gpu对于人工智能和深度学习应用至关重要,因为其高效的架构使其成为计算密集型用例的理想选择。然而,几乎每个使用过它们的人都知道它们往往很贵!在本文中,我们希望说明,虽然GPU的每小时成本可能更高,但从总成本到解决方案的角度来看,它实际上可能更便宜。此外,你的洞察时间将大大缩短,可能会带来额外的节省。在这个基准测试中,我们比较了Databricks平台上提供的8个高性能gpu和2个仅cpu集群配置的NLP应用程序的运行时和成本占解决方案的比例。bob体育客户端下载
为什么gpu是有益的?
gpu非常适合这项任务,因为它们有大量的计算单元,具有专为数字处理而设计的架构。例如,在MLPerf基准测试中,Nvidia A100 GPU的速度比cpu快237倍(https://blogs.nvidia.com/blog/2020/10/21/inference-mlperf-benchmarks/).具体来说,对于深度学习应用程序,已经做了相当多的工作来创建成熟的框架,如Tensorflow和Pytorch,允许最终用户利用这些架构。gpu不仅是为这些计算密集型任务设计的,而且是围绕它的基础设施,例如NVlink用于GPU内存之间高速数据传输的互连。的NCCL图书馆允许在高速互连上执行多gpu操作,这样这些深度学习实验就可以扩展到数千个gpu上。此外,NCCL紧密集成到最流行的深度学习框架中。
虽然gpu对于深度学习来说几乎是不可或缺的,但与之相关的每小时成本往往会让客户望而却步。但是,在本文中使用的基准测试的帮助下,我希望阐明两个关键点:
- Cost-of-solution-虽然GPU实例的每小时成本可能更高,但解决方案的总成本实际上可能更低。
- Time-to-insight-由于gpu速度更快,由于深度学习或数据科学的迭代特性,洞察时间通常要低得多。这反过来又可以降低基础设施成本,如存储成本。
基准
在这项研究中,gpu被用于在NLP任务中执行推理,或者更具体地说,对文本文档集进行情感分析。具体来说,基准测试由对三个数据集执行的推理组成
- 一组3个JSON文件
- 更大的拼花
- 较大的Parquet文件划分为10个文件
这里的目标是评估推理任务的总运行时间以及批处理大小的变化,以解释可用GPU内存的差异。GPU内存利用率也被监控,以考虑运行时差异。从GPU获得最大性能的关键是确保所有GPU计算单元和内存在任何时候都被工作充分占用。
列出了每个测试实例的每小时成本,我们计算了总推理成本,以便进行有意义的业务成本比较。下面提供了用于基准测试的代码。
模型=“distilbert-base-uncased-finetuned-sst-2-english”defget_all_files():Partitioned_file_list = glob.glob(' / dbfs /用户/(电子邮件保护)/ Peteall_partitioned / * .parquet ')File_list = [' / dbfs /用户/(电子邮件保护)/ Peteall.txt ']如果(USE_ONE_FILE = =真正的):返回(file_list)其他的:返回(partitioned_file_list)
类TextLoader(数据集):def__init__(自我,文件=没有一个变换=没有一个target_transform =没有一个记号赋予器=没有一个):自我。文件= pd.read_parquet(file)自我。文件= self.file自我。文件= tokenizer(列表(self.file [“full_text”]),填充=真正的截断=真正的max_length =512return_tensors =“pt”)自我。文件= self.file[“input_ids”]自我。变换=变换自我。Target_transform = Target_transformdef__len__(自我):返回len(self.file)def__getitem__(自我,idx):数据= self.file[idx]返回(数据)
类SentimentModel(神经网络。模块):#我们的模型def__init__(自我):超级(自我SentimentModel) . __init__ ()#打印 ("------------------- 初始化一次 ------------------")自我。fc = automodelforsequencecclassification .from_pretrained(MODEL)def向前(自我,输入):#输出(输入)输出= self.fc(输入)pt_forecasts = nn.function .softmax(输出。分对数,昏暗的=1)#print("\tIn Model: input size", input.size())返回(pt_predictions)
dev =cuda的如果dev = =“cpu”:设备= torch.device(“cpu”)device_staging =cpu: 0的其他的:设备= torch.device(cuda的)device_staging =的cuda: 0
tokenizer = AutoTokenizer.from_pretrained(MODEL)
All_files = get_all_files()model3 =情感模型()试一试:#如果省略device_ids参数,它将选择所有可用的设备(gpu)model3 = nn. dataparle (model3)model3.to (device_staging)除了:torch.set_printoptions(阈值=10000)
T0 = time.time()为文件在all_files:data = TextLoader(file=file, tokenizer=tokenizer)train_dataloader = DataLoader(data, batch_size=batch_size, shuffle=假)# Shuffle应该设置为FalseOut = torch.empty(0,0)为ct、数据在列举(train_dataloader):输入= data.to (device_staging)如果(len= =0):Out = model3(输入)其他的:输出= model3(输入)与torch.no_grad ():熄灭=火炬。猫((输出),0)Df = pd.read_parquet(file)[“full_text”]Res = out.cpu().numpy()Df_res = pd。DataFrame ({“文本”: df,“负面”: res (:,0),“积极的”: res (:,1]})#打印(df_res)打印(“时间执行推理”,time.time() - t0)
基础设施——gpu和cpu
这些基准测试在8个GPU集群和2个CPU集群上运行。GPU集群包括各种配置的k80 (Kepler)、t4 (Turing)和v100 (Volta) GPU,这些GPU可以通过AWS云后端在Databricks上使用。使用不同的计算和内存配置来选择实例。就纯吞吐量而言,Kepler架构是最古老且最不强大的,而Volta架构是最强大的。
gpu的
- G4dn
这些实例具有NVIDIA T4 gpu(图灵)和Intel Cascade Lake cpu。根据AWS的说法,“它们针对机器学习推理和小规模训练进行了优化”。使用了以下实例:
的名字 | gpu | 内存 | 价格 |
---|---|---|---|
g4dn.xlarge | 1 | 16 gb | 0.071美元 |
g4dn.12xlarge | 4 | 192 gb | 0.856美元 |
G4db.16xlarge | 1 | 256 gb | 1.141美元 |
- P2
它们有k80(开普勒),用于通用计算。
的名字 | gpu | 内存 | 价格 |
---|---|---|---|
p2.xlarge | 1 | 12 gb | 0.122美元 |
p2.8xlarge | 8 | 96 gb | 0.976美元 |
- P3
P3实例在单个实例上提供多达8个NVIDIA®V100 Tensor Core gpu,是机器学习应用程序的理想选择。这些实例每个实例可以提供高达1千万亿次的混合精度性能。P3dn。例如,24xlarge实例提供4倍的网络带宽P3.16xlarge实例,支持分布式机器学习的NCCL。
的名字 | gpu | GPU内存 | 价格 |
---|---|---|---|
p3.2xlarge | 1 | 16 gb | 0.415美元 |
p3.8xlarge | 4 | 64 gb | 1.66美元 |
p3dn.24xlarge | 8 | 256 gb | 4.233美元 |
CPU实例
C5
C5实例采用英特尔至强白金8000系列处理器(Skylake-SP或Cascade Lake),时钟速度高达3.6 GHz。这里选择的集群具有48或96个vcpu和96GB或192GB RAM。更大的内存允许我们使用更大的批处理大小进行推断。
的名字 | cpu | CPU内存 | 价格 |
---|---|---|---|
c5.12x | 48 | 96 gb | 0.728美元 |
c5.24xlarge | 96 | 192 gb | 1.456美元 |
基准
测试1
批处理大小设置为gpu总数的40倍,以便将工作负载扩展到集群。这里,我们按原样使用单个大文件,没有任何分区。显然,当文件太大而无法在集群中容纳时,这种方法将失败。
实例 | 小数据集 | 更大的数据集 | gpu数量 | 每小时费用 | 推理成本(小数据集) | 推理成本(大数据集) |
---|---|---|---|---|---|---|
G4dn.x | 19.3887 | NA | 1 | 0.071美元 | 0.0003 | NA |
G4dn.12x | 11.9705 | 857.6637 | 4 | 0.856美元 | 0.003 | 0.204 |
G4dn.16x | 20.0317 | 2134.0858 | 1 | 1.141美元 | 0.006 | 0.676 |
P2.x | 36.1057 | 3449.9012 | 1 | 0.122美元 | 0.001 | 0.117 |
P2.8x | 11.1389 | 772.0695 | 8 | 0.976美元 | 0.003 | 0.209 |
P3.2x | 10.2323 | 622.4061 | 1 | 0.415美元 | 0.001 | 0.072 |
P3.8x | 7.1598 | 308.2410 | 4 | 1.66美元 | 0.003 | 0.142 |
P3.24x | 6.7305 | 328.6602 | 8 | 4.233美元 | 0.008 | 0.386 |
正如预期的那样,Voltas的性能最好,其次是图灵和开普勒架构。除了最后两行之外,运行时还会随着gpu数量的增加而伸缩。P3.8x集群比P3.24x更快,尽管gpu数量只有P3.24x的一半。这是因为P3.24x上的每个gpu内存利用率为17%,而P3.8x上为33%。
测试2
批处理大小设置为可用gpu数量的40倍,以便为更大的集群扩展工作负载。大文件现在被划分为10个小文件。与前一个结果表的唯一区别是突出显示的列对应于更大的文件。
实例 | 小数据集 | 更大的数据集 | gpu数量 | 每小时费用 | 推理成本(小) | 推理成本(大) |
---|---|---|---|---|---|---|
G4dn.x | 19.3887 | 2349.5816 | 1 | 0.071美元 | 0.0003 | 0.046 |
G4dn.12x | 11.9705 | 979.2081 | 4 | 0.856美元 | 0.003 | 0.233 |
G4dn.16x | 20.0317 | 2043.2231 | 1 | 1.141美元 | 0.006 | 0.648 |
P2.x | 36.1057 | 3465.6696 | 1 | 0.122美元 | 0.001 | 0.117 |
P2.8x | 11.1389 | 831.7865 | 8 | 0.976美元 | 0.003 | 0.226 |
P3.2x | 10.2323 | 644.3109 | 1 | 0.415美元 | 0.001 | 0.074 |
P3.8x | 7.1598 | 350.5021 | 4 | 1.66美元 | 0.003 | 0.162 |
P3.24x | 6.7305 | 395.6856 | 8 | 4.233美元 | 0.008 | 0.465 |
测试3
在本例中,批处理大小增加到70,大文件被划分为10个小文件。在本例中,您会注意到P3.24x集群比P3.8x集群更快,因为与前面的实验相比,P3.24x上的每gpu利用率要高得多。
实例 | 小数据集 | 更大的数据集 | gpu数量 | 每小时费用 | 推理成本(小数据集) | 推理成本(大数据集) |
---|---|---|---|---|---|---|
G4dn.x | 18.6905 | 1702.3943 | 1 | 0.071美元 | 0.0004 | 0.034 |
G4dn.12x | 9.8503 | 697.9399 | 4 | 0.856美元 | 0.002 | 0.166 |
G4dn.16x | 19.0683 | 1783.3361 | 1 | 1.141美元 | 0.006 | 0.565 |
P2.x | 35.8419 | 伯父 | 1 | 0.122美元 | 0.001 | NA |
P2.8x | 10.3589 | 716.1538 | 8 | 0.976美元 | 0.003 | 0.194 |
P3.2x | 9.6603 | 647.3808 | 1 | 0.415美元 | 0.001 | 0.075 |
P3.8x | 7.5605 | 305.8879 | 4 | 1.66美元 | 0.003 | 0.141 |
P3.24x | 6.0897 | 258.259 | 8 | 4.233美元 | 0.007 | 0.304 |
仅cpu集群的推断
这里我们运行同样的推理问题,但这次只在cpu集群上使用较小的数据集。批量大小选择为vcpu数量的100倍。
实例 | 小数据集 | vcpu个数 | 内存 | 每小时费用 | 推理成本 |
---|---|---|---|---|---|
C5.12x | 42.491 | 48 | 96 | 0.728美元 | 0.009美元 |
C5.24x | 40.771 | 96 | 192 | 1.456美元 | 0.016美元 |
您会注意到,对于这两个集群,cpu上的运行时间都较慢,但与GPU集群相比,推理的成本往往更高。事实上,基准测试中最昂贵的GPU集群(p3.24倍)不仅比两个CPU集群快6倍,而且总推理成本(0.007美元)甚至比较小的CPU集群(c5.12倍,0.009美元)还要低。
结论
由于与gpu价格相关的溢价,人们普遍犹豫是否要将gpu用于工作负载,然而,在这个基准测试中,我们已经能够说明,用gpu替换cpu可能会为用户节省成本。洞察的时间也大大减少,导致更快的迭代和解决方案,这对GTM战略至关重要。
请查看存储库与笔记本和笔记本运行在Github上。