本文為您介紹線上預測的相關問題。
服務長時間處於Waiting(等待中)狀態,如何解決?
服務在部署階段後會進入到Waiting(等待中)狀態,等待資源調度和服務執行個體啟動。當所有服務執行個體均啟動成功後,服務會進入到Running(運行中)狀態。如果服務狀態長時間處於等待中時,通常可以通過服務詳情頁面的服務執行個體列表,查看服務執行個體的狀態來定位具體原因。原因一般分為如下兩類:
資源不足:服務執行個體列表中所有執行個體或部分執行個體狀態為Pending。
大部分原因在於專屬資源群組中空閑資源不足,導致執行個體無法調度。如下圖所示:
此時,您可以檢查專屬資源群組中的機器節點是否有足夠多的空閑資源(包括CPU、Memory和GPU)。如果一個執行個體需要3核4 GB的資源,那麼在專屬資源群組中需要至少一個機器節點有3核4 GB的空閑資源。
重要為避免在高負載時出現系統故障,機器節點需要預留1個核給系統組件,能調度的資源需要在總資源中減少一個核。
專屬資源群組節點列表如下圖所示。如何查看資源群組詳情,請參見管理專屬資源群組。
執行個體健全狀態檢查未完成:服務執行個體狀態為Running,但容器狀態一般為[0/1]或[1/2]。
正斜線(/)前面的數字表示啟動成功的容器數量,正斜線(/)後面的數字表示總的容器數量。當您使用自訂鏡像來部署服務時,執行個體中會自動注入一個Sidecar容器用於服務的流量控制與監控採集等工作,您無需關心該容器。在控制台您會看到總容器數量為2,即包含了您的自訂容器和引擎的Sidecar容器。此時,需要2個容器狀態都為Ready時,服務執行個體才被視為啟動完成,並開始接收流量。
服務處於Failed(失敗)狀態,如何解決?
服務會在以下兩種情況處於Failed狀態:
服務部署階段:如果部署時指定的資源(如模型地址等)不存在,服務的目前狀態資訊中將顯示報錯原因,通常您可以根據報錯資訊判斷出部署失敗的原因。
服務啟動階段:在服務完成部署並調度到資源開始啟動時失敗,此時會出現狀態資訊
Instance <network-test-5ff76448fd-h9dsn> not healthy: Instance crashed, please inspect instance log.
。該狀態資訊表示服務中某個執行個體啟動失敗,此時您需要在服務詳情頁面的服務執行個體列表中查看失敗狀態,來判斷具體的失敗原因。執行個體失敗有如下幾種情況:
服務執行個體在啟動階段因記憶體用超發生OOM被系統殺掉,這種情況需要調大服務記憶體來重新部署。執行個體狀態如下圖所示:
服務在啟動階段代碼錯誤發生Crash,該情況下上次狀態為Error(error code),您需要單擊執行個體操作列下的日誌按鈕進一步排查服務日誌,來定位服務啟動失敗的原因。執行個體狀態如下圖所示:
服務鏡像拉取失敗,這種情況在執行個體列表中您可以看到執行個體狀態為Pending,上次退出原因為ImagePullBackOff。執行個體狀態如下圖所示:
當您使用自訂鏡像部署服務時,如果自訂鏡像地址拉取失敗,通常會出現ImagePullBackOff的情況。您可做如下幾個方面的檢查:
鏡像地址是否正確。EAS線上服務內部預設與公網不通,預設無法拉取公網鏡像地址。如果使用個人版ACR鏡像,請使用同地區的內網VPC地址來部署。如需使用公網地址來拉取鏡像,請參考下一常見問題:EAS服務內部如何訪問公網?
當您選擇ACR企業版執行個體中的鏡像時,ACR企業版執行個體的專用網路配置需要和EAS的網路直連配置一致,配置方法如下:
ACR企業版執行個體專用網路配置:配置專用網路的存取控制。
EAS專屬資源群組直連配置:配置資源群組網路連通。
EAS公用資源群組直連配置:配置資源群組網路連通。
請判斷鑒權資訊是否正確。您在控制台上對EAS做過一鍵授權之後,即可對ACR鏡像倉庫中的鏡像進行免密拉取。個人版鏡像倉庫直接填鏡像地址即可,企業版鏡像倉庫需要在服務配置中通過
"cloud.docker_registry.instance_id": "cr_xxx"
欄位來指定企業版鏡像倉庫的執行個體ID。在使用第三方鏡像倉庫的情況下,您可以使用dockerAuth欄位來指定鏡像倉庫下載的使用者名稱和密碼。
EAS服務內部如何訪問公網?
EAS服務內部預設不通公網,如果您有訪問公網的需求,則需要通過開通到您的VPC的網路直連來實現公網訪問,同時需要確保在開通直連時選擇的VPC自身具有公網訪問的能力。若您的VPC不具備公網訪問能力,則需要為該VPC通過建立NAT Gateway來開通公網訪問能力。EAS開通直連的方法可參考文檔:
專屬資源群組直連配置:配置資源群組網路連通。
公用資源群組直連配置:配置資源群組網路連通。
服務VPC地址調用和VPC高速直連調用有什麼區別?
VPC地址調用:VPC地址調用是內網SLB+網關的模式(公網地址是公網SLB+網關),這是比較經典的請求模式。在這種模式下,請求需要通過SLB的4層轉寄和網關的7層轉寄之後到達服務執行個體。在大流量高並發的情境中,通過轉寄會帶來一定的效能開銷,同時網關也會有頻寬的限制(預設1 Gbps)。
VPC高速直連:EAS提供了高速直連的訪問模式,既解決了效能和擴充性的問題,也無須增加額外的成本。開通VPC高速直連後,相當於打通了您的VPC和EAS服務VPC之間的網路通路。您的請求通過EAS提供的服務發現功能對服務進行定址,並在用戶端代碼中通過軟負載的方式發起負載平衡的服務要求。這個過程需要使用EAS提供的SDK來進行訪問,並將endpoint_type設定為DIRECT即可。
例如在Python SDK使用說明的情境中,您可通過在代碼中增加如下一行代碼,來將調用由網關改為直連:
client = PredictClient('http://pai-eas-vpc.cn-hangzhou.aliyuncs.com', 'mnist_saved_model_example') client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # Direct link client.init()
服務日誌中出現[WARN] connection is closed: End of file或Write a Invalid stream: End of file,如何解決?
用戶端與服務端之間的串連斷開,服務端在向該串連中回寫請求結果時,發現串連已斷開後所打的warning日誌,串連斷開一般分兩種情況:
服務端逾時中斷連線:在Processor模式下,服務端預設逾時時間為5秒,您可以通過服務的
metadata.rpc.keepalive
參數來修改。在逾時時間到達後,服務端將關閉該串連,並在服務端的監控中記錄一個408狀態代碼。用戶端逾時中斷連線:用戶端的逾時時間由您的調用端代碼中設定的逾時時間決定。因逾時未返回HTTP響應,用戶端會主動中斷連線,此時服務端的監控記錄中會記錄一個499狀態代碼。
關於服務要求狀態代碼的詳細說明,請參見:附錄:服務狀態代碼說明。
Tensorflow/Pytorch processor部署的服務要求線上調試失敗,如何解決?
出於效能考慮,TensorFlow/PyTorch Processor的Request Body採用非明文的protobuf格式。目前線上調試僅支援明文的文字格式設定輸入,因此該服務暫時無法在控制台上直接進行線上調試。您可以使用EAS配套提供的SDK來進行請求訪問,各語言版本SDK可參考:服務調用SDK。
為什麼RAM使用者無法自動建立或刪除EAS服務關聯角色?
只有擁有指定許可權的使用者才能自動建立或刪除AliyunServiceRoleForPaiEas。因此,當RAM使用者無法自動建立或刪除AliyunServiceRoleForPaiEas時,您需要為其添加相應的權限原則,具體操作方法如下:
通過指令碼配置的方式將如下權限原則建立為自訂策略。具體操作,請參見建立自訂權限原則。
{ "Statement": [ { "Action": "ram:CreateServiceLinkedRole", "Resource": "*", "Effect": "Allow", "Condition": { "StringEquals": { "ram:ServiceName": "eas.pai.aliyuncs.com" } } } ], "Version": "1" }
將上一步建立的自訂策略授權給目標RAM使用者。具體操作,請參見方式一:在RAM使用者頁面為RAM使用者授權。
如何刪除預付費專屬資源群組的機器執行個體?
預付費機器未到期前無法直接刪除退訂,如有特殊原因需刪除,請聯絡您的商務經理來處理。
如何使用curl命令調用EAS線上服務?
EAS線上服務部署成功後,使用curl命令通過公網地址或VPC地址調用服務。具體操作步驟如下:
擷取服務訪問地址和Token。
在模型線上服務(EAS)頁面,單擊目標服務進入服務詳情頁面。
在基本資料地區中,單擊查看調用資訊。
在調用資訊對話方塊的公網地址調用或VPC地址調用頁簽,分別擷取服務的訪問地址和Token。
使用curl命令調用服務。
樣本如下:
$ curl <service_url> -H 'Authorization: <service_token>' -d '[{"sex":0,"cp":0,"fbs":0,"restecg":0,"exang":0,"slop":0,"thal":0,"age":0,"trestbps":0,"chol":0,"thalach":0,"oldpeak":0,"ca":0}]'
其中:
<service_url>:替換為已擷取的服務訪問地址。
<service_token>:替換為已擷取的Token。
-d:配置為服務要求資料。