全部產品
Search
文件中心

Platform For AI:彈性Job服務

更新時間:Nov 29, 2024

EAS彈性Job服務支援訓練和推理情境。在訓練情境中,支援一個執行個體(Job)內迴圈執行任務,根據隊列長度自動擴縮容。在推理情境中,能感知每個請求的執行進度,做到更公平的任務調度。本文為您介紹如何使用彈性Job服務。

使用情境

訓練情境

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

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

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

推理情境

彈性Job服務在模型推理情境中,能感知每個請求的執行進度實現更公平的任務調度

對於回應時間較長的推理服務,建議使用EAS非同步推理服務,但非同步服務存在以下問題:

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

  • 服務執行個體縮容時不能保證當前執行個體退出時內部請求已處理完畢,可能導致請求中斷重新調度。

針對這些問題,彈性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的預置鏡像地址為: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服務時,需設定taskTypecommandquery來標識。其中:

  • 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彈性Job服務提供了enable_write_log_to_queue配置,通過該配置可以將即時日誌寫入隊列。

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

  • 推理情境:預設關閉,日誌只能通過stdout輸出。

相關文檔

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