Container Service for Kubernetes (ACK) は、Slurm on Kubernetes ソリューションと ack-slurm-operator コンポーネントを提供します。これらを組み合わせることで、ハイパフォーマンスコンピューティング (HPC) や大規模な AI および機械学習 (ML) ワークロード向けに、ACK クラスターで Simple Linux Utility for Resource Management (Slurm) スケジューリングシステムをデプロイおよび管理できます。
Slurm の概要
Slurm は、クラスターリソース管理とジョブスケジューリングのための強力なオープンソースプラットフォームです。スーパーコンピューターや大規模な計算クラスターのパフォーマンスと効率を最適化するように設計されています。以下の図は、その主要コンポーネントがどのように連携して動作するかを示しています。
slurmctld:Slurm 制御デーモン。Slurm の中央管理コンポーネントとして、slurmctld はシステムリソースを監視し、ジョブをスケジュールし、クラスターの状態を管理します。セカンダリ slurmctld を設定してフェイルオーバーを行い、高可用性を確保できます。
slurmd:Slurm ノードデーモン。各計算ノードにデプロイされ、slurmd は slurmctld からの命令を受け取り、ジョブの開始と実行、ジョブステータスの報告、新しいジョブ割り当ての準備など、ジョブのライフサイクルを管理します。ジョブは slurmd を通じてスケジュールされます。
slurmdbd:Slurm データベースデーモン。このオプションのコンポーネントは、ジョブ履歴とアカウンティング情報のための中央集権的なデータベースを維持します。大規模クラスターの長期的な管理と監査に不可欠です。slurmdbd は、複数の Slurm 管理クラスターにまたがるデータを集約して、データ管理を簡素化できます。
Slurm CLI:Slurm は、ジョブ管理とシステム監視のために以下のコマンドラインツールを提供します:
scontrol:クラスターを管理し、クラスター構成を制御します。
squeue:キュー内のジョブのステータスを照会します。
srun:ジョブを投入し、管理します。
sbatch:コンピューティングリソースのスケジューリングと管理のために、ジョブをバッチで投入します。
sinfo:ノードの可用性を含む、クラスターの全体的なステータスを照会します。
Slurm on ACK の概要
Slurm オペレーターは、SlurmCluster カスタムリソース (CR) を使用して、Slurm クラスターの管理に必要な構成ファイルを定義します。これにより、Slurm 管理クラスターのデプロイとメンテナンスが簡素化され、コントロールプレーンの管理問題が解決されます。以下の図は、Slurm on ACK のアーキテクチャを示しています。
クラスター管理者は、SlurmCluster CR を定義することによって Slurm 管理クラスターをデプロイおよび管理します。その後、Slurm オペレーターはこの CR に基づいてクラスター内に Slurm 制御コンポーネントを作成します。Slurm 構成ファイルは、共有ボリュームまたは ConfigMap を使用して制御コンポーネントにマウントできます。
前提条件
Kubernetes 1.22 以降を実行し、GPU 高速化ノードを 1 つ含む ACK クラスターが作成されている必要があります。 詳細については、「GPU 高速化ノードを持つ ACK クラスターの作成」および「クラスターの更新」をご参照ください。
ステップ 1:ack-slurm-operator コンポーネントのインストール
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[マーケットプレイス] > [マーケットプレイス] を選択します。
[マーケットプレイス] ページで、ack-slurm-operator を検索し、コンポーネントをクリックします。詳細ページで、右上隅の [デプロイ] をクリックします。[デプロイ] パネルで、パラメーターを設定します。[クラスター] パラメーターのみを指定する必要があります。他のすべてのパラメーターはデフォルト設定を使用します。
パラメーターを設定した後、[OK] をクリックします。
ステップ 2:Slurm 管理クラスターの作成
Slurm 管理クラスターは、手動または Helm を使用して作成できます。ニーズに最も適した方法を選択してください。
Slurm 管理クラスターの手動作成
MUNGE 認証 Secret の作成
MUNGE (MUNGE Uid 'N' Gid Emporium) は、Slurm コンポーネント間の認証を提供します。MUNGE キーを保存するために Kubernetes Secret を作成する必要があります。
次のコマンドを実行して、OpenSSL を使用してキーを生成します:
openssl rand -base64 512 | tr -d '\r\n'次のコマンドを実行して、生成されたキーを保存する Secret を作成します:
<$MungeKeyName>を、mungekeyのようなキーのカスタム名に置き換えます。<$MungeKey>を、前のステップで生成されたキー文字列に置き換えます。
kubectl create secret generic <$MungeKeyName> --from-literal=munge.key=<$MungeKey>
Secret を作成した後、MUNGE ベースの認証のために Slurm 管理クラスターに設定または関連付けることができます。
Slurm 管理クラスター用 ConfigMap の作成
この例では、CR の slurmConfPath パラメーターを指定することで、ConfigMap が Pod にマウントされます。これにより、Pod が再作成された場合でも、Pod の構成が自動的に期待される状態に復元されることが保証されます。
以下のサンプルコードの data パラメーターは、サンプルの ConfigMap を指定しています。ConfigMap を生成するには、Easy Configurator または Full Configurator ツールを使用することを推奨します。
期待される出力:
configmap/slurm-test createdこの出力は、ConfigMap が作成されたことを示します。
SlurmCluster CR の送信
slurmcluster.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。この SlurmCluster CR は、1 つのヘッドノードと 4 つのワーカーノードを持つ Slurm 管理クラスターを作成します。このクラスターは ACK クラスター内で Pod として実行されます。SlurmCluster CR のmungeConfPathとslurmConfPathパラメーターの値は、slurmctldとworkerGroupSpecsセクションで指定されたマウントポイントと一致する必要があります。次のコマンドを実行して、
slurmcluster.yamlファイルをクラスターにデプロイします: 期待される出力:kubectl apply -f slurmcluster.yamlslurmcluster.kai.alibabacloud.com/slurm-job-demo created次のコマンドを実行して、Slurm 管理クラスターが期待どおりに実行されていることを確認します: 期待される出力: この出力は、Slurm 管理クラスターがデプロイされ、その 5 つのノードが準備完了状態であることを示します。
kubectl get slurmclusterNAME AVAILABLE WORKERS STATUS AGE slurm-job-demo 5 ready 14m次のコマンドを実行して、
slurm-job-demoという名前の Slurm 管理クラスター内のすべての Pod が Running 状態であることを確認します: 期待される出力: この出力は、ヘッドノードと 4 つのワーカーノードが期待どおりに実行されていることを確認します。kubectl get pods -l app.kubernetes.io/name=slurm-clusterNAME READY STATUS RESTARTS AGE slurm-job-demo-head-x9sgs 1/1 Running 0 14m slurm-job-demo-worker-cpu-0 1/1 Running 0 14m slurm-job-demo-worker-cpu-1 1/1 Running 0 14m slurm-job-demo-worker-cpu1-0 1/1 Running 0 14m slurm-job-demo-worker-cpu1-1 1/1 Running 0 14m
Helm を使用した Slurm 管理クラスターの作成
柔軟な構成で Slurm 管理クラスターを迅速にインストールおよび管理するために、Alibaba Cloud が提供する SlurmCluster チャートを Helm を使用してインストールできます。Helm チャートは charts-incubator (Alibaba Cloud チャートリポジトリ) からダウンロードします。パラメーターを設定すると、Helm はロールベースのアクセス制御 (RBAC)、ConfigMap、Secret、Slurm 管理クラスターなどのリソースを作成します。
Helm チャートによって作成されるリソース
| リソースタイプ | リソース名 | 説明 |
|---|---|---|
| ConfigMap | {{ .Values.slurmConfigs.configMapName }} | .Values.slurmConfigs.createConfigsByConfigMap が True に設定されている場合、この ConfigMap はユーザー定義の Slurm 構成を保存します。これは .Values.slurmConfigs.slurmConfigPathInPod で指定されたパスにマウントされ、Slurm 管理クラスターの .Spec.SlurmConfPath としてもレンダリングされます。Pod の起動時に、ConfigMap は /etc/slurm/ にコピーされ、アクセスが制限されます。 |
| ServiceAccount | {{ .Release.Namespace }}/{{ .Values.clusterName }} | slurmctld Pod が SlurmCluster CR 構成を変更できるようにし、オンクラウドノードのオートスケーリングを有効にします。 |
| Role | {{ .Release.Namespace }}/{{ .Values.clusterName }} | slurmctld Pod にオートスケーリングのための SlurmCluster CR 構成を変更する権限を付与します。 |
| RoleBinding | {{ .Release.Namespace }}/{{ .Values.clusterName }} | オートスケーリング権限のために Role を ServiceAccount にバインドします。 |
| Role | {{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }} | slurmctld Pod が SlurmOperator 名前空間の Secret を変更できるようにします。Slurm と Kubernetes が同じ物理サーバー群にデプロイされている場合、Slurm 管理クラスターはこのリソースを使用してトークンを更新できます。 |
| RoleBinding | {{ .Values.slurmOperatorNamespace }}/{{ .Values.clusterName }} | トークン更新のためにオペレーター名前空間の Role を ServiceAccount にバインドします。 |
| Secret | {{ .Values.mungeConfigs.secretName }} | Slurm コンポーネント通信のための MUNGE 認証キーを保存します。.Values.mungeConfigs.createConfigsBySecret が True に設定されている場合、この Secret は "munge.key"={{ .Values.mungeConfigs.content }} で自動的に作成されます。マウントパスは .Spec.MungeConfPath からレンダリングされ、Pod の起動コマンドはこのパスから /etc/munge/munge.key を初期化します。 |
| SlurmCluster | レンダリングされた Slurm 管理クラスター。 |
Helm チャートのパラメーター
| パラメーター | 例 | 説明 |
|---|---|---|
| clusterName | "" | クラスター名。Secret とロールの生成に使用されます。値は Slurm 構成ファイル内のクラスター名と一致する必要があります。 |
| headNodeConfig | N/A | 必須。slurmctld Pod を構成します。 |
| workerNodesConfig | N/A | slurmd Pod を構成します。 |
| workerNodesConfig.deleteSelfBeforeSuspend | true | true に設定すると、ワーカー Pod に preStop フックが自動的に追加されます。これにより、ノードが削除される前に自動的にノードのドレインがトリガーされ、ノードがスケジュール不可としてマークされます。 |
| slurmdbdConfigs | N/A | slurmdbd Pod を構成します。空のままにすると、slurmdbd Pod は作成されません。 |
| slurmrestdConfigs | N/A | slurmrestd Pod を構成します。空のままにすると、slurmrestd Pod は作成されません。 |
| headNodeConfig.hostNetwork / slurmdbdConfigs.hostNetwork / slurmrestdConfigs.hostNetwork / workerNodesConfig.workerGroups[].hostNetwork | false | それぞれの Pod の hostNetwork パラメーターとしてレンダリングされます。 |
| headNodeConfig.setHostnameAsFQDN / slurmdbdConfigs.setHostnameAsFQDN / slurmrestdConfigs.setHostnameAsFQDN / workerNodesConfig.workerGroups[].setHostnameAsFQDN | false | それぞれの Pod の setHostnameAsFQDN パラメーターとしてレンダリングされます。 |
| headNodeConfig.nodeSelector / slurmdbdConfigs.nodeSelector / slurmrestdConfigs.nodeSelector / workerNodesConfig.workerGroups[].nodeSelector | nodeSelector: example: example | それぞれの Pod の nodeSelector パラメーターとしてレンダリングされます。 |
| headNodeConfig.tolerations / slurmdbdConfigs.tolerations / slurmrestdConfigs.tolerations / workerNodesConfig.workerGroups[].tolerations | tolerations:- key: value: operator: | それぞれの Pod の tolerations としてレンダリングされます。 |
| headNodeConfig.affinity / slurmdbdConfigs.affinity / slurmrestdConfigs.affinity / workerNodesConfig.workerGroups[].affinity | affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - zone-a preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value | それぞれの Pod のアフィニティルールとしてレンダリングされます。 |
| headNodeConfig.resources / slurmdbdConfigs.resources / slurmrestdConfigs.resources / workerNodesConfig.workerGroups[].resources | resources: requests: cpu: 1 limits: cpu: 1 | それぞれの Pod のプライマリコンテナーのリソースとしてレンダリングされます。ワーカー Pod のプライマリコンテナーのリソース制限は、Slurm ノードのリソース制限としてレンダリングされます。 |
| headNodeConfig.image / slurmdbdConfigs.image / slurmrestdConfigs.image / workerNodesConfig.workerGroups[].image | "registry-cn-hangzhou.ack.aliyuncs.com/acs/slurm:23.06-1.6-aliyun-49259f59" | コンテナーイメージとしてレンダリングされます。ai-models-on-ack/framework/slurm/building-slurm-image からカスタムイメージをビルドすることもできます。 |
| headNodeConfig.imagePullSecrets / slurmdbdConfigs.imagePullSecrets / slurmrestdConfigs.imagePullSecrets / workerNodesConfig.workerGroups[].imagePullSecrets | imagePullSecrets:- name: example | コンテナーイメージをプルするために使用される Secret としてレンダリングされます。 |
| headNodeConfig.podSecurityContext / slurmdbdConfigs.podSecurityContext / slurmrestdConfigs.podSecurityContext / workerNodesConfig.workerGroups[].podSecurityContext | podSecurityContext: runAsUser: 1000 runAsGroup: 3000 fsGroup: 2000 supplementalGroups: [4000] | Pod レベルの Security Context としてレンダリングされます。 |
| headNodeConfig.securityContext / slurmdbdConfigs.securityContext / slurmrestdConfigs.securityContext / workerNodesConfig.workerGroups[].securityContext | securityContext: allowPrivilegeEscalation: false | プライマリコンテナーの Security Context としてレンダリングされます。 |
| headNodeConfig.volumeMounts / slurmdbdConfigs.volumeMounts / slurmrestdConfigs.volumeMounts / workerNodesConfig.workerGroups[].volumeMounts | N/A | プライマリコンテナーのボリュームマウント構成としてレンダリングされます。 |
| headNodeConfig.volumes / slurmdbdConfigs.volumes / slurmrestdConfigs.volumes / workerNodesConfig.workerGroups[].volumes | N/A | Pod にマウントされるボリュームとしてレンダリングされます。 |
| slurmConfigs.slurmConfigPathInPod | "" | Pod 内の Slurm 構成ファイルのマウントパス。構成ファイルがボリュームとしてマウントされている場合、この値を slurm.conf がマウントされているパスに設定します。Pod の起動コマンドはファイルを /etc/slurm/ にコピーし、アクセスを制限します。 |
| slurmConfigs.createConfigsByConfigMap | true | Slurm 構成用の ConfigMap を自動的に作成するかどうかを指定します。 |
| slurmConfigs.configMapName | "" | Slurm 構成を保存する ConfigMap の名前。 |
| slurmConfigs.filesInConfigMap | "" | 自動的に作成される ConfigMap の内容。 |
| mungeConfigs.mungeConfigPathInPod | N/A | Pod 内の MUNGE 構成ファイルのマウントパス。構成ファイルがボリュームとしてマウントされている場合、この値を munge.key がマウントされているパスに設定します。Pod の起動コマンドはファイルを /etc/munge/ にコピーし、アクセスを制限します。 |
| mungeConfigs.createConfigsBySecret | N/A | MUNGE 構成用の Secret を自動的に作成するかどうかを指定します。 |
| mungeConfigs.secretName | N/A | MUNGE 構成を保存する Secret の名前。 |
| mungeConfigs.content | N/A | 自動的に作成される Secret の内容。 |
slurmConfigs.filesInConfigMap の詳細については、「Slurm System Configuration Tool (schedmd.com)」をご参照ください。
Pod の作成後に slurmConfigs.filesInConfigMap を変更した場合、変更を有効にするには Pod を再作成する必要があります。Pod を再作成する前に変更を確認することを推奨します。
Helm チャートのインストール
次のコマンドを実行して、Alibaba Cloud Helm リポジトリをローカルの Helm クライアントに追加します: これにより、Slurm 管理クラスターチャートを含む、Alibaba Cloud が提供するさまざまなチャートにアクセスできるようになります。
helm repo add aliyun https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/次のコマンドを実行して、Helm チャートをプルして解凍します: これにより、現在のディレクトリに
ack-slurm-clusterという名前のディレクトリが作成されます。このディレクトリには、すべてのチャートファイルとテンプレートが含まれています。helm pull aliyun/ack-slurm-cluster --untar=truevalues.yamlファイルでチャートのパラメーターを変更します。values.yamlファイルには、デフォルトのチャート構成が含まれています。このファイルを変更して、Slurm 構成、リソースのリクエストと制限、ストレージなどのパラメーター設定を要件に合わせてカスタマイズします。cd ack-slurm-cluster vi values.yamlHelm を使用してチャートをインストールします: これにより、Slurm 管理クラスターがデプロイされます。
cd .. helm install my-slurm-cluster ack-slurm-cluster # my-slurm-cluster を希望のリリース名に置き換えます。Slurm 管理クラスターがデプロイされたことを確認します。デプロイが完了したら、
kubectlを使用してデプロイステータスを確認し、Slurm 管理クラスターが期待どおりに実行されていることを確認します:kubectl get pods -l app.kubernetes.io/name=slurm-cluster
ステップ 3:Slurm 管理クラスターへのログイン
Kubernetes クラスター管理者としてのログイン
Kubernetes クラスター管理者は、Kubernetes クラスター全体を管理する権限を持っています。Slurm 管理クラスターは Kubernetes クラスター内で Pod として実行されるため、管理者は kubectl を使用して任意の Slurm 管理クラスターの任意の Pod にログインでき、デフォルトでルート権限を持ちます。
次のコマンドを実行して、Slurm 管理クラスターの Pod にログインします:
# slurm-job-demo-head-x9sgs をご利用のクラスター内の Pod の名前に置き換えます。
kubectl exec -it slurm-job-demo-xxxxx -- bashSlurm 管理クラスターの一般ユーザーとしてのログイン
Slurm 管理クラスターの管理者または一般ユーザーは、kubectl exec コマンドを実行する権限を持っていない場合があります。この場合、SSH を使用して Slurm 管理クラスターにログインできます。2 つの方法があります:
LoadBalancer サービス:サービスの外部 IP アドレスを使用してヘッド Pod にアクセスします。この方法は、長期的で安定した接続に適しています。Classic Load Balancer (CLB) インスタンスとその外部 IP アドレスを使用して、内部ネットワーク内のどこからでも Slurm 管理クラスターにアクセスできます。
ポートフォワーディング:一時的なアクセスのために
kubectl port-forwardコマンドを使用します。この方法は、ポートフォワードコマンドを継続的に実行する必要があるため、短期的な運用保守 (O&M) やデバッグに適しています。
LoadBalancer サービスを使用したヘッド Pod へのログイン
LoadBalancer サービスを作成して、クラスター内の内部サービスを外部アクセス可能にします。詳細については、「既存の SLB インスタンスを使用してアプリケーションを公開する」または「自動的に作成された SLB インスタンスを使用してアプリケーションを公開する」をご参照ください。
LoadBalancer サービスは、内部向け Classic Load Balancer (CLB) インスタンスを使用する必要があります。
サービスに次のラベルを追加して、受信リクエストを期待される Pod にルーティングするようにします:
kai.alibabacloud.com/slurm-cluster: ack-slurm-cluster-1kai.alibabacloud.com/slurm-node-type: head
次のコマンドを実行して、LoadBalancer サービスの外部 IP アドレスを取得します:
kubectl get svc次のコマンドを実行して、SSH を使用してヘッド Pod にログインします:
# $YOURUSER をユーザー名に、$EXTERNAL_IP をサービスの外部 IP アドレスに置き換えます。 ssh $YOURUSER@$EXTERNAL_IP
port-forward コマンドを使用したリクエストの転送
port-forward コマンドを使用するには、Kubernetes クラスターの kubeconfig ファイルをローカルホストに保存する必要があります。これはセキュリティリスクを引き起こす可能性があります。本番環境ではこの方法を使用しないことを推奨します。
次のコマンドを実行して、リクエスト転送用のローカルポートを有効にし、slurmctld を実行しているヘッド Pod のポート 22 にマッピングします。SSH はデフォルトでポート 22 を使用します。
# $NAMESPACE、$CLUSTERNAME、および $LOCALPORT を実際の値に置き換えます。 kubectl port-forward -n $NAMESPACE svc/$CLUSTERNAME $LOCALPORT:22port-forwardコマンドが実行されている間に、次のコマンドを実行してログインします。現在のホスト上のすべてのユーザーがクラスターにログインしてジョブを投入できます。# $YOURUSER をヘッド Pod にログインするために使用するユーザー名に置き換えます。 ssh -p $LOCALPORT $YOURUSER@localhost
ステップ 4:Slurm 管理クラスターの使用
以下のセクションでは、ノード間でユーザーを同期する方法、ノード間でログを共有する方法、および Slurm 管理クラスターのオートスケーリングを実行する方法について説明します。
ノード間でのユーザー同期
Slurm は中央集権的なユーザー認証サービスを提供していません。sbatch コマンドを使用してジョブを投入する際、投入したユーザーのアカウントがジョブを実行するために選択されたノードに存在しない場合、ジョブは失敗する可能性があります。この問題を解決するには、Slurm 管理クラスターに Lightweight Directory Access Protocol (LDAP) を設定します。LDAP は認証のための中央集権的なバックエンドサービスとして機能し、Slurm がユーザー ID を認証できるようにします。
LDAP バックエンドのデプロイ
ldap.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。これにより、ユーザー情報を保存および管理する基本的な LDAP インスタンスが作成されます。ldap.yamlファイルは、LDAP バックエンド Pod とそれに関連するサービスを定義します。Pod には LDAP コンテナーが含まれ、サービスはネットワーク内で LDAP サービスを公開します。次のコマンドを実行して、LDAP バックエンドサービスをデプロイします: 期待される出力:
kubectl apply -f ldap.yamldeployment.apps/ldap created service/ldap-service created secret/ldap-secret created
(オプション) LDAP フロントエンドのデプロイ
phpldapadmin.yamlという名前のファイルを作成し、次の内容をファイルにコピーします。これにより、Web インターフェイスを通じて管理効率を向上させるための LDAP フロントエンド Pod とそれに関連するサービスがデプロイされます。次のコマンドを実行して、LDAP フロントエンドサービスをデプロイします:
kubectl apply -f phpldapadmin.yaml
LDAP クライアントの設定
ステップ 3 で説明したように Slurm 管理クラスターの Pod にログインし、次のコマンドを実行して LDAP クライアントパッケージをインストールします:
apt update apt install libnss-ldapdlibnss-ldapdパッケージがインストールされた後、Pod 内で Slurm 管理クラスターのネットワーク認証サービスを設定します。/etc/nslcd.confファイルの次のパラメーターを変更して、LDAP サーバーへの接続を定義します:
apt update apt install vim... BASE dc=example,dc=org # 値を LDAP ディレクトリ構造のルートノードの識別名に置き換えます。 URI ldap://ldap-service # 値をご利用の LDAP サーバーの Uniform Resource Identifier (URI) に置き換えます。 ...... uri ldap://ldap-service # 値をご利用の LDAP サーバーの URI に置き換えます。 base dc=example,dc=org # このパラメーターを LDAP ディレクトリ構造に基づいて指定します。 ... tls_cacertfile /etc/ssl/certs/ca-certificates.crt # LDAP サーバー証明書を検証するために使用される認証局 (CA) 証明書ファイルへのパスを指定します。 ...
ログの共有とアクセス
デフォルトでは、sbatch コマンドによって生成されるジョブログは、ジョブを実行するノードに保存されます。これにより、ログを一元的に表示することが困難になる場合があります。ログ管理を簡素化するために、File Storage NAS (NAS) ファイルシステムを作成して、すべてのジョブログをアクセス可能なディレクトリに保存できます。これにより、どのノードがコンピューティングジョブを実行しても、ログを一元的に収集およびアクセスできます。
各ノードのログを保存および共有するために、NAS ファイルシステムを作成します。詳細については、「ファイルシステムの作成」をご参照ください。
ACK コンソールにログインし、NAS ファイルシステム用の永続ボリューム (PV) と永続ボリューム要求 (PVC) を作成します。詳細については、「静的プロビジョニングされた NAS ボリュームのマウント」をご参照ください。
SlurmCluster CR を変更します。
slurmctldおよびworkerGroupSpecsセクションのvolumeMountsおよびvolumesパラメーターを設定して、作成した PVC を参照し、それを/homeディレクトリにマウントします。例:slurmctld: ... # /home をマウントポイントとして指定します。 volumeMounts: - mountPath: /home name: test # PVC を参照するボリュームの名前。 volumes: # PVC 定義を追加します。 - name: test # volumeMounts の名前と一致する必要があります。 persistentVolumeClaim: claimName: test # ご利用の PVC の名前に置き換えます。 ... workerGroupSpecs: # ... 各ワーキンググループに対してボリュームと volumeMounts の構成を繰り返します。次のコマンドを実行して、SlurmCluster CR をデプロイします。SlurmCluster CR がデプロイされると、ワーカーノードは NAS ファイルシステムを共有できます。
重要SlurmCluster CR のデプロイに失敗した場合は、
kubectl delete slurmcluster slurm-job-demoコマンドを実行して CR を削除し、再デプロイしてください。kubectl apply -f slurmcluster.yaml
Slurm 管理クラスターのオートスケーリングの実行
デフォルトの Slurm イメージのルートパスには、slurm-resume.sh、slurm-suspend.sh、slurmctld-copilot などの実行可能ファイルとスクリプトが含まれています。これらは slurmctld と対話し、Slurm 管理クラスターをスケーリングします。
オンクラウドノードに基づく Slurm クラスターのオートスケーリング
Slurm on ACK は 2 種類のノードをサポートしています:
ローカルノード:slurmctld に直接接続されている物理計算ノード。
オンクラウドノード:クラウドサービスプロバイダーによってオンデマンドで作成および破棄できる VM インスタンスによってバックアップされた論理ノード。
Slurm on ACK のオートスケーリング
手順
オートスケーリング権限の設定。 Helm がインストールされている場合、オートスケーリング権限は slurmctld Pod に自動的に設定されるため、このステップはスキップできます。ヘッド Pod は、オートスケーリングのために SlurmCluster CR にアクセスして更新する権限が必要です。RBAC を使用して必要な権限を付与することを推奨します。次の手順に従ってください: まず、slurmctld Pod 用の ServiceAccount、Role、および RoleBinding を作成します。次の例では、Slurm 管理クラスター名は
slurm-job-demoで、名前空間はdefaultです。rbac.yamlという名前のファイルを作成し、次の内容をファイルにコピーします:kubectl apply -f rbac.yamlを実行してリソースリストを送信します。次に、slurmctld Pod に権限を付与します。kubectl edit slurmcluster slurm-job-demoを実行して Slurm 管理クラスターを変更します。Spec.Slurmctld.Template.Spec.ServiceAccountNameを作成した ServiceAccount に設定します: 変更を適用するには、slurmctld を管理する StatefulSet を再構築します。kubectl get sts slurm-job-demoを実行して StatefulSet を見つけ、次にkubectl delete sts slurm-job-demoを実行して削除します。Slurm オペレーターは StatefulSet を再構築し、新しい構成を適用します。apiVersion: v1 kind: ServiceAccount metadata: name: slurm-job-demo --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: slurm-job-demo rules: - apiGroups: ["kai.alibabacloud.com"] resources: ["slurmclusters"] verbs: ["get", "watch", "list", "update", "patch"] resourceNames: ["slurm-job-demo"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: slurm-job-demo subjects: - kind: ServiceAccount name: slurm-job-demo roleRef: kind: Role name: slurm-job-demo apiGroup: rbac.authorization.k8s.ioapiVersion: kai.alibabacloud.com/v1 kind: SlurmCluster ... spec: slurmctld: template: spec: serviceAccountName: slurm-job-demo .../etc/slurm/slurm.confでオートスケーリングパラメーターを設定します。方法 A:共有ボリュームを使用した ConfigMap の管理
# 以下のパラメーターは、オンクラウドノードを使用する場合に必要です。 # SuspendProgram と ResumeProgram 機能は Alibaba Cloud によって開発されました。 SuspendTimeout=600 ResumeTimeout=600 # ノード上でジョブが実行されていない場合に自動的に一時停止される間隔。 SuspendTime=600 # 1分あたりにスケーリングできるノード数を設定します。 ResumeRate=1 SuspendRate=1 # NodeName パラメーターの値を ${cluster_name}-worker-${group_name}- の形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld Pod # は、ノードに 1 つの vCPU しかないと見なします。オンクラウドノードで指定したリソースが、workerGroupSpecs パラメーターで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが無駄になる可能性があります。 NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD # 以下の構成は固定です。変更しないでください。 CommunicationParameters=NoAddrCache ReconfigFlags=KeepPowerSaveSettings SuspendProgram="/slurm-suspend.sh" ResumeProgram="/slurm-resume.sh"方法 B:ConfigMap の手動管理
slurm.confがslurm-configという名前の ConfigMap に保存されている場合、kubectl edit slurm-configを実行して次の構成を追加します:slurm.conf: ... # 以下のパラメーターは、オンクラウドノードを使用する場合に必要です。 # SuspendProgram と ResumeProgram 機能は Alibaba Cloud によって開発されました。 SuspendTimeout=600 ResumeTimeout=600 # ノード上でジョブが実行されていない場合に自動的に一時停止される間隔。 SuspendTime=600 # 1分あたりにスケーリングできるノード数を設定します。 ResumeRate=1 SuspendRate=1 # NodeName パラメーターの値を ${cluster_name}-worker-${group_name}- の形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld Pod # は、ノードに 1 つの vCPU しかないと見なします。オンクラウドノードで指定したリソースが、workerGroupSpecs パラメーターで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが無駄になる可能性があります。 NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD # 以下の構成は固定です。変更しないでください。 CommunicationParameters=NoAddrCache ReconfigFlags=KeepPowerSaveSettings SuspendProgram="/slurm-suspend.sh" ResumeProgram="/slurm-resume.sh"方法 C:Helm を使用した ConfigMap の管理
helm upgradeコマンドを実行して Slurm 構成を更新します。
slurm.conf: ... # 以下のパラメーターは、オンクラウドノードを使用する場合に必要です。 # SuspendProgram と ResumeProgram 機能は Alibaba Cloud によって開発されました。 SuspendTimeout=600 ResumeTimeout=600 # ノード上でジョブが実行されていない場合に自動的に一時停止される間隔。 SuspendTime=600 # 1分あたりにスケーリングできるノード数を設定します。 ResumeRate=1 SuspendRate=1 # NodeName パラメーターの値を ${cluster_name}-worker-${group_name}- の形式で設定する必要があります。この行でノードのリソース量を指定する必要があります。そうしないと、slurmctld Pod # は、ノードに 1 つの vCPU しかないと見なします。オンクラウドノードで指定したリソースが、workerGroupSpecs パラメーターで宣言されたリソースと同じであることを確認してください。そうしないと、リソースが無駄になる可能性があります。 NodeName=slurm-job-demo-worker-cpu-[0-10] Feature=cloud State=CLOUD # 以下の構成は固定です。変更しないでください。 CommunicationParameters=NoAddrCache ReconfigFlags=KeepPowerSaveSettings SuspendProgram="/slurm-suspend.sh" ResumeProgram="/slurm-resume.sh"新しい構成の適用。 Slurm 管理クラスターの名前が
slurm-job-demoの場合、kubectl delete sts slurm-job-demoを実行して slurmctld Pod の新しい構成を適用します。slurmcluster.yamlファイルでワーカーノードのレプリカ数を 0 に設定し、後続のステップでノードのスケーリング活動を観察できるようにします。手動管理
kubectl edit slurmcluster slurm-job-demoを実行し、Slurm 管理クラスターでworkerCountの値を 10 に変更します。これにより、ワーカーノードのレプリカ数が 0 に設定されます。Helm を使用した管理
values.yamlファイルで、.Values.workerGroup[].workerCountを0に変更します。次に、helm upgrade slurm-job-demo .を実行して現在の Helm チャートを更新します。これにより、ワーカーノードのレプリカ数が 0 に設定されます。sbatch コマンドを使用してジョブを投入します。 コマンドプロンプトの後に次の内容を入力します: 期待される出力: この出力は、スクリプトの内容が正しいことを確認します。期待される出力: この出力は、ジョブが投入され、ジョブ ID が割り当てられたことを示します。
次のコマンドを実行して、スクリプトを Slurm 管理クラスターに処理のために投入します:
cat << EOF > cloudnodedemo.sh> #!/bin/bash > srun hostname > EOFcat cloudnodedemo.sh#!/bin/bash srun hostnamesbatch cloudnodedemo.shSubmitted batch job 1クラスターのスケーリング結果の表示。 期待される出力: この出力は、Slurm 管理クラスターが投入されたジョブを実行するために自動的に 1 つの計算ノードを追加したことを示します。期待される出力: この出力は、
slurm-demo-worker-cpu-0Pod がクラスターに追加されたことを示しており、ジョブの送信時にクラスターがスケールアウトしたことを確認できます。期待される出力: この出力は、slurm-demo-worker-cpu-0が新しく起動したノードであり、さらに 10 のオンクラウドノードがスケールアウトに利用可能であることを示しています。期待される出力: 出力内のNodeList=slurm-demo-worker-cpu-0は、ジョブが新しく追加されたノードで実行されたことを示します。期待される出力: この出力は、スケールアウトに利用可能なノード数が 11 に増加したことを示しており、自動スケールインが完了したことを確認できます。一定期間後、次のコマンドを実行してスケールインの結果を表示します:
cat /var/log/slurm-resume.lognamespace: default cluster: slurm-demo resume called, args [slurm-demo-worker-cpu-0] slurm cluster metadata: default slurm-demo get SlurmCluster CR slurm-demo succeed hostlists: [slurm-demo-worker-cpu-0] resume node slurm-demo-worker-cpu-0 resume worker -cpu-0 resume node -cpu-0 endkubectl get podNAME READY STATUS RESTARTS AGE slurm-demo-head-9hn67 1/1 Running 0 21m slurm-demo-worker-cpu-0 1/1 Running 0 43ssinfoPARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 10 idle~ slurm-job-demo-worker-cpu-[2-10] debug* up infinite 1 idle slurm-job-demo-worker-cpu-[0-1]scontrol show job 1JobId=1 JobName=cloudnodedemo.sh UserId=root(0) GroupId=root(0) MCS_label=N/A Priority=4294901757 Nice=0 Account=(null) QOS=(null) JobState=COMPLETED Reason=None Dependency=(null) Requeue=1 Restarts=0 BatchFlag=1 Reboot=0 ExitCode=0:0 RunTime=00:00:00 TimeLimit=UNLIMITED TimeMin=N/A SubmitTime=2024-05-28T11:37:36 EligibleTime=2024-05-28T11:37:36 AccrueTime=2024-05-28T11:37:36 StartTime=2024-05-28T11:37:36 EndTime=2024-05-28T11:37:36 Deadline=N/A SuspendTime=None SecsPreSuspend=0 LastSchedEval=2024-05-28T11:37:36 Scheduler=Main Partition=debug AllocNode:Sid=slurm-job-demo:93 ReqNodeList=(null) ExcNodeList=(null) NodeList=slurm-job-demo-worker-cpu-0 BatchHost=slurm-job-demo-worker-cpu-0 NumNodes=1 NumCPUs=1 NumTasks=1 CPUs/Task=1 ReqB:S:C:T=0:0:*:* ReqTRES=cpu=1,mem=1M,node=1,billing=1 AllocTRES=cpu=1,mem=1M,node=1,billing=1 Socks/Node=* NtasksPerN:B:S:C=0:0:*:* CoreSpec=* MinCPUsNode=1 MinMemoryNode=0 MinTmpDiskNode=0 Features=(null) DelayBoot=00:00:00 OverSubscribe=OK Contiguous=0 Licenses=(null) Network=(null) Command=//cloudnodedemo.sh WorkDir=/ StdErr=//slurm-1.out StdIn=/dev/null StdOut=//slurm-1.out Power=sinfoPARTITION AVAIL TIMELIMIT NODES STATE NODELIST debug* up infinite 11 idle~ slurm-demo-worker-cpu-[0-10]