随着算法的发展,AIGC 已经展现出其在艺术创意领域的巨大潜力。以近几个月风靡全球的 Stable Diffusion 为例,这是一种基于潜在扩散模型(Latent Diffusion Models)的 text-to-image 模型,能够根据用户输入的任意文本生成相应的高质量图像,受到广大艺术从业者和开发者的关注。
作为字节跳动旗下的云服务平台,火山引擎提炼了字节跳动多年云原生机器学习、大模型推理框架、训练/推理软硬件方案等技术实践,推出了一系列高性价的 AI 基础设施。
为了让对 AIGC 感兴趣的开发者感受 AI 的魅力,本文将以 Stable Diffusion 模型为例,结合大模型企业常规工程化技术实践,演示如何在火山引擎云上部署用户自己的 Stable Diffusion 服务。
Stable Diffusion 环境依赖
如果想把 Stable Diffusion 部署在云端,用户一般需要用到以下产品及服务:
- 容器服务 VKE(Kubernetes v1.24)
- 镜像仓库 CR
- 弹性容器 VCI
- 对象存储 TOS
- GPU 服务器 ecs.gni2.3xlarge NVIDIA A10
- 应用负载均衡 ALB
- API 网关 APIG
- GPU 共享技术 mGPU
- Stable Diffusion:huggingface.co/CompVis/stable-diffusion-v1-4
- Stable Diffusion WebUI:github.com/AUTOMATIC1111/stable-diffusion-webui
步骤一:准备 VKE 集群环境
火山引擎容器服务 VKE 通过深度融合新一代云原生技术,提供以容器为核心的高性能 Kubernetes 容器集群管理服务,可以被用户用于快速构建容器化的应用。
1. 登录火山引擎控制台,创建 VKE 集群,集群版本选择 1.24,容器网络模型选择 VPC-CNI,选择立刻创建节点,节点规格选择 GPU 计算型,ecs.gni2.3xlarge NVIDIA A10,组件勾选安装 nvidia-device-plugin 组件。
2. 开通 TOS 并创建桶,将 CompVis/stable-diffusion-v1-4 相关文件(包括模型)上传到 TOS。
stable-diffusion-v1-4 下载可以参考 Huggingface(需要注册账号获取 token)提供到下载接口进行下载:huggingface.co/docs/huggingface_hub/v0.14.1/guides/download
pip install --upgrade diffusers
pip install transformers
#安装pytorch,根据官网选择对应环境的命令进行安装。https://pytorch.org/get-started/locally/
- 在自己的命令行上,输入“huggingface-cli login”,出现 successful 即已经成功:
- 使用 snapshot_download 方法进行下载:
>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="CompVis/stable-diffusion-v1-4",local_dir="/root/")
- 下载完成后,使用 rclone 工具将文件上传至 TOS,rclone 配置可参考:volcengine.com/docs/6349/81434
rclone copy diffusers/ ${rclone_config_name}:${bucketname}/diffusers --copy-links#需要加上--copy-links参数,保证能通过软链接上传原始文件
部署 Stable Diffusion
准备好对应的容器镜像,push 到容器镜像仓库中供使用。本文使用 cr-demo-cn-beijing.cr.volces.com/diffusers/stable-diffusion:taiyi-0.1 镜像,该镜像可以在火山引擎北京 region 的 VPC 环境下直接拉取到。
登录容器服务 VKE 控制台,使用 TOS 创建 PV、PVC:
创建工作负载和服务部署应用时,由于 AI 镜像都比较大,我们可以选择火山引擎镜像仓库 CR 提供 P2P 加速、按需加载、镜像缓存等能力。我们将在后续系列文章,详细介绍这块的能力。
火山引擎镜像仓库 CR 支持基于 P2P 方式的大规模集群拉取:P2P 加速功能利用计算节点的带宽资源,可以进行节点之间镜像分发,减少对容器镜像存储的压力,从而大幅提升镜像拉取速度,减少应用部署时间。通过和开源社区合作,在大规模节点拉镜像的场景下,当前容器镜像拉取用时已节省超过 90% ,极大提升了产品性能和客户服务能力。
容器内挂载路径:/stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1
容器监听端口:7860
Deployment yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sd-a10
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 0
revisionHistoryLimit: 10
selector:
matchLabels:
app: sd-a10
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: sd-a10
spec:
containers:
- image: cr-demo-cn-beijing.cr.volces.com/${namespace}/stable-diffusion:taiyi-0.1
# 需要替换为实际的镜像地址
imagePullPolicy: IfNotPresent
name: sd
resources:
limits:
vke.volcengine.com/mgpu-core: "30"
vke.volcengine.com/mgpu-memory: "10240"
requests:
vke.volcengine.com/mgpu-core: "30"
vke.volcengine.com/mgpu-memory: "10240"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1
name: data
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: data
persistentVolumeClaim:
claimName: sd-tos-pvc
步骤三:暴露推理服务
选择一:使用负载均衡 ALB
火山引擎应用型负载均衡 ALB 面向七层(HTTP、HTTPS、HTTP/2、WebSocket、QUIC等协议)网站、音视频等应用的大流量高并发场景,基于内容进行精细化、均衡的流量调度,消除单点故障影响,可提升应用系统整体的稳定性、可靠性与服务能力。经过用户实测,使用 ALB 后,单实例最高可承载百万级并发请求。
- 创建 ALB 类型的 Ingress 用于暴露服务。
- 通过创建好的 ALB 类型的 Ingress 的 VIP 访问 Stable Diffusion WebUI 服务。
选择二:使用 API 网关
火山引擎 API 网关 APIG 是基于云原生的、高扩展、高可用的云上网关托管服务。在传统流量网关的基础上,APIG 集成丰富的服务发现和服务治理能力,打通微服务架构的内外部网络,可以帮助用户快速实现各服务之间、服务与客户端之间的安全通信。如果有认证鉴权、认证、流量控制等需求,用户也可以通过 APIG 来暴露容器服务。
登录 APIG 控制台创建实例,创建好我们的 Upstream 来源,选择对应的 VKE 集群。需要注意的是,创建网关实例时,需要选择跟 VKE 集群相同的 VPC,然后创建对应的 API 网关服务,配置协议、认证信息后,创建对应的路由信息完成创建,创建完成后会自动生成 API 网关域名用于访问,同时我们也可以使用我们自己的域名进行 CNAME 解析。
完成以上操作后,您就已经成功在火山引擎容器服务上部署 Stable Diffusion 了。您可以在 WebUI 页面进行模型推理验证。
大模型工程化部署
相比 Stable Diffusion 的部署,真正的企业级大模型部署还要考虑训练和推理加速、资源利用率提升、控制应用成本等工程化问题。火山引擎结合字节跳动大规模 AI 场景实践经验,也为用户提供了真正的系统工程能力。
使用 mGPU 提升 GPU 资源利用率
当前,如何进一步提高 GPU 的利用率,将多个容器运行在单张 GPU 卡上,仍是业界在持续探索的难题。
火山引擎的 mGPU(multi-container GPU)容器共享解决方案是针对该问题提出的解决方案,它支持单个容器申领 1% 精度的百分比算力和 1 MiB 级显存调度,兼容整卡调度场景,满足同时使用 GPU 容器共享和整卡 GPU 的业务场景。经落地验证,mGPU 可以帮助用户提升超过 50% 的资源利用率。
现在 mGPU 可以在火山引擎公有云 GPU 服务器和容器服务中免费使用。
- 通过 VKE 控制台安装 mGPU 组件。
- 开启集群的 Prometheus 监控,这样可以方便我们对相关 GPU 指标进行观测,了解集群的工作负载情况。
- 我们可以通过给 GPU 节点增加 label 的方式启用 mGPU 能力。为了方便操作,我们可以通过节点池管理,在节点池中配置对应的label。
通过该节点池扩容的节点都会打上对应的 label。如果是提前创建好的节点,我们也可以直接编辑节点打 label。
这样我们就可以根据业务需求设置 GPU 算力,可以设置 GPU 算力小于 1 卡,进而充分利用 GPU 资源、控制成本。
- 查看 Pod GPU 监控情况。
使用 Serverless GPU 部署 Stable Diffusion
除了 GPU 资源使用,提升模型服务弹性伸缩能力也是企业关注的一个重点,这可以在降低运行成本的同时,也提升了服务的可用性。
火山引擎弹性容器实例 VCI 是一种 Serverless 和容器化的计算服务,可无缝集成容器服务 VKE,提供 Kubernetes 编排能力。通过使用 VCI,用户可以专注于构建应用本身,无需购买和管理底层云服务器等基础设施,并仅为容器实际运行消耗的资源付费。VCI 还支持秒级启动、高并发创建、沙箱容器安全隔离等能力。
- 打开火山引擎控制台,数据、镜像准备同 VKE 部署方式一致,唯一区别在于部署业务时选择基于 VCI 部署,同时指定 GPU 规格。
- 我们可以通过注解指定 GPU 规格,本文使用 vci.vke.volcengine.com/preferred-instance-types: vci.ini2.26c-243gi NVIDIA A30 卡。
- 服务暴露方式也跟基于 VKE 部署一致。
Deployment yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: sd-vci
namespace: default
spec:
progressDeadlineSeconds: 600
replicas: 0
revisionHistoryLimit: 10
selector:
matchLabels:
app: sd-vci
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
annotations:
vci.vke.volcengine.com/preferred-instance-types: vci.ini2.26c-243gi
# 指定使用到GPU规格
vci.volcengine.com/tls-enable: "false"
vke.volcengine.com/burst-to-vci: enforce
# 调度到VCI实例上
creationTimestamp: null
labels:
app: sd-vci
spec:
containers:
- image: cr-demo-cn-beijing.cr.volces.com/${namespace}/stable-diffusion:taiyi-0.1
# 需要替换为实际的镜像地址
imagePullPolicy: IfNotPresent
name: sd-vci
resources:
limits:
nvidia.com/gpu: "1"
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1
name: sd
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
volumes:
- name: sd
persistentVolumeClaim:
claimName: sd-tos-pvc
结语
当前,AIGC 的竞争主要围绕应用层,即通过理解用户和企业的需求,利用 AI 大模型生成文本、图像、音频、视频等多模态内容的能力构建应用,进而提供切实解决问题的服务与方案。以下是几个典型场景:
作为拥有丰富云原生机器学习平台搭建经验的企业,火山引擎希望通过自身的技术实践和解决方案,帮助企业不断降低 AI 技术开发和应用的门槛。火山引擎云原生团队也在不断迭代和创新解决方案,提供更高稳定性和更弹性的云原生 AI 基建,面向客户创造出更多价值!