本文為您介紹線上預測的相關問題。
服務長時間處於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調用地址是內網SLB+網關的模式(公網地址是公網SLB+網關),這是比較經典的請求模式,在這種模式下請求需要通過SLB的4層轉寄和網關的7層轉寄之後到達服務執行個體,在大流量高並發的情境中通過轉寄會帶來一定的效能開銷,同時網關也會有頻寬的限制(預設1 Gbps)。EAS暫不提供付費的可擴縮的專屬網關,專屬網關會給使用者帶來額外的資源和流量成本。相反EAS提供了高速直連的訪問模式,既解決了效能和擴充性的問題,也無須增加額外的成本。在開通直連後,相當於打通了使用者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模式下服務端逾時預設逾時時間為5s,可通過服務的metadata.rpc.keepalive參數來修改,逾時時間到達後服務端會關閉該串連,並在服務端的監控中記錄一個408狀態代碼。
用戶端逾時中斷連線:用戶端的逾時時間由使用者調用端代碼中設定的逾時時間決定,逾時未返回HTTP用戶端會主動中斷連線,此時服務端監控中會記錄一個499狀態代碼。
關於服務要求狀態代碼的詳細說明請參考:附錄:服務狀態代碼說明。
Tensorflow/Pytorch processor部署的服務要求或線上調試失敗,如何解決?
TensorFlow/PyTorch Processor出於效能考慮Request Body是非明文的protobuf格式,目前線上調試只能支援明文的文字格式設定的輸入,因此暫時無法在控制台上直接進行線上調試,而需要使用我們配套提供的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:配置為服務要求資料。