Todos os produtos
Search
Central de documentação

Container Service for Kubernetes:Acelere a inferência de texto para imagem do Stable Diffusion XL Turbo com CPU

Última atualização: Jun 27, 2026

Use nós de trabalho ECS g8i em um cluster ACK com IPEX para inferências de texto para imagem com excelente custo-benefício. Opcionalmente, migre para um pool de nós de VM confidencial TDX para garantir a confidencialidade dos dados.

Este tópico usa o modelo stabilityai/sdxl-turbo como exemplo.

Importante
  • A Alibaba Cloud não garante a legitimidade, segurança ou precisão dos modelos de terceiros "Stable Diffusion" e "stabilityai/sdxl-turbo". A Alibaba Cloud não se responsabiliza por quaisquer perdas ou danos decorrentes do uso desses modelos.

  • Respeite os acordos de usuário, as especificações de uso e as leis e regulamentações relevantes dos modelos de terceiros. O uso desses modelos é de sua inteira responsabilidade.

  • O serviço de exemplo destina-se apenas a aprendizado, testes e prova de conceito (POC). As estatísticas servem apenas como referência. Os resultados reais podem variar conforme o ambiente.

Quando usar inferência via CPU

A combinação g8i + IPEX + Advanced Matrix Extensions (AMX) é uma alternativa prática à inferência via GPU quando:

  • O custo é prioritário: A troca de ecs.gn7i-c8g1.2xlarge (GPU) para ecs.g8i.4xlarge reduz o custo da instância em mais de 53%.

  • Os requisitos de throughput são moderados: Com step=4 e batch=16, a instância ecs.g8i.8xlarge gera 1,2 imagens/s — acima do limiar de 1 imagem/s exigido por muitas cargas de trabalho em produção.

  • A confidencialidade dos dados é obrigatória: Migre para um pool de nós de VM confidencial TDX sem alterar o código.

Se o seu SLO de latência exigir throughput equivalente ao de GPU (0,4 imagens/s com step=30 e batch=16), mantenha as instâncias GPU. Caso 1,2 imagens/s com step=4 seja aceitável, a instância g8i oferece melhor custo-benefício.

Contexto

A família de instâncias g8i

A família de instâncias ECS de uso geral g8i é alimentada por Unidades de Processamento de Infraestrutura em Nuvem (CIPUs) e Apsara Stack. Ela utiliza processadores Intel® Xeon® Scalable de 5ª geração (codinome Emerald Rapids) com AMX para aceleração de IA. Todas as instâncias g8i suportam Intel® TDX, permitindo cargas de trabalho em Ambiente de Execução Confiável (TEE) com sobrecarga mínima de desempenho e sem necessidade de alterações no código.

Consulte g8i, família de instâncias de uso geral.

Intel® TDX

O Intel® TDX é uma tecnologia TEE baseada em hardware que isola e criptografa instâncias ECS, protegendo registradores de CPU, memória e injeções de interrupção durante a execução. Essa tecnologia ajuda a prevenir acessos não autorizados a processos e dados sensíveis sem exigir mudanças no código.

Consulte Intel® Trust Domain Extensions (Intel® TDX).

IPEX

O Intel® Extension for PyTorch (IPEX) é uma extensão open source para PyTorch que acelera tarefas de IA em processadores Intel, sendo continuamente otimizado para os hardwares e softwares mais recentes da Intel.

Consulte IPEX.

Pré-requisitos

Antes de começar, certifique-se de ter:

Etapa 1: Preparar o modelo

A implantação utiliza o modelo stabilityai/sdxl-turbo. Escolha uma opção com base no local onde seu modelo está armazenado.

Opção 1: Usar o modelo oficial (recomendado)

A imagem do chart Helm (v0.1.5) inclui o modelo oficial stabilityai/sdxl-turbo. Crie o arquivo values.yaml com o conteúdo abaixo. Ajuste a CPU e a memória conforme o tipo da sua instância.

resources:
  limits:
    cpu: "16"
    memory: 32Gi
  requests:
    cpu: "14"
    memory: 24Gi

Opção 2: Usar um modelo personalizado do OSS

Se você armazena um modelo personalizado stabilityai/sdxl-turbo no Object Storage Service (OSS), monte-o usando um PersistentVolume (PV) e um PersistentVolumeClaim (PVC).

Crie um usuário do Resource Access Management (RAM) com permissões de leitura no OSS e obtenha seu par de AccessKey.

  1. Crie o arquivo models-oss-secret.yaml com o seguinte conteúdo.

    apiVersion: v1
    kind: Secret
    metadata:
      name: models-oss-secret
      namespace: default
    stringData:
      akId: <your-access-key-id>          # AccessKey ID of the RAM user
      akSecret: <your-access-key-secret>  # AccessKey secret of the RAM user
  2. Aplique o Secret.

    kubectl create -f models-oss-secret.yaml

    Saída esperada:

    secret/models-oss-secret created
  3. Crie o arquivo models-oss-pv.yaml com o conteúdo a seguir. Substitua os placeholders pelos detalhes do seu bucket OSS.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: models-oss-pv
      labels:
        alicloud-pvname: models-oss-pv
    spec:
      capacity:
        storage: 50Gi
      accessModes:
        - ReadOnlyMany
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeHandle: models-oss-pv
        nodePublishSecretRef:
          name: models-oss-secret
          namespace: default
        volumeAttributes:
          bucket: "<your-bucket-name>"     # OSS bucket to mount
          url: "<your-oss-endpoint>"       # Use an internal endpoint, e.g., oss-cn-beijing-internal.aliyuncs.com
          otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other"
          path: "/models"                  # Must contain the stabilityai/sdxl-turbo subdirectory

    Consulte Método 1: Usar um Secret para ver os parâmetros do OSS.

  4. Crie o PV.

    kubectl create -f models-oss-pv.yaml

    Saída esperada:

    persistentvolume/models-oss-pv created
  5. Crie o arquivo models-oss-pvc.yaml com o conteúdo abaixo.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: models-oss-pvc
    spec:
      accessModes:
        - ReadOnlyMany
      resources:
        requests:
          storage: 50Gi
      selector:
        matchLabels:
          alicloud-pvname: models-oss-pv
  6. Aplique o PVC.

    kubectl create -f models-oss-pvc.yaml

    Saída esperada:

    persistentvolumeclaim/models-oss-pvc created
  7. Crie o arquivo values.yaml com o volume do modelo personalizado habilitado. Ajuste os recursos conforme o tipo da sua instância.

    resources:
      limits:
        cpu: "16"
        memory: 32Gi
      requests:
        cpu: "14"
        memory: 24Gi
    
    # Set to true to mount the custom model from OSS instead of the bundled image model.
    useCustomModels: true
    volumes:
      models:
        name: data-volume
        persistentVolumeClaim:
          claimName: models-oss-pvc

Referência completa do values.yaml

O chart Helm suporta opções adicionais além dos recursos e da origem do modelo. Valores padrão:

# Number of pod replicas.
replicaCount: 1

# Container image configuration.
image:
  repository: registry-vpc.cn-beijing.aliyuncs.com/eric-dev/stable-diffusion-ipex
  pullPolicy: IfNotPresent
  tag: "v0.1.5"              # Bundles the official stabilityai/sdxl-turbo model
  tagOnlyApi: "v0.1.5-lite"  # API-only image; requires mounting the model manually (see useCustomModels)

# Credentials for pulling a private container image.
imagePullSecrets: []

# Output path for generated images inside the container.
outputDirPath: /tmp/sd

# Set to true to use a custom model mounted via the volumes.models PVC.
# When false, the image.tag image (which includes the model) is used.
useCustomModels: false

volumes:
  # Volume for the image output path.
  output:
    name: output-volume
    emptyDir: {}
  # Volume for the custom model. Only active when useCustomModels: true.
  # Place the model in the stabilityai/sdxl-turbo subdirectory of the mount path.
  models:
    name: data-volume
    persistentVolumeClaim:
      claimName: models-oss-pvc
  # Alternatively, use a host path:
  # models:
  #   hostPath:
  #     path: /data/models
  #     type: DirectoryOrCreate

# Service configuration.
service:
  type: ClusterIP
  port: 5000

# Container resource limits and requests.
resources:
  limits:
    cpu: "16"
    memory: 32Gi
  requests:
    cpu: "14"
    memory: 24Gi

# Workload update strategy.
strategy:
  type: RollingUpdate

# Scheduling configuration.
nodeSelector: {}
tolerations: []
affinity: {}

# Container security settings.
securityContext:
  capabilities:
    drop:
    - ALL
  runAsNonRoot: true
  runAsUser: 1000

# Horizontal Pod Autoscaler (HPA) configuration.
# https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 3
  targetCPUUtilizationPercentage: 80
  targetMemoryUtilizationPercentage: 90

Etapa 2: Implantar o serviço

  1. Implante o serviço Stable Diffusion XL Turbo acelerado por IPEX usando o Helm.

    helm install stable-diffusion-ipex \
      https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/stable-diffusion-ipex-0.1.7.tgz \
      -f values.yaml

    Saída esperada:

    NAME: stable-diffusion-ipex
    LAST DEPLOYED: Mon Jan 22 20:42:35 2024
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
  2. Aguarde cerca de 10 minutos para o carregamento do modelo e verifique se o pod está em execução.

    kubectl get pod | grep stable-diffusion-ipex

    Saída esperada:

    stable-diffusion-ipex-65d98cc78-vmj49   1/1     Running   0   1m44s

Após iniciar, o serviço expõe uma API de texto para imagem na porta 5000. Consulte a Referência da API para ver os parâmetros.

Etapa 3: Testar o serviço

  1. Encaminhe a porta do serviço para sua máquina local.

    kubectl port-forward svc/stable-diffusion-ipex 5000:5000

    Saída esperada:

    Forwarding from 127.0.0.1:5000 -> 5000
    Forwarding from [::1]:5000 -> 5000
  2. Envie uma solicitação de geração. Tamanhos suportados: 512x512 e 1024x1024. Imagem 512x512

    curl -X POST http://127.0.0.1:5000/api/text2image \
      -d '{"prompt": "A panda listening to music with headphones. highly detailed, 8k.", "number": 1}'

    Saída esperada:

    {
      "averageImageGenerationTimeSeconds": 2.0333826541900635,
      "generationTimeSeconds": 2.0333826541900635,
      "id": "9ae43577-170b-45c9-ab80-69c783b41a70",
      "meta": {
        "input": {
          "batch": 1,
          "model": "stabilityai/sdxl-turbo",
          "number": 1,
          "prompt": "A panda listening to music with headphones. highly detailed, 8k.",
          "size": "512x512",
          "step": 4
        }
      },
      "output": [
        {
          "latencySeconds": 2.0333826541900635,
          "url": "http://127.0.0.1:5000/images/9ae43577-170b-45c9-ab80-69c783b41a70/0_0.png"
        }
      ],
      "status": "success"
    }

    Imagem 1024x1024

    curl -X POST http://127.0.0.1:5000/api/text2image \
      -d '{"prompt": "A panda listening to music with headphones. highly detailed, 8k.", "number": 1, "size": "1024x1024"}'

    Saída esperada:

    {
      "averageImageGenerationTimeSeconds": 8.635204315185547,
      "generationTimeSeconds": 8.635204315185547,
      "id": "ac341ced-430d-4952-b9f9-efa57b4eeb60",
      "meta": {
        "input": {
          "batch": 1,
          "model": "stabilityai/sdxl-turbo",
          "number": 1,
          "prompt": "A panda listening to music with headphones. highly detailed, 8k.",
          "size": "1024x1024",
          "step": 4
        }
      },
      "output": [
        {
          "latencySeconds": 8.635204315185547,
          "url": "http://127.0.0.1:5000/images/ac341ced-430d-4952-b9f9-efa57b4eeb60/0_0.png"
        }
      ],
      "status": "success"
    }

    Abra a url em um navegador para visualizar a imagem gerada.

Benchmarks de desempenho

Tempos médios de geração em tipos de instância g8i (batch: 1, step: 4). Os resultados servem apenas como referência.

Tipo de instância

Solicitação/Limite do Pod (vCPU)

Duração média — 512x512

Duração média — 1024x1024

ecs.g8i.4xlarge (16 vCPUs, 64 GiB)

14/16

2,2s

8,8s

ecs.g8i.8xlarge (32 vCPUs, 128 GiB)

24/32

1,3s

4,7s

ecs.g8i.12xlarge (48 vCPUs, 192 GiB)

32/32

1,1s

3,9s

Recomendação: A instância ecs.g8i.8xlarge oferece o melhor equilíbrio entre custo e throughput. Com step=4 e batch=16, ela gera 1,2 imagens/s sem comprometer a qualidade da imagem.

(Opcional) Etapa 4: Migrar para um pool de nós de VM confidencial TDX

Migre o serviço implantado para um pool de nós de VM confidencial TDX para obter isolamento e criptografia de memória baseados em hardware. Nenhuma alteração de código é necessária.

Pré-requisitos

Deve existir um pool de nós de VM confidencial TDX no cluster ACK com a seguinte configuração:

  • Tipo de instância: No mínimo 16 vCPUs. Recomendado: ecs.g8i.4xlarge.

  • Espaço em disco: Pelo menos 200 GiB por nó.

  • Rótulo do nó: nodepool-label=tdx-vm-pool.

Consulte Criar um pool de nós compatível com VMs confidenciais TDX.

Migrar o serviço

  1. Crie o arquivo tdx_values.yaml com o seletor de nós a seguir. Substitua tdx-vm-pool caso tenha usado um valor de rótulo diferente.

    nodeSelector:
      nodepool-label: tdx-vm-pool
  2. Atualize a release do Helm para reprogramar o pod no pool de nós TDX.

    helm upgrade stable-diffusion-ipex \
      https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/pre/charts-incubator/stable-diffusion-ipex-0.1.7.tgz \
      -f tdx_values.yaml

    Saída esperada:

    Release "stable-diffusion-ipex" has been upgraded. Happy Helming!
    NAME: stable-diffusion-ipex
    LAST DEPLOYED: Wed Jan 24 16:38:04 2024
    NAMESPACE: default
    STATUS: deployed
    REVISION: 2
    TEST SUITE: None
  3. Aguarde cerca de 10 minutos e verifique se o pod está em execução no pool de nós TDX.

    kubectl get pod | grep stable-diffusion-ipex

    Saída esperada:

    stable-diffusion-ipex-7f8c4f88f5-r478t   1/1     Running   0   1m44s
  4. Repita a Etapa 3: Testar o serviço para confirmar que o modelo funciona no pool de nós TDX.

Referência da API

Após a implantação, o serviço expõe uma API REST na porta 5000.

Sintaxe da solicitação

POST /api/text2image

Request parameters

Parâmetro

Tipo

Descrição

prompt

string

O prompt de texto para geração da imagem.

number

integer

Quantidade de imagens a gerar. O total de imagens é number × batch.

size

string

Tamanho da imagem de saída. Padrão: 512x512. Valores válidos: 512x512, 1024x1024.

step

integer

Contagem de etapas de difusão. Padrão: 4.

batch

integer

Tamanho do lote. Padrão: 1.

Sample request

{
  "prompt": "A panda listening to music with headphones. highly detailed, 8k.",
  "number": 1
}

Response parameters

Parâmetro

Tipo

Descrição

id

string

ID do job.

averageImageGenerationTimeSeconds

float

Tempo médio para gerar uma imagem, em segundos.

generationTimeSeconds

float

Tempo total para gerar todas as imagens, em segundos.

meta

object

Metadados do job.

meta.input

object

Parâmetros de entrada retornados: model, batch, step, number, size, prompt.

output

array

Resultados das imagens. Quando number > 1, uma imagem mesclada adicional (image_grid.png) é incluída.

output[].url

string

URL da imagem gerada. Acessível apenas no navegador quando replicaCount for 1.

output[].latencySeconds

float

Tempo para gerar este lote, em segundos.

status

string

Status do job.

Sample response

{
  "averageImageGenerationTimeSeconds": 2.0333826541900635,
  "generationTimeSeconds": 2.0333826541900635,
  "id": "9ae43577-170b-45c9-ab80-69c783b41a70",
  "meta": {
    "input": {
      "batch": 1,
      "model": "stabilityai/sdxl-turbo",
      "number": 1,
      "prompt": "A panda listening to music with headphones. highly detailed, 8k.",
      "size": "512x512",
      "step": 4
    }
  },
  "output": [
    {
      "latencySeconds": 2.0333826541900635,
      "url": "http://127.0.0.1:5000/images/9ae43577-170b-45c9-ab80-69c783b41a70/0_0.png"
    }
  ],
  "status": "success"
}

Comparação de desempenho

O pool de nós g8i usa AMX e IPEX para acelerar a inferência via CPU. Os benchmarks utilizam ecs.g8i.8xlarge (32 vCPUs, 128 GiB) com as ferramentas de benchmark lambda-diffusers. Os resultados servem apenas como referência.

Benchmarks de aceleração via CPU

Tipo de instância

Modelo

Step

Comando

ecs.g8i.8xlarge (32 vCPUs, 128 GiB)

sdxl-turbo

4

python sd_pipe_sdxl_turbo.py --bf16 --batch 1 --height 512 --width 512 --repeat 5 --step 4 --prompt "A panda listening to music with headphones. highly detailed, 8k"

ecs.g8i.8xlarge (32 vCPUs, 128 GiB)

stable-diffusion-2-1-base

30

python sd_pipe_infer.py --model /data/models/stable-diffusion-2-1-base --bf16 --batch 1 --height 512 --width 512 --repeat 5 --step 30 --prompt "A panda listening to music with headphones. highly detailed, 8k"

Resultados de desempenho (imagens/s):

Configuração

Throughput

ecs.g8i.8xlarge, step=4, batch=16 (sdxl-turbo)

1,2 imagens/s

ecs.g8i.8xlarge, step=30, batch=16 (sd-2-1-base)

0,14 imagens/s

Benchmarks de aceleração via GPU

Importante

Os benchmarks de GPU foram obtidos em Lambda Diffusers Benchmarking inference. Os resultados reais podem variar.

image

image

Comparação de custos

Estas estimativas comparam instâncias CPU g8i com a instância ecs.gn7i-c8g1.2xlarge (GPU). Para preços atuais, consulte a aba Pricing na página do Elastic Compute Service.

Tipo de instância

Custo vs. ecs.gn7i-c8g1.2xlarge

Throughput com step=4, batch=16

ecs.g8i.8xlarge

9% menor

1,2 imagens/s

ecs.g8i.4xlarge

>53% menor

0,5 imagens/s

Use a ecs.g8i.8xlarge quando precisar de economia de custos combinada com throughput superior a 1 imagem/s. Opte pela ecs.g8i.4xlarge quando a redução de custos, a confidencialidade de dados via TEE ou o fornecimento de recursos de CPU em larga escala forem prioritários e 0,5 imagens/s atender aos seus requisitos.

Próximos passos