Mixtral 8x7B 是 Mistral AI 发布的高质量稀疏型专家混合模型 (SMoE),权重公开。Mixtral 在大多数基准测试中均优于 Llama 2 70B,推理速度快 6 倍。Mistral.ai 使用 SkyPilot 作为默认方式来通过 OSS 堆栈部署他们的新模型。其文档中的说明是在单个实例上通过暴露端口部署模型的基本方法。在本博客文章中,我们将展示使用 SkyPilot 的更高级方法,以在生产环境中扩大服务规模,同时实现最佳的 GPU 可用性和更低的成本。

inline-banner

仅使用裸虚拟机进行服务部署不足以满足生产环境需求

人们首先想到的在云上部署模型的一种直观方式是启动一个新的虚拟机,该虚拟机有一个暴露给公共网络的端口,并在该端口上提供模型服务。使用 SkyPilot 很容易做到这一点,如Mistral.ai 的官方文档所述。更详细的 YAML 示例也可以在我们的 SkyPilot 示例此处找到。

resources:
  cloud: GCP
  region: us-central1
  accelerators: A100-80GB:2
  ports:
    - 8000

setup: |
  conda activate mixtral
  if [ $? -ne 0 ]; then
    conda create -n mixtral -y python=3.10
    conda activate mixtral
  fi
  # We have to manually install Torch otherwise apex & xformers won't build
  pip list | grep torch || pip install "torch>=2.0.0"

  pip list | grep vllm || pip install "git+https://github.com/vllm-project/vllm.git"
  pip install git+https://github.com/huggingface/transformers
  pip list | grep megablocks || pip install megablocks  

run: |
  conda activate mixtral
  export PATH=$PATH:/sbin
  python -u -m vllm.entrypoints.openai.api_server \
                --host 0.0.0.0 \
                --model mistralai/Mixtral-8x7B-Instruct-v0.1 \
                --tensor-parallel-size $SKYPILOT_NUM_GPUS_PER_NODE | tee ~/openai_api_server.log  

通过一条简单的命令,即可使用集群的 IP 和端口访问模型。

sky launch -c mixtral serve.yaml
IP=$(sky status --ip mixtral)
curl http://$IP:8000/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
      "model": "mistralai/Mixtral-8x7B-Instruct-v0.1",
      "prompt": "My favourite condiment is",
      "max_tokens": 25
  }'

这对于测试新模型来说效果非常好。

然而,在生产环境中,我们可能会遇到几个问题:

  1. GPU 可用性:由于近期 GPU 短缺,指定 GPU(A100:2,2x A100 40GB GPU)的可用性可能很差,这会导致寻找和等待可用资源花费大量时间。
  2. 服务监控:监控、检测和从由瞬时问题引起的服务停机中恢复是一个巨大的手动负担。
  3. 高成本:使用高端 GPU 提供模型服务的成本可能很高。

SkyPilot 已经识别并解决了在云上提供 LLM 服务时的这些痛点:

  • 我们已经发布了“多资源”功能,以进一步提高 GPU 可用性;以及
  • 我们已经发布了 SkyServe 库,作为 SkyPilot 的一部分,用于处理在云上扩展 AI 服务的操作。

这些最近增加的功能一直在为 LMSYS.org 的 Chatbot Arena 提供 10 多种开源模型的服务。该系统已为 Chatbot Arena 在生产环境中运行数月。请继续关注 SkyServe 的另一篇发布博客。

在本博客中,我们将以 Mixtral 为例,展示 SkyPilot 和 SkyServe 如何为实际的 LLM 服务解决上述问题。

扩大搜索范围以找到 GPU

SkyPilot 通过自动在任何云上查找可用的 GPU、配置虚拟机、开放端口和提供模型服务,帮助您部署 Mixtral 或任何微调过的 LLM/自定义模型。

由于 GPU 短缺,在您自己的云中部署模型的第一个问题是:我在哪里以及如何找到 GPU?

在上面的 SkyPilot YAML 中,我们完全指定了要使用的云、区域和加速器,SkyPilot 寻找 GPU 的搜索范围是有限的。

resources:
  cloud: gcp
  region: us-central1
  accelerators: A100-80GB:2

因此,较小的搜索范围可能会导致漫长的冷启动时间,因为需要等待特定区域中的特定 GPU 变得可用。

为了缓解这个问题,SkyPilot 现在允许您通过利用多个位置和 GPU 选项来显著扩大每次配置请求的搜索范围。

第 1 步:允许跨多个区域

云提供商通常有多个区域,不同区域的资源池也不同。因此,我们可以做的第一件事是删除区域字段,让 SkyPilot 在执行价格优化以找到最便宜的可用资源时自动遍历云中的不同区域。

resources:
  cloud: gcp
  # Remove region spec to allow optimizing over all regions in the cloud:
  # region: us-central1
  accelerators: A100-80GB:2

请注意,在 LLM 服务中,延迟瓶颈主要由模型推理(超过 2 秒)引起,而不是联系不同区域的网络延迟(少于 200 毫秒)。因此,允许跨多个区域对响应时间的影响可以忽略不计。

如果用户只想使用某些特定区域(例如,仅限美国区域),我们也可以使用新支持的语法来减少候选区域。

resources:
  cloud: gcp
  accelerators: A100-80GB:2
  # Leverage two regions to expand the search space:
  any_of:
    - region: us-central1
    - region: us-east1

第 2 步:允许跨多个云

由于不同的云提供商在其数据中心中 GPU 的可用性不同,因此跨云(您有权访问的所有云)搜索可用 GPU 可以进一步增加作业找到所需 GPU 的机会。

我们可以通过在资源规范中省略 cloud 字段来实现这一点。这样,SkyPilot 将搜索所有已为您启用的潜在资源池(例如,如果启用了 3 个云,潜在资源将增加 3 倍)。

resources:
  accelerators: A100-80GB:2
  # No `cloud` or `region` set means utilize all clouds you have access to!

第 3 步:允许选择多种备用加速器

为了进一步提高 GPU 可用性,我们发现服务工作负载通常可以在不同的 GPU 上运行。例如,Mixtral 模型可以在 L4:8、A10G:8、A100-80GB:2 等 GPU 上提供服务。

SkyPilot 允许用户指定一组可用于运行模型的加速器,其含义是“这些加速器中的任何一个都可以”。

resources:
  # SkyPilot performs cost & availability optimizations on this set of
  # GPUs. The probability of successfully getting *any* of these
  # GPUs also becomes much higher.
  accelerators: {L4:8, A10g:8, A10:8, A100:4, A100:8, A100-80GB:2, A100-80GB:4, A100-80GB:8}

通过此配置,SkyPilot 将自动从云上可用的候选加速器中找到最便宜的加速器,并提供模型服务。

SkyServe:通过多副本扩展模型服务

当需要扩大规模时,SkyServe 是构建在 SkyPilot 之上的库,它可以帮助您通过多个实例来扩展服务,同时提供单一入口端点以及自动负载均衡和副本恢复功能。

要使用多个实例部署 Mixtral,请运行以下命令启动服务,并让 SkyServe 自动监控和管理它:

sky serve up -n mixtral ./serve.yaml

我们如何获取 serve.yaml?很简单。只需在常规 SkyPilot YAML 中添加一个 service 规范,就像上一节中描述的那样。服务部署的其他参数指定了检查服务就绪状态的方式以及要用于服务的副本数量。

service:
  readiness_probe:
    path: /v1/chat/completions
    post_data:
      model: mistralai/Mixtral-8x7B-Instruct-v0.1
      messages:
        - role: user
          content: Hello! What is your name?
    initial_delay_seconds: 1200
  replica_policy:
    min_replicas: 2

sky serve up 完成后,我们可以获得一个单一的端点,用于访问在任何副本上提供的模型。

ENDPOINT=$(sky serve status -endpoint mixtral)
curl -L http://$ENDPOINT/v1/completions \
  -H "Content-Type: application/json" \
  -d '{
      "model": "mistralai/Mixtral-8x7B-Instruct-v0.1",
      "prompt": "My favourite condiment is",
      "max_tokens": 25
  }'

尽管在单个实例上提供服务的接口看起来类似,但 SkyServe 库显著提高了所提供服务的健壮性:

  1. 自动监控和恢复:SkyServe 将启动一个控制平面,持续监控服务的健康状况,并在发生故障时自动恢复服务,因此无需手动监控。
  2. 创建一个单一的端点,请求流量将在多个副本之间通过自动负载均衡进行重定向,从而可以处理比单实例解决方案更多的请求。
  3. 利用跨多个云的 GPU 可用性:基于 SkyPilot,SkyServe 可以轻松利用跨多个云的 GPU 可用性,无需用户额外参与。

serve-status

使用 Spot 实例进一步降低成本

为了进一步将成本降低 3-4 倍,SkyServe 允许使用 Spot 实例作为副本。SkyServe 自动管理 Spot 实例,监控中断情况并在需要时重启副本。

为此,只需将 use_spot: true 添加到 resources 字段中,例如:

resources:
  use_spot: true
  accelerators: {L4:8, A10g:8, A10:8, A100:4, A100:8, A100-80GB:2, A100-80GB:4, A100-80GB:8}

请注意,由于 Spot 实例缺乏保证,在实例被抢占后恢复期间,使用 Spot 实例可能会导致服务性能下降或停机。尽管如此,请继续关注 SkyServe 即将推出的策略,该策略将利用 Spot 实例副本优化成本,同时确保服务级别目标!

了解更多

SkyPilot 增强了 LLM 服务能力,为 GPU 短缺、服务可靠性和成本优化提供了解决方案。本文阐述了 SkyPilot 及其 SkyServe 库如何在实际的 LLM 服务场景中有效使用。

后续步骤