deepopsを使ったGPUクラスター(kubernetes)の構築
今日は学習基盤となるGPUクラスター(kubernetes)をdeepopsを使って簡単に構築する方法についてまとめます。
特に企業勤めでproxy周りの設定が必要なことを想定して、そのあたりの設定についても詳しく書いて行きたいと思います。
deepops
deepopsは、NVIDIAがOSSとして提供しているGPUクラスター作成用のツール群です。
実体としては必要な機能をインストールするためのシェルおよびAnsibleの集合体となっています。
deepopsの中から必要なスクリプトを実行することで、各ノードPCにGPU処理を可能にするためのnvidia-dockerなどがインストールされたkubernetesベースのGPUクラスターを構築することができます。
deepopsではkubernetesだけでなく、SlurmベースでもGPUクラスターを作成できますが、今回はkubernetesベースで話を進めます
事前準備
GPUクラスターを立ち上げるためには最低3台(2台がGPUクラスター用、1台はGPUクラスターのPCに設定を遠隔で反映させる用)必要になります。
- master(Ubuntu18.04): 1台以上
- kubernetesのマスター。これが計算用に使われる訳ではないので注意。
- worker(Ubuntu18.04): 1台以上
- 計算用PC。GPUはリッチなものを搭載しましょう。
- provisioner: 1台
後ほどGPUクラスター構築時に各PCへユーザー名とパスワードでsshログインをするため、同一ユーザー名、パスワードにしておきましょう。
1. deepopsのダウンロード
注意: この項以降はprovisioner PCで行います
また、20.06 versionでの解説になります!
https://github.com/NVIDIA/deepops/blob/20.06/docs/getting-started.md
公式のGetting startを参考に、deepopsのダウンロードおよびタグのチェックアウトを実施。
git clone https://github.com/NVIDIA/deepops.git cd deepops git checkout tags/20.06
以降は下記の設定を参考
https://github.com/NVIDIA/deepops/blob/20.06/docs/kubernetes-cluster.md
2. provisionerの設定
provisioner自体の設定を実施、Ansibleやproxyの設定をしてくれるスクリプトを実行します。
proxyの設定はscript/proxy.sh
にproxy情報を記載します
# edit the proxy details # proxyを記載 export http_proxy="http://10.0.2.5:3128" export https_proxy="http://10.0.2.5:3128" # no_proxyにはGPUクラスターに使うIPアドレスを記載 # この例でいうと、10.0.2.10以降を自分の環境に合わせて変更 export no_proxy="localhost,cluster.local,127.0.0.1,::1,10.0.2.10,10.0.2.20,10.0.2.30"
その後、scripts/setup.sh
を実行。
# Install software prerequisites and copy default configuration ./scripts/setup.sh
3. Ansible inventory 設定
GPUクラスターの設定にはAnsibleが使われるため、それの設定を行います。
config/inventory
を編集。
###### # ALL NODES # NOTE: Use existing hostnames here, DeepOps will configure server hostnames to match these values ###### [all] # ノード名 ansible_host=IPアドレス として記載 mgmt01 ansible_host=10.0.0.1 # masterノードのIPアドレス #mgmt02 ansible_host=10.0.0.2 # masterを複数台用意する場合に使用 #mgmt03 ansible_host=10.0.0.3 # masterを複数台用意する場合に使用 #login01 ansible_host=10.0.1.1 # loginノードは使用しない gpu01 ansible_host=10.0.2.1 # workerノードのIPアドレス(1台目) #gpu02 ansible_host=10.0.2.2 # workerノードのIPアドレス(2台目あれば使用) ###### # KUBERNETES ###### [kube-master] mgmt01 # コメントアウトを外す #mgmt02 #mgmt03 # Odd number of nodes required [etcd] mgmt01 # コメントアウトを外す #mgmt02 #mgmt03 # Also add mgmt/master nodes here if they will run non-control plane jobs [kube-node] gpu01 # コメントアウトを外す #gpu02 ###### # SSH connection configuration ###### [all:vars] # SSH User ansible_user=ubuntu # master, workerで作成しているユーザー名を記載 ansible_ssh_private_key_file='~/.ssh/id_rsa' # SSH bastion/jumpbox #ansible_ssh_common_args='-o ProxyCommand="ssh -W %h:%p -q ubuntu@10.0.0.1"'
続いて、proxyの設定。こちらは前項で設定した値と同じようにする。
config/group_vars/all.yaml
を編集
################################################################################ # PROXY ################################################################################ # コメントアウトを外す # proxyおよびno_proxyを設定 # Proxy Variables needed for scripts, ansible, etc. http_proxy: http://10.0.2.5:3128 https_proxy: http://10.0.2.5:3128 no_proxy: localhost,cluster.local,127.0.0.1,::1,10.0.2.10,10.0.2.20,10.0.2.30 # コメントアウトを外す proxy_env: http_proxy: '{{ http_proxy }}' https_proxy: '{{ https_proxy }}' no_proxy: '{{ no_proxy }}'
4. Ansible設定の確認
これらの設定が上手くできているかを確認します。
# -u <ユーザー名> を記載 # 実行後パスワードを聞かれるので入力 ansible all -m raw -a "hostname" -k -K -u ubuntu
問題なければALL OK 的な表示がでているはずです。
5. kubernetesのインストール
# NOTE: If SSH requires a password, add: `-k` # NOTE: If sudo on remote machine requires a password, add: `-K` # NOTE: If SSH user is different than current user, add: `-u ubuntu` # -k -K -u <ユーザー名> オプションをつけることで各ノードにユーザー/パスワードでsshログインする # 下記コマンドを実行後パスワードを聞かれるのでパスワードを入力 ansible-playbook -l k8s-cluster playbooks/k8s-cluster.yml -k -K -u ubuntu
6. kubernetes構築の確認
まずはkubernetesが立ち上がっているかを確認
# You may need to manually run: `sudo cp ./config/artifacts/kubectl /usr/local/bin` kubectl get nodes # こんな感じの結果が返ってくればOK NAME STATUS ROLES AGE VERSION gpu01 Ready <none> 1d v1.17.6 mgmt01 Ready master 1d v1.17.6
次に、GPUが認識されるか確認
export CLUSTER_VERIFY_EXPECTED_PODS=1 # GPUクラスター全体で搭載しているGPUの枚数 ./scripts/k8s_verify_gpu.sh
GPUが正しく認識されていればdeepopsを使ったGPUクラスターの構築は完了です!!
まとめ
deepopsを使うことで簡単にkubernetesを使ったGPUクラスターが構築できましたね。