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
的日誌行的迭代器。當所有符合條件的日誌行都已讀取完畢時,迭代器就會結束。如果排程器支援基於時間的游標來擷取自訂時間範圍內的日誌行,則會採用
since
、until
欄位,否則會忽略這些欄位。未指定since
和until
等同於取得所有可用的日誌行。如果until
為空,則迭代器的行為類似於tail -f
,會持續追蹤日誌輸出,直到作業達到終止狀態為止。日誌的確切定義會因排程器而異。有些排程器可能會將 stderr 或 stdout 視為日誌,而其他排程器可能會從日誌檔案中讀取日誌。
行為和假設
如果在不存在的應用程式上呼叫,則會產生未定義的行為。呼叫者應在呼叫此方法之前,使用
exists(app_id)
檢查應用程式是否存在。不是狀態性的,使用相同的參數呼叫此方法兩次會返回一個新的迭代器。先前的迭代進度會遺失。
不保證支援日誌追蹤。並非所有排程器都支援即時日誌迭代(例如,在應用程式執行時追蹤日誌)。迭代器的行為請參閱特定排程器的文件。
- 3.1 如果排程器支援日誌追蹤,則應由
should_tail
參數控制。
不保證日誌保留。在呼叫此方法時,底層排程器可能已清除此應用程式的日誌記錄。如果是這樣,此方法會引發任意例外狀況。
如果
should_tail
為 True,則只有在可存取的日誌行已完全耗盡且應用程式已達到最終狀態時,該方法才會引發StopIteration
例外狀況。例如,如果應用程式卡住且未產生任何日誌行,則迭代器會封鎖,直到應用程式最終被終止(透過逾時或手動終止),此時它會引發StopIteration
。如果
should_tail
為 False,則當沒有更多日誌時,該方法會引發StopIteration
。並非所有排程器都需要支援。
有些排程器可能透過支援
__getitem__
來支援行游標(例如,iter[50]
會搜尋到第 50 個日誌行)。- 會保留空格,每個新行都應包含
\n
。若要 支援互動式進度條,返回的行不需要包含
\n
,但應在沒有換行的情況下列印,以便正確處理\r
歸位字元。
- 會保留空格,每個新行都應包含
- 參數:
streams - 要選擇的 IO 輸出串流。選項之一:combined、stdout、stderr。如果排程器不支援所選的串流,則會引發 ValueError。
- 傳回值:
指定角色副本的日誌行的
迭代器
- 引發:
NotImplementedError - 如果排程器不支援日誌迭代
- 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_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] [原始碼]¶