详情页标题前

阿里云人工智能平台PAI高级配置:模型服务预热-云淘科技

详情页1

为了解决模型初次请求耗时较长的问题,EAS提供了模型预热功能,使模型服务在上线之前得到预热,从而实现模型服务上线后即可进入正常服务状态。本文介绍如何使用模型预热功能。

背景信息

通常向模型发送初次请求时,不同的Runtime会进行不同的初始化操作,导致初次请求耗时相对较高。因此,模型服务在扩容或服务更新时,可能存在请求超时。例如,Java Processor在初次启动时,JVM的冷启动会导致初始的部分请求耗时较长。对于部分TensorFlow模型,初次调用时需要将模型相关文件或参数加载到内存中,该过程可能要耗费较长时间,从而导致前几次请求模型服务的RT较长,甚至出现408超时或450等情况。因此,EAS提供了模型预热功能,即模型服务上线之前对模型服务进行调用,使模型得到预热,从而实现模型服务上线后即可进入正常服务状态。

模型预热的实现原理是在模型服务上线之前,由EAS服务引擎向自身发送您上传的预热请求。系统设置每10秒(keep_alive*2)发送一次请求或在上一次请求正确结束后立即发送请求,且每个请求文件连续发送5次。如果模型初次请求小于10秒,则根据经验除了初次预热耗时较长,后面的几次请求都可以在很短的时间内完成,总预热时间约在10秒以内。如果初次请求大于10秒,则预热耗时会稍微长一些,可能达到几十秒。

使用EAS提供的模型预热功能,首先需要生成一份预热请求文件,然后在模型服务部署的JSON文件中指定该请求文件,最后在部署模型服务或更新模型服务的过程中,EAS服务引擎内部会发送预热请求,发送成功后,该模型服务才启动完成。

使用模型预热

生成预热请求文件就是按照模型服务上线后的真实请求构造一份请求文件,供预热时读取调用。您可以直接通过EAS提供的服务调用SDK构造请求,SDK的接口详情请参见SDK使用说明。本文以TensorFlow模型为例,介绍如何使用模型预热功能。

  1. 生成服务预热请求文件。

    本文以Python SDK和Java SDK为例,构造TensorFlow模型服务的请求。对于其它有预热需求的模型服务,您可以使用对应的SDK,参见生成TensorFlow预热文件的方法构造服务请求。对于将字符串作为输入的模型服务,您可以将请求按照STRING存入TXT文件中(同一个TXT文件可以包括多行请求,每个请求为一行),EAS会自动区分文件类型,并按照不同的形式发送预热请求。

    重要

    TensorFlow模型预热所需的请求必须与上线后真实请求的输入输出签名完全一致。

    使用SDK构造TensorFlow模型服务的请求示例如下:

    • 使用Python SDK构造

      #!/usr/bin/env python
      
      from eas_prediction import PredictClient
      from eas_prediction import StringRequest
      from eas_prediction import TFRequest
      
      if __name__ == '__main__':
              # 请求示例,请根据具体情况构造。请特别注意:预热所需的请求必须与上线后真实请求的输入签名完全一致。
              req = TFRequest('serving_default')
              req.add_feed('sentence1', [200, 15], TFRequest.DT_INT32, [1] * 200 * 15)
              req.add_feed('sentence2', [200, 15], TFRequest.DT_INT32, [1] * 200 * 15)
              req.add_feed('y', [200, 2], TFRequest.DT_INT32, [2] * 200 * 2)
              req.add_feed('keep_rate', [], TFRequest.DT_FLOAT, [0.2])
              req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784)
              req.add_fetch('sorted_labels')
              req.add_fetch('sorted_probs')
              # print(req.request_data) # 打印检查参数。
              with open("warm_up.bin", "wb") as fw :
                  fw.write(req.to_string());
              # 保存得到的 warm_up.bin 即为预热请求文件。
    • 使用Java SDK构造

      import java.util.List;
      import com.aliyun.openservices.eas.predict.http.PredictClient;
      import com.aliyun.openservices.eas.predict.http.HttpConfig;
      import com.aliyun.openservices.eas.predict.request.TFDataType;
      import com.aliyun.openservices.eas.predict.request.TFRequest;
      import com.aliyun.openservices.eas.predict.response.TFResponse;
      
      public class Test_TF {
      
          public static void main(String[] args) throws Exception{
              // 请求示例,请按照实际需要的预热请求进行构造。
              TFRequest request = new TFRequest();
              request.setSignatureName("predict_images");
              float[] content = new float[784];
              for (int i = 0; i < content.length; i++)
                  content[i] = (float)0.0;
              request.addFeed("images", TFDataType.DT_FLOAT, new long[]{1, 784}, content);
              request.addFetch("scores");
              
              try {
                  // 构造文件。
                  File writename = new File("/path/to/warm_up1.bin"); // 如果没有该文件,则建立一个新的文件。
                  FileUtils.writeByteArrayToFile(writename, request.getRequest().toByteArray());
              } catch (Exception ex) {
              }
          }
      }
  2. 验证请求正确性。

    您可以通过以下任何一种方式进行验证:

    • 方式一:发送服务请求进行验证

      通过以下命令向模型服务发送请求。

      curl  --data-binary @"" -H 'Authorization: ' 

      您需要将以下参数替换为实际值:

      • :上一步生成的请求文件路径。

      • :模型服务的访问Token。

      • :模型服务的访问地址。

    • 方式二:通过解析的方式验证

      • Python解析

        from eas_prediction import TFRequest
        
        req = TFRequest()
        with open('/path/to/warm_up1.bin', 'rb') as wm:
            req.request_data.ParseFromString(wm.read())
            print(req.request_data)
      • Java解析

        
        public static void main(String[] args) throws Exception {
        
              File readfile = new File("/path/to/warm_up1.bin");
              byte[] data = FileUtils.readFileToByteArray(readfile);
              PredictProtos.PredictRequest pb = PredictProtos.PredictRequest.parseFrom(data);
              System.out.println(pb);
          }
  3. 配置模型服务。

    1. 将模型预热的请求文件上传至OSS。

    2. 配置模型服务参数。

      在模型描述JSON文件中,配置模型服务参数。

      {
          "name":"warm_up_demo",
          "model_path":"oss://path/to/model", 
          "warm_up_data_path":"oss://path/to/warm_up_test.bin", // 模型预热的请求文件路径。
          "processor":"tensorflow_cpu_1.15",
          "metadata":{
              "cpu":2,
              "instance":1,
              "rpc": {
                  "warm_up_count": 5, // 每个预热请求发送的次数。如果没有配置,则默认为5。
              }
          }
      }

      与模型预热相关的参数如下,其他参数解释请参见创建服务:

      • warm_up_data_path:预热的请求文件路径,系统会自动寻找该文件并在模型服务上线前进行预热。

      • warm_up_count:每个预热请求发送的次数。如果没有配置,则默认为5。

  4. 部署或更新模型服务,详情请参见创建服务或修改服务配置。

    部署或更新模型服务的过程中,EAS引擎内部会发送预热请求,发送成功后,该模型服务才启动完成。

TensorFlow模型预热的常见问题

  • 问题现象

    在实际业务场景中,可能出现TensorFlow模型更新后导致服务不稳定的情况。在Processor中添加预热功能(指在Processor的实现代码中添加调用模型推理函数进行预热)后,仍无法解决该问题。经多方测试发现,对于TensorFlow模型而言,每一次不同的输入输出签名都会导致模型重新加载所需文件进行预热,即使模型已经将全部输入输出签名进行了预热加载,发送部分输入输出请求时仍需耗费较长时间重新加载。

  • 原因分析

    出现该现象的原因是TensorFlow的session->Run(inputs, output_tensor_names, {}, &outputs) 会对inputs和output_tensor_names进行哈希校验,如果输入输出发生变化,就重新加载,而不判断实际是否需要重新加载。

    例如,模型的输入如下。

    Inputs:
      threshold: []; DT_FLOAT
      model_id: []; DT_STRING
      input_holder: [-1]; DT_STRING

    模型的输出如下。

    Outputs:
      model_version_id: []; DT_STRING
      sorted_labels: [-1, 3]; DT_STRING
      sorted_probs: [-1, 3]; DT_FLOAT

    发送如下预热请求。

    request.addFeed("input_holder",TFDataType.DT_STRING, new long[]{1}, input);
    request.addFeed("threshold", TFDataType.DT_FLOAT, new long[] {}, th);
    request.addFeed("model_id", TFDataType.DT_STRING, new long[]{}, model_name);
    
    request.addFetch("sorted_labels");
    request.addFetch("sorted_probs");

    预热成功后,再次发送如下请求(与预热请求相比,增加一个输出),模型仍然需要重新加载所需文件。

    request.addFeed("input_holder",TFDataType.DT_STRING, new long[]{1}, input);
    request.addFeed("threshold", TFDataType.DT_FLOAT, new long[] {}, th);
    request.addFeed("model_id", TFDataType.DT_STRING, new long[]{}, model_name);
    
    request.addFetch("sorted_labels");
    request.addFetch("sorted_probs");
    request.addFetch("model_version_id"); // 与预热请求相比,增加一个输出。
  • 解决方法

    对于TensorFlow而言,每个服务都需要使用真实业务请求进行预热,并且该预热仅适用于请求的输入输出。因此,EAS提供的模型预热功能需要您上传真实的请求数据。

    对于TensorFlow模型进行预热,只需要让session->Run按照真实请求成功执行一次即可。因此,您可以只上传一个预热文件,并严格按照实际调用的输入输出进行预热。

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/164103.html

(0)
上一篇 2023年12月10日
下一篇 2023年12月10日
详情页2

相关推荐

  • 阿里云负载均衡查看CLB监控信息-云淘科技

    当您遇到传统型负载均衡CLB请求超时、流量限速等网络连接问题,或者需要了解CLB的负载、性能等情况时,您可以利用云监控功能查看CLB资源的运行状态和各个指标的使用情况,方便快速定位问题。您可以通过控制台、API、SDK方式来查看CLB的监控信息。 前提条件 请确保您已经创建了实例并添加了监听。具体操作,请参见: 添加TCP监听 添加UDP监听 添加HTTP监…

    阿里云负载均衡 2023年12月10日
  • 按照机器学习PAI阿里云文档请问相关问题应该咨询哪位同学呀?-云小二-阿里云

    按照机器学习PAI阿里云文档https://help.aliyun.com/zh/pai/use-tensorflow-to-develop-an-image-classification-model-1 使用tensorflow cpu组件对图像进行分类,代码、数据和参数配置都是使用这个文档里面提供的,但是还是不能跑通,请问相关问题应该咨询哪位同学呀? 以…

    阿里云 2023年12月18日
  • 阿里云容器服务ACK搭建TensorFlow应用-云淘科技

    本文介绍如何使用阿里云容器服务Serverless版和弹性容器实例(ECI),快速完成基于GPU的TensorFlow训练任务。 背景信息 人工智能与机器学习已经被广泛应用到各个领域,近些年来各种各样的训练模型被提出,更多的训练任务运行到云上。然而上云之后,想要轻松、持久地运行训练任务,仍有一些痛点,例如: 环境搭建麻烦:您需要购买GPU实例并安装GPU驱动…

    2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云人工智能平台PAI高级配置:模型服务预热-云淘科技

    为了解决模型初次请求耗时较长的问题,EAS提供了模型预热功能,使模型服务在上线之前得到预热,从而实现模型服务上线后即可进入正常服务状态。本文介绍如何使用模型预热功能。 背景信息 通常向模型发送初次请求时,不同的Runtime会进行不同的初始化操作,导致初次请求耗时相对较高。因此,模型服务在扩容或服务更新时,可能存在请求超时。例如,Java Processor…

    阿里云人工智能平台PAI 2023年12月10日
  • 阿里云人工智能平台PAI5分钟操作EAS一键部署通义千问模型-云淘科技

    本文为您介绍如何通过EAS一键部署基于开源模型通义千问的WebUI应用,以及使用WebUI和API进行模型推理。 背景信息 通义千问-7B(Qwen-7B)是阿里云研发的通义千问大模型系列的70亿参数规模的模型。Qwen-7B是基于Transformer的大语言模型, 在超大规模的预训练数据上进行训练得到。预训练数据类型多样,覆盖广泛,包括大量网络文本、专业…

    阿里云人工智能平台PAI 2023年12月10日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。