捷徑

Kubernetes-MCAD

這包含 TorchX Kubernetes_MCAD 排程器,可用於透過多叢集應用程式調度器 (MCAD) 在 Kubernetes 叢集上執行 TorchX 元件。

先決條件

TorchX Kubernetes_MCAD 排程器依賴於 AppWrapper + MCAD。

安裝 MCAD:請參閱部署多叢集應用程式調度器指南 https://github.com/project-codeflare/multi-cluster-app-dispatcher/blob/main/doc/deploy/deployment.md

此實作需要 MCAD v1.34.1 或更高版本。

TorchX 使用 torch.distributed.run 來執行分散式訓練。

深入了解執行分散式訓練器 torchx.components.dist

類別 torchx.schedulers.kubernetes_mcad_scheduler.KubernetesMCADScheduler(session_name: str, client: Optional[ApiClient] = None, docker_client: Optional[DockerClient] = None)[來源]

基底: DockerWorkspaceMixin, Scheduler[KubernetesMCADOpts]

KubernetesMCADScheduler 是一個用於 Kubernetes 的 TorchX 排程介面。

重要資訊:需要在 Kubernetes 叢集上安裝 AppWrapper/MCAD。TorchX 需要叢集排程才能執行多複本/多角色執行。請注意,AppWrapper/MCAD 支援 Kubernetes 上任何應用程式包裝作業之間的叢集排程。但是,對於真正的叢集排程,需要將 AppWrapper/MCAD 與額外的 Kubernetes 共同排程器一起使用。如需安裝說明,請參閱:https://github.com/project-codeflare/multi-cluster-app-dispatcher/blob/main/doc/deploy/deployment.md

已確認這適用於 MCAD 主要分支 v1.34.1 或更高版本,以及 OpenShift Kubernetes 用戶端版本:4.10.13 伺服器版本:4.9.18 Kubernetes 版本:v1.22.3+e790d7f

$ torchx run --scheduler kubernetes_mcad --scheduler_args namespace=default,image_repo=<your_image_repo> utils.echo --image alpine:latest --msg hello
...

TorchX-MCAD 排程器可以在 Kubernetes 上與輔助排程器一起使用。若要啟用此功能,使用者必須提供共同排程器的名稱。有了這項功能,會為每個 TorchX 角色定義一個 PodGroup,並且共同排程器會處理 Kubernetes 叢集上的輔助排程。如需其他資源,請參閱:1. PodGroup 和共同排程:https://github.com/kubernetes-sigs/scheduler-plugins/tree/release-1.24/pkg/coscheduling 2. 安裝輔助排程器:https://github.com/kubernetes-sigs/scheduler-plugins/blob/release-1.24/doc/install.md 3. PodGroup CRD:https://github.com/kubernetes-sigs/scheduler-plugins/blob/release-1.24/config/crd/bases/scheduling.sigs.k8s.io_podgroups.yaml

MCAD 排程器支援 AppWrapper 層級的優先順序,以及在具有 PriorityClass 定義的叢集上選擇性地在 Pod 層級支援優先順序。在 AppWrapper 層級,較高的整數值表示較高的優先順序。Kubernetes 叢集可能還有其他可以在 Pod 層級套用的 PriorityClass 定義。雖然可以獨立設定這些不同層級的優先順序,但建議諮詢您的 Kubernetes 叢集管理員,以查看是否有適用的額外指南。如需 Kubernetes PriorityClass 的詳細資訊,請參閱:https://kubernetes.dev.org.tw/docs/concepts/scheduling-eviction/pod-priority-preemption/

若要使用網路選項,Kubernetes 叢集必須安裝 multus。如需 multus 安裝說明以及如何設定網路自訂網路附加定義,請參閱:https://github.com/k8snetworkplumbingwg/multus-cni/blob/master/docs/how-to-use.md

設定選項

    usage:
        [namespace=NAMESPACE],[image_repo=IMAGE_REPO],[service_account=SERVICE_ACCOUNT],[priority=PRIORITY],[priority_class_name=PRIORITY_CLASS_NAME],[image_secret=IMAGE_SECRET],[coscheduler_name=COSCHEDULER_NAME],[network=NETWORK]

    optional arguments:
        namespace=NAMESPACE (str, default)
            Kubernetes namespace to schedule job in
        image_repo=IMAGE_REPO (str, None)
            The image repository to use when pushing patched images, must have push access. Ex: example.com/your/container
        service_account=SERVICE_ACCOUNT (str, None)
            The service account name to set on the pod specs
        priority=PRIORITY (int, None)
            The priority level to set on the job specs. Higher integer value means higher priority
        priority_class_name=PRIORITY_CLASS_NAME (str, None)
            Pod specific priority level. Check with your Kubernetes cluster admin if Priority classes are defined on your system
        image_secret=IMAGE_SECRET (str, None)
            The name of the Kubernetes/OpenShift secret set up for private images
        coscheduler_name=COSCHEDULER_NAME (str, None)
            Option to run TorchX-MCAD with a co-scheduler. User must provide the co-scheduler name.
        network=NETWORK (str, None)
            Name of additional pod-to-pod network beyond default Kubernetes network

掛載

掛載外部檔案系統/磁碟區是透過 HostPath 和 PersistentVolumeClaim 支援來完成的。

  • hostPath 磁碟區:type=bind,src=<主機 路徑>,dst=<容器 路徑>[,唯讀]

  • PersistentVolumeClaim:type=volume,src=<宣告>,dst=<容器 路徑>[,唯讀]

  • 主機裝置:type=device,src=/dev/foo[,dst=<容器 路徑>][,perm=rwm] 如果您指定主機裝置,則作業將在特權模式下執行,因為 Kubernetes 不會公開將 –device 傳遞至底層容器執行階段的方法。使用者應該優先使用裝置外掛程式。

如需詳細資訊,請參閱 torchx.specs.parse_mounts()

外部文件:https://kubernetes.dev.org.tw/docs/concepts/storage/persistent-volumes/

資源/配置

若要選取特定的機器類型,您可以使用 node.kubernetes.io/instance-type 將功能新增至您的資源,這會將啟動的作業限制為該執行個體類型的節點。

>>> from torchx import specs
>>> specs.Resource(
...     cpu=4,
...     memMB=16000,
...     gpu=2,
...     capabilities={
...         "node.kubernetes.io/instance-type": "<cloud instance type>",
...     },
... )
Resource(...)

Kubernetes 可能會為主機保留一些記憶體。TorchX 假設您是在整個主機上進行排程,因此會自動減少資源請求量,以考慮節點保留的 CPU 和記憶體。如果您遇到排程問題,則可能需要減少從主機值請求的 CPU 和記憶體。

相容性

功能

排程器支援

擷取日誌

✔️

分散式作業

✔️

取消作業

✔️

描述作業

✔️

工作區/修補

✔️

掛載

✔️

彈性

describe(app_id: str) Optional[DescribeAppResponse][來源]

描述指定的應用程式。

傳回值:

AppDef 描述,如果應用程式不存在,則為 None

list() List[ListAppResponse][原始碼]

對於在排程器上啟動的應用程式,這個 API 會返回一個 ListAppResponse 物件列表,每個物件都包含應用程式 ID 和其狀態。注意:此 API 處於原型階段,可能會有所變更。

log_iter(app_id: str, role_name: str, k: int = 0, regex: Optional[str] = None, since: Optional[datetime] = None, until: Optional[datetime] = None, should_tail: bool = False, streams: Optional[Stream] = None) Iterable[str][原始碼]

返回 k``th 副本 ``role 的日誌行的迭代器。當所有符合條件的日誌行都已讀取完畢時,迭代器就會結束。

如果排程器支援基於時間的游標來擷取自訂時間範圍內的日誌行,則會採用 sinceuntil 欄位,否則會忽略這些欄位。未指定 sinceuntil 等同於取得所有可用的日誌行。如果 until 為空,則迭代器的行為類似於 tail -f,會持續追蹤日誌輸出,直到作業達到終止狀態為止。

日誌的確切定義會因排程器而異。有些排程器可能會將 stderr 或 stdout 視為日誌,而其他排程器可能會從日誌檔案中讀取日誌。

行為和假設

  1. 如果在不存在的應用程式上呼叫,則會產生未定義的行為。呼叫者應在呼叫此方法之前,使用 exists(app_id) 檢查應用程式是否存在。

  2. 不是狀態性的,使用相同的參數呼叫此方法兩次會返回一個新的迭代器。先前的迭代進度會遺失。

  3. 不保證支援日誌追蹤。並非所有排程器都支援即時日誌迭代(例如,在應用程式執行時追蹤日誌)。迭代器的行為請參閱特定排程器的文件。

3.1 如果排程器支援日誌追蹤,則應由

should_tail 參數控制。

  1. 不保證日誌保留。在呼叫此方法時,底層排程器可能已清除此應用程式的日誌記錄。如果是這樣,此方法會引發任意例外狀況。

  2. 如果 should_tail 為 True,則只有在可存取的日誌行已完全耗盡且應用程式已達到最終狀態時,該方法才會引發 StopIteration 例外狀況。例如,如果應用程式卡住且未產生任何日誌行,則迭代器會封鎖,直到應用程式最終被終止(透過逾時或手動終止),此時它會引發 StopIteration

    如果 should_tail 為 False,則當沒有更多日誌時,該方法會引發 StopIteration

  3. 並非所有排程器都需要支援。

  4. 有些排程器可能透過支援 __getitem__ 來支援行游標(例如,iter[50] 會搜尋到第 50 個日誌行)。

  5. 會保留空格,每個新行都應包含 \n。若要

    支援互動式進度條,返回的行不需要包含 \n,但應在沒有換行的情況下列印,以便正確處理 \r 歸位字元。

參數:

streams - 要選擇的 IO 輸出串流。選項之一:combined、stdout、stderr。如果排程器不支援所選的串流,則會引發 ValueError。

傳回值:

指定角色副本的日誌行的 迭代器

引發:

NotImplementedError - 如果排程器不支援日誌迭代

run_opts() runopts[原始碼]

返回排程器預期的執行設定選項。基本上是 run API 的 --help

schedule(dryrun_info: AppDryRunInfo[KubernetesMCADJob]) str[原始碼]

submit 相同,但它採用 AppDryRunInfo。建議實作者實作此方法,而不是直接實作 submit,因為 submit 可以透過以下方式簡單地實作

dryrun_info = self.submit_dryrun(app, cfg)
return schedule(dryrun_info)
class torchx.schedulers.kubernetes_mcad_scheduler.KubernetesMCADJob(images_to_push: Dict[str, Tuple[str, str]], resource: Dict[str, object])[原始碼]

參考

torchx.schedulers.kubernetes_mcad_scheduler.create_scheduler(session_name: str, client: Optional[ApiClient] = None, docker_client: Optional[DockerClient] = None, **kwargs: Any) KubernetesMCADScheduler[原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.app_to_resource(app: AppDef, namespace: str, service_account: Optional[str], image_secret: Optional[str], coscheduler_name: Optional[str], priority_class_name: Optional[str], network: Optional[str], priority: Optional[int] = None) Dict[str, Any][原始碼]

app_to_resource 會從提供的 AppDef 建立一個 AppWrapper/MCAD Kubernetes 資源定義。該資源定義可用於在 Kubernetes 上啟動應用程式。

MCAD 支援在「應用程式」層級重試。在多個 TorchX 角色的情況下,AppWrapper 的最大重試次數設定為角色 max_retries 的最小值。

torchx.schedulers.kubernetes_mcad_scheduler.mcad_svc(app: AppDef, svc_name: str, namespace: str, service_port: str) V1Service[原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.get_appwrapper_status(app: Dict[str, str]) AppState[原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.get_port_for_service(app: AppDef) str[原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.get_role_information(generic_items: Iterable[Dict[str, Any]]) Dict[str, Any][原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.get_tasks_status_description(status: Dict[str, str]) Dict[str, int][原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.pod_labels(app: AppDef, role_idx: int, role: Role, replica_id: int, coscheduler_name: Optional[str], app_id: str) Dict[str, str][原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.role_to_pod(name: str, unique_app_id: str, namespace: str, role: Role, service_account: Optional[str], image_secret: Optional[str], coscheduler_name: Optional[str], priority_class_name: Optional[str], network: Optional[str]) V1Pod[原始碼]
torchx.schedulers.kubernetes_mcad_scheduler.sanitize_for_serialization(obj: object) object[原始碼]

文件

取得 PyTorch 的完整開發人員文件

檢視文件

教學課程

取得針對初學者和進階開發人員的深入教學課程

檢視教學課程

資源

尋找開發資源並取得您的問題解答

檢視資源