妙到毫巅,在阿里云容器服务中体验RAPIDS加速数据科学

简介: 在阿里云容器服务中体验RAPIDS加速数据科学 摘要 算法、数据和算力称为人工智能的三大要素,如果没有算力的支撑,人工智能难以落地。而Nvidia GPU的强劲算力是AI模型训练加速的首选,但是它的价格也确实不菲。

妙到毫巅,在阿里云容器服务中体验RAPIDS加速数据科学

摘要

算法、数据和算力称为人工智能的三大要素,如果没有算力的支撑,人工智能难以落地。而Nvidia GPU的强劲算力是AI模型训练加速的首选,但是它的价格也确实不菲。如何能够简单,有效同时低成本的使用Nvidia GPU的算力,使用阿里云容器服务+ECI+Arena的方案是一个可以参考的选项。

而一谈起Nvidia GPU,大家首先会想到的就是深度学习,传统的机器学习和数据分析的方法对GPU的利用却很少,实际上Nvidia有一个非常优秀的项目RAPIDS,全称Real-time Acceleration Platform for Integrated Data Science,是NVIDIA针对数据科学和机器学习推出的GPU加速库。更多RAPIDS信息请参见官方网站。这是一个致力于将GPU加速带给传统算法的项目,并且提供了与Pandas和scikit-learn一致的用法和体验。实际上RAPIDS有三个模块:cuDF相当于Pandas,cuML相当于scikit-learn,cuGraph则是处理图数据的。由于它的兼容性很好,我们可以把RAPIDS与深度学习框架结合,用cuDF来利用GPU加速处理数据,然后使用TensorFlow和PyTorch的深度学习模型框架处理任务。

rapids_on_eci_full

在本文中,我们将介绍如何利用TensorFlow和Rapids实现在阿里云容器服务上以图搜图的功能;同时通过ECI实现GPU资源的使用即申请,秒级的GPU资源准备速度,完成即释放,用户无需提前准备GPU实例;而站在使用者的角度,他并不需要和Kubernetes的基础设施打交道,通过arena的命令行,就可以实现包含GPU的RAPIDS环境的构建和运行,并且完成对GPU基础设施的管理。

执行步骤

步骤1:准备集群

准备托管k8s的集群,所谓托管k8s的集群就是这个k8s的管控节点由阿里云承担资源和运维成本,并且创建了虚拟的Kubelet节点

需要您已创建好容器服务 Kubernetes集群。 您可以选择管版的Kubernetes集群。
由于需要运行系统组件容器,节点中至少有一个Worker节点。

  1. 安装虚拟节点,具体可以参考虚拟节点
  2. 配置virtual-kubelet-autoscaler,当集群内的GPU资源不足的时候,通过virtual-kubelet-autoscaler将弹出使用GPU的ECI实例。具体参考文档

步骤2:从无到有运行arena创建RAPIDS服务

1.安装arena

$ wget http://kubeflow.oss-cn-beijing.aliyuncs.com/arena-installer-0.3.1-b96e1ac-linux-amd64.tar.gz
$ tar -xvf arena*.tar.gz
$ cd arena-installer
$ ./install.sh

2.先运行一下arena命令查看集群的GPU资源, 可以看到在该用户集群下,有一个真实节点并没有包含GPU资源,同时存在了一个虚拟节点,该节点并不真实存在,无需付费,同时它提供了无限的GPU资源可以扩展。

$ arena top node
arena top node
NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-shanghai.192.168.1.248  192.168.1.248  <none>  ready   0           0
virtual-kubelet            172.20.2.18    agent   ready   1000        0
-----------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
0/1000 (0%)

3.再提交rapids任务前,我们需要做一些准备。准备的目的是加速创建过程和简化访问操作。

3.1.设置访问方式。将访问方式设置为LoadBalancer(该方法只是为了示例简单,并不推荐您在生产环境开放外网ip方访问)

$ find /charts/ -name "*.yaml" | xargs sed -i "s/NodePort/LoadBalancer/g"

3.2.加速启动速度

3.2.1.GPU的容器镜像通常很大,以本实验要使用的rapids容器镜像为例,它的容量为14.7GB.通常启动时间会在10分钟左右。而通过镜像缓存的能力可以将这个从无到有的过程缩短到20s左右。

docker images | grep rapids
registry.cn-shanghai.aliyuncs.com/tensorflow-samples/rapids-samples                0.8.2-cuda10.0-runtime-ubuntu16.04   4597a0334d41        12 days ago         14.7GB

3.2.2.而在serverless kubernetes中,你只需要创建一个ImageCache CRD,就可以直接使用镜像缓存的能力。

$ cat > imagecache.yaml << EOF
apiVersion: eci.alibabacloud.com/v1
kind: ImageCache
metadata:
  name: imagecache-rapids
spec:
  images:
  - registry.cn-shanghai.aliyuncs.com/tensorflow-samples/rapids-samples:0.8.2-cuda10.0-runtime-ubuntu16.04
  imageCacheSize:
   50
EOF

$ kubectl create -f imagecache.yaml

3.2.3.提交后稍等片刻。查看ImageCache状态,其中CACHID可以做后面提交任务时指定的snapshot-id

$ kubectl get imagecache
NAME                AGE    CACHEID                    PHASE   PROGRESS
imagecache-rapids   3d9h   imc-uf6dxdji7txxxxx        Ready   100%

具体操作可以参考文档

4.提交rapids的开发环境

$ arena serve custom \
     --name=rapids \
     --selector=type=virtual-kubelet \
     --toleration=all \
     --annotation=k8s.aliyun.com/eci-image-snapshot-id=imc-uf6dxdji7txxxxx \
     --annotation=k8s.aliyun.com/eci-instance-type=ecs.gn5i-c8g1.2xlarge \
     --gpus=1 \
     -e=PASSWORD=mypassw0rd \
     --restful-port=80 \
     --image=registry.cn-shanghai.aliyuncs.com/tensorflow-samples/rapids-samples:0.8.2-cuda10.0-runtime-ubuntu16.04
configmap/rapids-201912011815-custom-serving created
configmap/rapids-201912011815-custom-serving labeled
service/rapids-201912011815 created
deployment.extensions/rapids-201912011815-custom-serving created

--selector=type=virtual-kubelet表示通过Virtual Node启动Pod
--annotation=k8s.aliyun.com/eci-instance-type=ecs.gn5i-c8g1.2xlarge表示指定使用ECI的实例类型,ecs.gn5i-c8g1.2xlarge代表阿里云P4机型。具体规格可以查看文档
--annotation=k8s.aliyun.com/eci-image-snapshot-id=imc-uf6dxdji7txxxxx指定3.2.3步中的CACHEID
-e=PASSWORD=mypassw0rd就是通过环境变量PASSWORD设置访问RAPIDS notebook
--gpus=1表示申请的GPU数目

4.查看访问地址,这里是ENDPOINT_ADDRESS和PORTS的组合, 在本示例中它是106.15.173.2:80。同时发现该任务在32秒的时候就可以变成Running状态

$ arena serve list
NAME    TYPE    VERSION       DESIRED  AVAILABLE  ENDPOINT_ADDRESS  PORTS
rapids  CUSTOM  201911181827  1        1          105.13.58.3      restful:80

$ arena serve get rapids
 arena serve get rapids
NAME:             rapids
NAMESPACE:        default
VERSION:          201912011815
DESIRED:          1
AVAILABLE:        1
SERVING TYPE:     CUSTOM
ENDPOINT ADDRESS: 106.15.173.2
ENDPOINT PORTS:   restful:80
AGE:              32s

INSTANCE                                           STATUS   AGE  READY  RESTARTS  NODE
rapids-201912011815-custom-serving-6b54d5cd-swcwz  Running  32s  1/1    0         N/A

5.再次查看集群的GPU使用情况,发现已经有一个GPU资源被占用了

$ arena top node
NAME                       IPADDRESS      ROLE    STATUS  GPU(Total)  GPU(Allocated)
cn-shanghai.192.168.1.248  192.168.1.248  <none>  ready   0           0
virtual-kubelet            172.20.2.20    agent   ready   1000        1
-----------------------------------------------------------------------------------------
Allocated/Total GPUs In Cluster:
1/1000 (0%)

6.如果想查询是哪个Pod占用了这个GPU, 可以在原有命令中加一个-d就可以看到具体的Pod名称。

$ arena top node -d


NAME:       cn-shanghai.192.168.1.248
IPADDRESS:  192.168.1.248
ROLE:       <none>

Total GPUs In Node cn-shanghai.192.168.1.248:      0
Allocated GPUs In Node cn-shanghai.192.168.1.248:  0 (0%)
-----------------------------------------------------------------------------------------

NAME:       virtual-kubelet
IPADDRESS:  172.20.2.20
ROLE:       agent

NAMESPACE  NAME                                                GPU REQUESTS
default    rapids-201912011815-custom-serving-6b54d5cd-swcwz  1

Total GPUs In Node virtual-kubelet:      1000
Allocated GPUs In Node virtual-kubelet:  1 (0%)
-----------------------------------------------------------------------------------------


Allocated/Total GPUs In Cluster:  1/1000 (0%)

7.根据步骤4中的访问地址和端口,打开本地浏览器。输入http://{ENDPOINT ADDRESS}:{ENDPOINT PORT},在本例子中是http://105.13.58.3:80

说明: 推荐使用Chrome浏览器。

8.输入启动命令中设置的密码,然后单击Log in。 在本例子中,密码为mypassw0rd

步骤三:执行以图搜图的示例

1.进入示例所在目录cuml。
2.双击cuml_knn.ipynb文件。
3.单击

说明: 单击一次执行一个cell,请单击至示例执行结束,详细说明请参见示例执行过程

rapids_1

示例执行过程

图像搜索示例的执行过程分为三个步骤:处理数据集、提取图片特征和搜索相似图片。本文示例结果中对比了GPU加速的RAPIDS cuml KNN与CPU实现的scikit-learn KNN的性能。

1.处理数据集。
1.1 下载和解压数据集。 本文示例中使用了STL-10数据集,该数据集中包含10万张未打标的图片,图片的尺寸均为:96 x 96 x 3, 您可以使用其他数据集,为便于提取图片特征,请确保数据集中图片的尺寸相同。

本文示例提供了download_and_extract(data_dir)方法供您下载和解压STL-10数据集。RAPIDS镜像中已经将数据集下载到./data目录,您可以执行download_and_extract()方法直接解压数据集。

1.2. 读取图片。 从数据集解压出的数据为二进制格式,执行read_all_images(path_to_data)方法加载数据并转换为NHWC(batch, height, width, channels)格式,以便用Tensorflow提取图片特征。

1.3. 展示图片。 执行show_image(image)方法随机展示一张数据集中的图片。

1.4. 分割数据集。 按照9:1的比例把数据集分为两部分,分别用于创建图片索引库和搜索图片。

2.提取图片特征。 使用开源框架Tensorflow和Keras提取图片特征,其中模型为基于ImageNet数据集的ResNet50(notop)预训练模型。
2.1 设定Tensorflow参数。 Tensorflow默认使用所有GPU显存,我们需要留出部分GPU显存供cuML使用。您可以选择一种方法设置GPU显存参数:

  • 方法1:依据运行需求进行显存分配。

    config.gpu_options.allow_growth = True
  • 方法2:设定可以使用的GPU显存比例。本示例中使用方法2,并且GPU显存比例默认设置为0.3,即Tensorflow可以使用整块GPU显存的30%,您可以依据应用场景修改比例。

    config.gpu_options.per_process_gpu_memory_fraction = 0.3

2.2 下载ResNet50(notop)预训练模型。 连接公网下载模型(大小约91M),目前该模型已经被保存到/root/.keras/models/目录。

参数名称 说明
weights 取值范围:
- None:随机初始化权重值。
- imagenet:权重值的初始值设置为通过ImageNet预训练过的模型的权重值。
本示例中设置为imagenet。
include_top 取值范围:
- True:包含整个ResNet50网络结构的最后一个全链接层。
- False:不包含整个ResNet50网络结构的最后一个全链接层。
本示例中,使用神经网络模型ResNet50的主要目的是提取图片特征而非分类图片,因此设置为False。
input_shape 可选参数,用于设置图片的输入shape,仅在include_top设置为False时生效。
您必须为图片设置3个inputs channels,且宽和高不应低于32。此处设为(96, 96, 3)。
pooling 在include_top设置为False时,您需要设置池化层模式,取值范围:
- None:输出为4D tensor。
- avg:平均池化,输出为2D tensor。
- max:最大池化,输出为2D tensor。 本示例中设置为max。

您可以执行model.summary()方法查看模型的网络结构。

2.2 提取图片特征。 对分割得到的两个图片数据集执行model.predict()方法提取图片特征。

  1. 搜索相似图片。
    3.1 使用cuml KNN搜索相似图片。 通过k=3设置K值为3,即查找最相似的3张图片,您可以依据使用场景自定义K值。

其中,knn_cuml.fit()方法为创建索引阶段,knn_cuml.kneighbors()为搜索近邻阶段。

KNN向量检索耗时791 ms。

3.2 使用scikit-learn KNN搜索相似图片。 通过n_neighbors=3设置K值为3,通过n_jobs=-1设置使用所有CPU进行近邻搜索。

说明: ecs.gn5i-c8g1.2xlarge的配置为8 vCPU。

KNN向量检索耗时7分34秒。

3.3 对比cuml KNN和scikit-learn KNN的搜索结果。 对比两种方式的KNN向量检索速度,使用GPU加速的cuml KNN耗时791 ms,使用CPU的scikit-learn KNN耗时7min 34s。前者为后者的近600倍。

验证两种方式的输出结果是否相同,输出结果为两个数组:

  • distance:最小的K个距离值。本示例中搜索了10000张图片,K值为3,因此distance.shape=(10000,3)
  • indices:对应的图片索引。indices.shape=(10000, 3)
    由于本示例所用数据集中存在重复图片,容易出现图片相同但索引不同的情况,因此使用distances,不使用indices对比结果。考虑到计算误差,如果两种方法得出的10000张图片中的3个最小距离值误差都小于1,则认为结果相同。

图片搜索结果

本示例从1万张搜索图片中随机选择5张图片并搜索相似图片,最终展示出5行4列图片。

第一列为搜索图片,第二列至第四列为图片索引库中的相似图片,且相似性依次递减。每张相似图片的标题为计算的距离,数值越大相似性越低。

步骤4:清理工作

$ arena serve delete rapids
service "rapids-201912011815" deleted
deployment.extensions "rapids-201912011815-custom-serving" deleted
configmap "rapids-201912011815-custom-serving" deleted
INFO[0000] The Serving job rapids with version 201912011815 has been deleted successfully

总结

本文介绍通过Arena+阿里云Serverless Kubernetes快速,简单,低成本的使用RAPIDS加速数据科学。

相关实践学习
使用ACS算力快速搭建生成式会话应用
阿里云容器计算服务 ACS(Container Compute Service)以Kubernetes为使用界面,采用Serverless形态提供弹性的算力资源,使您轻松高效运行容器应用。本文将指导您如何通过ACS控制台及ACS集群证书在ACS集群中快速部署并公开一个容器化生成式AI会话应用,并监控应用的运行情况。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
4月前
|
存储 Kubernetes 网络安全
关于阿里云 Kubernetes 容器服务(ACK)添加镜像仓库的快速说明
本文介绍了在中国大陆地区因网络限制无法正常拉取 Docker 镜像的解决方案。作者所在的阿里云 Kubernetes 集群使用的是较旧版本的 containerd(1.2x),且无法直接通过 SSH 修改节点配置,因此采用了一种无需更改 Kubernetes 配置文件的方法。通过为 `docker.io` 添加 containerd 的镜像源,并使用脚本自动修改 containerd 配置文件中的路径错误(将错误的 `cert.d` 改为 `certs.d`),最终实现了通过多个镜像站点拉取镜像。作者还提供了一个可重复运行的脚本,用于动态配置镜像源。虽然该方案能缓解镜像拉取问题,
497 2
|
11月前
|
Cloud Native Serverless 数据中心
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
阿里云ACK One:注册集群支持ACS算力——云原生时代的计算新引擎
334 10
|
11月前
|
Kubernetes 监控 Serverless
基于阿里云Serverless Kubernetes(ASK)的无服务器架构设计与实践
无服务器架构(Serverless Architecture)在云原生技术中备受关注,开发者只需专注于业务逻辑,无需管理服务器。阿里云Serverless Kubernetes(ASK)是基于Kubernetes的托管服务,提供极致弹性和按需付费能力。本文深入探讨如何使用ASK设计和实现无服务器架构,涵盖事件驱动、自动扩展、无状态设计、监控与日志及成本优化等方面,并通过图片处理服务案例展示具体实践,帮助构建高效可靠的无服务器应用。
|
10月前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
355 0
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
11月前
|
Kubernetes 持续交付 开发工具
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
阿里云协同万兴科技落地ACK One GitOps方案,全球多机房应用自动化发布,效率提升50%
429 2
|
11月前
|
监控 Kubernetes Cloud Native
基于阿里云容器服务Kubernetes版(ACK)的微服务架构设计与实践
本文介绍了如何基于阿里云容器服务Kubernetes版(ACK)设计和实现微服务架构。首先概述了微服务架构的优势与挑战,如模块化、可扩展性及技术多样性。接着详细描述了ACK的核心功能,包括集群管理、应用管理、网络与安全、监控与日志等。在设计基于ACK的微服务架构时,需考虑服务拆分、通信、发现与负载均衡、配置管理、监控与日志以及CI/CD等方面。通过一个电商应用案例,展示了用户服务、商品服务、订单服务和支付服务的具体部署步骤。最后总结了ACK为微服务架构提供的强大支持,帮助应对各种挑战,构建高效可靠的云原生应用。
|
10月前
|
人工智能 Kubernetes Serverless
阿里云向全球客户推出创新容器计算服务ACS,可降低算力成本高达55%
阿里云向全球客户推出创新容器计算服务ACS,可降低算力成本高达55%
|
11月前
|
弹性计算 监控 持续交付
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
面对热点事件,阿里云如何通过云上弹性与容器服务帮助客户应对流量洪峰
271 0
|
11月前
|
边缘计算 调度 对象存储
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
部署DeepSeek但IDC GPU不足,阿里云ACK Edge虚拟节点来帮忙
261 0
|
11月前
|
监控 Cloud Native Java
基于阿里云容器服务(ACK)的微服务架构设计与实践
本文介绍如何利用阿里云容器服务Kubernetes版(ACK)构建高可用、可扩展的微服务架构。通过电商平台案例,展示基于Java(Spring Boot)、Docker、Nacos等技术的开发、容器化、部署流程,涵盖服务注册、API网关、监控日志及性能优化实践,帮助企业实现云原生转型。

相关产品

  • 容器计算服务
  • 容器服务Kubernetes版
  • 推荐镜像

    更多