腾讯CVM标准型SR1是腾讯云推出的首款搭载ARM架构处理器的新一代CVM标准型计算实例规格。SR1基于全核一致主频3.0GHz的Ampere Altra处理器,实例核数从1核到64核,并支持1: 2、1: 4等多种处理器与内存配比,相对x86架构实例为用户提供卓越的性价比。
Ampere为基于Ampere Altra处理器的SR1实例提供了优化过的AI框架(Ampere AI),并通过腾讯镜像市场提供免费的镜像给客户使用。本文将介绍如何在腾讯云上创建SR1实例,并基于TensorFlow对计算机视觉分类性能进行评测。
用CPU做推理
现下AI推理应用的算力来源主要有三种方式,即CPU AI专用芯片,CPU GPU和单纯的CPU推理。根据Statista和麦肯锡之前发布的AI硬件洞察报告,基于CPU的推理目前仍占50%以上。相比其他两种模式,采用CPU推理的主要原因有几点:
- 更加灵活便利,软件主导,对应用方来说对专用硬件的依赖性低。
- 涉及操作系统、驱动程序、运行时组件库等的复杂性较低。
- CPU 上 AI 模型算法(例如稀疏性、量化等)的持续优化创新可以提供接近 GPU 的高吞吐量 。
- 更容易实现横向扩展并与其他软件堆栈进行集成 。
更重要的是在CPU上搭建推理应用可以方便的将AI集成到业务逻辑模块,融入微服务云原生体系。
创建SR1实例
我们将创建一个16vCPU的SR1实例SR1.4XLARGE32来进行评测,该实例配置16个Ampere Altra物理核和32GB内存。
首先登录腾讯云的控制台,在“实例”类别下选择“新建”,将进入实例创建页面。由于SR1目前只在广州六区有售,所以需要选择“广州”->“广州六区”->”标准型SR1”。
然后将看到不同规格的SR1实例,这里我们选择SR1.4XLARGE32规格的实例。
镜像选择“镜像市场”-> “从镜像市场选择”,然后搜索“Ampere”,选取“Ampere® Optimized TensorFlow - Ubuntu 20.04”镜像即可免费使用Ampere针对SR1优化过的TensorFlow 2.7以及各种示例程序。
设置好其它的实例配置,就可以确认配置信息并开通实例了。
启动并连接到实例
实例创建完就可以启动并登录了。实例的IP地址可以从控制台获取,取决于创建时设置的登录方式,可以使用密码或密钥的方式登录实例。
代码语言:javascript复制ssh ubuntu@<public ip address of the instances>
登录后将看到下面的Ampere AI的欢迎界面。
可以看到,这个镜像除了集成了Ampere 优化的Tensorflow,也包含aio-example的测试代码,该代码也可以从github上获取。
运行TensorFlow AIO 示例
TensorFlow是一个端到端开源机器学习平台,它拥有一个全面而灵活的生态系统,其中包含各种工具、库和社区资源,可助力研究人员推动先进机器学习技术的发展,并使开发者能够轻松地构建和部署由机器学习提供支持的应用。
我们创建实例时从镜像市场选择的镜像已经包含了针对Ampere Altra CPU优化过的Tensorflow 2.7。为了运行aio-example提供的示例程序,我们需要先下载模型。aio-examples提供了包括图像分类和对象检测的不同模型,有32位的,也有16位和8位的模型。
代码语言:javascript复制$ cd aio-examples
$ ./download_models.sh
取决于网络状况,下载所有的模型将需要几分钟。
我们将用TensorFlow resnet_50_v15 分类模型来进行测试和评估。ResNet50是最常用的图像分类模型之一。
由于Ampere Altra CPU是单核单线程,SR1里每一个vCPU都对应一个Altra物理核,所以在用SR1.4XLARGE32测试时,我们指定AIO_NUM_THREADS为16。我们首先测试FP32的双精度模型。
代码语言:javascript复制cd classification/resnet_50_v15
export AIO_NUM_THREADS=16
python3 run.py -m resnet_50_v15_tf_fp32.pb -p fp32
可以看到,使用16个核心,resnet_50_v15可以每秒处理65.36张图像(65.36 ips), 延时为15ms。
下面我们再测试基于FP16的模型。
代码语言:javascript复制cd classification/resnet_50_v15
export AIO_NUM_THREADS=16
python3 run.py -m resnet_50_v15_tf_fp16.pb -p fp16
我们看到FP16的模型提供了高达115.59 ips的吞吐能力,这是因为Ampere Altra处理器对FP16提供了原生支持。相比FP32模型, FP16模型可以在几乎不影响模型的精度的前提下提供接近2倍的图像处理能力。
与其他实例的性能对比
这里的aio-example同样可以运行在基于Intel CPU和AMD CPU的腾讯CVM实例上。我们同样创建16vCPU的实例S6.4XLARGE32 和SA3.4XLARGE32。 其中S6.4XLARGE32是基于Intel® Xeon® Ice Lake 处理器的16vCPU实例,SA3.4XLARGE32是基于AMD EPYC™ Milan 处理器的16vCPU实例。与SR1.4XLARGE32不同的是,这里的16vCPU是16个线程,而非物理核,实际的物理核为8。
我们在S6.4XLARGE32上运行intel-tensorflow, 这是Intel优化过的TensorFlow以充分发挥AVX-512指令集的性能。
AMD也提供了针对AMD CPU优化的ZenDNN,但在腾讯CVM里测试的结果并不比native的Tensorflow更好,所以以下SA3.4XLARGE32的数据采用的是native TensorFlow。
“resnet_50_v15”模型在3个平台上的性能表现如下表。
实例类型 | vCPU数量 | 价格(¥/小时) | 模型 | ips | ips/price | latency(ms) |
---|---|---|---|---|---|---|
S6.4xLARGE32 | 16 | 2.51 | fp32 | 47 | 18.73 | 21 |
SA3.4xLARGE32 | 16 | 1.88 | fp32 | 44 | 23.29 | 23 |
SR1.4xLARGE32 | 16 | 2.04 | fp32 | 65 | 32.04 | 15 |
SR1.4xLARGE32 | 16 | 2.04 | fp16 | 116 | 56.66 | 9 |
我们可以看到,每秒处理的图像数量(ips),SR1.4xLARGE32分别比同规格的S6和SA3实例高出40%和50%;如果再考虑单个实例的价格差异,以相同的价格,SR1.4xLARGE32可以获得比同规格的S6和SA3高出70%和40%的性能。
于此同时,SR1实例还提供了对FP16的支持,可以获得更高的吞吐能力,以及更低的延时特性。
Jupyter Notebook的可视化示例
aio-example 也提供了Jupyter Notebook脚本,方式编辑,调试和实现可视化。
下面将以对象检测模型SSD Inception v2为例。首先在CVM里启动Jupyter Notebook。
在另外一台有浏览器的机器上,执行以下命令,输入实例的密码,开启ssh 隧道;然后打开浏览器,输入上面最后一行的地址,就可以看到AIO的Jupyter Notebook了。
代码语言:javascript复制ssh -N -L 8080:localhost:8080 ubuntu@<public ip address of the instances>
进入“object_detection”,点击“examples.ipynb”,将会看到Object Detection Examples的页面。
点击”Cell” -> “Run All”运行。
查看运行结果。
也可以通过同样的方法运行aio-examples里面其它的示例。
结论
采用Ampere® Altra®处理器的腾讯SR1实例,充分发挥了单核单线程的性能优势,同时Ampere® AI优化软件栈将SR1在AI推理应用中,相对x86架构的性价比优势提升到了70%。
除了腾讯云市场的免费镜像,用户也可以从Ampere解决方案网站获取即用型 Docker 映像,包括代码和文档,在接受最终用户许可协议后的进行下载。Docker 映像包含一个标准的 ML 框架(TensorFlow,PyTorch, ONNX等),预装了优化的软件,可以在腾讯CVM SR1无需更改即可运行推理脚本。镜像中也提供了图像分类和对象检测等示例模型。
Ampere Computing免费试用计划为开发者开放了SR1实例的申请通道,有兴趣的同学可以通过该计划免费试用SR1实例。
文内资源链接参考
https://solutions.amperecomputing.com/solutions/ampere-ai
https://github.com/AmpereComputingAI/aio-examples
https://github.com/AmpereComputingAI/ampere_model_library
https://cloud.tencent.com/document/product/213/55669
https://developer.amd.com/zendnn/