使用 Vertex AI 部署 LLM

749 阅读6分钟

将大型语言模型部署到生产环境对于机器学习工程师来说可能是一项具有挑战性的任务。但是,在这篇博文中,我将指导您完成使用DeepSpeed MII将几乎所有语言模型部署到Vertex AI的过程。借助此解决方案,您可以有效管理部署大型语言模型的复杂性,确保从开发到生产的无缝过渡。

DeepSpeed-MII 是 DeepSpeed 的一个开源 Python 库,旨在使强大模型的低延迟、低成本推理易于访问。使用 DeepSpeed MII,每个 GPU 每秒生成的令牌表明吞吐量显着增加。事实上,与其他解决方案相比,MII-Public 的吞吐量提高了 10 倍以上,这表明每个 GPU 每秒生成的令牌数量大幅增加。MII 加速了超过 30,000 个模型,支持文本生成、问答和文本分类等各种任务。这些模型来源于 Hugging FaceFairSeqEluetherAI 等热门模型库,涵盖基于 BERTRobertaGPT 架构的密集模型,参数范围从几亿到数百亿。MII 正在不断扩展其模型支持,并致力于增加对千亿以上参数密集和稀疏模型的支持。MII 目前支持 Hugging Face Transformers 模型系列。

使用 DeepSpeed MII 的主要优势之一是其易用性。开始使用这个强大的库只需要几行代码,使部署过程非常简单。

部署

此代码演示如何使用miiPython 包部署文本生成任务。它首先导入mii包并为部署定义配置设置。然后,该mii.deploy()方法用于bigscience/bloom-560m为文本生成任务部署预训练模型。

部署后,该mii.mii_query_handle()方法用于为部署的模型创建查询处理程序,并generator.query()调用该方法根据给定的查询生成文本。

import mii 
mii_configs = { "tensor_parallel" : 1 , "dtype" : "fp16" } 
mii.deploy(task= "text-generation" , 
           model= "bigscience/bloom-560m" , 
           deployment_name= "bloom560m_deployment" , 
           mii_config=mii_configs ) 
generator = mii.mii_query_handle( "bloom560m_deployment" ) 
result = generator.query({ "query" : [ "相对论是" ]}, do_sample= True ,max_new_tokens= 30 )
打印(结果)

这就是我所说的易用性!

让我们探索如何将 DeepSpeed MII 与 Flask 应用程序集成。通过利用 Flask 的简单性,我们可以轻松地将我们的语言模型与 Web 服务集成,从而实现快速高效的推理。

根据使用 Vertex AI 进行预测的自定义容器要求概述的自定义容器要求,有必要定义两条路线来将 Flask 应用程序与系统集成。第一条路线称为/isalive,用于检查 Flask 应用程序的运行状况,并在应用程序准备好进行推理时返回状态代码为 200 的响应。第二条路线,/predict用于进行预测。通过定义这两条路由,我们可以确保我们的 Flask 应用程序与 Vertex AI 完全兼容。

@app.route( "/isalive" ) 
def  isalive (): 
    print ( "/isalive request" ) 
    status_code = Response(status= 200 ) 
    return status_code

我们的预测路线将定义如下

@app.route( '/predict' , methods = [ 'POST' ] ) 
def  predict (): 
    form = request.get_json() 
    return writer.generator(form[ 'instances' ])

根据要求,“/predict”路由必须使用以下格式的 JSON 负载处理 POST 请求:{ “instances”: [dict, …]}.使用大型语言模型时,可能需要特定参数,例如 prompt、top_p、top_k、max_tokens等。但是,无论使用的具体参数如何,必须注意的是,数据将以列表形式出现在“实例”字段下,其中包含字典集合。通过遵守这种标准格式,我们可以确保我们的 Flask 应用程序能够有效地处理在生产环境中使用大型语言模型进行预测的请求。

要启动我们的 Flask 应用程序,我们将其配置为在端口上运行8080,因为这是部署到 Vertex AI 的要求。

如果__name__ == "__main__" : 
    port = int (os.environ.get( 'PORT' , 8080 )) 
    app.run(debug= True , host= '0.0.0.0' , port=port, use_reloader= False )

我们的模型类是一个简单的类,可以无缝加载和查询语言模型。

class  LLMBaseModel : 
    """This module will handle generating text""" 

    def  __init__ ( 
        self, 
        num_tokens: int = 200 , 
        top_p: float = 0.92 , 
        top_k: int = 50 , 
        model_name: str = "bigscience/bloom" ,
     ): 
        self.model_name = model_name 
        self.top_p = top_p 
        self.top_k = top_k 
        self.world_size = torch.cuda.device_count() 
        self.num_tokens = num_tokens
        logging.info( f"Using {self.world_size} gpus" )

        尝试:
            logging.info( f"Loading model: {self.model_name} " ) 
            self.model = DS() 

            logging.info( "model_loaded!" )

        除了异常:
            raise ValueError( f"model is deprecated: {self.model_name} " ) 

    def  generator ( self, form: Mapping[ str , Any ] ) -> str : 
        logging.info( f'this is the form: {form}')
        prompt = form[ 0 ][ “prompt” ] 
        top_p = form[ 0 ][ “top_p” ] 
        top_k = form[ 0 ][ “top_k” ] 
        max_new_tokens = form[ 0 ][ “max_new_tokens” ] 
        response = self。 model.generate(prompt, top_p, top_k, max_new_tokens) 
        response = response[ "generation" ][ 0 ] 
        return { "response" : str (response)}回复

可以通过实现一个用于读取数据的辅助方法来增强模型类的功能,为了演示的目的,我选择尽可能简单明了。

容器化 Flask 应用程序

这个过程应该相对简单。唯一需要考虑的一点是父映像必须包含 CUDA 运行时和 CUDA 开发工具。为确保 deepspeed 使用的 nvcc 等驱动程序可用,请确保使用包含dlevel标签的图像。

FROM nvidia/cuda:11.3.1-devel-ubuntu20.04 
ENV DEBIAN_FRONTEND=noninteractive 
RUN apt-get update && \ 
    apt-get install -y nginx python3 python3-dev python3-pip && \ 
    rm -rf /var/lib/apt /lists/* 
WORKDIR /app 
COPY . . 
RUN pip3 install -r requirements.txt 

EXPOSE 8080 
ENTRYPOINT [“python3”] 
CMD [“main.py”]

部署到 Vertex AI

让我们开始吧!我们的第一步是构建和推送容器化的 Flask 应用程序。我们可以使用以下两个命令来实现这一点。

docker build -t gcr.io/<PROJECT-ID>/<IMAGE-TAG> 。
docker push gcr.io/<PROJECT-ID>/<IMAGE-TAG>

如果您导航到 Google Cloud Console 中的 Container Registry 页面,您应该会看到一个包含 Docker 映像的目录。

使用 gcloud CLI 上传模型非常简单:

gcloud ai 模型上传 \ 
  --container-ports=80 \ 
  --container-predict-route= "/predict" \ 
  --container-health-route= "/health" \ 
  --region=us-central1 \ 
  --display -name=test_llms \ 
  --container-image-uri=gcr.io/tahatest-playground/test_llms

创建端点

gcloud ai 端点创建 \ 
  --project=tahatest-playground \ 
  --region=us-central1 \ 
  --display-name=test_llms

上一个命令可能需要大约 15 分钟才能完成。完成后,您可以使用模型和端点 ID 将模型部署到端点。

!gcloud ai 端点部署模型 <ENDPOINT-ID>\ 
  --project=tahatest-playground \ 
  --region=us-central1 \ 
  --model=<MODEL-ID> \ 
  --accelerator= type =nvidia-tesla-a100 ,count=1 
  --traffic-split=0=100 \ 
  --machine-type= "a2-highgpu-1g" \ 
  --display-name=llms

在 Vertex AI 上部署模型时,选择支持 GPU 的机器类型很重要。您可以在此页面上找到支持 GPU 的机器的可用配置列表:配置计算。请务必根据您的要求和预算选择合适的机器类型。

推理

现在,为了关键时刻,让我们从推理开始吧!有多种方法可以将请求发送到您的 Vertex AI 端点,但这里有一种简单的方法。首先,确保已gcloud.ai.platform安装。然后,您可以使用以下代码片段将请求发送到您的端点。

!pip install google.cloud.aiplatform 
from google.cloud import aiplatform 

project = 'PROJECT-ID'
 location = 'us-central1'

 aiplatform.init(project=project, 
                location=location) 
endpoint = aiplatform.Endpoint( "项目/< YOUR-PROJECT-ID>/locations/us-central1/endpoints/<ENDPOINT-ID>" ) 
instances = [ 
      { 
         "prompt" :[ "hello" ], "top_k" : 50 , "top_p" : 0.92 , "max_new_tokens “:100
       },
   ]

prediction = endpoint.predict(instances=instances)
打印(预测)

结论

恭喜!您刚刚使用 Docker、Flask 和 DeepSpeed MII 将深度学习模型部署到 Google Cloud 的 Vertex AI 平台以加快推理速度。这涉及为您的 Flask 应用程序构建 Docker 映像,将其推送到 Google Cloud Container Registry,并将其部署到 Vertex AI 端点。