AWS Trainium & Inferentia 文档

在 AWS Inferentia2 上部署 Mixtral 8x7B

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

在 AWS Inferentia2 上部署 Mixtral 8x7B

Mixtral 8x7B 是 Mistral AI 的开源大型语言模型 (LLM)。它是一个稀疏专家混合模型,其架构与 Mistral 7B 相似,但有一个独特之处:它实际上是 8 个“专家”模型合而为一。如果您想了解更多关于 MoE 的信息,请查看 专家混合模型解释

在本教程中,您将学习如何使用 Hugging Face Optimum Neuron 在 Amazon SageMaker 上部署 mistralai/Mixtral-8x7B-Instruct-v0.1 模型到 AWS Inferentia2。我们将使用 Hugging Face TGI Neuron 容器,这是一个专门为在由 文本生成推理Optimum Neuron 提供支持的 AWS Inferentia2 上轻松部署 LLM 而构建的推理容器。

我们将介绍如何

  1. 设置开发环境
  2. 检索最新的 Hugging Face TGI Neuron DLC
  3. 将 Mixtral 8x7B 部署到 Inferentia2
  4. 清理

让我们开始吧!🚀

AWS Inferentia (Inf2) 是专为深度学习 (DL) 推理工作负载而构建的 EC2 实例。以下是 Inferentia2 系列的不同实例。

实例大小 加速器 Neuron 核心 加速器内存 vCPU CPU 内存 按需价格(美元/小时)
inf2.xlarge 1 2 32 4 16 0.76
inf2.8xlarge 1 2 32 32 128 1.97
inf2.24xlarge 6 12 192 96 384 6.49
inf2.48xlarge 12 24 384 192 768 12.98

1. 设置开发环境

在本教程中,我们将使用 Amazon SageMaker 中的 Notebook 实例,配备 Python 3 (ipykernel) 和 sagemaker Python SDK,将 Mixtral 8x7B 部署到 SageMaker 推理端点。

确保您已安装最新版本的 SageMaker SDK。

!pip install sagemaker --upgrade --quiet

然后,实例化 sagemaker 角色和会话。

import sagemaker
import boto3

sess = sagemaker.Session()
# sagemaker session bucket -> used for uploading data, models and logs
# sagemaker will automatically create this bucket if it not exists
sagemaker_session_bucket = None
if sagemaker_session_bucket is None and sess is not None:
    # set to default bucket if a bucket name is not given
    sagemaker_session_bucket = sess.default_bucket()

try:
    role = sagemaker.get_execution_role()
except ValueError:
    iam = boto3.client("iam")
    role = iam.get_role(RoleName="sagemaker_execution_role")["Role"]["Arn"]

sess = sagemaker.Session(default_bucket=sagemaker_session_bucket)

print(f"sagemaker role arn: {role}")
print(f"sagemaker session region: {sess.boto_region_name}")

2. 检索最新的 Hugging Face TGI Neuron DLC

最新的 Hugging Face TGI Neuron DLC 可用于在 AWS Inferentia2 上运行推理。您可以使用 sagemaker SDK 的 get_huggingface_llm_image_uri 方法,根据您所需的 backendsessionregionversion 检索相应的 Hugging Face TGI Neuron DLC URI。如果 SageMaker SDK 中尚未添加最新版本的容器,您可以在 此处 找到。

from sagemaker.huggingface import get_huggingface_llm_image_uri

# retrieve the llm image uri
llm_image = get_huggingface_llm_image_uri(
    "huggingface-neuronx",
)

# print ecr image uri
print(f"llm image uri: {llm_image}")

3. 将 Mixtral 8x7B 部署到 Inferentia2

在撰写本文时,AWS Inferentia2 不支持推理的动态形状,这意味着我们需要提前指定序列长度和批大小。为了方便客户充分利用 Inferentia2 的强大功能,我们创建了一个 神经元模型缓存,其中包含最流行的 LLM(包括 Mixtral 8x7B)的预编译配置。

这意味着我们不需要自己编译模型,而是可以使用缓存中的预编译模型。您可以在 Hugging Face Hub 上找到编译/缓存的配置。如果您的所需配置尚未缓存,您可以使用 Optimum CLI 自行编译,或在 缓存存储库 提交请求。

让我们检查缓存中的不同配置。为此,您首先需要使用具有读取权限的 用户访问令牌 登录 Hugging Face Hub。

请确保您具有访问模型的必要权限。您可以在此处申请模型访问权限。

from huggingface_hub import notebook_login

notebook_login()

然后,我们需要安装最新版本的 Optimum Neuron。

!pip install optimum-neuron --upgrade --quiet

最后,我们可以查询缓存并检索我们已维护编译版本的模型现有配置集。

HF_MODEL_ID = "mistralai/Mixtral-8x7B-Instruct-v0.1"

!optimum-cli neuron cache lookup $HF_MODEL_ID

您应该在缓存中检索到两个条目

*** 2 entrie(s) found in cache for mistralai/Mixtral-8x7B-Instruct-v0.1 for inference.***

auto_cast_type: bf16
batch_size: 1
checkpoint_id: mistralai/Mixtral-8x7B-Instruct-v0.1
checkpoint_revision: 41bd4c9e7e4fb318ca40e721131d4933966c2cc1
compiler_type: neuronx-cc
compiler_version: 2.16.372.0+4a9b2326
num_cores: 24
sequence_length: 4096
task: text-generation

auto_cast_type: bf16
batch_size: 4
checkpoint_id: mistralai/Mixtral-8x7B-Instruct-v0.1
checkpoint_revision: 41bd4c9e7e4fb318ca40e721131d4933966c2cc1
compiler_type: neuronx-cc
compiler_version: 2.16.372.0+4a9b2326
num_cores: 24
sequence_length: 4096
task: text-generation

将 Mixtral 8x7B 部署到 SageMaker 端点

在将模型部署到 Amazon SageMaker 之前,我们必须定义 TGI Neuron 端点配置。我们需要确保定义以下附加参数:

  • HF_NUM_CORES:用于编译的Neuron核心数量。
  • HF_BATCH_SIZE:用于编译模型的批处理大小。
  • HF_SEQUENCE_LENGTH:用于编译模型的序列长度。
  • HF_AUTO_CAST_TYPE:用于编译模型的自动转换类型。

我们仍然需要定义传统的TGI参数:

  • HF_MODEL_ID:Hugging Face模型ID。
  • HF_TOKEN:用于访问受限模型的Hugging Face API令牌。
  • MAX_BATCH_SIZE:模型可以处理的最大批处理大小,等于用于编译的批处理大小。
  • MAX_INPUT_TOKEN:模型可以处理的最大输入长度。
  • MAX_TOTAL_TOKENS:模型可以生成的最大总token数,等于用于编译的序列长度。

或者,您可以将端点配置为支持聊天模板

  • MESSAGES_API_ENABLED:启用消息 API

选择正确的实例类型

Mixtral 8x7B 是一个大型模型,需要大量内存。我们将使用 inf2.48xlarge 实例类型,它有 192 个 vCPU 和 384 GB 加速器内存。inf2.48xlarge 实例带有 12 个 Inferentia2 加速器,其中包括 24 个 Neuron Core。在我们的案例中,我们将使用批大小为 4,序列长度为 4096。

之后,我们可以创建端点配置并将模型部署到 Amazon SageMaker。我们将启用消息 API 来部署端点,使其与 OpenAI 聊天完成 API 完全兼容。

from sagemaker.huggingface import HuggingFaceModel

# sagemaker config
instance_type = "ml.inf2.48xlarge"
health_check_timeout = 2400  # additional time to load the model
volume_size = 512  # size in GB of the EBS volume

# Define Model and Endpoint configuration parameter
config = {
    "HF_MODEL_ID": "mistralai/Mixtral-8x7B-Instruct-v0.1",
    "HF_NUM_CORES": "24",  # number of neuron cores
    "HF_AUTO_CAST_TYPE": "bf16",  # dtype of the model
    "MAX_BATCH_SIZE": "4",  # max batch size for the model
    "MAX_INPUT_TOKENS": "4000",  # max length of input text
    "MAX_TOTAL_TOKENS": "4096",  # max length of generated text
    "MESSAGES_API_ENABLED": "true",  # Enable the messages API
    "HF_TOKEN": "<REPLACE WITH YOUR TOKEN>",
}

assert (
    config["HF_TOKEN"] != "<REPLACE WITH YOUR TOKEN>"
), "Please replace '<REPLACE WITH YOUR TOKEN>' with your Hugging Face Hub API token"


# create HuggingFaceModel with the image uri
llm_model = HuggingFaceModel(role=role, image_uri=llm_image, env=config)

创建 HuggingFaceModel 后,我们可以使用 deploy 方法将其部署到 Amazon SageMaker。我们将使用 ml.inf2.48xlarge 实例类型部署模型。TGI 将自动在所有 Inferentia 设备上分配和分片模型。

# Deploy model to an endpoint
# https://sagemaker.readthedocs.io/en/stable/api/inference/model.html#sagemaker.model.Model.deploy
llm_model._is_compiled_model = True

llm = llm_model.deploy(
    initial_instance_count=1,
    instance_type=instance_type,
    container_startup_health_check_timeout=health_check_timeout,
    volume_size=volume_size,
)

SageMaker 现在将创建我们的端点并将模型部署到其中。部署大约需要 15 分钟。

在我们的终端节点部署完成后,我们可以在其上运行推理。我们将使用 predictorpredict 方法在我们的终端节点上运行推理。

该端点支持消息 API,该 API 完全兼容 OpenAI Chat Completion API。消息 API 允许我们以对话方式与模型交互。我们可以定义消息的角色和内容。角色可以是 systemassistantusersystem 角色用于为模型提供上下文,user 角色用于向模型提问或提供输入。

参数可以在负载的 parameters 属性中定义。请查看聊天完成 文档 以查找支持的参数。

{
  "messages": [
    { "role": "system", "content": "You are a helpful assistant." },
    { "role": "user", "content": "What is deep learning?" }
  ]
}
# Prompt to generate
messages = [
    {"role": "system", "content": "You are a helpful assistant."},
    {"role": "user", "content": "What is deep learning in one sentence?"},
]

# Generation arguments https://platform.openai.com/docs/api-reference/chat/create
parameters = {
    "max_tokens": 100,
}

好的,让我们测试一下。

chat = llm.predict({"messages": messages, **parameters, "steam": True})

print(chat["choices"][0]["message"]["content"].strip())

4. 清理

为了清理,我们可以删除模型和端点。

llm.delete_model()
llm.delete_endpoint()