亚马逊云科技面向游戏运营活动的AI生图解决方案
随着Stable Diffusion等AI生图方案逐步普及,越来越多的场景被开发和落地。其中面向游戏C端玩家的AI生图营销活动场景正在被逐步验证:在某个游戏社区中,玩家一键从手机上传一张照片,AI会将自动识别该照片中的元素并替换成游戏中相应的角色或物品,替换后的照片可以进一步被玩家传播,进而扩大活动影响力。这样的活动已经被应用于游戏新版本发布、展会等场景,能有效提升玩家与游戏之间的粘性,让玩家成为游戏的推广大使,为游戏拉新。
本文将探讨如何高效地搭建方案架构——游戏AI生图活动,以下为要点:
-
包含了游戏风格与素材的AI模型,并调试出相应的推理算法。
-
有效触达游戏玩家的客户端,可以是游戏客户端本身,也可以是社交媒体,比如常见的游戏玩家聚集地,海外有Discord,国内有Fanbook、微信等。
-
一套能快速伸缩承载高并发出图请求的后端架构:本方案选用EKS,搭载了EFS、Bottlerocket、GPU时间分片虚拟化和Karpenter等组件作为演示的后端架构。
方案架构

方案上大致可以划分两大部份:
客户端和请求接入层:
首先我们选择Discord作为我们的客户端。Discord是一款集语音、视频以及文字聊天于一体的服务软件。最早服务于电子游戏社区,但现在也用于AI、Web 3.0、艺术、音乐等领域。用户可以在Discord上创建和加入各种类型的服务器,与其他用户进行实时的聊天和交流。Discord服务器是Discord的核心功能,每个服务器里还能有自己的频道,用户可以在频道内与其他用户进行实时的文字、语音和视频聊天。在我们的场景里面,游戏玩家正是通过这些频道发起生图请求,并通过Discord服务器传递到接入层中。
接入层实现了一个Discord bot,该bot包含两部分功能:1,更新command,command是用于引导游戏玩家便捷输入照片和提示词,并获得相应的输出照片。2,对来自游戏玩家的请求做筛选过滤和初步处理,在3秒钟之内(Discord协议规定)做出初步响应,同时把符合条件需要生图的请求转发给SQS。
接入层的Discord bot的实现参考了Amazon Blog:An elastic deployment of Stable Diffusion with Discord on AWS,采用的是API Gateway+Lambda的Serverless架构,该架构提供了事件驱动型计算服务,使用者无需预置服务器便可快速构建自动扩展的程序。Discord bot是SQS消息队列的生产端,通过SQS来实现与后端AI推理层的解耦。
后端AI推理集群:
SQS的消费端是基于EKS构建起来后端AI推理集群。
首先,是一个controller模块,它会从SQS消费来自游戏玩家的消息以及相应的消息回调接口,之后按频道把消息分发到不同的Stable Diffusion(SD)生图服务中,等待生图完成后,会再把生成的图片等结果发送到指定的消息回调接口,至此,一条游戏玩家生图请求就算最终完成了。
其次,是sd-svc服务,每一个服务托管了一种我们预设好的Stable Diffusion模型和算法组合,在本文后续部份,我们将会用AUTOMATIC1111/stable-diffusion-webui来托管我们的模型和算法。AUTOMATIC1111/stable-diffusion-webui是一款当前流行的基于Stable Diffusion打造的工具应用,通过它可以方便进行文生图和图生图,并集成各种社区的插件,比如LoRA和ControlNet等。它自带Web界面,也同时支持Web API访问,本文中将使用Web API来访问。
在模型选择上,我们将选择一个已经事先训练好的包含魔兽世界游戏素材的模型rpg_V4.safetensors,以及一个ControlNet Canny模型control_v11p_sd15_canny做为演示。在实际项目中,您还可以根据实际的游戏,利用该游戏素材,训练出具备该游戏特色的模型(关于Stable Diffusion模型训练,不是本文重点,如果感兴趣,可以参考如Hugging Face的训练一个diffusion模型文档)。
在面向C端游戏玩家的场景,如何在满足高并发的服务的同时,也兼顾成本效益,这是绕不开的话题,为此我们做了以下优化:
-
bottlerocket-images-cache+高性能EBS:实现快速集群扩容。一般的扩容过程是:请求新增Node→启动并初始化Node→启动Pod→拉取Container镜像→启动进程初始化→开始提供服务,由于Stable Diffusion用到的pytorch框架以及相应依赖的工具包还有模型十分巨大,一个包含这些完整工具链+模型的镜像往往会达到10G以上,再加上Stable Diffusion webUI本身在第一次启动还有初始化过程,会导致集群扩容过程缓慢,一次扩容往往会达到10分钟以上。这样的扩容速度在面向C端场景里面,会显得比较滞后。我们的做法是:提前预设好优化过的容器镜像,并通过bottlerocket-image-cache把镜像制作成snapshot,做为volumn 被Node在启动时挂载,同时适当提升该volumn的IO吞吐,从而节省了大量的启动和初始化时间。在我们的实验环境里,总共13GB(运行环境78G+2G的Checkpoint模型文件+1.3G的ControlNet模型文件)的镜像在优化之后,搭配IO吞吐为500MB的GP3 EBS,从请求Node到可以开始提供服务(已加载ckpt模型)一共花了1:40分钟。
-
EFS:实现模型文件一份存储和被动态加载。所有pod都可以通过挂载同一个EFS文件系统,实现动态加载模型的效果,运维人员只需要维护一份模型文件即可。同时EFS优秀的IO吞吐(Gbit/s级别)也保障模型加载的速度。
-
GPU分片:提升GPU使用率,降低成本。如果您选用的GPU卡性能很强劲,而且AI推理的任务比较简单,无法占满该GPU卡,那么可以考虑让多个推理任务同时复用一张GPU卡来提升GPU卡的使用率。利用NVIDIA/k8s-device-plugin的时间分片能力可以很方便的管理GPU的算力。在我们的实验环境中,我们把一张型号为A10g的显卡切分为3个分片,每个分片各跑一个pod,在推理任务接连不断满负荷的情况下,GPU的利用率可以提升9%(相同工作量的任务,总完成时间减少11.9%)。
-
Karpenter+Spot:更高的集群利用率加上更好的成本方案,进一步优化成本。
总结
在游戏领域,AI生图营销活动正迅速兴起。本文以方案架构为基础,探讨了面向玩家的AI生图活动的工程化解决方案。通过在Discord等平台引入AIGC生图服务,玩家能够将照片转化为游戏元素,增强了互动与推广效果。这些创新措施共同提升了活动的性能与可扩展性,为玩家创造了流畅而个性化的体验,同时降低了运营成本。
相关文章:
亚马逊云科技面向游戏运营活动的AI生图解决方案
随着Stable Diffusion等AI生图方案逐步普及,越来越多的场景被开发和落地。其中面向游戏C端玩家的AI生图营销活动场景正在被逐步验证:在某个游戏社区中,玩家一键从手机上传一张照片,AI会将自动识别该照片中的元素并替换成游戏中相应…...
腾讯mini项目-【指标监控服务重构】2023-07-30
今日已办 调研 CPU & Memory Cadivisor Cadivisor -> Prometheus -> (Grafana / SigNoz Web) google/cadvisor: Analyzes resource usage and performance characteristics of running containers. (github.com) services:cadvisor:image: gcr.io/ca…...
Windows 下 MySQL 8.1 图形化界面安装、配置详解
首先我们下载安装包 官方下载链接: MySQL :: Begin Your Download 网盘链接: https://pan.baidu.com/s/1FOew6-93XpknB-bYDhDYPw 提取码: brys 外网下载慢的同学可以使用上述网盘链接 下载完成后我们双击安装包即可进入安装界面 点击next 勾选同意协议&#…...
WebRTC 源码 编译 iOS端
1. 获取依赖工具 首先,确保你已经安装了以下工具: GitDepot ToolsXcode(确保已安装命令行工具) 2. 下载 depot_tools 使用 git 克隆 depot_tools 并将其添加到你的 PATH 中: /path/to/depot_tools 替换为自己的路径…...
Python编程指南:利用HTTP和HTTPS适配器实现智能路由
嗨,爬虫大佬们!今天我要为大家分享一篇关于如何利用HTTP和HTTPS适配器来实现智能路由的Python编程指南。在现代互联网应用中,路由功能起着至关重要的作用,而利用Python编程语言实现智能路由则可以为我们的应用带来更高的灵活性和性…...
MySQL 权限分配
有时候,您需要查看某个用户被授予的权限以便复核。 MySQL 允许您使用 SHOW GRANTS 语句来显示分配给用户帐户或角色的权限。 MySQL SHOW GRANTS 语句介绍 以下是 SHOW GRANTS 语句的基本语法: SHOW GRANTS [FOR {user | role} [USING role [, role] .…...
基于PHP的医药博客管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的医药博客管理系统 一 介绍 此医药博客系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。用户可注册登录,查看/评论/搜索博客,建议留言。管理员可对用户&a…...
spark SQLQueryTestSuite sql 自动化测试用例
把SQL 添加到自动化测试用例。 ./sql/core/src/test/resources/sql-tests/inputs 目录存放原始的SQL. ./sql/core/src/test/resources/sql-tests/results存放SQL的执行结果。在执行测试时,根据最新生成的结果和 ./sql/core/src/test/resources/sql-tests/results 进…...
Taro小程序隐私协议开发指南填坑
一. 配置文件app.config.js export default {...__usePrivacyCheck__: true,... }二. 开发者工具基础库修改 原因:从基础库 2.32.3 开始支持 修改路径:详情->本地设置->调试基础库 三. 用户隐私保护指引更新 修改路径:mp后台->设…...
iOS App上传到苹果应用市场构建版本的图文教程
使用hbuilderx的h5或uniapp框架写的前端,进行云打包ios应用,会生成一个ipa后缀的应用文件。这个文件是没有办法像安卓应用那样直接安装在手机上面的。需要上架到苹果应用商店,用户才能下载安装使用。 因此,我们这篇文章讲详细介绍…...
paddle框架的使用
Paddle是由百度开发的深度学习框架,支持声明式和命令式编程风格。它还支持深度神经网络的超大规模训练和神经架构的自动设计。您可以使用 Paddle 构建用于训练的神经网络模型,具体步骤如下: 导入桨模块和其他必要的模块,如numpy&…...
Spring Boot + Vue的网上商城之基于element ui后台管理系统搭建
Spring Boot Vue的网上商城之基于element ui后台管理系统搭建 在本篇博客中,我们将使用Spring Boot和Vue来构建一个基于element ui的后台管理系统。我们将详细介绍每个步骤,并提供完整的代码示例,包括配置文件和组件。此外,我们…...
Linux基础入门
一、操作系统安装方法 1、使用u盘安装 工具(前提条件): <1>u盘 <2>镜像文件iso/msdn.itellyou.cn <3>把u盘做成PE:大白菜/老毛桃/winPE/软碟通/ultralSO 设置BIOS:通过u盘启动 安装系统&…...
Unity工具——LightTransition(光照过渡)
需求描述 在游戏中,开发者为了让玩家更直接地看到待拾取的物品从而为其添加一种闪烁效果,或者模拟现实中闪烁的灯光效果,我能够想到的一种方案则是通过控制光照强度来实现,那么本篇文章我们就尝试通过这个方案来实现一下ÿ…...
【深度学习】 Python 和 NumPy 系列教程(十四):Matplotlib详解:1、2d绘图(下):箱线图、热力图、面积图、等高线图、极坐标图
目录 一、前言 二、实验环境 三、Matplotlib详解 1、2d绘图类型 0. 设置中文字体 1-5. 折线图、散点图、柱状图、直方图、饼图 6. 箱线图(Box Plot) 7. 热力图(Heatmap) 8. 面积图(Area Plot) 9. 等…...
IMU+摄像头实现无标记运动捕捉
惯性传感和计算机视觉的进步为在临床和自然环境中获得精准数据带来了新可能。然而在临床应用时需要仔细地将传感器与身体对齐,这减慢了数据收集过程。 随着无标记运动捕捉的发展,研究者们提出了一个新的深度学习模型,利用来自视觉、惯性传感…...
前后端分离,JSON数据如何交互
如何接收: 在配置文件商法加上相应注解 EnableWebMvc 在接收的路径上加上RequestBody注解 注解的作用:在Spring框架中,RequestBody注解用于将HTTP请求的body中的内容转换为Java对象,并将其作为参数传递给控制器方法。它通常用…...
docker中已创建容器的修改方法
环境信息以CentOS8为例 停止容器 #docker stop 容器名或id docker stop mysql停止docker服务 systemctl stop docker修改docker配置文件 配置文件在: /var/lib/docker/containers/{容器id} 如:/var/lib/docker/containers/92acfba87567bcca981ad17c0e…...
uniapp中video播放视频上按钮没显示的问题
video标签层级很高,尝试了添加z-index,但无效果 通过查阅资料,得知cover-view层级比video层级高 效果图 需求是为了使直播时,可选是原画/流畅 解决方案 首先,在pages.json中配置右上角的图标 {"path" : …...
docker学习:dockerfile和docker-compose
学习如何使用dockerfile 以下内容,部分来自gpt生成,里面的描述可能会出现问题,但代码部分,我都会进行测试。 1. 需求 对于一个docker,例如python,我们需要其在构建成容器时,就有np。有以下两种方…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
