充斥在各种工作、生活场景中的智能手机、平板、IoT设备、智能家电、智能机械等电子设备,对绝大多数人来说并不陌生,而这些设备背后的基础支撑力之一——Arm 架构芯片,其性能和功耗的优势也在逐渐升级,向传统台式机、笔记本甚至是服务器这类 x86 架构处理器的“主场”蔓延。
作为应用开发者,你有没有想过基于 Arm 架构打造全新应用,并通过云平台为用户提供更创新的服务?亚马逊云科技(Amazon Web Services)来挺你!
Graviton
更高性价比的工作负载工具
Graviton 是由亚马逊云科技使用 64 位 Arm Neoverse 内核定制的芯片,为在 Amazon Elastic Compute Cloud (Amazon EC2) 中运行的云工作负载提供更高的性价比。
在 Graviton 之前,X86 曾是亚马逊云科技中的唯一选择。不过在 re:Invent 2018 上,亚马逊云科技发布了第一款由 Graviton 支持的实例:Amazon EC2 A1 实例系列。这些实例针对成本和性能进行了优化,并专门为许多现代云架构中常见的工作负载而构建。
随着 A1 实例系列和第一代 Graviton 处理器的成功,越来越多开发者希望扩展 Graviton 的工作负载及适用范围。一年后的 re:Invent 2019,亚马逊云科技发布了 Graviton2 处理器,功能更强大。
Graviton2 采用 Arm Neoverse N1 内核,兼容 Arm v8.2 指令集,采用 7nm 制程。与第一代 Graviton 处理器相比,Graviton2 处理器不论在性能和功能上都实现了巨大飞跃。基于 Graviton2 的 Amazon EC2 T4g、M6g、C6g 和 R6g 实例,为各种工作负载提供高达 40% 的性价比提升。Graviton2 处理器也为视频编码工作负载提供增强的性能,为压缩工作负载提供硬件加速,并为基于 CPU 的机器学习推理提供支持。
构建 Arm 生态
提供更卓越的托管云服务支持
众所周知,Arm 架构有着世界上最大的计算生态系统。基于 Arm 授权的芯片出货量已达 1800 亿颗(截至 2020 年第 4 季度),大量 Arm 设备在移动和嵌入式市场中得到使用。
Arm 生态系统在移动和嵌入式方面一直很强大。从 Arm 架构发展历程来看,通过社区建设增强用户认知度,打造成熟的生态系统是其取得成功的关键因素。在云计算领域,虽然 Graviton2 的性价比优势巨大,但云原生的开发者对 Arm 架构还略显陌生。而对于开发者群体来说,生态系统构建至关重要。
随着 Graviton 和 Graviton2 处理器的相继发布,亚马逊云科技也在与社区紧密合作,为开发者在云端构建开放成熟的 Arm 生态系统。这意味着 Graviton2 不仅可以迅速为 Amazon EC2 实例提供动力,构建一系列的开源和商业应用,还可为更多的托管云服务提供支持。
优化操作系统
推动 Arm 架构支持
在生态系统中,操作系统的作用与影响至关重要。亚马逊云科技与操作系统生态中的合作伙伴们保持密切合作,推动对 64 位 Arm(arm64)架构的支持。一方面,开源社区中的操作系统对 Arm 的支持已经很普遍;另一方面,亚马逊云科技也在持续助力合作伙伴优先安排对 Arm 的支持。
目前大多数主流 Linux 发行版都支持 Graviton 和 Graviton2 的“开箱即用”,包括 Amazon Linux 2、Ubuntu、SUSE Linux 企业服务器和红帽企业 Linux。
依托 Graviton 部署容器
支持更多架构
容器是云原生现代应用开发的核心基础设施。在容器领域,Graviton 和 Graviton2 处理器经过优化,是基于容器工作负载的理想选择。利用基于 Graviton 的实例作为容器主机,需要确保容器运行的软件依赖项支持 arm64 架构。
目前,容器生态系统通常都会支持 x86_64 和 arm64 两种架构,并且可以通过多架构(multi-arch)映像透明地实现。使用多架构会自动为容器主机部署正确的映像。主流的容器映像存储库,包括 Dockerhub、Quay 和 Amazon Elastic Container Registry(Amazon ECR),都支持多架构映像。
除了大多数映像已经支持多架构外,开发者也可以便捷创建多架构映像。Docker 19.03 通过引入 Buildx 插件,扩展了 docker build 命令,可以方便地构建多架构的 Docker 映像。
对于容器部署来说,大多数容器编排平台也都同时支持 x86_64 和 arm64。亚马逊云科技的容器服务及一些新开源项目(如 Firecraker 和 Bottlerocket)也都可以在 Graviton 2 上运行。在丰富的开源容器生态系统中,包括 Istio、Envoy、Flannel、Helm、Prometheus、Terraform、Grafana、core-dns、containerd、CNI 等都已支持 Graviton 和 Graviton2。
借助 Graviton
加速机器学习推理效率
机器学习是云平台的重要工作负载之一,而云计算也在不断推动机器学习的进步。Graviton2 通过支持 fp16 和 int8 指令集以加速机器学习的推理效率。在一项基于 CPU 上的 TVM 进行的 BERT 分类性能比较中发现,基于 Graviton2 的 M6g 实例比基于 Intel Xeon 的 M5 实例的推理效率提升 28%。
而在机器学习的使用过程中,框架是大部分开发者都会用到的工具。Graviton2 能够良好地运行包括 TensorFlow和 PyTorch 在内的主流框架。目前在 Graviton2 上使用 TensorFlow 需要进行简单的编译。在安装 bazel 编译工具之后,就可以配置、编译并且使用 TensorFlow。
git clone https://github.com/tensorflow/tensorflow $HOME/tensorflow
cd $HOME/tensorflow
./configure
bazel build //tensorflow/tools/pip_package:build_pip_package
⟵左滑可查阅所有代码
在 Graviton2 上使用 PyTorch 则更为简单。PyTorch 1.8 版本中已经可以支持 Graviton2 (arm64),安装即可使用。
pip install --pre torch torchvision -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html
⟵左滑可查阅所有代码
结合 Graviton 创新开源软件
推动云端 Arm 生态系统加速发展
不仅容器和机器学习,开源社区及其带来的创新对于 Graviton 生态系统的持续成功至关重要。开源软件已经遍及到技术的各个领域,从各种的开发工具到不同的应用前沿。亚马逊云科技都在和开源社区紧密协作,一起推动云端 Arm 生态系统的共同发展。
集成亚马逊云服务
打造更开放的 Arm 生态系统
当前,越来越多的亚马逊云科技的服务已经与 Arm 集成,包括 Systems Manager、Batch、Cloud9 IDE 和 DevOps 服务。此外还有众多支持 Graviton 的工具、软件和服务。大多数亚马逊云科技工具和 SDK 都透明地支持 Graviton2,包括 Amazon Command Line Interface (Amazon CLI) v1、Amazon CLI v2、Amazon CloudWatch agent、SSM agent以及 Amazon SDK for 面向C/C++、node.js、Python、Go、Java、.NET 的 Amazon SDK 等。
Graviton2 还在为越来越多的亚马逊云科技的数据与分析托管服务赋能。这些服务大多是基于开源项目构建。Graviton2 帮助使用 Redis 和 Memcached 的 ElastiCache 服务性价比提高了 45%,且 Graviton2 实例已经成为 ElasticCache 的默认选项。对于开源数据库如 MySQL,PostgreSQL 在云端的托管服务,根据数据库引擎、版本和工作负载的不同,Graviton2 实例可以提供高达 52% 的性价比提升。对于托管的 Hadoop 生态系统的 EMR 服务,在 Graviton2 实例的 Spark 工作负载可以获得高达 15% 的性能改进和 30% 的成本降低。
arm64 生态系统已经获得了众多语言、工具包和运行时的支持,使得开发者在 Graviton2 上的开发和迁移变得简单便捷。基于解释性语言(包括 Python、Java、Ruby 等)的应用无需修改即可在 Graviton2 上运行;基于编译性语言的应用则需要为 arm64 重新编译。所有主流编译器都支持 arm64,包括 C、C++、Go 以及最近非常流行的 Rust。
举例来说,使用 gcc 和 LLVM 在 Graviton2 上启用 Arm 架构特定的功能,可以通过-march=armv8.2-a+fp16+rcpc+dotprod+crypto实现,使用-mtune=neoverse-n1可以进行为 Graviton2 内核优化的编译。Arm 软件生态系统非常活跃,每天都会产生大量的改进。一般来说,只要有可能,就应该使用更高版本的编译器和语言运行时。
向 Graviton2 迁移的路径和方式也非常成熟,通常分为识别,测试和部署三个阶段:
01
首先要确定生产环境中的所有库和依赖项,同时查找现有的 arm64 二进制文件或与架构无关的源代码,并进行必要的代码修改和编译。
02
其次是测试,所有测试都应支持多体系结构。在测试阶段可能需要编写新的测试,之后还需要执行通常的单元测试,验收测试和上线前测试等。
03
在最后的部署阶段,可利用 CloudFormation 或 CDK 之类的工具更新 IaaC 资源,将应用部署到 arm64 实例。通过蓝绿部署和 CI/CD 工具在现有应用堆栈旁边创建新的 arm64 应用堆栈,然后利用加权路由将一小部分请求发送到新堆栈,以监视错误率、用户行为、负载和其他关键因素,确定生产中移植应用的运行状况。
亚马逊云科技通过持续推动云与 Arm 和社区的融合,在为开发者构建起一整套云端开放成熟的 Arm 生态系统的同时,进一步实现降本增效。
如果您对以上内容感兴趣,不妨立即行动,让 Arm 架构应用生态就此发展壮大,为未来的应用创新奠定全新的基础!
本篇作者
王宇博
亚马逊云科技首席开发者布道师
负责亚马逊云科技的技术与产品在开发者中的布道与推广。此前曾担任亚马逊云科技高级产品经理多年,负责亚马逊云科技的计算、数据和人工智能相关产品和解决方案的业务拓展。
听说,点完下面4个按钮
就不会碰到bug了!