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

服務(wù)部署:自定義鏡像

EAS支持使用自定義鏡像的方式來部署模型服務(wù)。您可以使用docker鏡像來構(gòu)建自己完整的運行環(huán)境,并通過服務(wù)存儲掛載將模型或代碼在運行時掛載至服務(wù)實例中。本文介紹使用自定義鏡像部署模型服務(wù)的詳細步驟。

背景信息

在模型服務(wù)開發(fā)過程中,通常會有較為復雜的業(yè)務(wù)邏輯,無法通過簡單的模型部署的方式實現(xiàn)復雜的業(yè)務(wù)需求。同時自定義的推理代碼對于環(huán)境也有較為復雜的依賴,比如需要使用yum install/apt-get install命令在系統(tǒng)目錄中安裝依賴包等,因此EAS推出了使用自定義鏡像的方式來部署模型服務(wù)。

您可以通過控制臺或客戶端工具EASCMD(詳情請參見下載并認證客戶端)來進行模型服務(wù)的部署,本文會分別介紹如何通過這兩種方式使用自定義鏡像來部署模型服務(wù)。

在服務(wù)運行過程中,EAS的服務(wù)引擎會以Sidecar的方式注入到服務(wù)實例中,主要進行流量或系統(tǒng)監(jiān)控數(shù)據(jù)的采集,以及對服務(wù)請求增加認證信息等。鏡像部署支持在鏡像中以HTTP、WebSocket、gRPC(HTTP2)三種協(xié)議提供API服務(wù)。

說明

鏡像中使用GRPC協(xié)議時需要在服務(wù)部署時指定額外參數(shù):"metadata.enable_grpc": true

鏡像倉庫選擇

EAS支持以下兩種形式的自定義鏡像倉庫:

  • 鏡像服務(wù)ACR。關(guān)于如何創(chuàng)建ACR鏡像,請參見什么是容器鏡像服務(wù)ACR

    • 個人版:ACR個人版會在每個區(qū)域提供統(tǒng)一的內(nèi)網(wǎng)地址,例如:registry-vpc.cn-shanghai.aliyuncs.com

      說明

      由于EAS默認不通公網(wǎng),如果使用個人版鏡像倉庫部署服務(wù),請使用同區(qū)域內(nèi)網(wǎng)地址來部署。

    • 企業(yè)版:ACR企業(yè)版有更多高級功能,例如:鏡像加速功能按需加載容器鏡像

      說明

      企業(yè)版鏡像內(nèi)網(wǎng)地址僅在用戶VPC中可訪問,因此在EAS中拉取ACR企業(yè)版內(nèi)網(wǎng)鏡像地址,需要打通EAS到用戶VPC的網(wǎng)絡(luò),詳情請參見配置網(wǎng)絡(luò)連通

  • 用戶自建鏡像倉庫:如果您在阿里云VPC中使用Harbor自建的鏡像倉庫,地址僅支持在您的VPC中訪問,與ACR企業(yè)版類似,需要打通EAS到您的VPC網(wǎng)絡(luò),具體操作,請參見配置網(wǎng)絡(luò)連通

說明

EAS默認不通公網(wǎng),如需要通過公網(wǎng)拉取鏡像倉庫,則需要開通公網(wǎng)訪問,詳情請參見公網(wǎng)連接及白名單配置

鏡像倉庫認證

使用私有鏡像倉庫部署時,您需要提供認證信息才能夠在EAS中拉取鏡像,分如下兩種情況:

  • ACR鏡像倉庫:您在開通EAS中選擇授權(quán)給EAS之后,對于同賬號下的ACR個人版和企業(yè)版鏡像倉庫部署時,無需指定認證信息,EAS可實現(xiàn)跨服務(wù)免密拉取。

  • 自建私有鏡像倉庫:若自建倉庫需要用戶名密碼訪問,則在服務(wù)部署時需要在服務(wù)配置中通過dockerAuth來提供用戶名密碼信息,詳情請參見部署模型服務(wù)章節(jié)的dockerAuth參數(shù)說明。

鏡像服務(wù)開發(fā)

說明

如果您已經(jīng)有一個開發(fā)好的鏡像,并能夠提供HTTP、WebSocket、gRPC協(xié)議的訪問,則可跳過該章節(jié),直接進行服務(wù)部署。

您可以使用多種方式開發(fā)一個鏡像服務(wù),例如使用Flask拉起一個Webserver來進行服務(wù)訪問,示例代碼如下。

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/hello/model')
def hello_world():
    return 'Hello World'
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)  

您也可使用EAS提供的高性能服務(wù)框架allspark來進行鏡像服務(wù)的開發(fā),詳情請參見:使用Python開發(fā)自定義Processor,示例代碼如下。

# -*- coding: utf-8 -*-
import allspark


class MyProcessor(allspark.BaseProcessor):
    def initialize(self):
        """
        This function is only executed once when the service starts, 
        and traffic will not be imported until it is completed. 
        It can be used to load models and service initialization.
        """
        pass

    def process(self, data):
        """
        Each time a request is received, this function is called.
        The input parameter of the function is the request body of the HTTP request, 
        and the function returns two parameters: 
        1. the first parameter will be used as the HTTP response body, 
        2. the second parameter is the HTTP response status code.
        """
        data = 'hello eas'

        return bytes(data, encoding='utf8'), 200

if __name__ == '__main__':
    runner = MyProcessor(endpoint='0.0.0.0:8000')
    runner.run()

開發(fā)好的代碼可以直接通過docker build打包在待部署的鏡像中,也可保存在Nas或Git倉庫中,通過存儲掛載的方式在運行時掛載進服務(wù)實例,詳情請參見高級配置:服務(wù)存儲掛載

部署模型服務(wù)

準備工作

  • 準備條件,自定義鏡像部署需要如下三要素:

    • 鏡像倉庫地址,例如:registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz

    • 鏡像的啟動執(zhí)行命令,例如:/data/eas/ENV/bin/python /data/eas/app.py

    • 鏡像中進程監(jiān)聽的網(wǎng)絡(luò)端口號,例如:8000 。

      說明

      端口號在一些場景中為可選。例如用戶服務(wù)中不依賴由EAS網(wǎng)關(guān)導入的流量,而是用戶在鏡像中自行通過訂閱消息隊列的方式獲取消息,則此場景中鏡像端口號可選填。

  • 部署服務(wù)時需準備JSON格式的配置文件,文件內(nèi)容的示例如下。

    通過控制臺交互式頁面部署時最終也會生成下面的配置文件,您也可以使用該文件通過eascmd或openapi來進行服務(wù)部署。

    {
      "name": "image_test",
      "containers": [
        {
          "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
          "env": [
            {
              "name": "var_name",
              "value": "var_value"
            }
          ],
          "command": "/data/eas/ENV/bin/python /data/eas/app.py",
          "port": 8000
        }
      ],
      "metadata": {
        "cpu": 1,
        "instance": 1
      }
    }

    JSON文件內(nèi)的參數(shù)解釋如下表所示。

    參數(shù)

    是否必選

    描述

    containers

    image

    用于部署模型服務(wù)的鏡像地址。

    由于EAS不開放公網(wǎng)訪問權(quán)限,因此您需要使用VPC內(nèi)網(wǎng)Registry地址進行部署。例如,registry-vpc.cn-shanghai.aliyuncs.com

    env

    name

    鏡像執(zhí)行時的環(huán)境變量名稱。

    value

    鏡像執(zhí)行時的環(huán)境變量取值。

    command

    二者必選其一

    鏡像的入口命令,只支持單一命令形式,不支持復雜腳本,如:cd xxx && python app.py,這種形式請使用下面的script參數(shù)來指定,command字段適應(yīng)于鏡像中無/bin/sh命令的場景。

    script

    鏡像的入口執(zhí)行的腳本,可指定較為復雜的腳本形式,多行以\n或分號分隔。

    port

    容器端口。

    重要
    • 由于EAS引擎監(jiān)聽固定的8080/9090端口,因此容器端口需要避開8080/9090端口。

    • 該端口一定要和command中的xxx.py文件配置的端口保持一致。

    prepare

    pythonRequirements

    實例啟動前安裝的python requirements列表,要求鏡像中在系統(tǒng)路徑中存在python和pip命令,list格式,如:

    "prepare": {
      "pythonRequirements": [
        "numpy==1.16.4",
        "absl-py==0.11.0"
      ]
    }

    pythonRequirementsPath

    實例啟動前安裝的python requirements.txt文件地址,要求鏡像中在系統(tǒng)路徑中存在Python和pip命令,requirements.txt可直接打在鏡像中,也可以由外部存儲掛載的方式掛載到服務(wù)實例中,如:

    "prepare": {
      "pythonRequirementsPath": "/data_oss/requirements.txt"
    }

    health_check

    tcp_socket.port

    使用TCP方式健康檢查時,檢查的TCP端口號。

    http_get.path

    使用HTTP方式健康檢查時,檢查的HTTP Server訪問地址。

    http_get.port

    使用HTTP方式健康檢查時,檢查的HTTP Server端口號。

    initial_delay_seconds

    默認健康檢查開始的延時時間,默認為3秒。

    period_seconds

    配置每次健康檢查請求的間隔時間,默認為3秒。

    timeout_seconds

    配置每次健康檢查請求的超時時間,超過該時間請求為正確返回則判定為健康檢查失敗,默認為1秒。

    success_threshold

    健康檢查成功的閾值,如設(shè)置為2,則表示健康檢查成功2次判定為實例健康,開始啟動流量導入。

    failure_threshold

    健康檢查失敗的閾值,如設(shè)置為4,則表示健康檢查失敗4次后則判斷實例為不健康,開始停止流量導入。

    dockerAuth

    如果使用私有倉庫中的鏡像,則需要通過該參數(shù)指定Docker Registry的認證信息。目前,認證信息僅支持username:password的Base 64編碼形式。

    例如,username:password取值為abcd:abcde12345時,命令echo -n "abcd:abcde12345" | base64返回YWJjZDphYmNkZTEy****,即為dockerAuth的取值。

    metadata

    服務(wù)的Meta信息,詳細參數(shù)請參見命令使用說明

    name

    服務(wù)名稱,必須在同一地域內(nèi)唯一。

使用客戶端工具部署

  1. 通過客戶端工具的create命令部署模型服務(wù)。

eascmd create image.json

其中image.json表示上一步中創(chuàng)建的服務(wù)描述文件。

系統(tǒng)返回如下類似結(jié)果,包括服務(wù)的訪問地址和訪問Token。

[RequestId]: BFFFE5F5-1F07-437E-B59A-AF1F2B66****
+-------------------+-----------------------------------------------------------------------------------+
| Internet Endpoint | http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test    |
| Intranet Endpoint | http://182848887922***.vpc.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test|
|             Token | NjA4MzQxOWQ0MTY2M2Y4OGY0NjgwODkwZTZmYWJmZWU1ZmY0Njhk****                          |
+-------------------+-----------------------------------------------------------------------------------+
[OK] Service is now creating
[OK] Waiting [Total: 2, Pending: 2, Running: 0]
[OK] Running [Total: 2, Pending: 0, Running: 2]
[OK] Service is running
  1. 如果需要修改服務(wù)配置,則通過客戶端工具的modify命令實現(xiàn)。

修改上述服務(wù)的示例命令如下,關(guān)于modify命令的詳情信息,請參見修改服務(wù)配置

eascmd modify registry_test -s image.json

其中:registry_test表示服務(wù)名稱;image.json表示服務(wù)描述文件。

使用控制臺部署image

上圖的示例中演示了使用用戶自建私有倉庫來部署的場景,同時配置了訪問倉庫的用戶名和密碼。模型和代碼均以O(shè)SS存儲掛載的方式掛載到服務(wù)實例中,生成的完整配置如下所示。

{
  "metadata": {
    "name": "image_test",
    "instance": 1
  },
  "storage": [
    {
      "mount_path": "/models/",
      "oss": {
        "path": "oss://example-cn-beijing/models/",
        "readOnly": true
      }
    },
    {
      "mount_path": "/root/code",
      "oss": {
        "path": "oss://example-cn-beijing/processors/",
        "readOnly": true
      }
    }
  ],
  "containers": [
    {
      "image": "myharbor.com/xxx/yyy:zzz",
      "script": "python /root/code/app.py",
      "port": 8000,
      "prepare": {
        "pythonRequirementsPath": "/root/code/requirements.txt"
      },
      "env": [
        {
          "name": "var_name",
          "value": "var_value"
        }
      ]
    }
  ],
  "dockerAuth": "YWJjOmJjZA=="
}

服務(wù)請求

模型服務(wù)部署后,可在控制臺服務(wù)詳情頁面中獲取到服務(wù)的訪問地址,通過eascmd desc命令也可以獲取到服務(wù)的訪問地址。假設(shè)為用戶使用如下Flask代碼在鏡像中構(gòu)建了一個API服務(wù)。

from flask import Flask
 
app = Flask(__name__)
 
@app.route('/hello/model')
def hello_world():
    return 'Hello World'
 
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8000)

上述代碼中提供了一個Web服務(wù),訪問路徑為/hello/model,則對于同步服務(wù)在進行訪問服務(wù)時,需要在該訪問地址后加上鏡像中的訪問路徑。

例如在服務(wù)調(diào)用頁面獲取到的服務(wù)的公網(wǎng)訪問地址為:http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test

則對于上述的鏡像服務(wù)要請求/hello/model路徑時,最終的訪問地址為:

http://182848887922***.cn-shanghai.pai-eas.aliyuncs.com/api/predict/image_test/hello/model

關(guān)于服務(wù)請求的更多信息,詳情請參見服務(wù)調(diào)用方式

附錄:服務(wù)配置示例

使用PythonRequirements

{
  "name": "image_test",
  "containers": [
    {
      "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
      "prepare": {
        "pythonRequirements": [
          "numpy==1.16.4",
          "absl-py==0.11.0"
        ]
      },
      "command": "python app.py",
      "port": 8000
    }
  ],
  "metadata": {
    "instance": 1
  }
}

自定義健康檢查

{
   "name": "image_test",
   "containers": [
     {
       "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
       "command": "python app.py",
       "port": 8000,
       "health_check":{
         "http_get": {
           "path": "/",
           "port": 8000
         },
         "initial_delay_seconds": 3,
         "period_seconds": 3,
         "timeout_seconds": 1,
         "success_threshold": 2,
         "failure_threshold": 4
       }
     }
   ],
   "metadata": {
      "instance": 1
     }
}

使用GRPC協(xié)議

{
  "name": "image_test",
  "containers": [
    {
      "image": "registry-vpc.cn-shanghai.aliyuncs.com/xxx/yyy:zzz",
      "command": "python app.py",
      "port": 8000
    }
  ],
  "metadata": {
    "instance": 1,
    "enable_grpc": true
  }
}

相關(guān)文檔

  • 關(guān)于服務(wù)部署原理,詳情請參見服務(wù)部署概述

  • 服務(wù)部署成功后,在業(yè)務(wù)負載出現(xiàn)顯著的波峰波谷時,您可以開啟水平自動擴縮容功能,詳情請參見水平自動擴縮容功能