深度学习在某些学术界和工业界正获得巨大的发展势头。推理——即基于预训练模型从现实世界数据中检索信息的能力——是深度学习应用的核心。
深度学习推理可用于在图像到达对象存储时对其进行分类,无论对象存储是托管在公共云(如 Amazon S3 或 Azure Blob)上,还是使用 Ceph RADOS Gateway (RGW) 等接口的本地环境中。此用例的传统工作流程是,当图像更新时,它会触发一个事件,并且对象存储将该事件发布给其订阅者。然后,订阅者下载图像并将其发送到推理服务。这种事件触发机制可以在 AWS 的 Simple Queue Service 中找到。
最近出现的 Ceph RGW PubSub 项目为本地解决方案扩展了机会。我们将 RGW PubSub 与 Kubernetes 原生的无服务器框架 Knative 集成,并开发了 rgw-pubsub-api 用于深度学习推理服务功能。
RGW PubSub
RGW PubSub 利用 RGW 的多站点系统,并提供插件机制,可以轻松地对对象更改创建不同的操作。一个例子是元数据索引插件,它索引系统中任何对象的元数据。添加的 pubsub 同步模块提供了一种发布和订阅系统中对象修改的机制。
RGW PubSub 提供了一个 REST API,可用于配置和使用此功能。
一切都基于用户。用户可以定义一个主题。通过定义包含存储桶(用户拥有)和事件类型(对象创建、对象删除)的通知,可以将更改发布到此主题。可以有多个发布者发布到单个主题。必须创建订阅才能获取这些事件,并且每个主题可以有多个订阅。可以从订阅中拉取事件,然后进行确认(acked),这是一个删除事件的操作。还实现了一种推送机制;但是,可靠且可扩展的推送仍在开发中。未确认的事件最终将被删除。
我们实现了一个 golang 客户端来与 RGW PubSub 服务交互。golang 客户端被 RGW PubSub 命令行界面 (CLI) 客户端和 Knative 事件源使用。
RGW PubSub 与 Knative 的集成
Knative 有三个核心组件:事件处理 (eventing)、构建 (build) 和服务 (serving)。事件处理是一个框架,它从各种来源(如 GitHub、GCP PubSub 和 Kubernetes Event)拉取外部事件。一旦事件被拉取,它们将被分派到事件接收器 (event sink)。常用的接收器是 Knative 服务,这是一个由服务功能托管的运行 HTTP(S) 服务的内部端点。
我们在 Knative 的 ContainerSource 之后建模了 RGW PubSub 的 Knative 事件源,ContainerSource 用于运行可以生成事件并分派到事件接收器的容器镜像。
PubSub 事件源使用 RGW PubSub API 定期拉取事件,将事件发布到事件接收器,然后删除它们。在接收器的另一端,我们实现了两个推理服务功能:Google Vision 和 ResNet。
推理服务功能
Google Vision 服务功能
此服务功能运行一个 HTTP 服务,该服务接受 RGW PubSub 事件源发布的事件,通过 Amazon S3 API 从 RGW 下载图像,并将图像发布到 Google Vision 服务以获取注释。
要运行此功能,请首先克隆存储库并编辑 service-entry.yaml 和 subscription.yaml 以反映您的本地 RGW 设置和您的 Google Vision API 密钥。
然后运行以下命令
kubectl apply -f deploy/google-vision-svc/service-entry.yaml
kubectl apply -f deploy/google-vision-svc/subscription.yaml
服务功能运行后,通过将猫的图像上传到 RGW 来测试它
# wget https://r.hswstatic.com/w_907/gif/tesla-cat.jpg
# ./s3 put buck/cat1.jpg --in-file=./tesla-cat.jpg
# ./s3 put buck/cat2.jpg --in-file=./tesla-cat.jpg
检查服务容器的日志
# kubectl logs -lserving.knative.dev/service=rgwpubsub-svc -c user-container
2018/11/29 16:22:49 Ready and listening on port 8080
2018/11/29 16:23:42 [2018-11-29T16:23:41Z] application/json rgwpubsub. Object: "cat1.jpg" Bucket: "buck"
2018/11/29 16:23:43 label: cat, Score: 0.993347
2018/11/29 16:25:01 [2018-11-29T16:25:01Z] application/json rgwpubsub. Object: "cat2.jpg" Bucket: "buck"
2018/11/29 16:25:02 label: cat, Score: 0.993347
猫被识别出来了!
ResNet 服务功能
此服务功能使用 ResNet 和预训练的 ImageNet 模型对图像进行分类。
首先,编辑 service-entry.yaml 和 subscription-resnet.yaml 以反映您的本地 RGW 设置和 Tensorflow 服务端点。
接下来,运行以下命令
kubectl apply -f deploy/resnet-grpc/service-entry.yaml
kubectl apply -f deploy/resnet-grpc/subscription-grpc.yaml
然后将猫和狗的图像上传到 RGW
# wget https://r.hswstatic.com/w_907/gif/tesla-cat.jpg
# wget https://upload.wikimedia.org/wikipedia/commons/d/d9/Collage_of_Nine_Dogs.jpg
#./s3 put buck/dogs.jpg --in-file=./Collage_of_Nine_Dogs.jpg
#./s3 put buck/telsa-cat.jpg --in-file=./tesla-cat.jpg
检查服务容器的日志
# kubectl logs -lserving.knative.dev/service=rgwpubsub-svc -c user-container
2018/11/29 18:52:23 Ready and listening on port 8080
2018/11/29 18:54:31 [2018-11-29T18:54:31Z] application/json rgwpubsub. Object: "dogs.jpg" Bucket: "buck"
2018/11/29 18:54:32 classes: [162]
2018/11/29 18:57:54 [2018-11-29T18:57:51Z] application/json rgwpubsub. Object: "telsa-cat.jpg" Bucket: "buck"
2018/11/29 18:57:54 classes: [286]
关于 ImageNet 类,类 162 是比格犬 (beagle),类 286 是美洲狮 (cougar, puma, catamount, mountain lion, painter, panther, Felis concolor)。分类器已经足够接近了。
展望未来
我们期待更多社区参与到 Ceph RGW PubSub 和 Knative 中来。欢迎贡献、测试和错误报告。
陈华敏和 Yehuda Sadeh-Weinraub 将于 12 月 10 日至 13 日在西雅图举行的 KubeCon + CloudNativeCon 北美会议上介绍“如何通过 Knative 无服务器框架构建深度学习推理”。
评论已关闭。