EC2 P2 实例:将数据保存在 GPU 内存中以进行实时处理?

EC2 P2 instance : keep data in GPU memory for realtime processing?

我有一个 GPU 应用程序(C++ 网络服务)。在 Web 服务初始化期间,我从 S3 加载了大约 20,000 张图像,执行了一些图像处理任务并将结果存储在 GPU 内存中。(~$4Gb 数据)。

然后 Web 服务保持 运行 在 EC2 上等待用户请求。

下一个用户请求使用此数据执行一些 "near-realtime" 任务(使用 CUDA)并将结果 return 返回给用户。

我的问题是,我可以在 GPU 内存中保留这么多数据吗? GPU内存(或EC2实例)是否有可能获得restarted/refresh?

更新 我将使用 P2 实例(~2000 个 CUDA 内核)运行 Ubuntu 18. GPU 总内存为 16G,因此它有足够的可用内存。我使用具有 340 个 CUDA 内核和 4GB 内存的旧 GTX 卡在我的桌面上测试了我的代码,我在大约 4 秒内得到了结果。我假设 P2 实例结果将接近实时(~1 秒)。我的要求之一是,此 Web 服务每分钟将被调用约 30 次。希望这不会对 GPU 造成高负载。

罗伯特的评论很到位。您可以(并且应该)在某些初始化函数期间将 4GB 数据存储在 GPU 中。 When/where 调用该函数取决于您的 Web 服务的体系结构及其持久性。我不熟悉 AWS,但我猜想如果实例关闭或重新启动,您的 C++ 应用程序将不再 运行,这意味着任何指向设备内存的指针都将消失。也就是说,我猜重启不是很常见的事件,所以当实例(和你的应用程序)启动时,你应该只加载一次 GPU 内存就可以了。

您没有提到您使用的是众多 CUDA 内存 API 中的哪一个,但我建议您手动 cudaMemcpy() 将数据移动到设备上的已知位置。然后,每次必须进行计算时,您都应该有一个指向数据的可重用设备指针。

我假设这是一个 Linux 实例。

你的要求不难实现。今天 4 GB 的内存对于企业 class 系统来说已经很小了。

1) 关闭交换。

2) 分配 4 GB 后,请确保您有额外的可用内存。

3) 将您的应用程序设计为使用共享内存并锁定页面,这将保证您的对象保留在内存中。

4) 设计您的应用程序以处理系统重启。很少,但确实会发生,AWS 将在集群上进行维护并且您的实例将被移动/重新启动。

Is it possible that GPU memory (or EC2 instance) get restarted/refresh?

,因为 AWS 不断升级实例和服务器以保持最新状态并帮助确保安全,您可以打赌您的实例将重新启动。这些不是每天,但说它们是 "not common" 是不正确的。预计一年一次或两次的频率。

您可以通过在维护模式下为您的 Web 服务设计以在重新启动期间响应 "Temporarily Down for Maintenance" 或类似内容来防止这种情况。如果您想将影响降至最低,您甚至可以主动执行实例重启。

您可以从 EC2 Maintenance Page

获取实例和服务器重启的完整详细信息

最终,如果您继续使用 AWS,您将希望重新设计您的应用程序以利用 S3 和 EC2 以外的更多优势。有一些 AWS 功能可以确保计划内(或计划外)维护期间的高可用性。这些都是为了消除您的努力中的风险并最大限度地延长您的在线正常运行时间。将它们全部列在一个答案中是不可能的。这是一个很长的列表,而且还在不断增加。

给你一个想法:看看一些 example reference architectures at the bottom of this page to give you an idea of what is possible and recommended. Also some of the AWS White Papers or blog posts 可以帮助指导你改进你的托管网络应用程序。

不要期望只将您的服务迁移到 AWS 而不对其进行更改。为了最大化 AWS(或任何云提供商)的价值并降低风险,您需要了解所提供的服务并重新设计您的服务以充分利用这些服务。他们每年都在变化。