如何在火山引擎云上部署 Stable Diffusion

容器服务GPU

随着算法的发展,AIGC 已经展现出其在艺术创意领域的巨大潜力。以近几个月风靡全球的 Stable Diffusion 为例,这是一种基于潜在扩散模型(Latent Diffusion Models)的 text-to-image 模型,能够根据用户输入的任意文本生成相应的高质量图像,受到广大艺术从业者和开发者的关注。

picture.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 组件。

picture.image

picture.image

picture.image 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/
  1. 在自己的命令行上,输入“huggingface-cli login”,出现 successful 即已经成功:

picture.image

  1. 使用 snapshot_download 方法进行下载:
>>> from huggingface_hub import snapshot_download
>>> snapshot_download(repo_id="CompVis/stable-diffusion-v1-4",local_dir="/root/")
  1. 下载完成后,使用 rclone 工具将文件上传至 TOS,rclone 配置可参考:volcengine.com/docs/6349/81434
rclone copy diffusers/ ${rclone_config_name}:${bucketname}/diffusers --copy-links#需要加上--copy-links参数,保证能通过软链接上传原始文件

picture.image

部署 Stable Diffusion

准备好对应的容器镜像,push 到容器镜像仓库中供使用。本文使用 cr-demo-cn-beijing.cr.volces.com/diffusers/stable-diffusion:taiyi-0.1 镜像,该镜像可以在火山引擎北京 region 的 VPC 环境下直接拉取到。

登录容器服务 VKE 控制台,使用 TOS 创建 PV、PVC:

picture.image

picture.image 创建工作负载和服务部署应用时,由于 AI 镜像都比较大,我们可以选择火山引擎镜像仓库 CR 提供 P2P 加速、按需加载、镜像缓存等能力。我们将在后续系列文章,详细介绍这块的能力。

火山引擎镜像仓库 CR 支持基于 P2P 方式的大规模集群拉取:P2P 加速功能利用计算节点的带宽资源,可以进行节点之间镜像分发,减少对容器镜像存储的压力,从而大幅提升镜像拉取速度,减少应用部署时间。通过和开源社区合作,在大规模节点拉镜像的场景下,当前容器镜像拉取用时已节省超过 90% ,极大提升了产品性能和客户服务能力。

picture.image

picture.image 容器内挂载路径:/stable-diffusion-webui/models/Taiyi-Stable-Diffusion-1B-Chinese-v0.1

容器监听端口:7860

picture.image

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 后,单实例最高可承载百万级并发请求。

  1. 创建 ALB 类型的 Ingress 用于暴露服务。

picture.image

picture.image

  1. 通过创建好的 ALB 类型的 Ingress 的 VIP 访问 Stable Diffusion WebUI 服务。

picture.image

选择二:使用 API 网关

火山引擎 API 网关 APIG 是基于云原生的、高扩展、高可用的云上网关托管服务。在传统流量网关的基础上,APIG 集成丰富的服务发现和服务治理能力,打通微服务架构的内外部网络,可以帮助用户快速实现各服务之间、服务与客户端之间的安全通信。如果有认证鉴权、认证、流量控制等需求,用户也可以通过 APIG 来暴露容器服务。

登录 APIG 控制台创建实例,创建好我们的 Upstream 来源,选择对应的 VKE 集群。需要注意的是,创建网关实例时,需要选择跟 VKE 集群相同的 VPC,然后创建对应的 API 网关服务,配置协议、认证信息后,创建对应的路由信息完成创建,创建完成后会自动生成 API 网关域名用于访问,同时我们也可以使用我们自己的域名进行 CNAME 解析。

picture.image

picture.image

完成以上操作后,您就已经成功在火山引擎容器服务上部署 Stable Diffusion 了。您可以在 WebUI 页面进行模型推理验证。

picture.image

大模型工程化部署

相比 Stable Diffusion 的部署,真正的企业级大模型部署还要考虑训练和推理加速、资源利用率提升、控制应用成本等工程化问题。火山引擎结合字节跳动大规模 AI 场景实践经验,也为用户提供了真正的系统工程能力。

使用 mGPU 提升 GPU 资源利用率

当前,如何进一步提高 GPU 的利用率,将多个容器运行在单张 GPU 卡上,仍是业界在持续探索的难题。

picture.image

火山引擎的 mGPU(multi-container GPU)容器共享解决方案是针对该问题提出的解决方案,它支持单个容器申领 1% 精度的百分比算力和 1 MiB 级显存调度,兼容整卡调度场景,满足同时使用 GPU 容器共享和整卡 GPU 的业务场景。经落地验证,mGPU 可以帮助用户提升超过 50%  的资源利用率。

现在 mGPU 可以在火山引擎公有云 GPU 服务器和容器服务中免费使用。

  1. 通过 VKE 控制台安装 mGPU 组件。

picture.image

  1. 开启集群的 Prometheus 监控,这样可以方便我们对相关 GPU 指标进行观测,了解集群的工作负载情况。

picture.image

  1. 我们可以通过给 GPU 节点增加 label 的方式启用 mGPU 能力。为了方便操作,我们可以通过节点池管理,在节点池中配置对应的label。

picture.image

通过该节点池扩容的节点都会打上对应的 label。如果是提前创建好的节点,我们也可以直接编辑节点打 label。

picture.image

这样我们就可以根据业务需求设置 GPU 算力,可以设置 GPU 算力小于 1 卡,进而充分利用 GPU 资源、控制成本。

picture.image

picture.image

  1. 查看 Pod GPU 监控情况。

picture.image

使用 Serverless GPU 部署 Stable Diffusion

除了 GPU 资源使用,提升模型服务弹性伸缩能力也是企业关注的一个重点,这可以在降低运行成本的同时,也提升了服务的可用性。

火山引擎弹性容器实例 VCI 是一种 Serverless 和容器化的计算服务,可无缝集成容器服务 VKE,提供 Kubernetes 编排能力。通过使用 VCI,用户可以专注于构建应用本身,无需购买和管理底层云服务器等基础设施,并仅为容器实际运行消耗的资源付费。VCI 还支持秒级启动、高并发创建、沙箱容器安全隔离等能力。

  1. 打开火山引擎控制台,数据、镜像准备同 VKE 部署方式一致,唯一区别在于部署业务时选择基于 VCI 部署,同时指定 GPU 规格。

picture.image

  1. 我们可以通过注解指定 GPU 规格,本文使用 vci.vke.volcengine.com/preferred-instance-types: vci.ini2.26c-243gi NVIDIA A30 卡。

picture.image

  1. 服务暴露方式也跟基于 VKE 部署一致。

picture.image

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 大模型生成文本、图像、音频、视频等多模态内容的能力构建应用,进而提供切实解决问题的服务与方案。以下是几个典型场景:

picture.image

作为拥有丰富云原生机器学习平台搭建经验的企业,火山引擎希望通过自身的技术实践和解决方案,帮助企业不断降低 AI 技术开发和应用的门槛。火山引擎云原生团队也在不断迭代和创新解决方案,提供更高稳定性和更弹性的云原生 AI 基建,面向客户创造出更多价值!

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论