彈性Job服務
EAS彈性Job服務支持訓練和推理場景。在訓練場景中,支持一個實例(Job)內循環執行任務,根據隊列長度自動擴縮容。在推理場景中,能感知每個請求的執行進度,做到更公平的任務調度。本文為您介紹如何使用彈性Job服務。
使用場景
訓練場景
彈性Job服務用于訓練場景:
功能實現:前后端分離架構,支持部署常駐的前端服務與彈性Job服務。
架構優勢:前端服務通常資源需求低,價格低廉,常駐前端服務可避免頻繁創建前端服務,減少等待時間。后端彈性Job服務支持在一個實例(Job)內循環執行訓練任務,避免實例(Job)被反復拉起和釋放,提升吞吐效率。同時,后端彈性Job服務會在隊列長度過長或過短時自動進行擴縮容,保證資源高效利用。
推理場景
彈性Job服務在模型推理場景中,能感知每個請求的執行進度,實現更公平的任務調度。
對于響應時間較長的推理服務,建議使用EAS異步推理服務,但異步服務存在以下問題:
隊列服務推送請求時不能保證優先推送給空閑的實例,導致資源利用不足。
服務實例縮容時不能保證當前實例退出時內部請求已處理完畢,可能導致請求中斷重新調度。
針對這些問題,彈性Job服務進行了優化:
優化訂閱邏輯,優先推送請求到空閑實例。實例退出前阻塞等待當前請求處理完畢。
提高擴縮容效率,不同于定期上報機制,隊列服務內置監控服務,快速觸發擴容,將擴縮容的響應時間從分鐘級降低到10秒左右。
基本架構
整體框架由隊列服務、HPA控制器和彈性Job服務三部分組成,如下圖所示。
實現邏輯如下:
隊列服務解耦請求和任務的下發與執行,使一個彈性Job服務可以處理多個不同請求或任務。
HPA控制器監聽隊列服務中待執行的訓練任務和請求的數量,實現彈性Job服務實例的彈性伸縮。彈性Job服務自動擴縮容的默認配置如下,更多參數說明,請參見水平自動擴縮容功能。
{ "behavior":{ "onZero":{ "scaleDownGracePeriodSeconds":60 # 縮容到0的生效時間(秒)。 }, "scaleDown":{ "stabilizationWindowSeconds":1 # 縮容的生效時間(秒)。 } }, "max":10, # 實例(Job)的最大個數。 "min":1, # 實例(Job)的最小個數。 "strategies":{ "avg_waiting_length":2 # 每個實例(Job)的平均負載閾值。 } }
服務部署
部署推理服務
類似于創建異步推理服務,參照以下示例內容準備服務配置文件:
{
"containers": [
{
"image": "registry-vpc.cn-shanghai.aliyuncs.com/eas/eas-container-deploy-test:202010091755",
"command": "/data/eas/ENV/bin/python /data/eas/app.py",
"port": 8000,
}
],
"metadata": {
"name": "scalablejob",
"type": "ScalableJob",
"rpc.worker_threads": 4,
"instance": 1,
}
}
其中,type配置為ScalableJob,推理服務就會以彈性Job服務的形式部署。其他參數配置詳情,請參見服務模型所有相關參數說明。關于如何部署推理服務,請參見部署寫真相機在線推理服務。
服務部署成功后,會自動創建隊列服務和彈性Job服務,同時默認啟用Autoscaler(水平自動擴縮容)的功能。
部署訓練服務
支持集成部署與獨立部署兩種方式。具體的實現邏輯和配置詳情說明如下,具體部署方法,請參見部署彈性伸縮的Kohya訓練服務。
實現邏輯
集成部署:EAS除了創建隊列服務和彈性Job服務外,還會創建一個前端服務。前端服務主要負責接收用戶請求,并將用戶請求轉發到隊列服務中。您可以將前端服務理解成彈性Job服務的客戶端。在此模式下,彈性Job服務會被綁定到唯一的前端服務上,此時彈性Job服務只能執行當前前端服務下發的訓練任務。
獨立部署:獨立部署適用于多用戶場景,在此模式下彈性Job服務作為公共的后端服務,可以和多個前端服務綁定,每個用戶都可以在自己的前端服務下發訓練任務,后端Job服務會創建對應的Job實例來執行訓練任務,并且每個Job實例可以依次執行不同的訓練任務,實現多個用戶共享訓練資源。不用多次創建訓練任務,有效降低使用成本。
配置說明
在部署彈性Job服務時,您需要提供一個自定義鏡像環境(kohya場景可直接使用EAS預置的kohya_ss鏡像)。該鏡像需包含執行訓練任務的所有依賴,只是作為訓練任務的執行環境,因此不需要配置啟動命令和端口號。如果您需要在訓練任務開始前執行一些初始化任務,可以配置初始化命令,EAS會在實例(Job)內部單獨創建一個進程來執行初始化任務。如何準備自定義鏡像,請參見服務部署:自定義鏡像。EAS的預置鏡像地址為:eas-registry-vpc.cn-shanghai.cr.aliyuncs.com/pai-eas/kohya_ss:2.2。
集成部署
參照下方示例準備服務配置文件,以EAS提供的預置鏡像(kohya_ss)為例:
{ "containers": [ { "image": "eas-registry-vpc.cn-shanghai.cr.aliyuncs.com/pai-eas/kohya_ss:2.2" } ], "metadata": { "cpu": 4, "enable_webservice": true, "gpu": 1, "instance": 1, "memory": 15000, "name": "kohya_job", "type": "ScalableJobService" }, "front_end": { "image": "eas-registry-vpc.cn-shanghai.cr.aliyuncs.com/pai-eas/kohya_ss:2.2", "port": 8001, "script": "python -u kohya_gui.py --listen 0.0.0.0 --server_port 8001 --data-dir /workspace --headless --just-ui --job-service" } }
其中關鍵配置說明如下,其他參數配置說明,請參見服務模型所有相關參數說明。
將type配置為ScalableJobService。
前端服務使用的資源組默認和彈性Job服務相同,系統默認分配的資源為2核CPU和8 GB內存。
參考以下示例自定義配置資源組或資源:
{ "front_end": { "resource": "", # 修改前端服務使用專屬資源組。 "cpu": 4, "memory": 8000 } }
參考以下示例自定義配置部署的機型:
{ "front_end": { "instance_type": "ecs.c6.large" } }
獨立部署
參照下方示例準備服務配置文件,以EAS提供的預置鏡像(kohya_ss)為例:
{ "containers": [ { "image": "eas-registry-vpc.cn-shanghai.cr.aliyuncs.com/pai-eas/kohya_ss:2.2" } ], "metadata": { "cpu": 4, "enable_webservice": true, "gpu": 1, "instance": 1, "memory": 15000, "name": "kohya_job", "type": "ScalableJob" } }
其中,type需要配置為ScalableJob,其他參數配置說明,請參見服務模型所有相關參數說明。
在此模式下,需要用戶手動部署前端服務,并在前端服務內部實現請求的代理,將接收到的請求轉發到彈性Job服務的隊列內部,完成前端服務和后端Job服務的綁定,詳情請參見向隊列服務發送數據。
服務調用
為了區分訓練場景和推理場景,在調用彈性Job服務時,需設置taskType
為command
或query
來標識。其中:
command:用來標識訓練服務。
query:用來標識推理服務。
調用服務時需顯式地指定taskType,示例如下:
HTTP調用: 如果是推理服務,Wanted_TaskType替換為query。
curl http://166233998075****.cn-shanghai.pai-eas.aliyuncs.com/api/predict/scalablejob?taskType={Wanted_TaskType} -H 'Authorization: xxx' -D 'xxx'
SDK調用時需要指定tags,通過該參數來配置taskType。下面示例中,如果是推理服務,將 wanted_task_type替換為query。
# 創建輸入隊列,用于發送任務或請求。 queue_client = QueueClient('166233998075****.cn-shanghai.pai-eas.aliyuncs.com', 'scalabejob') queue_client.set_token('xxx') queue_client.init() tags = {"taskType": "wanted_task_type"} # 向輸入隊列發送任務或請求。 index, request_id = inputQueue.put(cmd, tags)
獲取結果:
推理服務:通過EAS隊列服務的SDK來獲取輸出隊列的結果,詳情請參見隊列服務訂閱推送。
訓練服務:建議部署服務時配置OSS掛載,將訓練結果直接保存到OSS路徑中做持久化存儲,詳情請參見部署彈性伸縮的Kohya訓練服務。
配置日志收集
EAS彈性Job服務提供了enable_write_log_to_queue
配置,通過該配置可以將實時日志寫入隊列。
{
"scalable_job": {
"enable_write_log_to_queue": true
}
}
訓練場景:默認開啟,實時日志回寫到輸出隊列,您可通過EAS隊列服務SDK實時獲取訓練日志。詳情請參見自定義前端服務鏡像調用彈性Job服務。
推理場景:默認關閉,日志只能通過stdout輸出。
相關文檔
關于EAS彈性Job服務更詳細的使用場景介紹,請參見: