跳到主要内容
工程的博客

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任务中执行推理,或者更具体地说,对文本文档集进行情感分析。具体来说,基准测试由对三个数据集执行的推理组成

  1. 一组3个JSON文件
  2. 更大的拼花
  3. 较大的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(00ct、数据列举(train_dataloader):输入= data.to (device_staging)如果len= =0):Out = model3(输入其他的输出= model3(输入torch.no_grad ():熄灭=火炬。猫((输出),0Df = 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的

  1. 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美元
  1. P2

它们有k80(开普勒),用于通用计算。

的名字 gpu 内存 价格
p2.xlarge 1 12 gb 0.122美元
p2.8xlarge 8 96 gb 0.976美元
  1. 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上。

免费试用Databricks

相关的帖子

看到所有工程的博客的帖子