在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(下篇)
简介
在AI迅猛发展的时代,芯片算力对于模型性能起到了至关重要的作用。一款能够同时兼具高性能和低成本的芯片,能够帮助开发者快速构建性能稳定的生成式AI应用,同时降低开发成本。今天小李哥将介绍亚马逊推出的4代高性能计算处理器Gravition,带大家了解如何利用Graviton芯片为Java开发的生成式AI应用提高性能、优化成本。
本系列上篇文章介绍了如何在云平台上创建Graviton芯片服务器,并在Graviton芯片服务器上安装Java应用,并对比Java应用在Graviton和Intel芯片服务器上的运行性能。在本系列下篇中,我们将利用Graviton芯片部署Java容器应用,并利用亚马逊云科技原生容器镜像库ECR保存和管理Java多架构容器镜像和容器Manifest清单。
方案所需基础知识
什么是Graviton4代芯片?
Amazon Graviton 4 处理器由亚马逊云科技定制设计的第四代高性能、低功耗处理器,旨在为 Amazon 计算服务中的工作负载提供最佳性价比,相对于传统计算类工作负载(Graviton2)提供高达40%的性价比提升。与常见的 x86 处理器相比,基于 Graviton 4 的 EC2 实例具有以下特性:
- 每个 vCPU 独占一个物理核心的计算资源,而非通过 SMT 技术获得一个线程;
- 每个 vCPU 拥有更大的 L1/L2 Cache 容量;
- 更快的内存带宽和更低的内存延时。
- Graviton 处理器支持众多 Linux 操作系统,包括 Red Hat Enterprise Linux、SUSE 和 Ubuntu 等。
- Graviton 兼容众多云原生服务和开源软件,兼容亚马逊云科技上的开发工具,数据库,容器,分析,无服务器等服务,拥有丰富的应用生态。
最新发布的第 4 代 Graviton 处理器(基于 Arm Neoverse-V2,ARMv9.0-a);主频提升,L2 缓存翻倍,L3 缓存容量提升,支持 SVE2; 内存:12*DDR5-5600(前代采用 8*DDR5-4800),内存带宽提升 75%;
本实践包括的内容
1. 在亚马逊云科技上分别创建x86芯片以及Graviton4芯片的服务器
2. 构建兼容x86芯片以及Graviton4芯片的多架构容器镜像及Manifest清单
3. 在服务器中根据Manifest清单启动并运行java多架构容器应用
项目实操步骤
创建Graviton4芯片服务器
1. 首先我们进入亚马逊云科技控制台,进入EC2服务
2.点击Launch Instance创建一台EC2服务器
3.在芯片架构处,我们选择实例类型为r8g.xlarge(4vCPU和32GiB内存)实例用于创建Graviton4芯片服务器。另外我们还需要创建一个r6i.xlarge实例,实例用于创建Intel x86芯片服务器。
4. 创建SSH登录秘钥对
5.为密钥对命名,并选择pem类型,点击右下角创建。
6.运行以下命令为密钥对授权,用于SSH登录服务器
chmod 400 test-only.pem
7. 为EC2服务器添加VPC和子网配置
8.选择配置防火墙安全组,在防火墙入站规则中添加允许SSH从0.0.0.0/0 IP范围访问
9.并选择服务器存储,我们选择gp3类型的80GiB的磁盘存储。
通过SSH连接进入服务器
10.通过以下命令SSH登录到EC2服务器中,将创建好的EC2服务器IP地址替换到命令中“EC2实例公网 IP 地址”字段
ssh -i /path/key-pair-name.pem ec2-user@EC2实例公网 IP 地址
为多架构容器创建容器镜像库
11. 进入到ECR服务主页,在左侧菜单栏点击”Repositories“,点击红框创建镜像库
12. 将容器镜像库命名为”multiarchjava“,选择类型为私有,并点击创建
13. 创建完成后,我们可以在镜像库列表中看到我们刚创建的镜像库
14. 我们复制上图中的URI部分,URI格式如下:
{ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com/{存储库名称}
- Account_ID为亚马逊云科技账号ID
- AWS_REGION为ECR镜像库所在区域
- 存储库名称为”multiarchjava“
15. 接下来我们打开亚马逊云科技云端命令行CloudShell
16. 接下来我们运行以下Shell命令获取ECR镜像库API访问的授权密码
TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
export AWS_REGION=$(curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/placement/region)
aws ecr get-login-password --region $AWS_REGION
运行后会得到以下输出,红框内的部分为密码:
构建多架构容器镜像
17. 在x86芯片服务器中,我们执行下面的命令用于安装启动Docker必要依赖
sudo su - root
## 安装 Amazon CLI
curl "https://awscli.amazonaws.com/awscli-exe-linux-$(arch).zip" -o "awscliv2.zip"
unzip -q awscliv2.zip
./aws/install --update
## 安装 Docker
yum install -y jq git docker
systemctl start docker
18. 在运行以下命令,从远程Github拉取项目代码,构建Docker镜像。其中ECR_URL为我们在前面获取的ECR URL,构建的镜像标签为amd64
ECR_URL=xxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com
git clone https://github.com/ddynwzh1992/javaapp_graviton.git
cd javaapp_graviton/
docker build --tag $ECR_URL/multiarchjava:amd64 .
19. 我们通过以下命令登录ECR镜像库,输入密码授权访问,最后将镜像上传到镜像库中
docker login --username AWS $ECR_URL
docker push $ECR_URL/multiarchjava:amd64
20. 对于Gravition架构上的Docker镜像,我们使用相同的方法构建和上传镜像,唯一的区别是该镜像标签为arm64。
docker build --tag $ECR_URL/multiarchjava:arm64 .
21. 在全部上传成功后,我们会在ECR镜像库中看到两个不同标签的Docker镜像
创建多架构容器Manifest清单并启动容器
22. 我们运行以下命令创建多架构容器的Manifest清单,并推送清单到ECR镜像库中
## 创建 Manifest 清单
docker manifest create $ECR_URL/multiarchjava:javaapp --amend \
$ECR_URL/multiarchjava:amd64 \
$ECR_URL/multiarchjava:arm64
## 推送 Manifest 清单
docker manifest push $ECR_URL/multiarchjava:javaapp
23. 我们在ECR镜像库中可以看到新上传的标签为javaapp的Manifest清单,类型为Image Index
24. 如果我们想在不同芯片架构的服务器中通过Manifest清单启动镜像,我们需要运行以下命令
docker run -it -p 8010:8010 $ECR_URL/multiarchjava:javaapp
25. 启动成功后会得到如下多架构容器应用日志输出
以上就是利用亚马逊云科技自研Graviton4代芯片构建高性能、低成本的Java多架构容器应用程序的下篇内容。欢迎大家关注小李哥和我的亚马逊云科技AI服务深入调研系列,不要错过未来更多国际前沿的AWS云开发/云架构方案。