在EAS中,可以通過一個JSON格式的設定檔來定義和部署線上服務。當準備好JSON設定檔後,便可通過EAS控制台、EASCMD用戶端或SDK等多種方式完成服務部署。
一、準備JSON設定檔
部署服務的核心是建立一個包含所有必需配置的JSON檔案。對於初次使用者,建議在控制台的服務部署頁面進行基礎配置,系統會自動產生對應的JSON內容,可以在此基礎上進行修改和擴充。
樣本檔案service.json如下,完整的參數列表及詳細描述參見附錄:JSON參數說明。
{
"metadata": {
"name": "demo",
"instance": 1,
"workspace_id": "****"
},
"cloud": {
"computing": {
"instances": [
{
"type": "ecs.c7a.large"
}
]
}
},
"containers": [
{
"image": "eas-registry-vpc.cn-hangzhou.cr.aliyuncs.com/pai-eas/python-inference:py39-ubuntu2004",
"script": "python app.py",
"port": 8000
}
]
}二、使用JSON檔案部署服務
控制台
登入PAI控制台,在頁面上方選擇目標地區,並在右側選擇目標工作空間,然後單擊進入EAS。
在推理服務頁簽,單擊部署服務。在部署服務頁面,選擇。
輸入準備好的JSON檔案,單擊部署。等待一段時間,當服務狀態變為運行中時,表明服務部署成功。
EASCMD
通過用戶端工具EASCMD,可以在自己伺服器上對模型服務進行管理,包括建立、查看、刪除及更新服務。具體操作步驟如下:
下載並認證用戶端
如果您使用的是DSW開發環境並使用官方鏡像,則已預置EASCMD用戶端(路徑:
/etc/dsw/eascmd64),否則請下載並認證用戶端。執行部署命令
在JSON檔案所在目錄,執行以下命令部署服務。以Windows64版本為例。更多操作請參見命令使用說明。
eascmdwin64.exe create <service.json>其中:<service.json>需要替換為實際的JSON檔案名稱。
說明如果您使用的是DSW開發環境,需要上傳JSON設定檔,請參見上傳與下載檔案。
系統返回如下類似結果。
[RequestId]: 1651567F-8F8D-4A2B-933D-F8D3E2DD**** +-------------------+----------------------------------------------------------------------------+ | Intranet Endpoint | http://166233998075****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/test_eascmd | | Token | YjhjOWQ2ZjNkYzdiYjEzMDZjOGEyNGY5MDIxMzczZWUzNGEyMzhi**** | +-------------------+--------------------------------------------------------------------------+ [OK] Creating api gateway [OK] Building image [registry-vpc.cn-shanghai.aliyuncs.com/eas/test_eascmd_cn-shanghai:v0.0.1-20221122114614] [OK] Pushing image [registry-vpc.cn-shanghai.aliyuncs.com/eas/test_eascmd_cn-shanghai:v0.0.1-20221122114614] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Waiting [Total: 1, Pending: 1, Running: 0] [OK] Service is running
附錄:JSON參數說明
參數 | 是否必選 | 描述 |
metadata | 是 | 服務的Meta資訊。具體參數配置,詳情請參見metadata參數說明。 |
cloud | 否 | 計算資源與專用網路配置,詳情請參見cloud參數說明。 |
containers | 否 | 鏡像配置,詳情參見containers參數說明。 |
dockerAuth | 否 | 當鏡像來源於私人倉庫時,需配置dockerAuth,值為鏡像倉庫的 |
networking | 否 | 服務的調用配置。具體參數配置,詳情請參見networking參數說明。 |
storage | 否 | 表示服務儲存掛載等相關資訊。詳細配置說明,請參見儲存掛載。 |
token | 否 | 表示訪問鑒權的Token字串。如果未指定,則系統自動產生。 |
aimaster | 否 | 為多機分布式推理服務開啟算力檢測與容錯。 |
model_path | 是 | 使用processor部署時必選。model_path和processor_path分別為模型和Processor的輸入資料來源地址,均支援以下格式的地址:
|
oss_endpoint | 否 | OSS的Endpoint,例如oss-cn-beijing.aliyuncs.com。其他取值請參見地區和Endpoint。 說明 預設無需指定該參數,會使用當前地區的內網OSS地址,來進行模型檔案或Processor檔案的下載。當跨地區訪問OSS時,需要指定該參數。例如:當您在杭州地區部署服務時,model_path中填寫了北京地區的OSS地址,則需要使用該參數來指定北京地區的OSS公網訪問地址。 |
model_entry | 否 | 表示模型的入口檔案,可以包含任意檔案。如果未指定,則使用model_path中的檔案名稱。主檔案路徑會傳遞給Processor中的initialize()函數。 |
model_config | 否 | 表示模型的配置,支援任意文本。該參數值會傳遞給Processor中initialize()函數的第二個參數。 |
processor | 否 |
|
processor_path | 否 | Processor相關的檔案包路徑,可以參見model_path參數的描述資訊。 |
processor_entry | 否 | Processor的主檔案。例如libprocessor.so或app.py,其中包含了預測所需的 當processor_type為cpp或python時,必須指定該參數。 |
processor_mainclass | 否 | Processor的主檔案,JAR包中的mainclass。例如com.aliyun.TestProcessor。 當processor_type為java時,必須指定該參數。 |
processor_type | 否 | processor實現的語言,取值如下:
|
warm_up_data_path | 否 | 用於模型預熱的請求檔案路徑。更多關於模型預熱功能的介紹,詳情請參見模型服務預熱。 |
runtime.enable_crash_block | 否 | 當服務執行個體因Processor代碼異常發生Crash後,服務執行個體是否會自動重啟。取值如下:
|
autoscaler | 否 | 表示模型服務自動水平擴縮容的配置資訊。具體參數配置,詳情請參見水平自動擴縮容。 |
labels | 否 | 為EAS服務配置標籤。格式為 |
unit.size | 否 | 表示分布式推理配置下單一實例部署的機器數。預設值為2。 |
sinker | 否 | 支援將服務所有的請求和響應記錄持久化儲存到巨量資料MaxCompute或Log ServiceSLS中。具體參數配置,詳情請參見sinker參數說明。 |
confidential | 否 | 通過配置系統信任管理服務,保證服務部署和調用的過程中資料、模型和代碼等資訊可以安全加密,實現安全可驗證的推理服務。格式如下: 說明 安全加密環境主要針對您掛載的隱藏檔,請先完成隱藏檔的掛載再開啟該功能。 參數配置說明如下。
|
metadata參數說明
進階參數
cloud參數說明
參數 | 是否必選 | 描述 | |
computing | instances | 否 | 使用公用資源群組部署服務時,需設定該參數,表示使用的資源規格列表。當執行個體規格競價失敗或庫存不足時,按照配置順序依次嘗試使用下一個執行個體規格建立服務。
|
disable_spot_protection_period | 否 | 使用競價執行個體時,需設定該參數,取值如下:
| |
networking | vpc_id | 否 | 分別表示為EAS服務綁定的Virtual Private Cloud、交換器和安全性群組。 |
vswitch_id | 否 | ||
security_group_id | 否 | ||
樣本如下:
{
"cloud": {
"computing": {
"instances": [
{
"type": "ecs.c8i.2xlarge",
"spot_price_limit": 1
},
{
"type": "ecs.c8i.xlarge",
"capacity": "20%"
}
],
"disable_spot_protection_period": false
},
"networking": {
"vpc_id": "vpc-bp1oll7xawovg9*****",
"vswitch_id": "vsw-bp1jjgkw51nsca1e****",
"security_group_id": "sg-bp1ej061cnyfn0b*****"
}
}
}containers參數說明
使用自訂鏡像部署服務時,詳情請參見自訂鏡像。
參數 | 是否必選 | 描述 | |
image | 是 | 使用鏡像部署時必填。用於部署模型服務的鏡像地址。 | |
env | name | 否 | 鏡像執行時的環境變數名稱。 |
value | 否 | 鏡像執行時的環境變數取值。 | |
command | 二者必選其一 | 鏡像的入口命令,只支援單一命令形式,不支援複雜指令碼,如:cd xxx && python app.py,這種形式請使用下面的script參數來指定,command欄位適應於鏡像中無/bin/sh命令的情境。 | |
script | 鏡像的入口執行的指令碼,可指定較為複雜的指令碼形式,多行以\n或分號分隔。 | ||
port | 否 | 容器連接埠。 重要
| |
prepare | pythonRequirements | 否 | 執行個體啟動前安裝的python requirements列表,要求鏡像中在系統路徑中存在python和pip命令,list格式,如: |
pythonRequirementsPath | 否 | 執行個體啟動前安裝的python requirements.txt檔案地址,要求鏡像中在系統路徑中存在Python和pip命令,requirements.txt可直接打在鏡像中,也可以由外部儲存掛載的方式掛載到服務執行個體中,如: | |
networking參數說明
參數 | 是否必選 | 描述 |
gateway | 否 | 為EAS服務配置的專屬網關。 |
gateway_policy | 否 |
限流配置樣本: |
sinker參數說明
參數 | 是否必選 | 描述 | |
type | 否 | 支援配置以下兩種儲存類型:
| |
config | maxcompute.project | 否 | MaxCompute專案名稱。 |
maxcompute.table | 否 | MaxCompute資料表。 | |
sls.project | 否 | SLS專案名稱。 | |
sls.logstore | 否 | SLS的Logstore。 | |
配置樣本如下:
儲存到MaxCompute
"sinker": {
"type": "maxcompute",
"config": {
"maxcompute": {
"project": "cl****",
"table": "te****"
}
}
}儲存到Log ServiceSLS
"sinker": {
"type": "sls",
"config": {
"sls": {
"project": "k8s-log-****",
"logstore": "d****"
}
}
}附錄:JSON配置樣本
上述參數在JSON檔案中的配置樣本如下:
{
"token": "****M5Mjk0NDZhM2EwYzUzOGE0OGMx****",
"processor": "tensorflow_cpu_1.12",
"model_path": "oss://examplebucket/exampledir/",
"oss_endpoint": "oss-cn-beijing.aliyuncs.com",
"model_entry": "",
"model_config": "",
"processor_path": "",
"processor_entry": "",
"processor_mainclass": "",
"processor_type": "",
"warm_up_data_path": "",
"runtime": {
"enable_crash_block": false
},
"unit": {
"size": 2
},
"sinker": {
"type": "maxcompute",
"config": {
"maxcompute": {
"project": "cl****",
"table": "te****"
}
}
},
"cloud": {
"computing": {
"instances": [
{
"capacity": 800,
"type": "dedicated_resource"
},
{
"capacity": 200,
"type": "ecs.c7.4xlarge",
"spot_price_limit": 3.6
}
],
"disable_spot_protection_period": true
},
"networking": {
"vpc_id": "vpc-bp1oll7xawovg9t8****",
"vswitch_id": "vsw-bp1jjgkw51nsca1e****",
"security_group_id": "sg-bp1ej061cnyfn0b****"
}
},
"autoscaler": {
"min": 2,
"max": 5,
"strategies": {
"qps": 10
}
},
"storage": [
{
"mount_path": "/data_oss",
"oss": {
"endpoint": "oss-cn-shanghai-internal.aliyuncs.com",
"path": "oss://bucket/path/"
}
}
],
"confidential": {
"trustee_endpoint": "xx",
"decryption_key": "xx"
},
"metadata": {
"name": "test_eascmd",
"resource": "eas-r-9lkbl2jvdm0puv****",
"instance": 1,
"workspace_id": "1405**",
"gpu": 0,
"cpu": 1,
"memory": 2000,
"gpu_memory": 10,
"gpu_core_percentage": 10,
"qos": "",
"cuda": "11.2",
"enable_grpc": false,
"enable_webservice": false,
"rdma": 1,
"rpc": {
"batching": false,
"keepalive": 5000,
"io_threads": 4,
"max_batch_size": 16,
"max_batch_timeout": 50,
"max_queue_size": 64,
"worker_threads": 5,
"rate_limit": 0,
"enable_sigterm": false
},
"rolling_strategy": {
"max_surge": 1,
"max_unavailable": 1
},
"eas.termination_grace_period": 30,
"scheduling": {
"spread": {
"policy": "host"
}
},
"resource_rebalancing": false,
"workload_type": "elasticjob",
"shm_size": 100
},
"features": {
"eas.aliyun.com/extra-ephemeral-storage": "100Gi",
"eas.aliyun.com/gpu-driver-version": "tesla=550.127.08"
},
"networking": {
"gateway": "gw-m2vkzbpixm7mo****"
},
"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
}
],
"dockerAuth": "dGVzdGNhbzoxM*******"
}