RKE は K8S を構築し、Ali GPU Sharing を導入して GPU 共有を実現します

声明

この記事のすべてのコンテンツは Docker に基づいています. k8s クラスターは rancher が提供する rke ツールによって構築されます (以下、rancher 版 k8s と呼びます。RancherUI を使用して構築されたクラスターにも適用されます). GPU 共有テクノロジは Ali GPU Sharing を使用します。他のコンテナ テクノロジを使用するこの記事は適用されない可能性があります。また、kubeadm を使用して構築された k8s の一部は適用できない場合があります。GPU 共有をデプロイする場合、kubeadm によって構築された k8s にはインターネット上で入手可能な情報や公式 Web サイトの情報が多数ありますが、 k8s の rancher バージョン これはネイティブの kubernetes とは異なり、いくつかの具体的な手順が後で含まれます。

準備

++すでに Rancher 版の K8S クラスタをお持ちの場合は、「k8s クラスタの構築」から直接開始してください++

docker と nvidia-docker2 をインストールする

Docker をインストールするには、公式のインストール スクリプトのインストールを直接実行します。

curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

インストールが完了したら、Docker version「バージョンの表示」を使用します。通常、現在のインストールはバージョン 20.10 です。バージョンを正常に照会できれば、インストールは成功しています。

インストール後、次のコマンドを実行して、docker が自動的に起動するように設定します。

systemctl start docker
systemctl enable docker

nvidia-docker2のインストールについては、以前の記事「UbuntuがK8Sを実現するNVIDIA GPUのスケジューリングメモ」を参照してnvidia-dockerのインストールを行ってください。
インストールが完了したら、nvidia スケジューリングをサポートするように docker のデフォルトのランタイムを変更し、構成を編集する必要があります/etc/docker/daemon.json(存在しない場合は、新しいものを作成します)。

{
    
    
    "runtimes": {
    
    
        "nvidia": {
    
    
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    },
    "default-runtime": "nvidia",
    "exec-opts": ["native.cgroupdriver=systemd"]
}

その中で、runtimesパラメーターはランタイムを定義するもので、ここでは nvidia という名前のランタイム環境が定義されています。default-runtimeこれは、指定されたデフォルトのランタイムが定義されているだけであることを意味しますnvidia

最後の文"exec-opts": ["native.cgroupdriver=systemd"]の影響は、K8S のファイル ドライバーが cgroupfs で、docker のファイル ドライバーが systemd であるため、この 2 つの違いによりイメージの起動に失敗するため、K8S のファイル ドライバーを指定する必要があるということです。システムとして。

GPUドライバー

GPU ドライバーのインストールと簡単なスケジュールについては、以前の記事「Ubuntu が K8S を実現する NVIDIA GPU のスケジュールに関するメモ」の NVIDIA ドライバーのセクションを参照してください。

rke ツールをダウンロードする

rke をダウンロードする前に、指定されたバージョンの k8s クラスターが必要か、指定されたバージョンの rancher が必要かを判断する必要があります。github の rancher リポジトリでは、サポートされている k8s バージョンと、対応する rancher バージョンで必要な rke ツールのバージョンを確認できます。逆に、必要な k8s バージョンが決まっているので、rancher バージョンと rke バージョンを逆にすることもできます。

ここでの私の要件は、 rancher2.3.8 を使用することです。対応する rke バージョンは 1.0.9 で、 rke-1.0.9 に対応する k8s バージョンは次のとおりです。ここでは
画像.png
k8s のバージョンを使用しますv1.17.6-rancher2-1

さまざまなツールのバージョンを確認したら、対応するツールをダウンロードします。ここでのリンクはニーズに応じて変更され、静的ではありません。

# 下载rke
wget https://github.com/rancher/rke/releases/download/v1.0.9/rke_linux-amd64

# 配置rke
mv rke_linux-amd64 rke
chmod 755 rke
mv rke /usr/local/bin/

#验证
rke --version

k8sクラスタ構築

rke は yaml ファイルに基づいてクラスターを作成する必要があります。ここでは単一ノードを使用します。まず、rke クラスター ファイル ディレクトリを作成します。

mkdir rke-config
cd rke-config

以下は rke クラスター ファイルの内容です。vim cluster.yml既存のクラスターがある場合は vim を使用して編集し、クラスター yaml を編集して、サービスの下にスケジューラー ノードのすべての内容を追加します (rancher を使用してクラスターを直接作成する場合にも適用されます) rancher-ui を通じて操作されるだけです):

nodes:
  - address: 192.168.1.102
    user: root
    role:
      - controlplane
      - etcd
      - worker
services: 
    scheduler:
      extra_args:
        address: 0.0.0.0
        kubeconfig: /etc/kubernetes/ssl/kubecfg-kube-scheduler.yaml
        leader-elect: 'true'
        policy-config-file: /etc/kubernetes/ssl/scheduler-policy-config.json
        profiling: 'false'
        v: '2'
kubernetes_version: "v1.17.6-rancher2-1"
cluster_name: "aliyun"

ノード構成ノードはクラスターを構成するホストであり、ここでは単一ノードであるため、ロールにはコントロール、etcd、ワーカーの 3 つのタイプを含める必要があります。サービスの下のスケジューラー ノードは、スケジューリングを指定するための関連構成です。ここに、rancher バージョン k8s とネイティブ k8s の違いがあります。ネイティブ k8s では、kube-scheduler は実行可能ファイルとして存在しますが、rancher ではコンテナーです。スケジューラーノード コンテンツの一部はdocker inspect kube-scheduler閲覧することができます。ここにコピーして追加するだけですpolicy-config-file: /etc/kubernetes/ssl/scheduler-policy-config.json

Scheduler-policy-config.json を github から取得し、/etc/kubernetes/ssl/ に配置します。複数のマスター ノードがある場合、各マスター ノードは次を実行する必要があります。

cd /etc/kubernetes/ssl/
curl -O https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/config/scheduler-policy-config.json

次に、クラスターを構築するには、前の手順で作成したcluster.ymlのディレクトリに入る必要があります。

rke up

Docker バージョンがサポートしていないことを示すプロンプトが表示された場合は、バージョンを無視するパラメーターを追加するだけです。

rke up --ignore-docker-version

実行が完了すると、この時点でクラスターがセットアップされ、次の構成が実行されます。

mkdir ~/.kube
# kube_config_cluster.yml文件为rke up创建集群时在当前目录生成
cp kube_config_cluster.yml ~/.kube
mv ~/.kube/kube_config_cluster.yml ~/.kube/config

次に、クラスターを管理するために kubectl をインストールします。

curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl"
# 配置kubectl
chmod 755 ./kubectl
mv ./kubectl /usr/local/bin/kubectl
# 查看版本
kubectl version

kubectl を使用してポッドを表示します。

# 查看pod
kubectl get pods

それ以来、k8s クラスターが構築され、次に GPU 共有構成が行われます。

GPU 共有の展開

  1. GPU 共有スケジュール プラグイン gpushare-schd-extender をデプロイします。
cd /tmp/
curl -O https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/config/gpushare-schd-extender.yaml
# 因为是使用单节点,因此需要能够在master上进行调度,所以需要在gpushare-schd-extender.yaml中将
# nodeSelector:
#    node-role.kubernetes.io/master: ""
# 这两句删除,使k8s能够在master上进行调度
kubectl create -f gpushare-schd-extender.yaml
  1. デバイス プラグイン gpushare-device-plugin をデプロイします。

クラスターが新しく構築されていない場合、以前に nvidia-device-plugin をインストールしている場合は、それを削除する必要があります。k8s の rancher バージョンの場合、kubectl get pods を使用して、nvidia-device-plugin の対応するポッドを確認できます。消して。次に、デバイス プラグイン gpushare-device-plugin をデプロイします。

cd /tmp/
wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-device-plugin/master/device-plugin-rbac.yaml
kubectl create -f device-plugin-rbac.yaml
wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-device-plugin/master/device-plugin-ds.yaml
# 默认情况下,GPU显存以GiB为单位,若需要使用MiB为单位,需要在这个文件中,将--memory-unit=GiB修改为--memory-unit=MiB
kubectl create -f device-plugin-ds.yaml
  1. GPU ノードにラベルを付ける

GPU を備えたサーバーに GPU プログラムをスケジュールするには、サービスにタグを付ける必要がありますgpushare=true

# 查看所有节点
kubectl get nodes
# 选取GPU节点打标
kubectl label node <target_node> gpushare=true
# 例如我这里主机名为master,则打标语句为:
# kubectl label node master gpushare=true
  1. kubectl 実行可能ファイルを更新します。
wget https://github.com/AliyunContainerService/gpushare-device-plugin/releases/download/v0.3.0/kubectl-inspect-gpushare
chmod u+x kubectl-inspect-gpushare
mv kubectl-inspect-gpushare /usr/local/bin

次にkubectl inspect gpushare、 を実行します。GPU 情報が表示されれば、インストールが成功したことを意味します。

画像.png

この時点での合計 GPU メモリは 7981MiB で、使用量は 0 であることがわかります。

テスト

テストの次に、Alibaba Cloud のサンプル プログラムを入手します。

wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/samples/1.yaml
wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/samples/2.yaml
wget https://raw.githubusercontent.com/AliyunContainerService/gpushare-scheduler-extender/master/samples/3.yaml

これら 4 つのファイルは、GPU をスケジュールする必要がある 4 つのサンプル コンテナーの yaml であり、kubectl create -f x.yaml直接起動できます。これらのファイルでスケジュールされた GPU はすべて G 単位です。ここでは、スケジューリング値を変更しました。スケジューリング値のパラメーターには次の名前が付けられています: aliyun.com/gpu-mem、最初のものは 128、2 つ目は 256、3 つ目は 512、1 つずつ開始し、GPU 使用率を観察します。
最初のものを開始します: 2 つ目
画像.png
を開始します:
画像.png
3 つ目を開始します:
画像.png

これまでのところ、rancher バージョン k8s は GPU 共有を正常に構成しています。

おすすめ

転載: blog.csdn.net/u012751272/article/details/120566202