日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

高級配置:模型服務(wù)預(yù)熱

為了解決模型初次請求耗時(shí)較長的問題,EAS提供了模型預(yù)熱功能,使模型服務(wù)在上線之前得到預(yù)熱,從而實(shí)現(xiàn)模型服務(wù)上線后即可進(jìn)入正常服務(wù)狀態(tài)。本文介紹如何使用模型預(yù)熱功能。

背景信息

通常向模型發(fā)送初次請求時(shí),不同的Runtime會(huì)進(jìn)行不同的初始化操作,導(dǎo)致初次請求耗時(shí)相對較高。因此,模型服務(wù)在擴(kuò)容或服務(wù)更新時(shí),可能存在請求超時(shí)。例如,Java Processor在初次啟動(dòng)時(shí),JVM的冷啟動(dòng)會(huì)導(dǎo)致初始的部分請求耗時(shí)較長。對于部分TensorFlow模型,初次調(diào)用時(shí)需要將模型相關(guān)文件或參數(shù)加載到內(nèi)存中,該過程可能要耗費(fèi)較長時(shí)間,從而導(dǎo)致前幾次請求模型服務(wù)的RT較長,甚至出現(xiàn)408超時(shí)或450等情況。因此,EAS提供了模型預(yù)熱功能,即模型服務(wù)上線之前對模型服務(wù)進(jìn)行調(diào)用,使模型得到預(yù)熱,從而實(shí)現(xiàn)模型服務(wù)上線后即可進(jìn)入正常服務(wù)狀態(tài)。

模型預(yù)熱的實(shí)現(xiàn)原理是在模型服務(wù)上線之前,由EAS服務(wù)引擎向自身發(fā)送您上傳的預(yù)熱請求。系統(tǒng)設(shè)置每10秒(keep_alive*2)發(fā)送一次請求或在上一次請求正確結(jié)束后立即發(fā)送請求,且每個(gè)請求文件連續(xù)發(fā)送5次。如果模型初次請求小于10秒,則根據(jù)經(jīng)驗(yàn)除了初次預(yù)熱耗時(shí)較長,后面的幾次請求都可以在很短的時(shí)間內(nèi)完成,總預(yù)熱時(shí)間約在10秒以內(nèi)。如果初次請求大于10秒,則預(yù)熱耗時(shí)會(huì)稍微長一些,可能達(dá)到幾十秒。

使用EAS提供的模型預(yù)熱功能,首先需要生成一份預(yù)熱請求文件,然后在模型服務(wù)部署的JSON文件中指定該請求文件,最后在部署模型服務(wù)或更新模型服務(wù)的過程中,EAS服務(wù)引擎內(nèi)部會(huì)發(fā)送預(yù)熱請求,發(fā)送成功后,該模型服務(wù)才啟動(dòng)完成。

使用模型預(yù)熱

生成預(yù)熱請求文件就是按照模型服務(wù)上線后的真實(shí)請求構(gòu)造一份請求文件,供預(yù)熱時(shí)讀取調(diào)用。您可以直接通過EAS提供的服務(wù)調(diào)用SDK構(gòu)造請求,SDK的接口詳情請參見SDK使用說明。本文以TensorFlow模型為例,介紹如何使用模型預(yù)熱功能。

  1. 生成服務(wù)預(yù)熱請求文件。

    本文以Python SDK和Java SDK為例,構(gòu)造TensorFlow模型服務(wù)的請求。對于其它有預(yù)熱需求的模型服務(wù),您可以使用對應(yīng)的SDK,參見生成TensorFlow預(yù)熱文件的方法構(gòu)造服務(wù)請求。對于將字符串作為輸入的模型服務(wù),您可以將請求按照STRING存入TXT文件中(同一個(gè)TXT文件可以包括多行請求,每個(gè)請求為一行),EAS會(huì)自動(dòng)區(qū)分文件類型,并按照不同的形式發(fā)送預(yù)熱請求。

    重要

    TensorFlow模型預(yù)熱所需的請求必須與上線后真實(shí)請求的輸入輸出簽名完全一致。

    使用SDK構(gòu)造TensorFlow模型服務(wù)的請求示例如下:

    • 使用Python SDK構(gòu)造

      #!/usr/bin/env python
      
      from eas_prediction import PredictClient
      from eas_prediction import StringRequest
      from eas_prediction import TFRequest
      
      if __name__ == '__main__':
              # 請求示例,請根據(jù)具體情況構(gòu)造。請?zhí)貏e注意:預(yù)熱所需的請求必須與上線后真實(shí)請求的輸入簽名完全一致。
              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) # 打印檢查參數(shù)。
              with open("warm_up.bin", "wb") as fw :
                  fw.write(req.to_string());
              # 保存得到的 warm_up.bin 即為預(yù)熱請求文件。
    • 使用Java SDK構(gòu)造

      在Maven工程中使用EASJava SDK,必須在pom.xml文件的<dependencies>中添加eas-sdk的依賴,示例如下,最新版本以Maven倉庫中顯示的為準(zhǔn)。

      <dependency>
        <groupId>com.aliyun.openservices.eas</groupId>
        <artifactId>eas-sdk</artifactId>
        <version>2.0.13</version>
      </dependency>

      Java SDK代碼示例如下:

      import java.io.File;
      import com.aliyun.openservices.eas.predict.request.TFDataType;
      import com.aliyun.openservices.eas.predict.request.TFRequest;
      import org.apache.commons.io.FileUtils;
      
      public class TestTf {
      
          public static void main(String[] args) throws Exception{
              // 請求示例,請按照實(shí)際需要的預(yù)熱請求進(jìn)行構(gòu)造。
              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 {
                  // 構(gòu)造文件。如果沒有該文件,則建立一個(gè)新的文件。
                  File writename = new File("/path/to/warm_up1.bin");
                  FileUtils.writeByteArrayToFile(writename, request.getRequest().toByteArray());
              } catch (Exception ex) {
              }
          }
      }
  2. 驗(yàn)證請求正確性。

    您可以通過以下任何一種方式進(jìn)行驗(yàn)證:

    • 方式一:發(fā)送服務(wù)請求進(jìn)行驗(yàn)證

      通過以下命令向模型服務(wù)發(fā)送請求。如果返回內(nèi)容太大無法直接在終端打印,可通過添加--output <filePath>,將結(jié)果存儲(chǔ)在文件中。

      curl  --data-binary @"</path/to/warmup.bin>" -H 'Authorization: <yourToken>' <serviceAddress>

      您需要將以下參數(shù)替換為實(shí)際值:

      • </path/to/warmup.bin>:上一步生成的請求文件路徑。

      • <yourToken>:模型服務(wù)的訪問Token。

      • <serviceAddress>:模型服務(wù)的訪問地址。

    • 方式二:通過解析的方式驗(yàn)證

      • 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解析

        import com.aliyun.openservices.eas.predict.proto.PredictProtos;
        import org.apache.commons.io.FileUtils;
        import java.io.File;
        
        public class Test {
        
            public static void main(String[] args) throws Exception {
        
                File refile = new File("/path/to/warm_up1.bin");
                byte[] data = FileUtils.readFileToByteArray(refile);
                PredictProtos.PredictRequest pb = PredictProtos.PredictRequest.parseFrom(data);
                System.out.println(pb);
            }
        }
  3. 配置模型服務(wù)。

    1. 將模型預(yù)熱的請求文件上傳至OSS。

    2. 配置模型服務(wù)參數(shù)。

      在模型描述JSON文件中,配置模型服務(wù)參數(shù)。

      {
          "name":"warm_up_demo",
          "model_path":"oss://path/to/model", 
          "warm_up_data_path":"oss://path/to/warm_up_test.bin", // 模型預(yù)熱的請求文件路徑。
          "processor":"tensorflow_cpu_1.15",
          "metadata":{
              "cpu":2,
              "instance":1,
              "rpc": {
                  "warm_up_count": 5, // 每個(gè)預(yù)熱請求發(fā)送的次數(shù)。如果沒有配置,則默認(rèn)為5。
              }
          }
      }

      與模型預(yù)熱相關(guān)的參數(shù)如下,其他參數(shù)解釋請參見創(chuàng)建服務(wù)

      • warm_up_data_path:預(yù)熱的請求文件路徑,系統(tǒng)會(huì)自動(dòng)尋找該文件并在模型服務(wù)上線前進(jìn)行預(yù)熱。

      • warm_up_count:每個(gè)預(yù)熱請求發(fā)送的次數(shù)。如果沒有配置,則默認(rèn)為5。

  4. 部署或更新模型服務(wù),詳情請參見創(chuàng)建服務(wù)修改服務(wù)配置

    部署或更新模型服務(wù)的過程中,EAS引擎內(nèi)部會(huì)發(fā)送預(yù)熱請求,發(fā)送成功后,該模型服務(wù)才啟動(dòng)完成。

TensorFlow模型預(yù)熱的常見問題

  • 問題現(xiàn)象

    在實(shí)際業(yè)務(wù)場景中,可能出現(xiàn)TensorFlow模型更新后導(dǎo)致服務(wù)不穩(wěn)定的情況。在Processor中添加預(yù)熱功能(指在Processor的實(shí)現(xiàn)代碼中添加調(diào)用模型推理函數(shù)進(jìn)行預(yù)熱)后,仍無法解決該問題。經(jīng)多方測試發(fā)現(xiàn),對于TensorFlow模型而言,每一次不同的輸入輸出簽名都會(huì)導(dǎo)致模型重新加載所需文件進(jìn)行預(yù)熱,即使模型已經(jīng)將全部輸入輸出簽名進(jìn)行了預(yù)熱加載,發(fā)送部分輸入輸出請求時(shí)仍需耗費(fèi)較長時(shí)間重新加載。

  • 原因分析

    出現(xiàn)該現(xiàn)象的原因是TensorFlow的session->Run(inputs, output_tensor_names, {}, &outputs) 會(huì)對inputsoutput_tensor_names進(jìn)行哈希校驗(yàn),如果輸入輸出發(fā)生變化,就重新加載,而不判斷實(shí)際是否需要重新加載。

    例如,模型的輸入如下。

    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

    發(fā)送如下預(yù)熱請求。

    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");

    預(yù)熱成功后,再次發(fā)送如下請求(與預(yù)熱請求相比,增加一個(gè)輸出),模型仍然需要重新加載所需文件。

    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"); // 與預(yù)熱請求相比,增加一個(gè)輸出。
  • 解決方法

    對于TensorFlow而言,每個(gè)服務(wù)都需要使用真實(shí)業(yè)務(wù)請求進(jìn)行預(yù)熱,并且該預(yù)熱僅適用于請求的輸入輸出。因此,EAS提供的模型預(yù)熱功能需要您上傳真實(shí)的請求數(shù)據(jù)。

    對于TensorFlow模型進(jìn)行預(yù)熱,只需要讓session->Run按照真實(shí)請求成功執(zhí)行一次即可。因此,您可以只上傳一個(gè)預(yù)熱文件,并嚴(yán)格按照實(shí)際調(diào)用的輸入輸出進(jìn)行預(yù)熱。