全部產品
Search
文件中心

Platform For AI:彈性Job服務功能介紹

更新時間:Jul 13, 2024

EAS彈性Job服務支援訓練和推理情境,相較於非同步推理服務提供了可複用且能夠Auto Scaling的Job服務。在訓練情境中,有效解決多個執行個體(Job)並發執行時,執行個體(Job)頻繁建立和釋放導致的資源浪費問題。同時在推理情境能感知每個請求的執行進度,做到更公平的任務調度。本文為您介紹如何使用彈性Job服務。

使用情境

訓練情境

彈性Job服務用於訓練情境:

  • 功能實現

    實現了前後端分離架構,支援部署常駐的前端服務與彈性Job服務。

  • 架構優勢

    前端服務通常只需較低的資源配置,價格低廉。前端服務常駐可以避免頻繁建立前端服務,減少等待時間。後端彈性Job服務支援在一個執行個體(Job)內迴圈多次執行訓練任務,避免任務在多次執行過程中執行個體(Job)被反覆拉起和釋放,提升服務吞吐效率。同時,後端彈性Job服務會在隊列長度過長或過短時自動進行擴縮容,保證資源的高效利用。

推理情境

彈性Job服務用於模型推理情境,能夠感知每個請求的執行進度做到更公平的任務調度

對於回應時間較長的推理服務,一般建議使用EAS非同步推理服務的形式來部署,但非同步服務存在以下兩個問題:

  • 佇列服務推送請求時不能保證優先推送給閒置執行個體,導致資源不能被充分利用。

  • 服務執行個體縮容時不能保證當前執行個體退出時內部請求已處理結束,會導致正在處理的請求被中斷,然後被調度到其他執行個體重新執行。

針對以上問題,彈性Job服務進行了以下處理:

  • 最佳化了訂閱邏輯,保證將請求優先推送到空閑執行個體。在彈性Job執行個體退出前會阻塞等待保證當前處理的請求執行結束。

  • 在擴縮容上更加高效,不同於普通監控服務的定期上報機制,彈性Job服務在佇列服務內部內建了監控服務,實現了Job情境下專用的監控服務採集鏈路,保證隊列長度超過閾值時能快速觸發擴容,將擴縮容的回應時間從分鐘級降低到10秒左右。

基本架構

整體架構由佇列服務、HPA控制器和彈性Job服務三部分組成,如下圖所示。image.png

實現邏輯如下:

  • 通過佇列服務將請求或任務的下發和執行進行解耦,從而實現同一個彈性Job服務可以執行多個不同請求或任務。

  • 通過HPA控制器來持續監聽佇列服務中待執行的訓練任務和請求的數量,實現對彈性Job服務執行個體個數的Auto Scaling。其中彈性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(水平自動擴縮容)的功能。

部署訓練服務

支援整合部署獨立部署兩種方式。具體的實現邏輯和配置詳情說明如下,具體部署方法,請參見部署Auto Scaling的Kohya訓練服務

  • 實現邏輯

    image.png

    • 整合部署:EAS除了建立佇列服務和彈性Job服務外,還會建立一個前端服務。前端服務主要負責接收使用者請求,並將使用者請求轉寄到佇列服務中。您可以將前端服務理解成彈性Job服務的用戶端。在此模式下,彈性Job服務會被綁定到唯一的前端服務上,此時彈性Job服務只能執行當前前端服務下發的訓練任務。

    • 獨立部署:獨立部署適用於多使用者情境,在此模式下彈性Job服務作為公用的後端服務,可以和多個前端服務綁定,每個使用者都可以在自己的前端服務下發訓練任務,後端Job服務會建立對應的Job執行個體來執行訓練任務,並且每個Job執行個體可以依次執行不同的訓練任務,實現多個使用者共用訓練資源。不用多次建立訓練任務,有效降低使用成本。

  • 配置說明

    在部署彈性Job服務時,您需要提供一個自訂鏡像環境(kohya情境可以直接使用EAS預置的kohya_ss鏡像)。該鏡像需包含執行訓練任務的所有依賴,只是作為訓練任務的執行環境,因此不需要配置啟動命令和連接埠號碼。如果您需要在訓練任務開始前執行一些初始化任務,可以配置初始化命令,EAS會在執行個體(Job)內部單獨建立一個進程來執行初始化任務。如何準備自訂鏡像,請參見服務部署:自訂鏡像。EAS的預置鏡像如下所示:

     "containers": [
        {
          "image": "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:用來標識推理服務。

通過HTTP或SDK調用服務時,需要顯式指定taskType,樣本如下:

  • HTTP調用時需要將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。

    # 建立輸入隊列,用於發送任務或請求。
    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彈性Job服務提供了enable_write_log_to_queue配置,通過該配置擷取即時日誌。

{
  "scalable_job": {
    "enable_write_log_to_queue": true
  }
}
  • 在訓練情境中,該配置預設開啟,系統會將即時日誌回寫到輸出隊列,您可以通過EAS佇列服務的SDK即時擷取訓練日誌。詳情請參見自訂前端服務鏡像調用彈性Job服務

  • 在推理情境中,該配置預設關閉,日誌只能通過stdout輸出。

相關文檔

關於EAS彈性Job服務更詳細的使用情境介紹,請參見: